From 9904dc47c88d9592ec66e5990754369bfde84c02 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 6 Apr 2012 16:13:40 -0700 Subject: [PATCH] Use __builtin_bswap32/64 in __bswap_32/64 for GCC >= 4.2 --- ChangeLog | 6 ++++++ bits/byteswap.h | 24 +++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 91e836149c..dc8ed080f4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-04-06 H.J. Lu + + * bits/byteswap.h: Include . + (__bswap_32): Use __builtin_bswap32 for GCC >= 4.2. + (__bswap_64): Use __builtin_bswap64 for GCC >= 4.2. + 2012-04-06 H.J. Lu * bits/byteswap.h (__bswap_16): Removed. 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 + /* 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) \