Add 64-bit byte-swapping operations.
authorMichael Brown <mcb30@etherboot.org>
Sat, 13 May 2006 11:40:39 +0000 (11:40 +0000)
committerMichael Brown <mcb30@etherboot.org>
Sat, 13 May 2006 11:40:39 +0000 (11:40 +0000)
src/arch/i386/include/bits/byteswap.h
src/include/big_bswap.h
src/include/byteswap.h
src/include/little_bswap.h

index 1bc84fd..16e31f3 100644 (file)
@@ -1,7 +1,8 @@
 #ifndef ETHERBOOT_BITS_BYTESWAP_H
 #define ETHERBOOT_BITS_BYTESWAP_H
 
-static inline uint16_t __i386_bswap_16(uint16_t x)
+static inline __attribute__ ((always_inline)) uint16_t
+__i386_bswap_16(uint16_t x)
 {
        __asm__("xchgb %b0,%h0\n\t"
                : "=q" (x)
@@ -9,7 +10,8 @@ static inline uint16_t __i386_bswap_16(uint16_t x)
        return x;
 }
 
-static inline uint32_t __i386_bswap_32(uint32_t x)
+static inline __attribute__ ((always_inline)) uint32_t
+__i386_bswap_32(uint32_t x)
 {
        __asm__("xchgb %b0,%h0\n\t"
                "rorl $16,%0\n\t"
@@ -19,27 +21,56 @@ static inline uint32_t __i386_bswap_32(uint32_t x)
        return x;
 }
 
+static inline __attribute__ ((always_inline)) uint64_t
+__i386_bswap_64(uint64_t x)
+{
+       union {
+               uint64_t qword;
+               uint32_t dword[2]; 
+       } u;
+
+       u.qword = x;
+       u.dword[0] = __i386_bswap_32(u.dword[0]);
+       u.dword[1] = __i386_bswap_32(u.dword[1]);
+       __asm__("xchgl %0,%1"
+               : "=r" ( u.dword[0] ), "=r" ( u.dword[1] )
+               : "0" ( u.dword[0] ), "1" ( u.dword[1] ) );
+       return u.qword;
+}
 
 #define __bswap_constant_16(x) \
        ((uint16_t)((((uint16_t)(x) & 0x00ff) << 8) | \
-               (((uint16_t)(x) & 0xff00) >> 8)))
+                   (((uint16_t)(x) & 0xff00) >> 8)))
 
 #define __bswap_constant_32(x) \
        ((uint32_t)((((uint32_t)(x) & 0x000000ffU) << 24) | \
-               (((uint32_t)(x) & 0x0000ff00U) <<  8) | \
-               (((uint32_t)(x) & 0x00ff0000U) >>  8) | \
-               (((uint32_t)(x) & 0xff000000U) >> 24)))
+                   (((uint32_t)(x) & 0x0000ff00U) <<  8) | \
+                   (((uint32_t)(x) & 0x00ff0000U) >>  8) | \
+                   (((uint32_t)(x) & 0xff000000U) >> 24)))
+
+#define __bswap_constant_64(x) \
+       ((uint64_t)((((uint64_t)(x) & 0x00000000000000ffULL) << 56) | \
+                   (((uint64_t)(x) & 0x000000000000ff00ULL) << 40) | \
+                   (((uint64_t)(x) & 0x0000000000ff0000ULL) << 24) | \
+                   (((uint64_t)(x) & 0x00000000ff000000ULL) <<  8) | \
+                   (((uint64_t)(x) & 0x000000ff00000000ULL) >>  8) | \
+                   (((uint64_t)(x) & 0x0000ff0000000000ULL) >> 24) | \
+                   (((uint64_t)(x) & 0x00ff000000000000ULL) >> 40) | \
+                   (((uint64_t)(x) & 0xff00000000000000ULL) >> 56)))
 
 #define __bswap_16(x) \
        ((uint16_t)(__builtin_constant_p(x) ? \
        __bswap_constant_16(x) : \
        __i386_bswap_16(x)))
 
-
 #define __bswap_32(x) \
        ((uint32_t)(__builtin_constant_p(x) ? \
        __bswap_constant_32(x) : \
        __i386_bswap_32(x)))
 
+#define __bswap_64(x) \
+       ((uint64_t)(__builtin_constant_p(x) ? \
+       __bswap_constant_64(x) : \
+       __i386_bswap_64(x)))
 
 #endif /* ETHERBOOT_BITS_BYTESWAP_H */
index 66c3360..c016252 100644 (file)
@@ -5,12 +5,16 @@
 #define htonl(x)       (x)
 #define ntohs(x)       (x)
 #define htons(x)       (x)
+#define cpu_to_le64(x) __bswap_64(x)
 #define cpu_to_le32(x) __bswap_32(x)
 #define cpu_to_le16(x) __bswap_16(x)
+#define cpu_to_be64(x) (x)
 #define cpu_to_be32(x) (x)
 #define cpu_to_be16(x) (x)
+#define le64_to_cpu(x) __bswap_64(x)
 #define le32_to_cpu(x) __bswap_32(x)
 #define le16_to_cpu(x) __bswap_16(x)
+#define be64_to_cpu(x) (x)
 #define be32_to_cpu(x) (x)
 #define be16_to_cpu(x) (x)
 
index bed1485..72b5a01 100644 (file)
 #endif
 
 /* Make routines available to all */
+#define swap64(x)      __bswap_64(x)
 #define swap32(x)      __bswap_32(x)
 #define swap16(x)      __bswap_16(x)
+#define bswap_64(x)    __bswap_64(x)
 #define bswap_32(x)    __bswap_32(x)
 #define bswap_16(x)    __bswap_16(x)
        
index 3591853..155baa5 100644 (file)
@@ -5,12 +5,16 @@
 #define htonl(x)       __bswap_32(x)
 #define ntohs(x)       __bswap_16(x)
 #define htons(x)       __bswap_16(x)
+#define cpu_to_le64(x) (x)
 #define cpu_to_le32(x) (x)
 #define cpu_to_le16(x) (x)
+#define cpu_to_be64(x) __bswap_64(x)
 #define cpu_to_be32(x) __bswap_32(x)
 #define cpu_to_be16(x) __bswap_16(x)
+#define le64_to_cpu(x) (x)
 #define le32_to_cpu(x) (x)
 #define le16_to_cpu(x) (x)
+#define be64_to_cpu(x) __bswap_64(x)
 #define be32_to_cpu(x) __bswap_32(x)
 #define be16_to_cpu(x) __bswap_16(x)