about summary refs log tree commit diff
path: root/bits/byteswap.h
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2012-04-06 16:13:40 -0700
committerH.J. Lu <hjl.tools@gmail.com>2012-04-06 16:13:40 -0700
commit9904dc47c88d9592ec66e5990754369bfde84c02 (patch)
tree2ec3f8eb2aebd6b23b5f24c4ddb12bde60108f17 /bits/byteswap.h
parentf8887d0a5feda97244613135822b0439addc2b1f (diff)
downloadglibc-9904dc47c88d9592ec66e5990754369bfde84c02.tar.gz
glibc-9904dc47c88d9592ec66e5990754369bfde84c02.tar.xz
glibc-9904dc47c88d9592ec66e5990754369bfde84c02.zip
Use __builtin_bswap32/64 in __bswap_32/64 for GCC >= 4.2
Diffstat (limited to 'bits/byteswap.h')
-rw-r--r--bits/byteswap.h24
1 files changed, 21 insertions, 3 deletions
diff --git a/bits/byteswap.h b/bits/byteswap.h
index 6e3ed3ffae..d818293a4c 100644
--- a/bits/byteswap.h
+++ b/bits/byteswap.h
@@ -23,6 +23,8 @@
 #ifndef _BITS_BYTESWAP_H
 #define _BITS_BYTESWAP_H 1
 
+#include <features.h>
+
 /* Swap bytes in 16 bit value.  */
 #define __bswap_constant_16(x) \
      ((((x) >> 8) & 0xffu) | (((x) & 0xffu) << 8))
@@ -36,9 +38,17 @@
       (((x) & 0x0000ff00u) <<  8) | (((x) & 0x000000ffu) << 24))
 
 #ifdef __GNUC__
-# define __bswap_32(x) \
+# if __GNUC_PREREQ (4, 2)
+static __inline unsigned int
+__bswap_32 (unsigned int __bsx)
+{
+  return __builtin_bswap32 (__bsx);
+}
+# else
+#  define __bswap_32(x) \
   (__extension__							      \
    ({ register unsigned int __bsx = (x); __bswap_constant_32 (__bsx); }))
+# endif
 #else
 static __inline unsigned int
 __bswap_32 (unsigned int __bsx)
@@ -47,8 +57,8 @@ __bswap_32 (unsigned int __bsx)
 }
 #endif
 
-#if defined __GNUC__ && __GNUC__ >= 2
 /* Swap bytes in 64 bit value.  */
+#if __GNUC_PREREQ (2, 0)
 # define __bswap_constant_64(x) \
      (__extension__ ((((x) & 0xff00000000000000ull) >> 56)		      \
 		     | (((x) & 0x00ff000000000000ull) >> 40)		      \
@@ -59,7 +69,14 @@ __bswap_32 (unsigned int __bsx)
 		     | (((x) & 0x000000000000ff00ull) << 40)		      \
 		     | (((x) & 0x00000000000000ffull) << 56)))
 
-# define __bswap_64(x) \
+# if __GNUC_PREREQ (4, 2)
+static __inline unsigned long long int
+__bswap_64 (unsigned long long int __bsx)
+{
+  return __builtin_bswap64 (__bsx);
+}
+# else
+#  define __bswap_64(x) \
      (__extension__							      \
       ({ union { __extension__ unsigned long long int __ll;		      \
 		 unsigned int __l[2]; } __w, __r;			      \
@@ -72,6 +89,7 @@ __bswap_32 (unsigned int __bsx)
 	     __r.__l[1] = __bswap_32 (__w.__l[0]);			      \
 	   }								      \
 	 __r.__ll; }))
+# endif
 #elif __GLIBC_HAVE_LONG_LONG
 # define __bswap_constant_64(x) \
      ((((x) & 0xff00000000000000ull) >> 56)				      \