xref: /titanic_41/usr/src/grub/grub-0.97/netboot/i386_byteswap.h (revision 1b8adde7ba7d5e04395c141c5400dc2cffd7d809)
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"
__i386_bswap_16(uint16_t x)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 
__i386_bswap_32(uint32_t x)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