diff options
Diffstat (limited to 'sysdeps/x86_64/bits/byteswap.h')
-rw-r--r-- | sysdeps/x86_64/bits/byteswap.h | 49 |
1 files changed, 12 insertions, 37 deletions
diff --git a/sysdeps/x86_64/bits/byteswap.h b/sysdeps/x86_64/bits/byteswap.h index c6db93c41a..98767e4901 100644 --- a/sysdeps/x86_64/bits/byteswap.h +++ b/sysdeps/x86_64/bits/byteswap.h @@ -25,6 +25,7 @@ #ifndef _BITS_BYTESWAP_H #define _BITS_BYTESWAP_H 1 +#include <features.h> #include <bits/wordsize.h> /* Swap bytes in 16 bit value. */ @@ -57,38 +58,8 @@ ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \ (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)) -#if defined __GNUC__ && __GNUC__ >= 2 -# if __WORDSIZE == 64 || (defined __i486__ || defined __pentium__ \ - || defined __pentiumpro__ || defined __pentium4__ \ - || defined __k8__ || defined __athlon__ \ - || defined __k6__ || defined __nocona__ \ - || defined __core2__ || defined __geode__ \ - || defined __amdfam10__) -/* To swap the bytes in a word the i486 processors and up provide the - `bswap' opcode. On i386 we have to use three instructions. */ -# define __bswap_32(x) \ - (__extension__ \ - ({ register unsigned int __v, __x = (x); \ - if (__builtin_constant_p (__x)) \ - __v = __bswap_constant_32 (__x); \ - else \ - __asm__ ("bswap %0" : "=r" (__v) : "0" (__x)); \ - __v; })) -# else -# define __bswap_32(x) \ - (__extension__ \ - ({ register unsigned int __v, __x = (x); \ - if (__builtin_constant_p (__x)) \ - __v = __bswap_constant_32 (__x); \ - else \ - __asm__ ("rorw $8, %w0;" \ - "rorl $16, %0;" \ - "rorw $8, %w0" \ - : "=r" (__v) \ - : "0" (__x) \ - : "cc"); \ - __v; })) -# endif +#if __GNUC_PREREQ (4,2) +# define __bswap_32(x) __builtin_bswap32 (x) #else # define __bswap_32(x) \ (__extension__ \ @@ -98,7 +69,10 @@ #if defined __GNUC__ && __GNUC__ >= 2 /* Swap bytes in 64 bit value. */ -# define __bswap_constant_64(x) \ +# if __GNUC_PREREQ (4,2) +# define __bswap_64(x) __builtin_bswap64 (x) +# else +# define __bswap_constant_64(x) \ (__extension__ ((((x) & 0xff00000000000000ull) >> 56) \ | (((x) & 0x00ff000000000000ull) >> 40) \ | (((x) & 0x0000ff0000000000ull) >> 24) \ @@ -108,8 +82,8 @@ | (((x) & 0x000000000000ff00ull) << 40) \ | (((x) & 0x00000000000000ffull) << 56))) -# if __WORDSIZE == 64 -# define __bswap_64(x) \ +# if __WORDSIZE == 64 +# define __bswap_64(x) \ (__extension__ \ ({ register unsigned long __v, __x = (x); \ if (__builtin_constant_p (__x)) \ @@ -117,8 +91,8 @@ else \ __asm__ ("bswap %q0" : "=r" (__v) : "0" (__x)); \ __v; })) -# else -# define __bswap_64(x) \ +# else +# define __bswap_64(x) \ (__extension__ \ ({ union { __extension__ unsigned long long int __ll; \ unsigned int __l[2]; } __w, __r; \ @@ -131,6 +105,7 @@ __r.__l[1] = __bswap_32 (__w.__l[0]); \ } \ __r.__ll; })) +# endif # endif #endif |