diff options
author | Olivier Houchard <cognet@FreeBSD.org> | 2005-05-24 21:43:16 +0000 |
---|---|---|
committer | Olivier Houchard <cognet@FreeBSD.org> | 2005-05-24 21:43:16 +0000 |
commit | fdc05f791377cb68d0b3551e0c3569b027238a68 (patch) | |
tree | 4544ed0a00147e364736c6c4577032df910687da /sys/arm/include/endian.h | |
parent | fa7e20fdd44dffaeddbd7d277ccc6d2133bd1c75 (diff) |
Asm version of bswap16().
Obtained from: NetBSD
Notes
Notes:
svn path=/head/; revision=146592
Diffstat (limited to 'sys/arm/include/endian.h')
-rw-r--r-- | sys/arm/include/endian.h | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/sys/arm/include/endian.h b/sys/arm/include/endian.h index 093a57011c91..16a3b663f23f 100644 --- a/sys/arm/include/endian.h +++ b/sys/arm/include/endian.h @@ -87,16 +87,17 @@ __bswap32_var(__uint32_t v) { __uint32_t t1; - t1 = v ^ ((v << 16) | (v >> 16)); - t1 &= 0xff00ffffU; - v = (v >> 8) | (v << 24); - v ^= (t1 >> 8); + __asm __volatile("eor %1, %0, %0, ror #16\n" + "bic %1, %1, #0x00ff0000\n" + "mov %0, %0, ror #8\n" + "eor %0, %0, %1, lsr #8\n" + : "+r" (v), "=r" (t1)); return (v); } static __inline __uint16_t -__bswap16_var(__uint32_t v) +__bswap16_var(__uint16_t v) { __asm __volatile( "mov %0, %1, ror #8\n" |