[patch] Fix name clash for cris arch byte swap (byteswap.h)

Ricard Wanderlof ricard.wanderlof at axis.com
Wed Jan 25 08:51:48 UTC 2006


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.

/Ricard


--- libc/sysdeps/linux/cris/bits/byteswap.h	24 Jan 2005 17:41:10 -0000
+++ libc/sysdeps/linux/cris/bits/byteswap.h	24 Jan 2006 13:49:31 -0000
@@ -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 @@
        | (((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 @@
               __r.__l[1] = __bswap_32 (__w.__l[0]);
\
             }
\
           __r.__ll; }))
+#else
+#  define __bswap_64(x) __bswap_constant_64 (x)
  #endif

  #endif /* _BITS_BYTESWAP_H */


--
Ricard Wolf Wanderlöf                           ricardw(at)axis.com
Axis Communications AB, Lund, Sweden            www.axis.com
Phone +46 46 272 2016                           Fax +46 46 13 61 30


More information about the uClibc mailing list