byteorder.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #ifndef _I386_BYTEORDER_H
  2. #define _I386_BYTEORDER_H
  3. #include <asm/types.h>
  4. #include <linux/compiler.h>
  5. #ifdef __GNUC__
  6. /* For avoiding bswap on i386 */
  7. #ifdef __KERNEL__
  8. #include <linux/config.h>
  9. #endif
  10. static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
  11. {
  12. #ifdef CONFIG_X86_BSWAP
  13. __asm__("bswap %0" : "=r" (x) : "0" (x));
  14. #else
  15. __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */
  16. "rorl $16,%0\n\t" /* swap words */
  17. "xchgb %b0,%h0" /* swap higher bytes */
  18. :"=q" (x)
  19. : "0" (x));
  20. #endif
  21. return x;
  22. }
  23. static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 val)
  24. {
  25. union {
  26. struct { __u32 a,b; } s;
  27. __u64 u;
  28. } v;
  29. v.u = val;
  30. #ifdef CONFIG_X86_BSWAP
  31. asm("bswapl %0 ; bswapl %1 ; xchgl %0,%1"
  32. : "=r" (v.s.a), "=r" (v.s.b)
  33. : "0" (v.s.a), "1" (v.s.b));
  34. #else
  35. v.s.a = ___arch__swab32(v.s.a);
  36. v.s.b = ___arch__swab32(v.s.b);
  37. asm("xchgl %0,%1" : "=r" (v.s.a), "=r" (v.s.b) : "0" (v.s.a), "1" (v.s.b));
  38. #endif
  39. return v.u;
  40. }
  41. /* Do not define swab16. Gcc is smart enough to recognize "C" version and
  42. convert it into rotation or exhange. */
  43. #define __arch__swab64(x) ___arch__swab64(x)
  44. #define __arch__swab32(x) ___arch__swab32(x)
  45. #define __BYTEORDER_HAS_U64__
  46. #endif /* __GNUC__ */
  47. #include <linux/byteorder/little_endian.h>
  48. #endif /* _I386_BYTEORDER_H */