diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2011-01-30 00:58:45 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2011-01-30 00:58:45 +0000 |
commit | 18770dac2e560c88daa3ca9944917be561c3548f (patch) | |
tree | 5adf8aef7cb7999a6e07ddefcbb9e1d9bf18a15c /firmware | |
parent | c0c769c5a86c56c2ab2c9e88515a64da98575182 (diff) | |
download | rockbox-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
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/export/system.h | 129 | ||||
-rw-r--r-- | firmware/target/arm/system-arm.h | 24 | ||||
-rw-r--r-- | firmware/target/coldfire/system-target.h | 8 | ||||
-rw-r--r-- | firmware/target/sh/system-target.h | 8 |
4 files changed, 95 insertions, 74 deletions
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 |
240 | static inline uint16_t swap16(uint16_t value) | 185 | static 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 | ||
249 | static inline uint32_t swap32(uint32_t value) | 194 | static 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 | ||
262 | static inline uint32_t swap_odd_even32(uint32_t value) | 207 | static 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 | ||
217 | static 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 |
93 | static inline uint16_t swap16(uint16_t value) | 93 | static 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 | ||
105 | static inline uint32_t swap32(uint32_t value) | 105 | static 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 | ||
119 | static inline uint32_t swap_odd_even32(uint32_t value) | 119 | static 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 | ||
193 | static inline uint16_t swap16(uint16_t value) | 193 | static 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 | ||
202 | static inline uint32_t swap32(uint32_t value) | 202 | static 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 | ||
221 | static inline uint32_t swap_odd_even32(uint32_t value) | 221 | static 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 | ||
275 | static 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 | ||
135 | static inline uint16_t swap16(uint16_t value) | 135 | static 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 | ||
144 | static inline uint32_t SWAW32(uint32_t value) | 144 | static 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 | ||
154 | static inline uint32_t swap32(uint32_t value) | 154 | static 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 | ||
177 | static inline uint32_t swap_odd_even32(uint32_t value) | 177 | static 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 | ||
80 | static inline uint16_t swap16(uint16_t value) | 80 | static 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 | ||
91 | static inline uint32_t SWAW32(uint32_t value) | 91 | static 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 | ||
102 | static inline uint32_t swap32(uint32_t value) | 102 | static 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 | ||
116 | static inline uint32_t swap_odd_even32(uint32_t value) | 116 | static 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] |