diff options
author | Mike Frysinger <vapier@gentoo.org> | 2006-01-26 23:48:44 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2006-01-26 23:48:44 +0000 |
commit | 6f1e696677774d72adcec9faedf357283647f3ad (patch) | |
tree | 5baef4483f4042345ae2998013b33a9c93406277 | |
parent | dfb199421b130157ef9154acb932d80b35fa2894 (diff) |
Ricard Wanderlof writes:
Here's a patch to avoid a name clash between include/bits/byteswap.h and the
kernel include file <linux/byteorder/swab.h> . (Normally both aren't
included by the same file, but we've had one case where a conflict occurred
at link time, thus necessitating the patch). I've also taken the opportunity
to make the general structure and namespace of the file similar to the
corresponding file for other archs.
-rw-r--r-- | libc/sysdeps/linux/cris/bits/byteswap.h | 74 |
1 files changed, 41 insertions, 33 deletions
diff --git a/libc/sysdeps/linux/cris/bits/byteswap.h b/libc/sysdeps/linux/cris/bits/byteswap.h index e35c4b63f..4027456ac 100644 --- a/libc/sysdeps/linux/cris/bits/byteswap.h +++ b/libc/sysdeps/linux/cris/bits/byteswap.h @@ -1,51 +1,56 @@ #ifndef _BITS_BYTESWAP_H #define _BITS_BYTESWAP_H 1 -#define ___swab16(x) \ +/* CRIS specific byte swap operations: 16, 32 and 64-bit */ + +/* Swap bytes in 16 bit value. */ +#define __bswap_constant_16(x) \ ({ \ unsigned short __x = (x); \ ((unsigned short)( \ - (((unsigned short)(__x) & (unsigned short)0x00ffU) << 8) | \ - (((unsigned short)(__x) & (unsigned short)0xff00U) >> 8) )); \ + (((unsigned short)(__x) & (unsigned short)0x00ffu) << 8) | \ + (((unsigned short)(__x) & (unsigned short)0xff00u) >> 8) )); \ }) -#define ___swab32(x) \ +#if defined __GNUC__ && __GNUC__ >= 2 +# define __bswap_16(x) \ + __extension__ \ + ({ unsigned short __bswap_16_v; \ + if (__builtin_constant_p (x)) \ + __bswap_16_v = __bswap_constant_16 (x); \ + else \ + __asm__ ("swapb %0" : "=r" (__bswap_16_v) : "0" (x)); \ + __bswap_16_v; }) +#else +# define __bswap_16(x) __bswap_constant_16 (x) +#endif + + +/* Swap bytes in 32 bit value. */ +#define __bswap_constant_32(x) \ ({ \ unsigned long __x = (x); \ ((unsigned long)( \ - (((unsigned long)(__x) & (unsigned long)0x000000ffUL) << 24) | \ - (((unsigned long)(__x) & (unsigned long)0x0000ff00UL) << 8) | \ - (((unsigned long)(__x) & (unsigned long)0x00ff0000UL) >> 8) | \ - (((unsigned long)(__x) & (unsigned long)0xff000000UL) >> 24) )); \ + (((unsigned long)(__x) & (unsigned long)0x000000fful) << 24) | \ + (((unsigned long)(__x) & (unsigned long)0x0000ff00ul) << 8) | \ + (((unsigned long)(__x) & (unsigned long)0x00ff0000ul) >> 8) | \ + (((unsigned long)(__x) & (unsigned long)0xff000000ul) >> 24) )); \ }) -/* these are CRIS specific */ - -static inline unsigned short __fswab16(unsigned short x) -{ - __asm__ ("swapb %0" : "=r" (x) : "0" (x)); - - return(x); -} - -static inline unsigned long __fswab32(unsigned long x) -{ - __asm__ ("swapwb %0" : "=r" (x) : "0" (x)); - - return(x); -} - -# define __bswap_16(x) \ -(__builtin_constant_p((unsigned short)(x)) ? \ - ___swab16((x)) : \ - __fswab16((x))) - +#if defined __GNUC__ && __GNUC__ >= 2 # define __bswap_32(x) \ -(__builtin_constant_p((unsigned long)(x)) ? \ - ___swab32((x)) : \ - __fswab32((x))) + __extension__ \ + ({ unsigned long __bswap_32_v; \ + if (__builtin_constant_p (x)) \ + __bswap_32_v = __bswap_constant_32 (x); \ + else \ + __asm__ ("swapwb %0" : "=r" (__bswap_32_v) : "0" (x)); \ + __bswap_32_v; }) +#else +# define __bswap_32(x) __bswap_constant_32 (x) +#endif + -#if defined __GNUC__ && __GNUC__ >= 2 /* Swap bytes in 64 bit value. */ # define __bswap_constant_64(x) \ ((((x) & 0xff00000000000000ull) >> 56) \ @@ -57,6 +62,7 @@ static inline unsigned long __fswab32(unsigned long x) | (((x) & 0x000000000000ff00ull) << 40) \ | (((x) & 0x00000000000000ffull) << 56)) +#if defined __GNUC__ && __GNUC__ >= 2 # define __bswap_64(x) \ (__extension__ \ ({ union { __extension__ unsigned long long int __ll; \ @@ -70,6 +76,8 @@ static inline unsigned long __fswab32(unsigned long x) __r.__l[1] = __bswap_32 (__w.__l[0]); \ } \ __r.__ll; })) +#else +# define __bswap_64(x) __bswap_constant_64 (x) #endif #endif /* _BITS_BYTESWAP_H */ |