Index: apps/codecs/libmusepack/decoder.h =================================================================== --- apps/codecs/libmusepack/decoder.h (revision 17507) +++ apps/codecs/libmusepack/decoder.h (working copy) @@ -113,7 +113,7 @@ mpc_uint8_t SeekTable_Step; #ifdef MPC_FIXED_POINT - unsigned char SCF_shift[256]; + mpc_uint8_t SCF_shift[256]; #endif MPC_SAMPLE_FORMAT V_L[MPC_V_MEM + 960]; Index: apps/codecs/libmusepack/synth_filter.c =================================================================== --- apps/codecs/libmusepack/synth_filter.c (revision 17507) +++ apps/codecs/libmusepack/synth_filter.c (working copy) @@ -198,8 +198,12 @@ #define INVCOS30 MPC_MAKE_INVCOS( 684664578) #define INVCOS31 MPC_MAKE_INVCOS(1367679739) -static inline void +void mpc_calculate_new_V ( const MPC_SAMPLE_FORMAT * Sample, MPC_SAMPLE_FORMAT * V ) +ICODE_ATTR_MPC_LARGE_IRAM; + +void +mpc_calculate_new_V ( const MPC_SAMPLE_FORMAT * Sample, MPC_SAMPLE_FORMAT * V ) { // Calculating new V-buffer values for left channel // calculate new V-values (ISO-11172-3, p. 39) @@ -226,76 +230,44 @@ A[15] = Sample[15] + Sample[16]; // 16 adds - B[ 0] = A[ 0] + A[15]; - B[ 1] = A[ 1] + A[14]; - B[ 2] = A[ 2] + A[13]; - B[ 3] = A[ 3] + A[12]; - B[ 4] = A[ 4] + A[11]; - B[ 5] = A[ 5] + A[10]; - B[ 6] = A[ 6] + A[ 9]; - B[ 7] = A[ 7] + A[ 8];; - B[ 8] = MPC_MULTIPLY_V((A[ 0] - A[15]), INVCOS02); - B[ 9] = MPC_MULTIPLY_V((A[ 1] - A[14]), INVCOS06); - B[10] = MPC_MULTIPLY_V((A[ 2] - A[13]), INVCOS10); - B[11] = MPC_MULTIPLY_V((A[ 3] - A[12]), INVCOS14); - B[12] = MPC_MULTIPLY_V((A[ 4] - A[11]), INVCOS18); - B[13] = MPC_MULTIPLY_V((A[ 5] - A[10]), INVCOS22); - B[14] = MPC_MULTIPLY_V((A[ 6] - A[ 9]), INVCOS26); - B[15] = MPC_MULTIPLY_V((A[ 7] - A[ 8]), INVCOS30); + B[ 0] = A[ 0] + A[15]; B[ 8] = MPC_MULTIPLY_V((A[ 0] - A[15]), INVCOS02); + B[ 1] = A[ 1] + A[14]; B[ 9] = MPC_MULTIPLY_V((A[ 1] - A[14]), INVCOS06); + B[ 2] = A[ 2] + A[13]; B[10] = MPC_MULTIPLY_V((A[ 2] - A[13]), INVCOS10); + B[ 3] = A[ 3] + A[12]; B[11] = MPC_MULTIPLY_V((A[ 3] - A[12]), INVCOS14); + B[ 4] = A[ 4] + A[11]; B[12] = MPC_MULTIPLY_V((A[ 4] - A[11]), INVCOS18); + B[ 5] = A[ 5] + A[10]; B[13] = MPC_MULTIPLY_V((A[ 5] - A[10]), INVCOS22); + B[ 6] = A[ 6] + A[ 9]; B[14] = MPC_MULTIPLY_V((A[ 6] - A[ 9]), INVCOS26); + B[ 7] = A[ 7] + A[ 8]; B[15] = MPC_MULTIPLY_V((A[ 7] - A[ 8]), INVCOS30); // 8 adds, 8 subs, 8 muls, 8 shifts - A[ 0] = B[ 0] + B[ 7]; - A[ 1] = B[ 1] + B[ 6]; - A[ 2] = B[ 2] + B[ 5]; - A[ 3] = B[ 3] + B[ 4]; - A[ 4] = MPC_MULTIPLY_V((B[ 0] - B[ 7]), INVCOS04); - A[ 5] = MPC_MULTIPLY_V((B[ 1] - B[ 6]), INVCOS12); - A[ 6] = MPC_MULTIPLY_V((B[ 2] - B[ 5]), INVCOS20); - A[ 7] = MPC_MULTIPLY_V((B[ 3] - B[ 4]), INVCOS28); - A[ 8] = B[ 8] + B[15]; - A[ 9] = B[ 9] + B[14]; - A[10] = B[10] + B[13]; - A[11] = B[11] + B[12]; - A[12] = MPC_MULTIPLY_V((B[ 8] - B[15]), INVCOS04); - A[13] = MPC_MULTIPLY_V((B[ 9] - B[14]), INVCOS12); - A[14] = MPC_MULTIPLY_V((B[10] - B[13]), INVCOS20); - A[15] = MPC_MULTIPLY_V((B[11] - B[12]), INVCOS28); + A[ 0] = B[ 0] + B[ 7]; A[ 4] = MPC_MULTIPLY_V((B[ 0] - B[ 7]), INVCOS04); + A[ 1] = B[ 1] + B[ 6]; A[ 5] = MPC_MULTIPLY_V((B[ 1] - B[ 6]), INVCOS12); + A[ 2] = B[ 2] + B[ 5]; A[ 6] = MPC_MULTIPLY_V((B[ 2] - B[ 5]), INVCOS20); + A[ 3] = B[ 3] + B[ 4]; A[ 7] = MPC_MULTIPLY_V((B[ 3] - B[ 4]), INVCOS28); + A[ 8] = B[ 8] + B[15]; A[12] = MPC_MULTIPLY_V((B[ 8] - B[15]), INVCOS04); + A[ 9] = B[ 9] + B[14]; A[13] = MPC_MULTIPLY_V((B[ 9] - B[14]), INVCOS12); + A[10] = B[10] + B[13]; A[14] = MPC_MULTIPLY_V((B[10] - B[13]), INVCOS20); + A[11] = B[11] + B[12]; A[15] = MPC_MULTIPLY_V((B[11] - B[12]), INVCOS28); // 8 adds, 8 subs, 8 muls, 8 shifts - B[ 0] = A[ 0] + A[ 3]; - B[ 1] = A[ 1] + A[ 2]; - B[ 2] = MPC_MULTIPLY_V((A[ 0] - A[ 3]), INVCOS08); - B[ 3] = MPC_MULTIPLY_V((A[ 1] - A[ 2]), INVCOS24); - B[ 4] = A[ 4] + A[ 7]; - B[ 5] = A[ 5] + A[ 6]; - B[ 6] = MPC_MULTIPLY_V((A[ 4] - A[ 7]), INVCOS08); - B[ 7] = MPC_MULTIPLY_V((A[ 5] - A[ 6]), INVCOS24); - B[ 8] = A[ 8] + A[11]; - B[ 9] = A[ 9] + A[10]; - B[10] = MPC_MULTIPLY_V((A[ 8] - A[11]), INVCOS08); - B[11] = MPC_MULTIPLY_V((A[ 9] - A[10]), INVCOS24); - B[12] = A[12] + A[15]; - B[13] = A[13] + A[14]; - B[14] = MPC_MULTIPLY_V((A[12] - A[15]), INVCOS08); - B[15] = MPC_MULTIPLY_V((A[13] - A[14]), INVCOS24); + B[ 0] = A[ 0] + A[ 3]; B[ 2] = MPC_MULTIPLY_V((A[ 0] - A[ 3]), INVCOS08); + B[ 1] = A[ 1] + A[ 2]; B[ 3] = MPC_MULTIPLY_V((A[ 1] - A[ 2]), INVCOS24); + B[ 4] = A[ 4] + A[ 7]; B[ 6] = MPC_MULTIPLY_V((A[ 4] - A[ 7]), INVCOS08); + B[ 5] = A[ 5] + A[ 6]; B[ 7] = MPC_MULTIPLY_V((A[ 5] - A[ 6]), INVCOS24); + B[ 8] = A[ 8] + A[11]; B[10] = MPC_MULTIPLY_V((A[ 8] - A[11]), INVCOS08); + B[ 9] = A[ 9] + A[10]; B[11] = MPC_MULTIPLY_V((A[ 9] - A[10]), INVCOS24); + B[12] = A[12] + A[15]; B[14] = MPC_MULTIPLY_V((A[12] - A[15]), INVCOS08); + B[13] = A[13] + A[14]; B[15] = MPC_MULTIPLY_V((A[13] - A[14]), INVCOS24); // 8 adds, 8 subs, 8 muls, 8 shifts - A[ 0] = B[ 0] + B[ 1]; - A[ 1] = MPC_MULTIPLY_V((B[ 0] - B[ 1]), INVCOS16); - A[ 2] = B[ 2] + B[ 3]; - A[ 3] = MPC_MULTIPLY_V((B[ 2] - B[ 3]), INVCOS16); - A[ 4] = B[ 4] + B[ 5]; - A[ 5] = MPC_MULTIPLY_V((B[ 4] - B[ 5]), INVCOS16); - A[ 6] = B[ 6] + B[ 7]; - A[ 7] = MPC_MULTIPLY_V((B[ 6] - B[ 7]), INVCOS16); - A[ 8] = B[ 8] + B[ 9]; - A[ 9] = MPC_MULTIPLY_V((B[ 8] - B[ 9]), INVCOS16); - A[10] = B[10] + B[11]; - A[11] = MPC_MULTIPLY_V((B[10] - B[11]), INVCOS16); - A[12] = B[12] + B[13]; - A[13] = MPC_MULTIPLY_V((B[12] - B[13]), INVCOS16); - A[14] = B[14] + B[15]; - A[15] = MPC_MULTIPLY_V((B[14] - B[15]), INVCOS16); + A[ 0] = B[ 0] + B[ 1]; A[ 1] = MPC_MULTIPLY_V((B[ 0] - B[ 1]), INVCOS16); + A[ 2] = B[ 2] + B[ 3]; A[ 3] = MPC_MULTIPLY_V((B[ 2] - B[ 3]), INVCOS16); + A[ 4] = B[ 4] + B[ 5]; A[ 5] = MPC_MULTIPLY_V((B[ 4] - B[ 5]), INVCOS16); + A[ 6] = B[ 6] + B[ 7]; A[ 7] = MPC_MULTIPLY_V((B[ 6] - B[ 7]), INVCOS16); + A[ 8] = B[ 8] + B[ 9]; A[ 9] = MPC_MULTIPLY_V((B[ 8] - B[ 9]), INVCOS16); + A[10] = B[10] + B[11]; A[11] = MPC_MULTIPLY_V((B[10] - B[11]), INVCOS16); + A[12] = B[12] + B[13]; A[13] = MPC_MULTIPLY_V((B[12] - B[13]), INVCOS16); + A[14] = B[14] + B[15]; A[15] = MPC_MULTIPLY_V((B[14] - B[15]), INVCOS16); // 8 adds, 8 subs, 8 muls, 8 shifts // multiple used expressions: -(A[12] + A[14] + A[15]) @@ -328,59 +300,35 @@ A[15] = MPC_MULTIPLY_V_PRESCALE((Sample[15] - Sample[16]), INVCOS31); // 16 subs, 16 muls, 16 shifts - B[ 0] = A[ 0] + A[15]; - B[ 1] = A[ 1] + A[14]; - B[ 2] = A[ 2] + A[13]; - B[ 3] = A[ 3] + A[12]; - B[ 4] = A[ 4] + A[11]; - B[ 5] = A[ 5] + A[10]; - B[ 6] = A[ 6] + A[ 9]; - B[ 7] = A[ 7] + A[ 8]; - B[ 8] = MPC_MULTIPLY_V((A[ 0] - A[15]), INVCOS02); - B[ 9] = MPC_MULTIPLY_V((A[ 1] - A[14]), INVCOS06); - B[10] = MPC_MULTIPLY_V((A[ 2] - A[13]), INVCOS10); - B[11] = MPC_MULTIPLY_V((A[ 3] - A[12]), INVCOS14); - B[12] = MPC_MULTIPLY_V((A[ 4] - A[11]), INVCOS18); - B[13] = MPC_MULTIPLY_V((A[ 5] - A[10]), INVCOS22); - B[14] = MPC_MULTIPLY_V((A[ 6] - A[ 9]), INVCOS26); - B[15] = MPC_MULTIPLY_V((A[ 7] - A[ 8]), INVCOS30); + B[ 0] = A[ 0] + A[15]; B[ 8] = MPC_MULTIPLY_V((A[ 0] - A[15]), INVCOS02); + B[ 1] = A[ 1] + A[14]; B[ 9] = MPC_MULTIPLY_V((A[ 1] - A[14]), INVCOS06); + B[ 2] = A[ 2] + A[13]; B[10] = MPC_MULTIPLY_V((A[ 2] - A[13]), INVCOS10); + B[ 3] = A[ 3] + A[12]; B[11] = MPC_MULTIPLY_V((A[ 3] - A[12]), INVCOS14); + B[ 4] = A[ 4] + A[11]; B[12] = MPC_MULTIPLY_V((A[ 4] - A[11]), INVCOS18); + B[ 5] = A[ 5] + A[10]; B[13] = MPC_MULTIPLY_V((A[ 5] - A[10]), INVCOS22); + B[ 6] = A[ 6] + A[ 9]; B[14] = MPC_MULTIPLY_V((A[ 6] - A[ 9]), INVCOS26); + B[ 7] = A[ 7] + A[ 8]; B[15] = MPC_MULTIPLY_V((A[ 7] - A[ 8]), INVCOS30); // 8 adds, 8 subs, 8 muls, 8 shift - A[ 0] = B[ 0] + B[ 7]; - A[ 1] = B[ 1] + B[ 6]; - A[ 2] = B[ 2] + B[ 5]; - A[ 3] = B[ 3] + B[ 4]; - A[ 4] = MPC_MULTIPLY_V((B[ 0] - B[ 7]), INVCOS04); - A[ 5] = MPC_MULTIPLY_V((B[ 1] - B[ 6]), INVCOS12); - A[ 6] = MPC_MULTIPLY_V((B[ 2] - B[ 5]), INVCOS20); - A[ 7] = MPC_MULTIPLY_V((B[ 3] - B[ 4]), INVCOS28); - A[ 8] = B[ 8] + B[15]; - A[ 9] = B[ 9] + B[14]; - A[10] = B[10] + B[13]; - A[11] = B[11] + B[12]; - A[12] = MPC_MULTIPLY_V((B[ 8] - B[15]), INVCOS04); - A[13] = MPC_MULTIPLY_V((B[ 9] - B[14]), INVCOS12); - A[14] = MPC_MULTIPLY_V((B[10] - B[13]), INVCOS20); - A[15] = MPC_MULTIPLY_V((B[11] - B[12]), INVCOS28); + A[ 0] = B[ 0] + B[ 7]; A[ 4] = MPC_MULTIPLY_V((B[ 0] - B[ 7]), INVCOS04); + A[ 1] = B[ 1] + B[ 6]; A[ 5] = MPC_MULTIPLY_V((B[ 1] - B[ 6]), INVCOS12); + A[ 2] = B[ 2] + B[ 5]; A[ 6] = MPC_MULTIPLY_V((B[ 2] - B[ 5]), INVCOS20); + A[ 3] = B[ 3] + B[ 4]; A[ 7] = MPC_MULTIPLY_V((B[ 3] - B[ 4]), INVCOS28); + A[ 8] = B[ 8] + B[15]; A[12] = MPC_MULTIPLY_V((B[ 8] - B[15]), INVCOS04); + A[ 9] = B[ 9] + B[14]; A[13] = MPC_MULTIPLY_V((B[ 9] - B[14]), INVCOS12); + A[10] = B[10] + B[13]; A[14] = MPC_MULTIPLY_V((B[10] - B[13]), INVCOS20); + A[11] = B[11] + B[12]; A[15] = MPC_MULTIPLY_V((B[11] - B[12]), INVCOS28); // 8 adds, 8 subs, 8 muls, 8 shift - B[ 0] = A[ 0] + A[ 3]; - B[ 1] = A[ 1] + A[ 2]; - B[ 2] = MPC_MULTIPLY_V((A[ 0] - A[ 3]), INVCOS08); - B[ 3] = MPC_MULTIPLY_V((A[ 1] - A[ 2]), INVCOS24); - B[ 4] = A[ 4] + A[ 7]; - B[ 5] = A[ 5] + A[ 6]; - B[ 6] = MPC_MULTIPLY_V((A[ 4] - A[ 7]), INVCOS08); - B[ 7] = MPC_MULTIPLY_V((A[ 5] - A[ 6]), INVCOS24); - B[ 8] = A[ 8] + A[11]; - B[ 9] = A[ 9] + A[10]; - B[10] = MPC_MULTIPLY_V((A[ 8] - A[11]), INVCOS08); - B[11] = MPC_MULTIPLY_V((A[ 9] - A[10]), INVCOS24); - B[12] = A[12] + A[15]; - B[13] = A[13] + A[14]; - B[14] = MPC_MULTIPLY_V((A[12] - A[15]), INVCOS08); - B[15] = MPC_MULTIPLY_V((A[13] - A[14]), INVCOS24); - // 8 adds, 8 subs, 8 muls, 8 shift + B[ 0] = A[ 0] + A[ 3]; B[ 2] = MPC_MULTIPLY_V((A[ 0] - A[ 3]), INVCOS08); + B[ 1] = A[ 1] + A[ 2]; B[ 3] = MPC_MULTIPLY_V((A[ 1] - A[ 2]), INVCOS24); + B[ 4] = A[ 4] + A[ 7]; B[ 6] = MPC_MULTIPLY_V((A[ 4] - A[ 7]), INVCOS08); + B[ 5] = A[ 5] + A[ 6]; B[ 7] = MPC_MULTIPLY_V((A[ 5] - A[ 6]), INVCOS24); + B[ 8] = A[ 8] + A[11]; B[10] = MPC_MULTIPLY_V((A[ 8] - A[11]), INVCOS08); + B[ 9] = A[ 9] + A[10]; B[11] = MPC_MULTIPLY_V((A[ 9] - A[10]), INVCOS24); + B[12] = A[12] + A[15]; B[14] = MPC_MULTIPLY_V((A[12] - A[15]), INVCOS08); + B[13] = A[13] + A[14]; B[15] = MPC_MULTIPLY_V((A[13] - A[14]), INVCOS24); + // 8 adds, 8 subs, 8 muls, 8 shift A[ 0] = MPC_V_POSTSCALE((B[ 0] + B[ 1])); A[ 1] = MPC_MULTIPLY_V_POSTSCALE((B[ 0] - B[ 1]), INVCOS16); @@ -453,7 +401,7 @@ // total: 111 adds, 107 subs, 80 muls, 80 shifts } -static inline void +static void mpc_decoder_windowing_D(MPC_SAMPLE_FORMAT * Data, const MPC_SAMPLE_FORMAT * V) { const MPC_SAMPLE_FORMAT *D = (const MPC_SAMPLE_FORMAT *) &Di_opt; @@ -509,9 +457,9 @@ for ( k = 0; k < 32; k++, D += 16, V++ ) { *Data = V[ 0]*D[ 0] + V[ 96]*D[ 1] + V[128]*D[ 2] + V[224]*D[ 3] - + V[256]*D[ 4] + V[352]*D[ 5] + V[384]*D[ 6] + V[480]*D[ 7] - + V[512]*D[ 8] + V[608]*D[ 9] + V[640]*D[10] + V[736]*D[11] - + V[768]*D[12] + V[864]*D[13] + V[896]*D[14] + V[992]*D[15]; + + V[256]*D[ 4] + V[352]*D[ 5] + V[384]*D[ 6] + V[480]*D[ 7] + + V[512]*D[ 8] + V[608]*D[ 9] + V[640]*D[10] + V[736]*D[11] + + V[768]*D[12] + V[864]*D[13] + V[896]*D[14] + V[992]*D[15]; Data += 1; // total: 16 muls, 15 adds } @@ -604,10 +552,14 @@ // 64=64x64-multiply (FIXED_POINT) or float=float*float (!FIXED_POINT) in C for ( k = 0; k < 32; k++, D += 16, V++ ) { - *Data = MPC_MULTIPLY_EX(V[ 0],D[ 0],31) + MPC_MULTIPLY_EX(V[ 96],D[ 1],31) + MPC_MULTIPLY_EX(V[128],D[ 2],31) + MPC_MULTIPLY_EX(V[224],D[ 3],31) - + MPC_MULTIPLY_EX(V[256],D[ 4],31) + MPC_MULTIPLY_EX(V[352],D[ 5],31) + MPC_MULTIPLY_EX(V[384],D[ 6],31) + MPC_MULTIPLY_EX(V[480],D[ 7],31) - + MPC_MULTIPLY_EX(V[512],D[ 8],31) + MPC_MULTIPLY_EX(V[608],D[ 9],31) + MPC_MULTIPLY_EX(V[640],D[10],31) + MPC_MULTIPLY_EX(V[736],D[11],31) - + MPC_MULTIPLY_EX(V[768],D[12],31) + MPC_MULTIPLY_EX(V[864],D[13],31) + MPC_MULTIPLY_EX(V[896],D[14],31) + MPC_MULTIPLY_EX(V[992],D[15],31); + *Data = MPC_MULTIPLY_EX(V[ 0],D[ 0],31) + MPC_MULTIPLY_EX(V[ 96],D[ 1],31) + + MPC_MULTIPLY_EX(V[128],D[ 2],31) + MPC_MULTIPLY_EX(V[224],D[ 3],31) + + MPC_MULTIPLY_EX(V[256],D[ 4],31) + MPC_MULTIPLY_EX(V[352],D[ 5],31) + + MPC_MULTIPLY_EX(V[384],D[ 6],31) + MPC_MULTIPLY_EX(V[480],D[ 7],31) + + MPC_MULTIPLY_EX(V[512],D[ 8],31) + MPC_MULTIPLY_EX(V[608],D[ 9],31) + + MPC_MULTIPLY_EX(V[640],D[10],31) + MPC_MULTIPLY_EX(V[736],D[11],31) + + MPC_MULTIPLY_EX(V[768],D[12],31) + MPC_MULTIPLY_EX(V[864],D[13],31) + + MPC_MULTIPLY_EX(V[896],D[14],31) + MPC_MULTIPLY_EX(V[992],D[15],31); Data += 1; // total: 16 muls, 15 adds, 16 shifts } Index: apps/codecs/libmusepack/musepack.h =================================================================== --- apps/codecs/libmusepack/musepack.h (revision 17507) +++ apps/codecs/libmusepack/musepack.h (working copy) @@ -60,6 +60,7 @@ #if (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) || (CONFIG_CPU == MCF5250) /* PP5022/24 and MCF5250 have 128KB of IRAM */ #define IBSS_ATTR_MPC_LARGE_IRAM IBSS_ATTR +#define ICODE_ATTR_MPC_LARGE_IRAM ICODE_ATTR #else /* other PP's and MCF5249 have 96KB of IRAM */ #define IBSS_ATTR_MPC_LARGE_IRAM