Browse Source

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.

Mike Frysinger 18 years ago
parent
commit
6f1e696677
1 changed files with 41 additions and 33 deletions
  1. 41 33
      libc/sysdeps/linux/cris/bits/byteswap.h

+ 41 - 33
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 */