From 1ad72e0e79b36d52e8b9d2488cbc39edcd8a5ad8 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sat, 13 May 2006 11:40:39 +0000 Subject: [PATCH] Add 64-bit byte-swapping operations. --- src/arch/i386/include/bits/byteswap.h | 45 ++++++++++++++++++++++----- src/include/big_bswap.h | 4 +++ src/include/byteswap.h | 2 ++ src/include/little_bswap.h | 4 +++ 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/arch/i386/include/bits/byteswap.h b/src/arch/i386/include/bits/byteswap.h index 1bc84fda..16e31f34 100644 --- a/src/arch/i386/include/bits/byteswap.h +++ b/src/arch/i386/include/bits/byteswap.h @@ -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 */ diff --git a/src/include/big_bswap.h b/src/include/big_bswap.h index 66c3360e..c0162523 100644 --- a/src/include/big_bswap.h +++ b/src/include/big_bswap.h @@ -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) diff --git a/src/include/byteswap.h b/src/include/byteswap.h index bed14857..72b5a01d 100644 --- a/src/include/byteswap.h +++ b/src/include/byteswap.h @@ -12,8 +12,10 @@ #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) diff --git a/src/include/little_bswap.h b/src/include/little_bswap.h index 35918530..155baa59 100644 --- a/src/include/little_bswap.h +++ b/src/include/little_bswap.h @@ -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)