Use __builtin_bswap32/64 in x86_64 <bits/byteswap.h>

This commit is contained in:
H.J. Lu 2012-04-10 12:11:54 -07:00
parent 73d65cc378
commit b46068fcf2
2 changed files with 59 additions and 32 deletions

View File

@ -1,3 +1,9 @@
2012-04-10 H.J. Lu <hongjiu.lu@intel.com>
* sysdeps/x86_64/bits/byteswap.h: Include <features.h>.
(__bswap_32): Use __builtin_bswap32 for GCC >= 4.2.
(__bswap_64): Use __builtin_bswap64 for GCC >= 4.2.
2012-04-10 Siddhesh Poyarekar <siddhesh@redhat.com> 2012-04-10 Siddhesh Poyarekar <siddhesh@redhat.com>
* elf/dl-support.c (_dl_inhibit_cache): New variable. * elf/dl-support.c (_dl_inhibit_cache): New variable.

View File

@ -23,6 +23,7 @@
#ifndef _BITS_BYTESWAP_H #ifndef _BITS_BYTESWAP_H
#define _BITS_BYTESWAP_H 1 #define _BITS_BYTESWAP_H 1
#include <features.h>
#include <bits/wordsize.h> #include <bits/wordsize.h>
/* Swap bytes in 16 bit value. */ /* Swap bytes in 16 bit value. */
@ -37,7 +38,14 @@
((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \ ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
(((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)) (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
#if defined __GNUC__ && __GNUC__ >= 2 #ifdef __GNUC__
# if __GNUC_PREREQ (4, 2)
static __inline unsigned int
__bswap_32 (unsigned int __bsx)
{
return __builtin_bswap32 (__bsx);
}
# elif __GNUC__ >= 2
# if __WORDSIZE == 64 || (defined __i486__ || defined __pentium__ \ # if __WORDSIZE == 64 || (defined __i486__ || defined __pentium__ \
|| defined __pentiumpro__ || defined __pentium4__ \ || defined __pentiumpro__ || defined __pentium4__ \
|| defined __k8__ || defined __athlon__ \ || defined __k8__ || defined __athlon__ \
@ -69,14 +77,21 @@
: "cc"); \ : "cc"); \
__v; })) __v; }))
# endif # endif
#else # else
# define __bswap_32(x) \ # define __bswap_32(x) \
(__extension__ \ (__extension__ \
({ register unsigned int __x = (x); __bswap_constant_32 (__x); })) ({ register unsigned int __x = (x); __bswap_constant_32 (__x); }))
# endif
#else
static __inline unsigned int
__bswap_32 (unsigned int __bsx)
{
return __bswap_constant_32 (__bsx);
}
#endif #endif
#if defined __GNUC__ && __GNUC__ >= 2 #if __GNUC_PREREQ (2, 0)
/* Swap bytes in 64 bit value. */ /* Swap bytes in 64 bit value. */
# define __bswap_constant_64(x) \ # define __bswap_constant_64(x) \
(__extension__ ((((x) & 0xff00000000000000ull) >> 56) \ (__extension__ ((((x) & 0xff00000000000000ull) >> 56) \
@ -88,7 +103,13 @@
| (((x) & 0x000000000000ff00ull) << 40) \ | (((x) & 0x000000000000ff00ull) << 40) \
| (((x) & 0x00000000000000ffull) << 56))) | (((x) & 0x00000000000000ffull) << 56)))
# if __WORDSIZE == 64 # if __GNUC_PREREQ (4, 2)
static __inline unsigned long long int
__bswap_64 (unsigned long long int __bsx)
{
return __builtin_bswap64 (__bsx);
}
# elif __WORDSIZE == 64
# define __bswap_64(x) \ # define __bswap_64(x) \
(__extension__ \ (__extension__ \
({ register unsigned long __v, __x = (x); \ ({ register unsigned long __v, __x = (x); \