summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/cris/bits/byteswap.h
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2006-01-26 23:48:44 +0000
committerMike Frysinger <vapier@gentoo.org>2006-01-26 23:48:44 +0000
commit6f1e696677774d72adcec9faedf357283647f3ad (patch)
tree5baef4483f4042345ae2998013b33a9c93406277 /libc/sysdeps/linux/cris/bits/byteswap.h
parentdfb199421b130157ef9154acb932d80b35fa2894 (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.
Diffstat (limited to 'libc/sysdeps/linux/cris/bits/byteswap.h')
-rw-r--r--libc/sysdeps/linux/cris/bits/byteswap.h74
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 */