Index: apps/codecs/libmad/synth.c =================================================================== --- apps/codecs/libmad/synth.c (revision 27509) +++ apps/codecs/libmad/synth.c (working copy) @@ -577,6 +577,140 @@ /* optimised version of synth_full */ # ifdef FPM_COLDFIRE_EMAC + +#define SYNTH_EMAC1(res,f1,pD) \ + asm volatile( \ + "movem.l (%1), %%d0-%%d7 \n\t" \ + "move.l (%2), %%a5 \n\t" \ + "mac.l %%d0, %%a5, 56(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d1, %%a5, 48(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d2, %%a5, 40(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d3, %%a5, 32(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d4, %%a5, 24(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d5, %%a5, 16(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d6, %%a5, 8(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d7, %%a5, %%acc0\n\t" \ + "movclr.l %%acc0, %0 \n\t" \ + : "=r" (res) \ + : "a" (*f1), "a" (*pD) \ + : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a5"); + +#define SYNTH_EMAC2(res,f1,f2,pD) \ + asm volatile( \ + "movem.l (%1), %%d0-%%d7 \n\t" \ + "move.l 4(%2), %%a5 \n\t" \ + "msac.l %%d0, %%a5, 60(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d1, %%a5, 52(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d2, %%a5, 44(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d3, %%a5, 36(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d4, %%a5, 28(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d5, %%a5, 20(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d6, %%a5, 12(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d7, %%a5, (%2), %%a5, %%acc0\n\t" \ + "movem.l (%3), %%d0-%%d7 \n\t" \ + "mac.l %%d0, %%a5, 56(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d1, %%a5, 48(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d2, %%a5, 40(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d3, %%a5, 32(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d4, %%a5, 24(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d5, %%a5, 16(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d6, %%a5, 8(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d7, %%a5, %%acc0\n\t" \ + "movclr.l %%acc0, %0 \n\t" \ + : "=r" (res) \ + : "a" (*f1), "a" (*pD), "a" (*f2) \ + : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a5"); + +#define SYNTH_EMAC_ODD_SBSAMPLE(f1,f2,pD1,pD2,res1,res2) \ + asm volatile ( \ + "movem.l (%0), %%d0-%%d7 \n\t" \ + "move.l 4(%2), %%a5 \n\t" \ + "msac.l %%d0, %%a5, 60(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d1, %%a5, 52(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d2, %%a5, 44(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d3, %%a5, 36(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d4, %%a5, 28(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d5, %%a5, 20(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d6, %%a5, 12(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d7, %%a5, 112(%3), %%a5, %%acc0\n\t" \ + "mac.l %%d7, %%a5, 104(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d6, %%a5, 96(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d5, %%a5, 88(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d4, %%a5, 80(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d3, %%a5, 72(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d2, %%a5, 64(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d1, %%a5, 120(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d0, %%a5, 8(%2), %%a5, %%acc1\n\t" \ + "movem.l (%1), %%d0-%%d7 \n\t" \ + "mac.l %%d7, %%a5, 16(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d6, %%a5, 24(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d5, %%a5, 32(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d4, %%a5, 40(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d3, %%a5, 48(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d2, %%a5, 56(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d1, %%a5, (%2), %%a5, %%acc0\n\t" \ + "mac.l %%d0, %%a5, 60(%3), %%a5, %%acc0\n\t" \ + "mac.l %%d0, %%a5, 68(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d1, %%a5, 76(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d2, %%a5, 84(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d3, %%a5, 92(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d4, %%a5, 100(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d5, %%a5, 108(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d6, %%a5, 116(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d7, %%a5, %%acc1\n\t" \ + : \ + : "a" (*f1), "a" (*f2), "a" (*pD1), "a" (*pD2) \ + : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a5"); \ + asm volatile( \ + "movclr.l %%acc0, %0\n\t" \ + "movclr.l %%acc1, %1\n\t" \ + : "=d" (res1), "=d" (res2) ); + +#define SYNTH_EMAC_EVEN_SBSAMPLE(f1,f2,pD1,pD2,res1,res2) \ + asm volatile ( \ + "movem.l (%0), %%d0-%%d7 \n\t" \ + "move.l (%2), %%a5 \n\t" \ + "msac.l %%d0, %%a5, 56(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d1, %%a5, 48(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d2, %%a5, 40(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d3, %%a5, 32(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d4, %%a5, 24(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d5, %%a5, 16(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d6, %%a5, 8(%2), %%a5, %%acc0\n\t" \ + "msac.l %%d7, %%a5, 116(%3), %%a5, %%acc0\n\t" \ + "mac.l %%d7, %%a5, 108(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d6, %%a5, 100(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d5, %%a5, 92(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d4, %%a5, 84(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d3, %%a5, 76(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d2, %%a5, 68(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d1, %%a5, 60(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d0, %%a5, 12(%2), %%a5, %%acc1\n\t" \ + "movem.l (%1), %%d0-%%d7 \n\t" \ + "mac.l %%d7, %%a5, 20(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d6, %%a5, 28(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d5, %%a5, 36(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d4, %%a5, 44(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d3, %%a5, 52(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d2, %%a5, 60(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d1, %%a5, 4(%2), %%a5, %%acc0\n\t" \ + "mac.l %%d0, %%a5, 120(%3), %%a5, %%acc0\n\t" \ + "mac.l %%d0, %%a5, 64(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d1, %%a5, 72(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d2, %%a5, 80(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d3, %%a5, 88(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d4, %%a5, 96(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d5, %%a5, 104(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d6, %%a5, 112(%3), %%a5, %%acc1\n\t" \ + "mac.l %%d7, %%a5, %%acc1\n\t" \ + : \ + : "a" (*f1), "a" (*f2), "a" (*pD1), "a" (*pD2) \ + : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a5"); \ + asm volatile( \ + "movclr.l %%acc0, %0\n\t" \ + "movclr.l %%acc1, %1\n\t" \ + : "=d" (res1), "=d" (res2) ); + static void synth_full(struct mad_synth *synth, struct mad_frame const *frame, unsigned int nch, unsigned int ns) @@ -612,6 +746,8 @@ if(s & 1) { + SYNTH_EMAC2(hi0,fx,fe,D0ptr) + /* asm volatile( "movem.l (%1), %%d0-%%d7\n\t" "move.l 4(%2), %%a5\n\t" @@ -636,7 +772,7 @@ "movclr.l %%acc0, %0\n\t" : "=r" (hi0) : "a" (*fx), "a" (*D0ptr), "a" (*fe) : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a5"); - + */ pcm[0] = hi0 << 3; /* shift result to libmad's fixed point format */ pcm += 16; @@ -646,6 +782,8 @@ ++D1ptr; /* D[32 - sb][i] == -D[sb][31 - i] */ + SYNTH_EMAC_ODD_SBSAMPLE(fo,fe,D0ptr,D1ptr,hi0,hi1) + /* asm volatile ( "movem.l (%0), %%d0-%%d7\n\t" "move.l 4(%2), %%a5\n\t" @@ -684,16 +822,17 @@ "mac.l %%d7, %%a5, %%acc1\n\t" : : "a" (*fo), "a" (*fe), "a" (*D0ptr), "a" (*D1ptr) : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a5"); - asm volatile( "movclr.l %%acc0, %0\n\t" "movclr.l %%acc1, %1\n\t" : "=d" (hi0), "=d" (hi1) ); - + */ pcm[-sb] = hi0 << 3; pcm[ sb] = hi1 << 3; } ++D0ptr; + SYNTH_EMAC1(hi0,fo+1,D0ptr) + /* asm volatile( "movem.l (%1), %%d0-%%d7\n\t" "move.l 4(%2), %%a5\n\t" @@ -708,11 +847,13 @@ "movclr.l %%acc0, %0\n\t" : "=r" (hi0) : "a" (*fo), "a" (*D0ptr) : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a5"); - + */ pcm[0] = -(hi0 << 3); } else { + SYNTH_EMAC2(hi0,fe,fx,D0ptr) + /* asm volatile( "movem.l (%1), %%d0-%%d7\n\t" "move.l (%2), %%a5\n\t" @@ -737,7 +878,7 @@ "movclr.l %%acc0, %0\n\t" : "=r" (hi0) : "a" (*fx), "a" (*D0ptr), "a" (*fe) : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a5"); - + */ pcm[0] = hi0 << 3; /* shift result to libmad's fixed point format */ pcm += 16; @@ -747,6 +888,8 @@ ++D1ptr; /* D[32 - sb][i] == -D[sb][31 - i] */ + SYNTH_EMAC_EVEN_SBSAMPLE(fo,fe,D0ptr,D1ptr,hi0,hi1) + /* asm volatile ( "movem.l (%0), %%d0-%%d7\n\t" "move.l (%2), %%a5\n\t" @@ -785,16 +928,17 @@ "mac.l %%d7, %%a5, %%acc1\n\t" : : "a" (*fo), "a" (*fe), "a" (*D0ptr), "a" (*D1ptr) : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a5"); - asm volatile( "movclr.l %%acc0, %0\n\t" "movclr.l %%acc1, %1\n\t" : "=d" (hi0), "=d" (hi1) ); - + */ pcm[-sb] = hi0 << 3; pcm[ sb] = hi1 << 3; } ++D0ptr; + SYNTH_EMAC1(hi0,fo,D0ptr) + /* asm volatile( "movem.l (%1), %%d0-%%d7\n\t" "move.l (%2), %%a5\n\t" @@ -809,7 +953,7 @@ "movclr.l %%acc0, %0\n\t" : "=r" (hi0) : "a" (*fo), "a" (*D0ptr) : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a5"); - + */ pcm[0] = -(hi0 << 3); } pcm += 16;