unaligned.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _ASM_IA64_UNALIGNED_H
  2. #define _ASM_IA64_UNALIGNED_H
  3. #include <linux/types.h>
  4. /*
  5.  * The main single-value unaligned transfer routines.  Derived from
  6.  * the Linux/Alpha version.
  7.  *
  8.  * Copyright (C) 1998, 1999 Hewlett-Packard Co
  9.  * Copyright (C) 1998, 1999 David Mosberger-Tang <davidm@hpl.hp.com>
  10.  */
  11. #define get_unaligned(ptr) 
  12. ((__typeof__(*(ptr)))ia64_get_unaligned((ptr), sizeof(*(ptr))))
  13. #define put_unaligned(x,ptr) 
  14. ia64_put_unaligned((unsigned long)(x), (ptr), sizeof(*(ptr)))
  15. /*
  16.  * EGCS 1.1 knows about arbitrary unaligned loads.  Define some
  17.  * packed structures to talk about such things with.
  18.  */
  19. struct __una_u64 { __u64 x __attribute__((packed)); };
  20. struct __una_u32 { __u32 x __attribute__((packed)); };
  21. struct __una_u16 { __u16 x __attribute__((packed)); };
  22. static inline unsigned long
  23. __uldq (const unsigned long * r11)
  24. {
  25. const struct __una_u64 *ptr = (const struct __una_u64 *) r11;
  26. return ptr->x;
  27. }
  28. static inline unsigned long
  29. __uldl (const unsigned int * r11)
  30. {
  31. const struct __una_u32 *ptr = (const struct __una_u32 *) r11;
  32. return ptr->x;
  33. }
  34. static inline unsigned long
  35. __uldw (const unsigned short * r11)
  36. {
  37. const struct __una_u16 *ptr = (const struct __una_u16 *) r11;
  38. return ptr->x;
  39. }
  40. static inline void
  41. __ustq (unsigned long r5, unsigned long * r11)
  42. {
  43. struct __una_u64 *ptr = (struct __una_u64 *) r11;
  44. ptr->x = r5;
  45. }
  46. static inline void
  47. __ustl (unsigned long r5, unsigned int * r11)
  48. {
  49. struct __una_u32 *ptr = (struct __una_u32 *) r11;
  50. ptr->x = r5;
  51. }
  52. static inline void
  53. __ustw (unsigned long r5, unsigned short * r11)
  54. {
  55. struct __una_u16 *ptr = (struct __una_u16 *) r11;
  56. ptr->x = r5;
  57. }
  58. /*
  59.  * This function doesn't actually exist.  The idea is that when
  60.  * someone uses the macros below with an unsupported size (datatype),
  61.  * the linker will alert us to the problem via an unresolved reference
  62.  * error.
  63.  */
  64. extern unsigned long ia64_bad_unaligned_access_length (void);
  65. #define ia64_get_unaligned(_ptr,size)
  66. ({
  67. const void *ptr = (_ptr);
  68. unsigned long val;
  69. switch (size) {
  70.       case 1:
  71. val = *(const unsigned char *) ptr;
  72. break;
  73.       case 2:
  74. val = __uldw((const unsigned short *)ptr);
  75. break;
  76.       case 4:
  77. val = __uldl((const unsigned int *)ptr);
  78. break;
  79.       case 8:
  80. val = __uldq((const unsigned long *)ptr);
  81. break;
  82.       default:
  83. val = ia64_bad_unaligned_access_length();
  84. }
  85. val;
  86. })
  87. #define ia64_put_unaligned(_val,_ptr,size)
  88. do {
  89. const void *ptr = (_ptr);
  90. unsigned long val = (_val);
  91. switch (size) {
  92.       case 1:
  93. *(unsigned char *)ptr = (val);
  94.         break;
  95.       case 2:
  96. __ustw(val, (unsigned short *)ptr);
  97. break;
  98.       case 4:
  99. __ustl(val, (unsigned int *)ptr);
  100. break;
  101.       case 8:
  102. __ustq(val, (unsigned long *)ptr);
  103. break;
  104.       default:
  105.      ia64_bad_unaligned_access_length();
  106. }
  107. } while (0)
  108. #endif /* _ASM_IA64_UNALIGNED_H */