diff options
author | cognet <cognet@FreeBSD.org> | 2005-05-24 21:43:16 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2005-05-24 21:43:16 +0000 |
commit | 6f02d3277d8d18208c83c27cc056232358992ac8 (patch) | |
tree | 4544ed0a00147e364736c6c4577032df910687da /sys | |
parent | 7001627d7dedbce03ba2c066c62efaf50565750a (diff) | |
download | FreeBSD-src-6f02d3277d8d18208c83c27cc056232358992ac8.zip FreeBSD-src-6f02d3277d8d18208c83c27cc056232358992ac8.tar.gz |
Asm version of bswap16().
Obtained from: NetBSD
Diffstat (limited to 'sys')
-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 093a570..16a3b66 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" |