From 18770dac2e560c88daa3ca9944917be561c3548f Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Sun, 30 Jan 2011 00:58:45 +0000 Subject: 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 --- firmware/target/arm/system-arm.h | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'firmware/target/arm') 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) /* ARM_ARCH version section for architecture*/ #if ARM_ARCH >= 6 -static inline uint16_t swap16(uint16_t value) +static inline uint16_t swap16_hw(uint16_t value) /* result[15..8] = value[ 7..0]; result[ 7..0] = value[15..8]; @@ -102,7 +102,7 @@ static inline uint16_t swap16(uint16_t value) return retval; } -static inline uint32_t swap32(uint32_t value) +static inline uint32_t swap32_hw(uint32_t value) /* result[31..24] = value[ 7.. 0]; result[23..16] = value[15.. 8]; @@ -116,7 +116,7 @@ static inline uint32_t swap32(uint32_t value) return retval; } -static inline uint32_t swap_odd_even32(uint32_t value) +static inline uint32_t swap_odd_even32_hw(uint32_t value) { /* result[31..24],[15.. 8] = value[23..16],[ 7.. 0] @@ -190,7 +190,7 @@ static inline int disable_interrupt_save(int mask) #else /* ARM_ARCH < 6 */ -static inline uint16_t swap16(uint16_t value) +static inline uint16_t swap16_hw(uint16_t value) /* result[15..8] = value[ 7..0]; result[ 7..0] = value[15..8]; @@ -199,7 +199,7 @@ static inline uint16_t swap16(uint16_t value) return (value >> 8) | (value << 8); } -static inline uint32_t swap32(uint32_t value) +static inline uint32_t swap32_hw(uint32_t value) /* result[31..24] = value[ 7.. 0]; result[23..16] = value[15.. 8]; @@ -218,7 +218,7 @@ static inline uint32_t swap32(uint32_t value) return value; } -static inline uint32_t swap_odd_even32(uint32_t value) +static inline uint32_t swap_odd_even32_hw(uint32_t value) { /* result[31..24],[15.. 8] = value[23..16],[ 7.. 0] @@ -272,4 +272,16 @@ static inline int disable_interrupt_save(int mask) #endif /* ARM_ARCH */ +static inline uint32_t swaw32_hw(uint32_t value) +{ + /* + result[31..16] = value[15.. 0]; + result[15.. 0] = value[31..16]; + */ + uint32_t retval; + asm volatile ("mov %0, %1, ror #16" : + "=r"(retval) : "r"(value)); + return retval; +} + #endif /* SYSTEM_ARM_H */ -- cgit v1.2.3