summaryrefslogtreecommitdiffstats
path: root/sys/x86/include/endian.h
diff options
context:
space:
mode:
authordim <dim@FreeBSD.org>2012-03-29 23:31:48 +0000
committerdim <dim@FreeBSD.org>2012-03-29 23:31:48 +0000
commit50e5af3369794f1e7b1d9f89544e4d16c45c152a (patch)
tree0dc11f9904844a4215cd7d3e48747919d3ee31e9 /sys/x86/include/endian.h
parent56f6402e5ac3232bb8c00f9e6875327c214941cb (diff)
downloadFreeBSD-src-50e5af3369794f1e7b1d9f89544e4d16c45c152a.zip
FreeBSD-src-50e5af3369794f1e7b1d9f89544e4d16c45c152a.tar.gz
Fix an issue introduced in sys/x86/include/endian.h with r232721. In
that revision, the bswapXX_const() macros were renamed to bswapXX_gen(). Also, bswap64_gen() was implemented as two calls to bswap32(), and similarly, bswap32_gen() as two calls to bswap16(). This mainly helps our base gcc to produce more efficient assembly. However, the arguments are not properly masked, which results in the wrong value being calculated in some instances. For example, bswap32(0x12345678) returns 0x7c563412, and bswap64(0x123456789abcdef0) returns 0xfcdefc9a7c563412. Fix this by appropriately masking the arguments to bswap16() in bswap32_gen(), and to bswap32() in bswap64_gen(). This should also silence warnings from clang. Submitted by: jh
Diffstat (limited to 'sys/x86/include/endian.h')
-rw-r--r--sys/x86/include/endian.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/x86/include/endian.h b/sys/x86/include/endian.h
index 2f95320..6ca6a6c 100644
--- a/sys/x86/include/endian.h
+++ b/sys/x86/include/endian.h
@@ -65,9 +65,9 @@
#define __bswap16_gen(x) (__uint16_t)((x) << 8 | (x) >> 8)
#define __bswap32_gen(x) \
- (((__uint32_t)__bswap16(x) << 16) | __bswap16((x) >> 16))
+ (((__uint32_t)__bswap16((x) & 0xffff) << 16) | __bswap16((x) >> 16))
#define __bswap64_gen(x) \
- (((__uint64_t)__bswap32(x) << 32) | __bswap32((x) >> 32))
+ (((__uint64_t)__bswap32((x) & 0xffffffff) << 32) | __bswap32((x) >> 32))
#ifdef __GNUCLIKE_BUILTIN_CONSTANT_P
#define __bswap16(x) \
OpenPOWER on IntegriCloud