byteorder.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _PARISC_BYTEORDER_H
  2. #define _PARISC_BYTEORDER_H
  3. #include <asm/types.h>
  4. #ifdef __GNUC__
  5. static __inline__ __const__ __u32 ___arch__swab32(__u32 x)
  6. {
  7. unsigned int temp;
  8. __asm__("shd %0, %0, 16, %1nt" /* shift abcdabcd -> cdab */
  9. "dep %1, 15, 8, %1nt" /* deposit cdab -> cbab */
  10. "shd %0, %1, 8, %0" /* shift abcdcbab -> dcba */
  11. : "=r" (x), "=&r" (temp)
  12. : "0" (x));
  13. return x;
  14. }
  15. #if BITS_PER_LONG > 32
  16. /*
  17. ** From "PA-RISC 2.0 Architecture", HP Professional Books.
  18. ** See Appendix I page 8 , "Endian Byte Swapping".
  19. **
  20. ** Pretty cool algorithm: (* == zero'd bits)
  21. **      PERMH   01234567 -> 67452301 into %0
  22. **      HSHL    67452301 -> 7*5*3*1* into %1
  23. **      HSHR    67452301 -> *6*4*2*0 into %0
  24. **      OR      %0 | %1  -> 76543210 into %0 (all done!)
  25. */
  26. static __inline__ __const__ __u64 ___arch__swab64(__u64 x) {
  27. __u64 temp;
  28. __asm__("permh 3210, %0, %0nt"
  29. "hshl %0, 8, %1nt"
  30. "hshr u, %0, 8, %0nt"
  31. "or %1, %0, %0"
  32. : "=r" (x), "=&r" (temp)
  33. : "0" (x));
  34. return x;
  35. }
  36. #define __arch__swab64(x) ___arch__swab64(x)
  37. #else
  38. static __inline__ __const__ __u64 ___arch__swab64(__u64 x)
  39. {
  40. __u32 t1 = (__u32) x;
  41. __u32 t2 = (__u32) ((x) >> 32);
  42. ___arch__swab32(t1);
  43. ___arch__swab32(t2);
  44. return (((__u64) t1 << 32) + ((__u64) t2));
  45. }
  46. #endif
  47. static __inline__ __const__ __u16 ___arch__swab16(__u16 x)
  48. {
  49. __asm__("dep %0, 15, 8, %0nt" /* deposit 00ab -> 0bab */
  50. "shd %r0, %0, 8, %0" /* shift 000000ab -> 00ba */
  51. : "=r" (x)
  52. : "0" (x));
  53. return x;
  54. }
  55. #define __arch__swab32(x) ___arch__swab32(x)
  56. #define __arch__swab16(x) ___arch__swab16(x)
  57. #if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
  58. #  define __BYTEORDER_HAS_U64__
  59. #  define __SWAB_64_THRU_32__
  60. #endif
  61. #endif /* __GNUC__ */
  62. #include <linux/byteorder/big_endian.h>
  63. #endif /* _PARISC_BYTEORDER_H */