From 14698f5a20fe67606df35ccf279b02c81f4959d5 Mon Sep 17 00:00:00 2001 From: Andree Buschmann Date: Wed, 14 May 2008 19:49:01 +0000 Subject: Musepack performance optimization for PP5022/PP5024/MCF5250 targets. Use IRAM for internal sample buffers and lookup tables. Speeds up decoding by ~7% on PP5022/PP5024 (Sansa: c200, e200 + iPod mini2G, nano, video) and by ~27% on MCF5250 (iaudio m5, x5). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17507 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/libmusepack/mpc_decoder.c | 34 +++++++++++++++++----------------- apps/codecs/libmusepack/musepack.h | 10 ++++++++++ 2 files changed, 27 insertions(+), 17 deletions(-) (limited to 'apps/codecs/libmusepack') diff --git a/apps/codecs/libmusepack/mpc_decoder.c b/apps/codecs/libmusepack/mpc_decoder.c index c41b17c54c..f7687c5bad 100644 --- a/apps/codecs/libmusepack/mpc_decoder.c +++ b/apps/codecs/libmusepack/mpc_decoder.c @@ -75,21 +75,21 @@ extern const HuffmanTyp mpc_table_Region_C [ 4]; #define HUFFMAN_DECODE_FASTEST(d,a,b,c) mpc_decoder_huffman_decode_fastest ( (d), (a), (b), 32-(c) ) #define HUFFMAN_DECODE_FASTERER(d,a,b,c) mpc_decoder_huffman_decode_fasterer ( (d), (a), (b), 32-(c) ) -mpc_uint8_t LUT1_0 [1<< 6]; -mpc_uint8_t LUT1_1 [1<< 9]; // 576 Bytes -mpc_uint8_t LUT2_0 [1<< 7]; -mpc_uint8_t LUT2_1 [1<<10]; // 1152 Bytes -mpc_uint8_t LUT3_0 [1<< 4]; -mpc_uint8_t LUT3_1 [1<< 5]; // 48 Bytes -mpc_uint8_t LUT4_0 [1<< 4]; -mpc_uint8_t LUT4_1 [1<< 5]; // 48 Bytes -mpc_uint8_t LUT5_0 [1<< 6]; -mpc_uint8_t LUT5_1 [1<< 8]; // 320 Bytes -mpc_uint8_t LUT6_0 [1<< 7]; -mpc_uint8_t LUT6_1 [1<< 7]; // 256 Bytes -mpc_uint8_t LUT7_0 [1<< 8]; -mpc_uint8_t LUT7_1 [1<< 8]; // 512 Bytes -mpc_uint8_t LUTDSCF [1<< 6]; // 64 Bytes = 2976 Bytes +mpc_uint8_t LUT1_0 [1<< 6] IBSS_ATTR_MPC_LARGE_IRAM; +mpc_uint8_t LUT1_1 [1<< 9] IBSS_ATTR_MPC_LARGE_IRAM; // 576 Bytes +mpc_uint8_t LUT2_0 [1<< 7] IBSS_ATTR_MPC_LARGE_IRAM; +mpc_uint8_t LUT2_1 [1<<10] IBSS_ATTR_MPC_LARGE_IRAM; // 1152 Bytes +mpc_uint8_t LUT3_0 [1<< 4] IBSS_ATTR_MPC_LARGE_IRAM; +mpc_uint8_t LUT3_1 [1<< 5] IBSS_ATTR_MPC_LARGE_IRAM; // 48 Bytes +mpc_uint8_t LUT4_0 [1<< 4] IBSS_ATTR_MPC_LARGE_IRAM; +mpc_uint8_t LUT4_1 [1<< 5] IBSS_ATTR_MPC_LARGE_IRAM; // 48 Bytes +mpc_uint8_t LUT5_0 [1<< 6] IBSS_ATTR_MPC_LARGE_IRAM; +mpc_uint8_t LUT5_1 [1<< 8] IBSS_ATTR_MPC_LARGE_IRAM; // 320 Bytes +mpc_uint8_t LUT6_0 [1<< 7] IBSS_ATTR_MPC_LARGE_IRAM; +mpc_uint8_t LUT6_1 [1<< 7] IBSS_ATTR_MPC_LARGE_IRAM; // 256 Bytes +mpc_uint8_t LUT7_0 [1<< 8] IBSS_ATTR_MPC_LARGE_IRAM; +mpc_uint8_t LUT7_1 [1<< 8] IBSS_ATTR_MPC_LARGE_IRAM; // 512 Bytes +mpc_uint8_t LUTDSCF [1<< 6] IBSS_ATTR_MPC_LARGE_IRAM; // 64 Bytes = 2976 Bytes //------------------------------------------------------------------------------ // types @@ -119,8 +119,8 @@ static inline mpc_int32_t mpc_decoder_huffman_decode_fastest(mpc_decoder *d, con static void mpc_move_next(mpc_decoder *d); mpc_uint32_t Speicher[MPC_DECODER_MEMSIZE]; -MPC_SAMPLE_FORMAT Y_L[36][32]; -MPC_SAMPLE_FORMAT Y_R[36][32]; +MPC_SAMPLE_FORMAT Y_L[36][32] IBSS_ATTR_MPC_LARGE_IRAM; +MPC_SAMPLE_FORMAT Y_R[36][32] IBSS_ATTR_MPC_LARGE_IRAM; //------------------------------------------------------------------------------ // utility functions diff --git a/apps/codecs/libmusepack/musepack.h b/apps/codecs/libmusepack/musepack.h index 8233f21f91..5d1ad0de3f 100644 --- a/apps/codecs/libmusepack/musepack.h +++ b/apps/codecs/libmusepack/musepack.h @@ -56,6 +56,16 @@ extern "C" { #define IBSS_ATTR_MPC_SAMPLE_BUF IBSS_ATTR #endif +#ifndef IBSS_ATTR_MPC_LARGE_IRAM +#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 +#else +/* other PP's and MCF5249 have 96KB of IRAM */ +#define IBSS_ATTR_MPC_LARGE_IRAM +#endif +#endif + #ifdef ROCKBOX_LITTLE_ENDIAN #define MPC_LITTLE_ENDIAN #endif -- cgit v1.2.3