diff options
author | Nils Wallménius <nils@rockbox.org> | 2009-11-29 18:11:49 +0000 |
---|---|---|
committer | Nils Wallménius <nils@rockbox.org> | 2009-11-29 18:11:49 +0000 |
commit | 13f08d70fd5ba237ae53aad1de8bb3d613010246 (patch) | |
tree | ab159172b0c4a8cf13f07f16e28008da4d732dfc /apps/codecs/libspc/spc_codec.h | |
parent | 685ca2672e5842fe185c8f12da6bf108fd8f074f (diff) | |
download | rockbox-13f08d70fd5ba237ae53aad1de8bb3d613010246.tar.gz rockbox-13f08d70fd5ba237ae53aad1de8bb3d613010246.zip |
Enable strict aliasing optimizations for codecs on gcc versions >= 4.0, fix alising violations that this uncovered, gives small speedups for most codecs, FS#10801
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23784 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/libspc/spc_codec.h')
-rw-r--r-- | apps/codecs/libspc/spc_codec.h | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/apps/codecs/libspc/spc_codec.h b/apps/codecs/libspc/spc_codec.h index 923645b4aa..cf72f90af4 100644 --- a/apps/codecs/libspc/spc_codec.h +++ b/apps/codecs/libspc/spc_codec.h | |||
@@ -137,16 +137,15 @@ static inline void set_le16( void* p, unsigned n ) | |||
137 | } | 137 | } |
138 | 138 | ||
139 | #define GET_LE16( addr ) get_le16( addr ) | 139 | #define GET_LE16( addr ) get_le16( addr ) |
140 | #define GET_LE16A( addr ) get_le16( addr ) | ||
140 | #define SET_LE16( addr, data ) set_le16( addr, data ) | 141 | #define SET_LE16( addr, data ) set_le16( addr, data ) |
141 | #define INT16A( addr ) (*(uint16_t*) (addr)) | 142 | #define INT16A( addr ) (*(uint16_t*) (addr)) |
142 | #define INT16SA( addr ) (*(int16_t*) (addr)) | 143 | #define INT16SA( addr ) (*(int16_t*) (addr)) |
143 | 144 | ||
144 | #ifdef ROCKBOX_LITTLE_ENDIAN | 145 | #ifdef ROCKBOX_LITTLE_ENDIAN |
145 | #define GET_LE16A( addr ) (*(uint16_t*) (addr)) | ||
146 | #define GET_LE16SA( addr ) (*( int16_t*) (addr)) | 146 | #define GET_LE16SA( addr ) (*( int16_t*) (addr)) |
147 | #define SET_LE16A( addr, data ) (void) (*(uint16_t*) (addr) = (data)) | 147 | #define SET_LE16A( addr, data ) (void) (*(uint16_t*) (addr) = (data)) |
148 | #else | 148 | #else |
149 | #define GET_LE16A( addr ) get_le16 ( addr ) | ||
150 | #define GET_LE16SA( addr ) get_le16s( addr ) | 149 | #define GET_LE16SA( addr ) get_le16s( addr ) |
151 | #define SET_LE16A( addr, data ) set_le16 ( addr, data ) | 150 | #define SET_LE16A( addr, data ) set_le16 ( addr, data ) |
152 | #endif | 151 | #endif |
@@ -166,13 +165,22 @@ struct cpu_regs_t | |||
166 | uint8_t sp; | 165 | uint8_t sp; |
167 | }; | 166 | }; |
168 | 167 | ||
168 | struct src_dir | ||
169 | { | ||
170 | uint16_t start; | ||
171 | uint16_t loop; | ||
172 | }; | ||
173 | |||
169 | struct cpu_ram_t | 174 | struct cpu_ram_t |
170 | { | 175 | { |
171 | union { | 176 | union { |
172 | uint8_t padding1 [0x100]; | 177 | uint8_t padding1 [0x100]; |
173 | uint16_t align; | 178 | uint16_t align; |
174 | } padding1 [1]; | 179 | } padding1 [1]; |
175 | uint8_t ram [0x10000]; | 180 | union { |
181 | uint8_t ram [0x10000]; | ||
182 | struct src_dir sd [0x10000/sizeof(struct src_dir)]; | ||
183 | }; | ||
176 | uint8_t padding2 [0x100]; | 184 | uint8_t padding2 [0x100]; |
177 | }; | 185 | }; |
178 | 186 | ||
@@ -339,12 +347,6 @@ struct Spc_Dsp | |||
339 | #endif | 347 | #endif |
340 | }; | 348 | }; |
341 | 349 | ||
342 | struct src_dir | ||
343 | { | ||
344 | char start [2]; | ||
345 | char loop [2]; | ||
346 | }; | ||
347 | |||
348 | void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf ) ICODE_ATTR; | 350 | void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf ) ICODE_ATTR; |
349 | void DSP_reset( struct Spc_Dsp* this ); | 351 | void DSP_reset( struct Spc_Dsp* this ); |
350 | 352 | ||