1 /* Licensed under LGPLv2.1+ - see LICENSE file for details */
11 * bswap_16 - reverse bytes in a uint16_t value.
12 * @val: value whose bytes to swap.
15 * // Output contains "1024 is 4 as two bytes reversed"
16 * printf("1024 is %u as two bytes reversed\n", bswap_16(1024));
18 static inline uint16_t bswap_16(uint16_t val
)
20 return ((val
& (uint16_t)0x00ffU
) << 8)
21 | ((val
& (uint16_t)0xff00U
) >> 8);
25 * bswap_32 - reverse bytes in a uint32_t value.
26 * @val: value whose bytes to swap.
29 * // Output contains "1024 is 262144 as four bytes reversed"
30 * printf("1024 is %u as four bytes reversed\n", bswap_32(1024));
32 static inline uint32_t bswap_32(uint32_t val
)
34 return ((val
& (uint32_t)0x000000ffUL
) << 24)
35 | ((val
& (uint32_t)0x0000ff00UL
) << 8)
36 | ((val
& (uint32_t)0x00ff0000UL
) >> 8)
37 | ((val
& (uint32_t)0xff000000UL
) >> 24);
39 #endif /* !HAVE_BYTESWAP_H */
43 * bswap_64 - reverse bytes in a uint64_t value.
44 * @val: value whose bytes to swap.
47 * // Output contains "1024 is 1125899906842624 as eight bytes reversed"
48 * printf("1024 is %llu as eight bytes reversed\n",
49 * (unsigned long long)bswap_64(1024));
51 static inline uint64_t bswap_64(uint64_t val
)
53 return ((val
& (uint64_t)0x00000000000000ffULL
) << 56)
54 | ((val
& (uint64_t)0x000000000000ff00ULL
) << 40)
55 | ((val
& (uint64_t)0x0000000000ff0000ULL
) << 24)
56 | ((val
& (uint64_t)0x00000000ff000000ULL
) << 8)
57 | ((val
& (uint64_t)0x000000ff00000000ULL
) >> 8)
58 | ((val
& (uint64_t)0x0000ff0000000000ULL
) >> 24)
59 | ((val
& (uint64_t)0x00ff000000000000ULL
) >> 40)
60 | ((val
& (uint64_t)0xff00000000000000ULL
) >> 56);
64 /* Sanity check the defines. We don't handle weird endianness. */
65 #if !HAVE_LITTLE_ENDIAN && !HAVE_BIG_ENDIAN
66 #error "Unknown endian"
67 #elif HAVE_LITTLE_ENDIAN && HAVE_BIG_ENDIAN
68 #error "Can't compile for both big and little endian."
72 * cpu_to_le64 - convert a uint64_t value to little-endian
73 * @native: value to convert
75 static inline uint64_t cpu_to_le64(uint64_t native
)
77 #if HAVE_LITTLE_ENDIAN
80 return bswap_64(native
);
85 * cpu_to_le32 - convert a uint32_t value to little-endian
86 * @native: value to convert
88 static inline uint32_t cpu_to_le32(uint32_t native
)
90 #if HAVE_LITTLE_ENDIAN
93 return bswap_32(native
);
98 * cpu_to_le16 - convert a uint16_t value to little-endian
99 * @native: value to convert
101 static inline uint16_t cpu_to_le16(uint16_t native
)
103 #if HAVE_LITTLE_ENDIAN
106 return bswap_16(native
);
111 * le64_to_cpu - convert a little-endian uint64_t value
112 * @le_val: little-endian value to convert
114 static inline uint64_t le64_to_cpu(uint64_t le_val
)
116 #if HAVE_LITTLE_ENDIAN
119 return bswap_64(le_val
);
124 * le32_to_cpu - convert a little-endian uint32_t value
125 * @le_val: little-endian value to convert
127 static inline uint32_t le32_to_cpu(uint32_t le_val
)
129 #if HAVE_LITTLE_ENDIAN
132 return bswap_32(le_val
);
137 * le16_to_cpu - convert a little-endian uint16_t value
138 * @le_val: little-endian value to convert
140 static inline uint16_t le16_to_cpu(uint16_t le_val
)
142 #if HAVE_LITTLE_ENDIAN
145 return bswap_16(le_val
);
150 * cpu_to_be64 - convert a uint64_t value to big endian.
151 * @native: value to convert
153 static inline uint64_t cpu_to_be64(uint64_t native
)
155 #if HAVE_LITTLE_ENDIAN
156 return bswap_64(native
);
163 * cpu_to_be32 - convert a uint32_t value to big endian.
164 * @native: value to convert
166 static inline uint32_t cpu_to_be32(uint32_t native
)
168 #if HAVE_LITTLE_ENDIAN
169 return bswap_32(native
);
176 * cpu_to_be16 - convert a uint16_t value to big endian.
177 * @native: value to convert
179 static inline uint16_t cpu_to_be16(uint16_t native
)
181 #if HAVE_LITTLE_ENDIAN
182 return bswap_16(native
);
189 * be64_to_cpu - convert a big-endian uint64_t value
190 * @be_val: big-endian value to convert
192 static inline uint64_t be64_to_cpu(uint64_t be_val
)
194 #if HAVE_LITTLE_ENDIAN
195 return bswap_64(be_val
);
202 * be32_to_cpu - convert a big-endian uint32_t value
203 * @be_val: big-endian value to convert
205 static inline uint32_t be32_to_cpu(uint32_t be_val
)
207 #if HAVE_LITTLE_ENDIAN
208 return bswap_32(be_val
);
215 * be16_to_cpu - convert a big-endian uint16_t value
216 * @be_val: big-endian value to convert
218 static inline uint16_t be16_to_cpu(uint16_t be_val
)
220 #if HAVE_LITTLE_ENDIAN
221 return bswap_16(be_val
);
227 #endif /* CCAN_ENDIAN_H */