swab.h 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #ifndef _ASM_X86_SWAB_H
  2. #define _ASM_X86_SWAB_H
  3. #include <linux/types.h>
  4. #include <linux/compiler.h>
  5. static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
  6. {
  7. #ifdef __i386__
  8. # ifdef CONFIG_X86_BSWAP
  9. asm("bswap %0" : "=r" (val) : "0" (val));
  10. # else
  11. asm("xchgb %b0,%h0\n\t" /* swap lower bytes */
  12. "rorl $16,%0\n\t" /* swap words */
  13. "xchgb %b0,%h0" /* swap higher bytes */
  14. : "=q" (val)
  15. : "0" (val));
  16. # endif
  17. #else /* __i386__ */
  18. asm("bswapl %0"
  19. : "=r" (val)
  20. : "0" (val));
  21. #endif
  22. return val;
  23. }
  24. #define __arch_swab32 __arch_swab32
  25. static inline __attribute_const__ __u64 __arch_swab64(__u64 val)
  26. {
  27. #ifdef __i386__
  28. union {
  29. struct {
  30. __u32 a;
  31. __u32 b;
  32. } s;
  33. __u64 u;
  34. } v;
  35. v.u = val;
  36. # ifdef CONFIG_X86_BSWAP
  37. asm("bswapl %0 ; bswapl %1 ; xchgl %0,%1"
  38. : "=r" (v.s.a), "=r" (v.s.b)
  39. : "0" (v.s.a), "1" (v.s.b));
  40. # else
  41. v.s.a = __arch_swab32(v.s.a);
  42. v.s.b = __arch_swab32(v.s.b);
  43. asm("xchgl %0,%1"
  44. : "=r" (v.s.a), "=r" (v.s.b)
  45. : "0" (v.s.a), "1" (v.s.b));
  46. # endif
  47. return v.u;
  48. #else /* __i386__ */
  49. asm("bswapq %0"
  50. : "=r" (val)
  51. : "0" (val));
  52. return val;
  53. #endif
  54. }
  55. #define __arch_swab64 __arch_swab64
  56. #endif /* _ASM_X86_SWAB_H */