aboutsummaryrefslogtreecommitdiff
path: root/sys/arm/include/endian.h
diff options
context:
space:
mode:
authorOlivier Houchard <cognet@FreeBSD.org>2005-05-24 21:43:16 +0000
committerOlivier Houchard <cognet@FreeBSD.org>2005-05-24 21:43:16 +0000
commitfdc05f791377cb68d0b3551e0c3569b027238a68 (patch)
tree4544ed0a00147e364736c6c4577032df910687da /sys/arm/include/endian.h
parentfa7e20fdd44dffaeddbd7d277ccc6d2133bd1c75 (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.h11
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"