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