This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Use __builtin_bswap32/64 in __bswap_32/64 for GCC >= 4.2


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]