diff options
author | cognet <cognet@FreeBSD.org> | 2007-09-09 11:58:38 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2007-09-09 11:58:38 +0000 |
commit | 31dec38dbc6ee02d6c93365836a883751594234e (patch) | |
tree | d8428929a8f5dc0e2296d04f901c61f45d3decb8 /sys/arm/include/endian.h | |
parent | 2b762183e0985af704a2c14f8623c3c1cc5be4d7 (diff) | |
download | FreeBSD-src-31dec38dbc6ee02d6c93365836a883751594234e.zip FreeBSD-src-31dec38dbc6ee02d6c93365836a883751594234e.tar.gz |
In __bswap16_var(), make sure the 16 upper bits are cleared; while
optimizing, gcc4 doesn't always do so.
Reported by: Nathan Whitehorn
Approved by: re (blanket)
Diffstat (limited to 'sys/arm/include/endian.h')
-rw-r--r-- | sys/arm/include/endian.h | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/arm/include/endian.h b/sys/arm/include/endian.h index c99eaf7..715a945 100644 --- a/sys/arm/include/endian.h +++ b/sys/arm/include/endian.h @@ -99,13 +99,15 @@ __bswap32_var(__uint32_t v) static __inline __uint16_t __bswap16_var(__uint16_t v) { + __uint32_t ret = v & 0xffff; + __asm __volatile( "mov %0, %0, ror #8\n" "orr %0, %0, %0, lsr #16\n" "bic %0, %0, %0, lsl #16" - : "+r" (v)); + : "+r" (ret)); - return (v); + return ((__uint16_t)ret); } #ifdef __OPTIMIZE__ |