summaryrefslogtreecommitdiffstats
path: root/firmware/target/arm/system-arm.h
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 /firmware/target/arm/system-arm.h
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
Diffstat (limited to 'firmware/target/arm/system-arm.h')
-rw-r--r--firmware/target/arm/system-arm.h24
1 files changed, 18 insertions, 6 deletions
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 */