summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2011-01-30 00:58:45 +0000
committerMichael Sevakis <jethead71@rockbox.org>2011-01-30 00:58:45 +0000
commit18770dac2e560c88daa3ca9944917be561c3548f (patch)
tree5adf8aef7cb7999a6e07ddefcbb9e1d9bf18a15c
parentc0c769c5a86c56c2ab2c9e88515a64da98575182 (diff)
downloadrockbox-18770dac2e560c88daa3ca9944917be561c3548f.tar.gz
rockbox-18770dac2e560c88daa3ca9944917be561c3548f.zip
Use __builtin_constant_p() to select the best byteswapping method: constant or target optimized. Same macro can then be used for constant values and inits as well as non-constant.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29171 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/codecs/aiff_enc.c13
-rw-r--r--apps/codecs/libffmpegFLAC/shndec.c2
-rw-r--r--apps/codecs/wav_enc.c6
-rw-r--r--apps/codecs/wavpack_enc.c6
-rw-r--r--firmware/export/system.h129
-rw-r--r--firmware/target/arm/system-arm.h24
-rw-r--r--firmware/target/coldfire/system-target.h8
-rw-r--r--firmware/target/sh/system-target.h8
8 files changed, 110 insertions, 86 deletions
diff --git a/apps/codecs/aiff_enc.c b/apps/codecs/aiff_enc.c
index cfbc95196f..2d55dff755 100644
--- a/apps/codecs/aiff_enc.c
+++ b/apps/codecs/aiff_enc.c
@@ -56,15 +56,15 @@ struct aiff_header aiff_header =
56 0, /* form_size (*) */ 56 0, /* form_size (*) */
57 { 'A', 'I', 'F', 'F' }, /* aiff_id */ 57 { 'A', 'I', 'F', 'F' }, /* aiff_id */
58 { 'C', 'O', 'M', 'M' }, /* comm_id */ 58 { 'C', 'O', 'M', 'M' }, /* comm_id */
59 H_TO_BE32(18), /* comm_size */ 59 htobe32(18), /* comm_size */
60 0, /* num_channels (*) */ 60 0, /* num_channels (*) */
61 0, /* num_sample_frames (*) */ 61 0, /* num_sample_frames (*) */
62 H_TO_BE16(PCM_DEPTH_BITS), /* sample_size */ 62 htobe16(PCM_DEPTH_BITS), /* sample_size */
63 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* sample_rate (*) */ 63 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* sample_rate (*) */
64 { 'S', 'S', 'N', 'D' }, /* ssnd_id */ 64 { 'S', 'S', 'N', 'D' }, /* ssnd_id */
65 0, /* ssnd_size (*) */ 65 0, /* ssnd_size (*) */
66 H_TO_BE32(0), /* offset */ 66 htobe32(0), /* offset */
67 H_TO_BE32(0), /* block_size */ 67 htobe32(0), /* block_size */
68}; 68};
69 69
70/* (*) updated when finalizing file */ 70/* (*) updated when finalizing file */
@@ -96,7 +96,10 @@ STATICIRAM void uint32_h_to_ieee754_extended_be(uint8_t f[10], uint32_t l)
96 f[1] = (uint8_t)exp; 96 f[1] = (uint8_t)exp;
97 /* mantissa is value left justified with most significant non-zero 97 /* mantissa is value left justified with most significant non-zero
98 bit stored in bit 63 - bits 0-63 */ 98 bit stored in bit 63 - bits 0-63 */
99 *(uint32_t *)&f[2] = htobe32(l); 99 f[2] = (uint8_t)(l >> 24);
100 f[3] = (uint8_t)(l >> 16);
101 f[4] = (uint8_t)(l >> 8);
102 f[5] = (uint8_t)(l >> 0);
100} /* uint32_h_to_ieee754_extended_be */ 103} /* uint32_h_to_ieee754_extended_be */
101 104
102/* called version often - inline */ 105/* called version often - inline */
diff --git a/apps/codecs/libffmpegFLAC/shndec.c b/apps/codecs/libffmpegFLAC/shndec.c
index 78914f6252..40e7211b87 100644
--- a/apps/codecs/libffmpegFLAC/shndec.c
+++ b/apps/codecs/libffmpegFLAC/shndec.c
@@ -60,7 +60,7 @@
60#define get_le32(gb) bswap_32(get_bits_long(gb, 32)) 60#define get_le32(gb) bswap_32(get_bits_long(gb, 32))
61 61
62/* converts fourcc string to int */ 62/* converts fourcc string to int */
63static int ff_get_fourcc(const char *s){ 63static unsigned int ff_get_fourcc(const char *s){
64 //assert( strlen(s)==4 ); 64 //assert( strlen(s)==4 );
65 return (s[0]) + (s[1]<<8) + (s[2]<<16) + (s[3]<<24); 65 return (s[0]) + (s[1]<<8) + (s[2]<<16) + (s[3]<<24);
66} 66}
diff --git a/apps/codecs/wav_enc.c b/apps/codecs/wav_enc.c
index b11c3a2e99..193181d825 100644
--- a/apps/codecs/wav_enc.c
+++ b/apps/codecs/wav_enc.c
@@ -71,14 +71,14 @@ static const struct riff_header riff_header =
71 /* format header */ 71 /* format header */
72 { 'W', 'A', 'V', 'E' }, /* format */ 72 { 'W', 'A', 'V', 'E' }, /* format */
73 { 'f', 'm', 't', ' ' }, /* format_id */ 73 { 'f', 'm', 't', ' ' }, /* format_id */
74 H_TO_LE32(16), /* format_size */ 74 htole32(16), /* format_size */
75 /* format data */ 75 /* format data */
76 H_TO_LE16(1), /* audio_format */ 76 htole16(1), /* audio_format */
77 0, /* num_channels (*) */ 77 0, /* num_channels (*) */
78 0, /* sample_rate (*) */ 78 0, /* sample_rate (*) */
79 0, /* byte_rate (*) */ 79 0, /* byte_rate (*) */
80 0, /* block_align (*) */ 80 0, /* block_align (*) */
81 H_TO_LE16(PCM_DEPTH_BITS), /* bits_per_sample */ 81 htole16(PCM_DEPTH_BITS), /* bits_per_sample */
82 /* data header */ 82 /* data header */
83 { 'd', 'a', 't', 'a' }, /* data_id */ 83 { 'd', 'a', 't', 'a' }, /* data_id */
84 0 /* data_size (*) */ 84 0 /* data_size (*) */
diff --git a/apps/codecs/wavpack_enc.c b/apps/codecs/wavpack_enc.c
index 652a320546..66263cf1a1 100644
--- a/apps/codecs/wavpack_enc.c
+++ b/apps/codecs/wavpack_enc.c
@@ -85,14 +85,14 @@ static const struct riff_header riff_header =
85 /* format header */ 85 /* format header */
86 { 'W', 'A', 'V', 'E' }, /* format */ 86 { 'W', 'A', 'V', 'E' }, /* format */
87 { 'f', 'm', 't', ' ' }, /* format_id */ 87 { 'f', 'm', 't', ' ' }, /* format_id */
88 H_TO_LE32(16), /* format_size */ 88 htole32(16), /* format_size */
89 /* format data */ 89 /* format data */
90 H_TO_LE16(1), /* audio_format */ 90 htole16(1), /* audio_format */
91 0, /* num_channels (*) */ 91 0, /* num_channels (*) */
92 0, /* sample_rate (*) */ 92 0, /* sample_rate (*) */
93 0, /* byte_rate (*) */ 93 0, /* byte_rate (*) */
94 0, /* block_align (*) */ 94 0, /* block_align (*) */
95 H_TO_LE16(PCM_DEPTH_BITS), /* bits_per_sample */ 95 htole16(PCM_DEPTH_BITS), /* bits_per_sample */
96 /* data header */ 96 /* data header */
97 { 'd', 'a', 't', 'a' }, /* data_id */ 97 { 'd', 'a', 't', 'a' }, /* data_id */
98 0 /* data_size (*) */ 98 0 /* data_size (*) */
diff --git a/firmware/export/system.h b/firmware/export/system.h
index 4a5dcf0ea3..b246d154a4 100644
--- a/firmware/export/system.h
+++ b/firmware/export/system.h
@@ -137,61 +137,6 @@ int get_cpu_boost_counter(void);
137#undef htobe32 137#undef htobe32
138#endif 138#endif
139 139
140/* live endianness conversion */
141#ifdef ROCKBOX_LITTLE_ENDIAN
142#define letoh16(x) (x)
143#define letoh32(x) (x)
144#define htole16(x) (x)
145#define htole32(x) (x)
146#define betoh16(x) swap16(x)
147#define betoh32(x) swap32(x)
148#define htobe16(x) swap16(x)
149#define htobe32(x) swap32(x)
150#define swap_odd_even_be32(x) (x)
151#define swap_odd_even_le32(x) swap_odd_even32(x)
152#else
153#define letoh16(x) swap16(x)
154#define letoh32(x) swap32(x)
155#define htole16(x) swap16(x)
156#define htole32(x) swap32(x)
157#define betoh16(x) (x)
158#define betoh32(x) (x)
159#define htobe16(x) (x)
160#define htobe32(x) (x)
161#define swap_odd_even_be32(x) swap_odd_even32(x)
162#define swap_odd_even_le32(x) (x)
163#endif
164
165
166/* static endianness conversion */
167#define SWAP_16(x) ((typeof(x))(unsigned short)(((unsigned short)(x) >> 8) | \
168 ((unsigned short)(x) << 8)))
169
170#define SWAP_32(x) ((typeof(x))(unsigned long)( ((unsigned long)(x) >> 24) | \
171 (((unsigned long)(x) & 0xff0000ul) >> 8) | \
172 (((unsigned long)(x) & 0xff00ul) << 8) | \
173 ((unsigned long)(x) << 24)))
174
175#ifdef ROCKBOX_LITTLE_ENDIAN
176#define LE_TO_H16(x) (x)
177#define LE_TO_H32(x) (x)
178#define H_TO_LE16(x) (x)
179#define H_TO_LE32(x) (x)
180#define BE_TO_H16(x) SWAP_16(x)
181#define BE_TO_H32(x) SWAP_32(x)
182#define H_TO_BE16(x) SWAP_16(x)
183#define H_TO_BE32(x) SWAP_32(x)
184#else
185#define LE_TO_H16(x) SWAP_16(x)
186#define LE_TO_H32(x) SWAP_32(x)
187#define H_TO_LE16(x) SWAP_16(x)
188#define H_TO_LE32(x) SWAP_32(x)
189#define BE_TO_H16(x) (x)
190#define BE_TO_H32(x) (x)
191#define H_TO_BE16(x) (x)
192#define H_TO_BE32(x) (x)
193#endif
194
195/* Get the byte offset of a type's member */ 140/* Get the byte offset of a type's member */
196#define OFFSETOF(type, membername) ((off_t)&((type *)0)->membername) 141#define OFFSETOF(type, membername) ((off_t)&((type *)0)->membername)
197 142
@@ -237,7 +182,7 @@ enum {
237#endif 182#endif
238 183
239#ifdef NEED_GENERIC_BYTESWAPS 184#ifdef NEED_GENERIC_BYTESWAPS
240static inline uint16_t swap16(uint16_t value) 185static inline uint16_t swap16_hw(uint16_t value)
241 /* 186 /*
242 result[15..8] = value[ 7..0]; 187 result[15..8] = value[ 7..0];
243 result[ 7..0] = value[15..8]; 188 result[ 7..0] = value[15..8];
@@ -246,7 +191,7 @@ static inline uint16_t swap16(uint16_t value)
246 return (value >> 8) | (value << 8); 191 return (value >> 8) | (value << 8);
247} 192}
248 193
249static inline uint32_t swap32(uint32_t value) 194static inline uint32_t swap32_hw(uint32_t value)
250 /* 195 /*
251 result[31..24] = value[ 7.. 0]; 196 result[31..24] = value[ 7.. 0];
252 result[23..16] = value[15.. 8]; 197 result[23..16] = value[15.. 8];
@@ -254,12 +199,12 @@ static inline uint32_t swap32(uint32_t value)
254 result[ 7.. 0] = value[31..24]; 199 result[ 7.. 0] = value[31..24];
255 */ 200 */
256{ 201{
257 uint32_t hi = swap16(value >> 16); 202 uint32_t hi = swap16_hw(value >> 16);
258 uint32_t lo = swap16(value & 0xffff); 203 uint32_t lo = swap16_hw(value & 0xffff);
259 return (lo << 16) | hi; 204 return (lo << 16) | hi;
260} 205}
261 206
262static inline uint32_t swap_odd_even32(uint32_t value) 207static inline uint32_t swap_odd_even32_hw(uint32_t value)
263{ 208{
264 /* 209 /*
265 result[31..24],[15.. 8] = value[23..16],[ 7.. 0] 210 result[31..24],[15.. 8] = value[23..16],[ 7.. 0]
@@ -269,8 +214,72 @@ static inline uint32_t swap_odd_even32(uint32_t value)
269 return (t >> 8) | ((t ^ value) << 8); 214 return (t >> 8) | ((t ^ value) << 8);
270} 215}
271 216
217static inline uint32_t swaw32_hw(uint32_t value)
218{
219 /*
220 result[31..16] = value[15.. 0];
221 result[15.. 0] = value[31..16];
222 */
223 return (value >> 16) | (value << 16);
224}
225
272#endif /* NEED_GENERIC_BYTESWAPS */ 226#endif /* NEED_GENERIC_BYTESWAPS */
273 227
228/* static endianness conversion */
229#define SWAP16_CONST(x) \
230 ((typeof(x))( ((uint16_t)(x) >> 8) | ((uint16_t)(x) << 8) ))
231
232#define SWAP32_CONST(x) \
233 ((typeof(x))( ((uint32_t)(x) >> 24) | \
234 (((uint32_t)(x) & 0xff0000) >> 8) | \
235 (((uint32_t)(x) & 0xff00) << 8) | \
236 ((uint32_t)(x) << 24) ))
237
238#define SWAP_ODD_EVEN32_CONST(x) \
239 ((typeof(x))( ((uint32_t)SWAP16_CONST((uint32_t)(x) >> 16) << 16) | \
240 SWAP16_CONST((uint32_t)(x))) )
241
242#define SWAW32_CONST(x) \
243 ((typeof(x))( ((uint32_t)(x) << 16) | ((uint32_t)(x) >> 16) ))
244
245/* Select best method based upon whether x is a constant expression */
246#define swap16(x) \
247 ( __builtin_constant_p(x) ? SWAP16_CONST(x) : (typeof(x))swap16_hw(x) )
248
249#define swap32(x) \
250 ( __builtin_constant_p(x) ? SWAP32_CONST(x) : (typeof(x))swap32_hw(x) )
251
252#define swap_odd_even32(x) \
253 ( __builtin_constant_p(x) ? SWAP_ODD_EVEN32_CONST(x) : (typeof(x))swap_odd_even32_hw(x) )
254
255#define swaw32(x) \
256 ( __builtin_constant_p(x) ? SWAW32_CONST(x) : (typeof(x))swaw32_hw(x) )
257
258
259#ifdef ROCKBOX_LITTLE_ENDIAN
260#define letoh16(x) (x)
261#define letoh32(x) (x)
262#define htole16(x) (x)
263#define htole32(x) (x)
264#define betoh16(x) swap16(x)
265#define betoh32(x) swap32(x)
266#define htobe16(x) swap16(x)
267#define htobe32(x) swap32(x)
268#define swap_odd_even_be32(x) (x)
269#define swap_odd_even_le32(x) swap_odd_even32(x)
270#else
271#define letoh16(x) swap16(x)
272#define letoh32(x) swap32(x)
273#define htole16(x) swap16(x)
274#define htole32(x) swap32(x)
275#define betoh16(x) (x)
276#define betoh32(x) (x)
277#define htobe16(x) (x)
278#define htobe32(x) (x)
279#define swap_odd_even_be32(x) swap_odd_even32(x)
280#define swap_odd_even_le32(x) (x)
281#endif
282
274#ifndef BIT_N 283#ifndef BIT_N
275#define BIT_N(n) (1U << (n)) 284#define BIT_N(n) (1U << (n))
276#endif 285#endif
diff --git a/firmware/target/arm/system-arm.h b/firmware/target/arm/system-arm.h
index 0608f50a02..e77b786866 100644
--- a/firmware/target/arm/system-arm.h
+++ b/firmware/target/arm/system-arm.h
@@ -90,7 +90,7 @@ static inline void restore_interrupt(int cpsr)
90/* ARM_ARCH version section for architecture*/ 90/* ARM_ARCH version section for architecture*/
91 91
92#if ARM_ARCH >= 6 92#if ARM_ARCH >= 6
93static inline uint16_t swap16(uint16_t value) 93static inline uint16_t swap16_hw(uint16_t value)
94 /* 94 /*
95 result[15..8] = value[ 7..0]; 95 result[15..8] = value[ 7..0];
96 result[ 7..0] = value[15..8]; 96 result[ 7..0] = value[15..8];
@@ -102,7 +102,7 @@ static inline uint16_t swap16(uint16_t value)
102 return retval; 102 return retval;
103} 103}
104 104
105static inline uint32_t swap32(uint32_t value) 105static inline uint32_t swap32_hw(uint32_t value)
106 /* 106 /*
107 result[31..24] = value[ 7.. 0]; 107 result[31..24] = value[ 7.. 0];
108 result[23..16] = value[15.. 8]; 108 result[23..16] = value[15.. 8];
@@ -116,7 +116,7 @@ static inline uint32_t swap32(uint32_t value)
116 return retval; 116 return retval;
117} 117}
118 118
119static inline uint32_t swap_odd_even32(uint32_t value) 119static inline uint32_t swap_odd_even32_hw(uint32_t value)
120{ 120{
121 /* 121 /*
122 result[31..24],[15.. 8] = value[23..16],[ 7.. 0] 122 result[31..24],[15.. 8] = value[23..16],[ 7.. 0]
@@ -190,7 +190,7 @@ static inline int disable_interrupt_save(int mask)
190 190
191#else /* ARM_ARCH < 6 */ 191#else /* ARM_ARCH < 6 */
192 192
193static inline uint16_t swap16(uint16_t value) 193static inline uint16_t swap16_hw(uint16_t value)
194 /* 194 /*
195 result[15..8] = value[ 7..0]; 195 result[15..8] = value[ 7..0];
196 result[ 7..0] = value[15..8]; 196 result[ 7..0] = value[15..8];
@@ -199,7 +199,7 @@ static inline uint16_t swap16(uint16_t value)
199 return (value >> 8) | (value << 8); 199 return (value >> 8) | (value << 8);
200} 200}
201 201
202static inline uint32_t swap32(uint32_t value) 202static inline uint32_t swap32_hw(uint32_t value)
203 /* 203 /*
204 result[31..24] = value[ 7.. 0]; 204 result[31..24] = value[ 7.. 0];
205 result[23..16] = value[15.. 8]; 205 result[23..16] = value[15.. 8];
@@ -218,7 +218,7 @@ static inline uint32_t swap32(uint32_t value)
218 return value; 218 return value;
219} 219}
220 220
221static inline uint32_t swap_odd_even32(uint32_t value) 221static inline uint32_t swap_odd_even32_hw(uint32_t value)
222{ 222{
223 /* 223 /*
224 result[31..24],[15.. 8] = value[23..16],[ 7.. 0] 224 result[31..24],[15.. 8] = value[23..16],[ 7.. 0]
@@ -272,4 +272,16 @@ static inline int disable_interrupt_save(int mask)
272 272
273#endif /* ARM_ARCH */ 273#endif /* ARM_ARCH */
274 274
275static inline uint32_t swaw32_hw(uint32_t value)
276{
277 /*
278 result[31..16] = value[15.. 0];
279 result[15.. 0] = value[31..16];
280 */
281 uint32_t retval;
282 asm volatile ("mov %0, %1, ror #16" :
283 "=r"(retval) : "r"(value));
284 return retval;
285}
286
275#endif /* SYSTEM_ARM_H */ 287#endif /* SYSTEM_ARM_H */
diff --git a/firmware/target/coldfire/system-target.h b/firmware/target/coldfire/system-target.h
index 2de8fd06c2..d1a2a1f115 100644
--- a/firmware/target/coldfire/system-target.h
+++ b/firmware/target/coldfire/system-target.h
@@ -132,7 +132,7 @@ static inline void restore_irq(int oldlevel)
132 asm volatile ("move.w %0, %%sr" : : "d"(oldlevel)); 132 asm volatile ("move.w %0, %%sr" : : "d"(oldlevel));
133} 133}
134 134
135static inline uint16_t swap16(uint16_t value) 135static inline uint16_t swap16_hw(uint16_t value)
136 /* 136 /*
137 result[15..8] = value[ 7..0]; 137 result[15..8] = value[ 7..0];
138 result[ 7..0] = value[15..8]; 138 result[ 7..0] = value[15..8];
@@ -141,7 +141,7 @@ static inline uint16_t swap16(uint16_t value)
141 return (value >> 8) | (value << 8); 141 return (value >> 8) | (value << 8);
142} 142}
143 143
144static inline uint32_t SWAW32(uint32_t value) 144static inline uint32_t swaw32_hw(uint32_t value)
145 /* 145 /*
146 result[31..16] = value[15.. 0]; 146 result[31..16] = value[15.. 0];
147 result[15.. 0] = value[31..16]; 147 result[15.. 0] = value[31..16];
@@ -151,7 +151,7 @@ static inline uint32_t SWAW32(uint32_t value)
151 return value; 151 return value;
152} 152}
153 153
154static inline uint32_t swap32(uint32_t value) 154static inline uint32_t swap32_hw(uint32_t value)
155 /* 155 /*
156 result[31..24] = value[ 7.. 0]; 156 result[31..24] = value[ 7.. 0];
157 result[23..16] = value[15.. 8]; 157 result[23..16] = value[15.. 8];
@@ -174,7 +174,7 @@ static inline uint32_t swap32(uint32_t value)
174 return value; 174 return value;
175} 175}
176 176
177static inline uint32_t swap_odd_even32(uint32_t value) 177static inline uint32_t swap_odd_even32_hw(uint32_t value)
178{ 178{
179 /* 179 /*
180 result[31..24],[15.. 8] = value[23..16],[ 7.. 0] 180 result[31..24],[15.. 8] = value[23..16],[ 7.. 0]
diff --git a/firmware/target/sh/system-target.h b/firmware/target/sh/system-target.h
index a84ce07af9..1693a132a6 100644
--- a/firmware/target/sh/system-target.h
+++ b/firmware/target/sh/system-target.h
@@ -77,7 +77,7 @@ static inline void enable_irq(void)
77#define restore_irq(i) \ 77#define restore_irq(i) \
78 ((void)set_irq_level(i)) 78 ((void)set_irq_level(i))
79 79
80static inline uint16_t swap16(uint16_t value) 80static inline uint16_t swap16_hw(uint16_t value)
81 /* 81 /*
82 result[15..8] = value[ 7..0]; 82 result[15..8] = value[ 7..0];
83 result[ 7..0] = value[15..8]; 83 result[ 7..0] = value[15..8];
@@ -88,7 +88,7 @@ static inline uint16_t swap16(uint16_t value)
88 return result; 88 return result;
89} 89}
90 90
91static inline uint32_t SWAW32(uint32_t value) 91static inline uint32_t swaw32_hw(uint32_t value)
92 /* 92 /*
93 result[31..16] = value[15.. 0]; 93 result[31..16] = value[15.. 0];
94 result[15.. 0] = value[31..16]; 94 result[15.. 0] = value[31..16];
@@ -99,7 +99,7 @@ static inline uint32_t SWAW32(uint32_t value)
99 return result; 99 return result;
100} 100}
101 101
102static inline uint32_t swap32(uint32_t value) 102static inline uint32_t swap32_hw(uint32_t value)
103 /* 103 /*
104 result[31..24] = value[ 7.. 0]; 104 result[31..24] = value[ 7.. 0];
105 result[23..16] = value[15.. 8]; 105 result[23..16] = value[15.. 8];
@@ -113,7 +113,7 @@ static inline uint32_t swap32(uint32_t value)
113 return value; 113 return value;
114} 114}
115 115
116static inline uint32_t swap_odd_even32(uint32_t value) 116static inline uint32_t swap_odd_even32_hw(uint32_t value)
117{ 117{
118 /* 118 /*
119 result[31..24],[15.. 8] = value[23..16],[ 7.. 0] 119 result[31..24],[15.. 8] = value[23..16],[ 7.. 0]