byteorder.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #ifndef _PPC_BYTEORDER_H
  2. #define _PPC_BYTEORDER_H
  3. #include <asm/types.h>
  4. #include <linux/compiler.h>
  5. #ifdef __GNUC__
  6. #ifdef __KERNEL__
  7. extern __inline__ unsigned ld_le16(const volatile unsigned short *addr)
  8. {
  9. unsigned val;
  10. __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*addr));
  11. return val;
  12. }
  13. extern __inline__ void st_le16(volatile unsigned short *addr, const unsigned val)
  14. {
  15. __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr));
  16. }
  17. extern __inline__ unsigned ld_le32(const volatile unsigned *addr)
  18. {
  19. unsigned val;
  20. __asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*addr));
  21. return val;
  22. }
  23. extern __inline__ void st_le32(volatile unsigned *addr, const unsigned val)
  24. {
  25. __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr));
  26. }
  27. static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 value)
  28. {
  29. __u16 result;
  30. __asm__("rlwimi %0,%2,8,16,23" : "=&r" (result) : "0" (value >> 8), "r" (value));
  31. return result;
  32. }
  33. static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 value)
  34. {
  35. __u32 result;
  36. __asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (value>>24), "r" (value));
  37. __asm__("rlwimi %0,%2,8,8,15" : "=&r" (result) : "0" (result), "r" (value));
  38. __asm__("rlwimi %0,%2,24,0,7" : "=&r" (result) : "0" (result), "r" (value));
  39. return result;
  40. }
  41. #define __arch__swab32(x) ___arch__swab32(x)
  42. #define __arch__swab16(x) ___arch__swab16(x)
  43. /* The same, but returns converted value from the location pointer by addr. */
  44. #define __arch__swab16p(addr) ld_le16(addr)
  45. #define __arch__swab32p(addr) ld_le32(addr)
  46. /* The same, but do the conversion in situ, ie. put the value back to addr. */
  47. #define __arch__swab16s(addr) st_le16(addr,*addr)
  48. #define __arch__swab32s(addr) st_le32(addr,*addr)
  49. #endif /* __KERNEL__ */
  50. #if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
  51. # define __BYTEORDER_HAS_U64__
  52. # define __SWAB_64_THRU_32__
  53. #endif
  54. #endif /* __GNUC__ */
  55. #include <linux/byteorder/big_endian.h>
  56. #endif /* _PPC_BYTEORDER_H */