summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/codecs/libtremor/mapping0.c84
1 files changed, 61 insertions, 23 deletions
diff --git a/apps/codecs/libtremor/mapping0.c b/apps/codecs/libtremor/mapping0.c
index f3bd3401fe..27db815f3b 100644
--- a/apps/codecs/libtremor/mapping0.c
+++ b/apps/codecs/libtremor/mapping0.c
@@ -182,23 +182,17 @@ static vorbis_info_mapping *mapping0_unpack(vorbis_info *vi,oggpack_buffer *opb)
182#define MAGANG( _mag, _ang )\ 182#define MAGANG( _mag, _ang )\
183{\ 183{\
184 register int temp;\ 184 register int temp;\
185 asm( "cmp %[mag], #0\n\t"\ 185 asm( "mov %[temp], %[ang]\n\t"\
186 "cmpgt %[ang], #0\n\t"\
187 "subgt %[ang], %[mag], %[ang]\n\t"\
188 "bgt 1f\n\t"\
189 "cmp %[mag], #0\n\t"\ 186 "cmp %[mag], #0\n\t"\
190 "cmple %[ang], #0\n\t"\ 187 "rsble %[temp], %[temp], #0\n\t"\
191 "addgt %[temp], %[mag], %[ang]\n\t"\
192 "suble %[temp], %[mag], %[ang]\n\t"\
193 "cmp %[ang], #0\n\t"\ 188 "cmp %[ang], #0\n\t"\
189 "subgt %[ang], %[mag], %[temp]\n\t"\
194 "movle %[ang], %[mag]\n\t"\ 190 "movle %[ang], %[mag]\n\t"\
195 "movle %[mag], %[temp]\n\t"\ 191 "addle %[mag], %[mag], %[temp]\n\t"\
196 "movgt %[ang], %[temp]\n\t"\
197 "1:\n\t"\
198 : [mag] "+r" ( ( _mag ) ), [ang] "+r" ( ( _ang ) ), [temp] "=&r" (temp)\ 192 : [mag] "+r" ( ( _mag ) ), [ang] "+r" ( ( _ang ) ), [temp] "=&r" (temp)\
199 :\ 193 :\
200 : "cc" );\ 194 : "cc" );\
201} 195}
202 196
203static inline void channel_couple(ogg_int32_t *pcmM, ogg_int32_t *pcmA, int n) 197static inline void channel_couple(ogg_int32_t *pcmM, ogg_int32_t *pcmA, int n)
204{ 198{
@@ -224,27 +218,71 @@ static inline void channel_couple(ogg_int32_t *pcmM, ogg_int32_t *pcmA, int n)
224 [A0] "r" (A0), [A1] "r" (A1), [A2] "r" (A2), [A3] "r" (A3) 218 [A0] "r" (A0), [A1] "r" (A1), [A2] "r" (A2), [A3] "r" (A3)
225 : "memory" ); 219 : "memory" );
226 } 220 }
227} 221}
222
223#elif defined CPU_COLDFIRE
224
225#define MAGANG( _mag, _ang, _pcmA, _pcmM, _off )\
226{\
227 int temp;\
228 asm volatile( "move.l %[ang], %[temp]\n\t"\
229 "tst.l %[mag]\n\t"\
230 "bgt.s 1f\n\t"\
231 "neg.l %[temp]\n\t"\
232 "1:\n\t"\
233 "tst.l %[ang]\n\t"\
234 "bgt.s 2f\n\t"\
235 "add.l %[mag], %[temp]\n\t"\
236 "move.l %[temp], (" #_off ", %[pcmM])\n\t"\
237 ".word 0x51fa\n\t" /* trapf.w, shadow next insn */ \
238 "2:\n\t"\
239 "sub.l %[temp], %[mag]\n\t"\
240 "move.l %[mag], (%[pcmA])+\n\t"\
241 : [mag] "+r" ( ( _mag ) ), [ang] "+d" ( ( _ang ) ), [temp] "=&d" (temp),\
242 [pcmA] "+a" (pcmA)\
243 : [pcmM] "a" (pcmM)\
244 : "cc", "memory" );\
245}
246static inline void channel_couple(ogg_int32_t *pcmM, ogg_int32_t *pcmA, unsigned int n)
247{
248 ogg_int32_t * const pcmMend = pcmM + n/2;
249 while(LIKELY(pcmM < pcmMend))
250 {
251 register int M0 asm("a2"),M1 asm("a3"),M2 asm("a4"),M3 asm("a5");
252 register int A0 asm("d2"),A1 asm("d3"),A2 asm("d4"),A3 asm("d5");
253 asm volatile( "movem.l (%[pcmM]), %[M0]-%[M3]\n\t"
254 "movem.l (%[pcmA]), %[A0]-%[A3]\n\t"
255 : [M0] "=r" (M0), [M1] "=r" (M1), [M2] "=r" (M2), [M3] "=r" (M3),
256 [A0] "=r" (A0), [A1] "=r" (A1), [A2] "=r" (A2), [A3] "=r" (A3)
257 : [pcmM] "a" (pcmM), [pcmA] "a" (pcmA) );
258
259 MAGANG( M0, A0, pcmA, pcmM, 0 );
260 MAGANG( M1, A1, pcmA, pcmM, 4 );
261 MAGANG( M2, A2, pcmA, pcmM, 8 );
262 MAGANG( M3, A3, pcmA, pcmM, 12 );
263
264 asm volatile( "lea.l (4*4, %[pcmM]), %[pcmM]\n\t"
265 : [pcmM] "+a" (pcmM));
266 }
267}
228#else 268#else
229static inline void channel_couple(ogg_int32_t *pcmM, ogg_int32_t *pcmA, int n) 269static inline void channel_couple(ogg_int32_t *pcmM, ogg_int32_t *pcmA, int n)
230{ 270{
231 int j; 271 int j;
232 for(j=0;j<n/2;j++){ 272 for(j=0;j<n/2;j++){
233 ogg_int32_t mag = pcmM[j], ang = pcmA[j]; 273 ogg_int32_t mag = pcmM[j], ang = pcmA[j], _ang;
234 if(mag>0) 274 if(mag>0)
235 if(ang>0) 275 _ang = ang;
236 pcmA[j]=mag-ang; 276 else
237 else{ 277 _ang = -ang;
238 pcmA[j]=mag; 278
239 pcmM[j]=mag+ang;
240 }
241 else
242 if(ang>0) 279 if(ang>0)
243 pcmA[j]=mag+ang; 280 pcmA[j]=mag-_ang;
244 else{ 281 else{
245 pcmA[j]=mag; 282 pcmA[j]=mag;
246 pcmM[j]=mag-ang; 283 pcmM[j]=mag+_ang;
247 } 284 }
285
248 } 286 }
249} 287}
250#endif 288#endif