176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef ETHERBOOT_BITS_BYTESWAP_H
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ETHERBOOT_BITS_BYTESWAP_H
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( GPL2_OR_LATER );
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __attribute__ ((always_inline, const)) uint16_t
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman__bswap_variable_16(uint16_t x)
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	__asm__("xchgb %b0,%h0\n\t"
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		: "=q" (x)
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		: "0" (x));
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return x;
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __attribute__ ((always_inline, const)) uint32_t
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman__bswap_variable_32(uint32_t x)
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	__asm__("xchgb %b0,%h0\n\t"
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		"rorl $16,%0\n\t"
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		"xchgb %b0,%h0"
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		: "=q" (x)
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		: "0" (x));
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return x;
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __attribute__ ((always_inline, const)) uint64_t
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman__bswap_variable_64(uint64_t x)
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	union {
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		uint64_t qword;
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		uint32_t dword[2];
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	} u;
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u.qword = x;
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u.dword[0] = __bswap_variable_32(u.dword[0]);
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u.dword[1] = __bswap_variable_32(u.dword[1]);
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	__asm__("xchgl %0,%1"
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		: "=r" ( u.dword[0] ), "=r" ( u.dword[1] )
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		: "0" ( u.dword[0] ), "1" ( u.dword[1] ) );
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return u.qword;
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* ETHERBOOT_BITS_BYTESWAP_H */
44