Commit af8ffdfd2b3b0894a54cb6333217f9f3ae6eaa81
1 parent
b932caba
byte swap functions
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1031 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
99 additions
and
0 deletions
bswap.h
| ... | ... | @@ -73,4 +73,103 @@ static inline void bswap64s(uint64_t *s) |
| 73 | 73 | *s = bswap64(*s); |
| 74 | 74 | } |
| 75 | 75 | |
| 76 | +#if defined(WORDS_BIGENDIAN) | |
| 77 | +#define be_bswap(v, size) (v) | |
| 78 | +#define le_bswap(v, size) bswap ## size(v) | |
| 79 | +#define be_bswaps(v, size) | |
| 80 | +#define le_bswaps(p, size) *p = bswap ## size(*p); | |
| 81 | +#else | |
| 82 | +#define le_bswap(v, size) (v) | |
| 83 | +#define be_bswap(v, size) bswap ## size(v) | |
| 84 | +#define le_bswaps(v, size) | |
| 85 | +#define be_bswaps(p, size) *p = bswap ## size(*p); | |
| 86 | +#endif | |
| 87 | + | |
| 88 | +#define CPU_CONVERT(endian, size, type)\ | |
| 89 | +static inline type endian ## size ## _to_cpu(type v)\ | |
| 90 | +{\ | |
| 91 | + return endian ## _bswap(v, size);\ | |
| 92 | +}\ | |
| 93 | +\ | |
| 94 | +static inline type cpu_to_ ## endian ## size(type v)\ | |
| 95 | +{\ | |
| 96 | + return endian ## _bswap(v, size);\ | |
| 97 | +}\ | |
| 98 | +\ | |
| 99 | +static inline void endian ## size ## _to_cpus(type *p)\ | |
| 100 | +{\ | |
| 101 | + endian ## _bswaps(p, size)\ | |
| 102 | +}\ | |
| 103 | +\ | |
| 104 | +static inline void cpu_to_ ## endian ## size ## s(type *p)\ | |
| 105 | +{\ | |
| 106 | + endian ## _bswaps(p, size)\ | |
| 107 | +}\ | |
| 108 | +\ | |
| 109 | +static inline type endian ## size ## _to_cpup(const type *p)\ | |
| 110 | +{\ | |
| 111 | + return endian ## size ## _to_cpu(*p);\ | |
| 112 | +}\ | |
| 113 | +\ | |
| 114 | +static inline void cpu_to_ ## endian ## size ## w(type *p, type v)\ | |
| 115 | +{\ | |
| 116 | + *p = cpu_to_ ## endian ## size(v);\ | |
| 117 | +} | |
| 118 | + | |
| 119 | +CPU_CONVERT(be, 16, uint16_t) | |
| 120 | +CPU_CONVERT(be, 32, uint32_t) | |
| 121 | +CPU_CONVERT(be, 64, uint64_t) | |
| 122 | + | |
| 123 | +CPU_CONVERT(le, 16, uint16_t) | |
| 124 | +CPU_CONVERT(le, 32, uint32_t) | |
| 125 | +CPU_CONVERT(le, 64, uint64_t) | |
| 126 | + | |
| 127 | +/* unaligned versions (optimized for frequent unaligned accesses)*/ | |
| 128 | + | |
| 129 | +#if defined(__i386__) || defined(__powerpc__) | |
| 130 | + | |
| 131 | +#define cpu_to_le16wu(p, v) cpu_to_le16w(p, v) | |
| 132 | +#define cpu_to_le32wu(p, v) cpu_to_le32w(p, v) | |
| 133 | +#define le16_to_cpupu(p) le16_to_cpup(p) | |
| 134 | +#define le32_to_cpupu(p) le32_to_cpup(p) | |
| 135 | + | |
| 136 | +#else | |
| 137 | + | |
| 138 | +static inline void cpu_to_le16wu(uint16_t *p, uint16_t v) | |
| 139 | +{ | |
| 140 | + uint8_t *p1 = (uint8_t *)p; | |
| 141 | + | |
| 142 | + p1[0] = v; | |
| 143 | + p1[1] = v >> 8; | |
| 144 | +} | |
| 145 | + | |
| 146 | +static inline void cpu_to_le32wu(uint32_t *p, uint32_t v) | |
| 147 | +{ | |
| 148 | + uint8_t *p1 = (uint8_t *)p; | |
| 149 | + | |
| 150 | + p1[0] = v; | |
| 151 | + p1[1] = v >> 8; | |
| 152 | + p1[2] = v >> 16; | |
| 153 | + p1[3] = v >> 24; | |
| 154 | +} | |
| 155 | + | |
| 156 | +static inline uint16_t le16_to_cpupu(const uint16_t *p) | |
| 157 | +{ | |
| 158 | + const uint8_t *p1 = (const uint8_t *)p; | |
| 159 | + return p1[0] | (p1[1] << 8); | |
| 160 | +} | |
| 161 | + | |
| 162 | +static inline uint32_t le32_to_cpupu(const uint32_t *p) | |
| 163 | +{ | |
| 164 | + const uint8_t *p1 = (const uint8_t *)p; | |
| 165 | + return p1[0] | (p1[1] << 8) | (p1[2] << 16) | (p1[3] << 24); | |
| 166 | +} | |
| 167 | + | |
| 168 | +#endif | |
| 169 | + | |
| 170 | +#undef le_bswap | |
| 171 | +#undef be_bswap | |
| 172 | +#undef le_bswaps | |
| 173 | +#undef be_bswaps | |
| 174 | + | |
| 76 | 175 | #endif /* BSWAP_H */ | ... | ... |