1*1b8adde7SWilliam Kucharski #ifndef ETHERBOOT_BITS_BYTESWAP_H 2*1b8adde7SWilliam Kucharski #define ETHERBOOT_BITS_BYTESWAP_H 3*1b8adde7SWilliam Kucharski 4*1b8adde7SWilliam Kucharski #include "types.h" 5*1b8adde7SWilliam Kucharski static inline uint16_t __i386_bswap_16(uint16_t x) 6*1b8adde7SWilliam Kucharski { 7*1b8adde7SWilliam Kucharski __asm__("xchgb %b0,%h0\n\t" 8*1b8adde7SWilliam Kucharski : "=q" (x) 9*1b8adde7SWilliam Kucharski : "0" (x)); 10*1b8adde7SWilliam Kucharski return x; 11*1b8adde7SWilliam Kucharski } 12*1b8adde7SWilliam Kucharski 13*1b8adde7SWilliam Kucharski static inline uint32_t __i386_bswap_32(uint32_t x) 14*1b8adde7SWilliam Kucharski { 15*1b8adde7SWilliam Kucharski __asm__("xchgb %b0,%h0\n\t" 16*1b8adde7SWilliam Kucharski "rorl $16,%0\n\t" 17*1b8adde7SWilliam Kucharski "xchgb %b0,%h0" 18*1b8adde7SWilliam Kucharski : "=q" (x) 19*1b8adde7SWilliam Kucharski : "0" (x)); 20*1b8adde7SWilliam Kucharski return x; 21*1b8adde7SWilliam Kucharski } 22*1b8adde7SWilliam Kucharski 23*1b8adde7SWilliam Kucharski 24*1b8adde7SWilliam Kucharski #define __bswap_constant_16(x) \ 25*1b8adde7SWilliam Kucharski ((uint16_t)((((uint16_t)(x) & 0x00ff) << 8) | \ 26*1b8adde7SWilliam Kucharski (((uint16_t)(x) & 0xff00) >> 8))) 27*1b8adde7SWilliam Kucharski 28*1b8adde7SWilliam Kucharski #define __bswap_constant_32(x) \ 29*1b8adde7SWilliam Kucharski ((uint32_t)((((uint32_t)(x) & 0x000000ffU) << 24) | \ 30*1b8adde7SWilliam Kucharski (((uint32_t)(x) & 0x0000ff00U) << 8) | \ 31*1b8adde7SWilliam Kucharski (((uint32_t)(x) & 0x00ff0000U) >> 8) | \ 32*1b8adde7SWilliam Kucharski (((uint32_t)(x) & 0xff000000U) >> 24))) 33*1b8adde7SWilliam Kucharski 34*1b8adde7SWilliam Kucharski #define __bswap_16(x) \ 35*1b8adde7SWilliam Kucharski (__builtin_constant_p(x) ? \ 36*1b8adde7SWilliam Kucharski __bswap_constant_16(x) : \ 37*1b8adde7SWilliam Kucharski __i386_bswap_16(x)) 38*1b8adde7SWilliam Kucharski 39*1b8adde7SWilliam Kucharski 40*1b8adde7SWilliam Kucharski #define __bswap_32(x) \ 41*1b8adde7SWilliam Kucharski (__builtin_constant_p(x) ? \ 42*1b8adde7SWilliam Kucharski __bswap_constant_32(x) : \ 43*1b8adde7SWilliam Kucharski __i386_bswap_32(x)) 44*1b8adde7SWilliam Kucharski 45*1b8adde7SWilliam Kucharski 46*1b8adde7SWilliam Kucharski #endif /* ETHERBOOT_BITS_BYTESWAP_H */ 47