Use __builtin_bswap32/64 in __bswap_32/64 for GCC >= 4.2

This commit is contained in:
H.J. Lu 2012-04-06 16:13:40 -07:00
parent f8887d0a5f
commit 9904dc47c8
2 changed files with 27 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2012-04-06 H.J. Lu <hongjiu.lu@intel.com>
* 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-06 H.J. Lu <hongjiu.lu@intel.com>
* bits/byteswap.h (__bswap_16): Removed.

View File

@ -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__
# 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,6 +69,13 @@ __bswap_32 (unsigned int __bsx)
| (((x) & 0x000000000000ff00ull) << 40) \
| (((x) & 0x00000000000000ffull) << 56)))
# 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; \
@ -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) \