diff options
author | Mike Pall <mike> | 2011-04-28 12:33:31 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2011-04-28 12:33:31 +0200 |
commit | 0b606061dbe38bec18a4fdf37bfd248398ad015c (patch) | |
tree | 73ec4b6a9fe50e30e030abe547e2c3c761912562 /src/lj_def.h | |
parent | 5d096dcfdef5ddb0e6dd67e155adf893df7d7809 (diff) | |
download | luajit2-0b606061dbe38bec18a4fdf37bfd248398ad015c.tar.gz |
ARM: Use own lj_bswap(). Reduce min. req. version of GCC to 4.2.
Diffstat (limited to 'src/lj_def.h')
-rw-r--r-- | src/lj_def.h | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/lj_def.h b/src/lj_def.h index b7df8606..c60bc118 100644 --- a/src/lj_def.h +++ b/src/lj_def.h @@ -131,7 +131,29 @@ static LJ_AINLINE uint32_t lj_fls(uint32_t x) #define lj_fls(x) ((uint32_t)(__builtin_clz(x)^31)) #endif -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) +#if defined(__arm__) +static LJ_AINLINE uint32_t lj_bswap(uint32_t x) +{ + uint32_t r; +#if __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6T2__ || __ARM_ARCH_6Z__ ||\ + __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ + __asm__("rev %0, %1" : "=r" (r) : "r" (x)); + return r; +#else +#ifdef __thumb__ + r = x ^ lj_ror(x, 16); +#else + __asm__("eor %0, %1, %1, ror #16" : "=r" (r) : "r" (x)); +#endif + return ((r & 0xff00ffffu) >> 8) ^ lj_ror(x, 8); +#endif +} + +static LJ_AINLINE uint64_t lj_bswap64(uint64_t x) +{ + return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32)); +} +#elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) static LJ_AINLINE uint32_t lj_bswap(uint32_t x) { return (uint32_t)__builtin_bswap32((int32_t)x); |