This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] Use __builtin_bswap32/64 in __bswap_32/64 for GCC >= 4.2
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: GNU C Library <libc-alpha at sourceware dot org>
- Date: Fri, 6 Apr 2012 15:43:49 -0700
- Subject: [PATCH] Use __builtin_bswap32/64 in __bswap_32/64 for GCC >= 4.2
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
Hi,
This patch uses __builtin_bswap32/64 in __bswap_32/64. OK to install?
Thanks.
H.J.
---
ChangeLog | 6 ++++++
bits/byteswap.h | 30 ++++++++++--------------------
2 files changed, 16 insertions(+), 20 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 91e8361..b9e6739 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2012-04-06 H.J. Lu <hongjiu.lu@intel.com>
+ * bits/byteswap.h (__bswap_32): Use __builtin_bswap32 for
+ GCC >= 4.2.
+ (__bswap_64): Use __builtin_bswap64 for GCC >= 4.2.
+
+2012-04-06 H.J. Lu <hongjiu.lu@intel.com>
+
* bits/byteswap.h (__bswap_16): Removed.
Include <bits/byteswap-16.h> to get __bswap_16.
* sysdeps/i386/bits/byteswap.h: Likewise.
diff --git a/bits/byteswap.h b/bits/byteswap.h
index 6e3ed3f..2ac2d5e 100644
--- a/bits/byteswap.h
+++ b/bits/byteswap.h
@@ -35,19 +35,17 @@
((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) | \
(((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24))
-#ifdef __GNUC__
-# define __bswap_32(x) \
- (__extension__ \
- ({ register unsigned int __bsx = (x); __bswap_constant_32 (__bsx); }))
-#else
static __inline unsigned int
__bswap_32 (unsigned int __bsx)
{
+#if defined __GNUC__ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
+ return __builtin_bswap32 (__bsx);
+#else
return __bswap_constant_32 (__bsx);
-}
#endif
+}
-#if defined __GNUC__ && __GNUC__ >= 2
+#if defined __GNUC__ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
/* Swap bytes in 64 bit value. */
# define __bswap_constant_64(x) \
(__extension__ ((((x) & 0xff00000000000000ull) >> 56) \
@@ -59,19 +57,11 @@ __bswap_32 (unsigned int __bsx)
| (((x) & 0x000000000000ff00ull) << 40) \
| (((x) & 0x00000000000000ffull) << 56)))
-# define __bswap_64(x) \
- (__extension__ \
- ({ union { __extension__ unsigned long long int __ll; \
- unsigned int __l[2]; } __w, __r; \
- if (__builtin_constant_p (x)) \
- __r.__ll = __bswap_constant_64 (x); \
- else \
- { \
- __w.__ll = (x); \
- __r.__l[0] = __bswap_32 (__w.__l[1]); \
- __r.__l[1] = __bswap_32 (__w.__l[0]); \
- } \
- __r.__ll; }))
+static __inline unsigned long long int
+__bswap_64 (unsigned long long int __bsx)
+{
+ return __builtin_bswap64 (__bsx);
+}
#elif __GLIBC_HAVE_LONG_LONG
# define __bswap_constant_64(x) \
((((x) & 0xff00000000000000ull) >> 56) \
--
1.7.6.5