diff options
Diffstat (limited to 'bits/byteswap.h')
-rw-r--r-- | bits/byteswap.h | 24 |
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) \ |