5#include <linux/types.h>
8# if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || defined(__LITTLE_ENDIAN__)
9# define __LITTLE_ENDIAN 1
14# define _IS_LITTLE_ENDIAN 1
16# define _IS_LITTLE_ENDIAN 0
19static unsigned _isLittleEndian(
void)
21 const union { uint32_t u; uint8_t
c[4]; } one = { 1 };
27static uint16_t _swap16(uint16_t in)
29 return ((in & 0xF) << 8) + ((
in & 0xF0) >> 8);
32static uint32_t _swap32(uint32_t in)
34 return __builtin_bswap32(in);
37static uint64_t _swap64(uint64_t in)
39 return __builtin_bswap64(in);
43static uint16_t get_unaligned_le16(
const void* memPtr)
46 __builtin_memcpy(&val, memPtr,
sizeof(val));
47 if (!_isLittleEndian()) _swap16(val);
51static uint32_t get_unaligned_le32(
const void* memPtr)
54 __builtin_memcpy(&val, memPtr,
sizeof(val));
55 if (!_isLittleEndian()) _swap32(val);
59static uint64_t get_unaligned_le64(
const void* memPtr)
62 __builtin_memcpy(&val, memPtr,
sizeof(val));
63 if (!_isLittleEndian()) _swap64(val);
67static void put_unaligned_le16(uint16_t value,
void* memPtr)
69 if (!_isLittleEndian()) value = _swap16(value);
70 __builtin_memcpy(memPtr, &value,
sizeof(value));
73static void put_unaligned_le32(uint32_t value,
void* memPtr)
75 if (!_isLittleEndian()) value = _swap32(value);
76 __builtin_memcpy(memPtr, &value,
sizeof(value));
79static void put_unaligned_le64(uint64_t value,
void* memPtr)
81 if (!_isLittleEndian()) value = _swap64(value);
82 __builtin_memcpy(memPtr, &value,
sizeof(value));
86static uint32_t get_unaligned_be32(
const void* memPtr)
89 __builtin_memcpy(&val, memPtr,
sizeof(val));
90 if (_isLittleEndian()) _swap32(val);
94static uint64_t get_unaligned_be64(
const void* memPtr)
97 __builtin_memcpy(&val, memPtr,
sizeof(val));
98 if (_isLittleEndian()) _swap64(val);
102static void put_unaligned_be32(uint32_t value,
void* memPtr)
104 if (_isLittleEndian()) value = _swap32(value);
105 __builtin_memcpy(memPtr, &value,
sizeof(value));
108static void put_unaligned_be64(uint64_t value,
void* memPtr)
110 if (_isLittleEndian()) value = _swap64(value);
111 __builtin_memcpy(memPtr, &value,
sizeof(value));
117#define __get_unaligned_le(ptr) ((typeof(*(ptr)))({ \
118 __builtin_choose_expr(sizeof(*(ptr)) == 1, *(ptr), \
119 __builtin_choose_expr(sizeof(*(ptr)) == 2, get_unaligned_le16((ptr)), \
120 __builtin_choose_expr(sizeof(*(ptr)) == 4, get_unaligned_le32((ptr)), \
121 __builtin_choose_expr(sizeof(*(ptr)) == 8, get_unaligned_le64((ptr)), \
122 __bad_unaligned_access_size())))); \
125#define __get_unaligned_be(ptr) ((typeof(*(ptr)))({ \
126 __builtin_choose_expr(sizeof(*(ptr)) == 1, *(ptr), \
127 __builtin_choose_expr(sizeof(*(ptr)) == 2, get_unaligned_be16((ptr)), \
128 __builtin_choose_expr(sizeof(*(ptr)) == 4, get_unaligned_be32((ptr)), \
129 __builtin_choose_expr(sizeof(*(ptr)) == 8, get_unaligned_be64((ptr)), \
130 __bad_unaligned_access_size())))); \
133#define __put_unaligned_le(val, ptr) \
135 void *__gu_p = (ptr); \
136 switch (sizeof(*(ptr))) { \
138 *(uint8_t *)__gu_p = (uint8_t)(val); \
141 put_unaligned_le16((uint16_t)(val), __gu_p); \
144 put_unaligned_le32((uint32_t)(val), __gu_p); \
147 put_unaligned_le64((uint64_t)(val), __gu_p); \
150 __bad_unaligned_access_size(); \
156#define __put_unaligned_be(val, ptr) \
158 void *__gu_p = (ptr); \
159 switch (sizeof(*(ptr))) { \
161 *(uint8_t *)__gu_p = (uint8_t)(val); \
164 put_unaligned_be16((uint16_t)(val), __gu_p); \
167 put_unaligned_be32((uint32_t)(val), __gu_p); \
170 put_unaligned_be64((uint64_t)(val), __gu_p); \
173 __bad_unaligned_access_size(); \
180# define get_unaligned __get_unaligned_le
181# define put_unaligned __put_unaligned_le
183# define get_unaligned __get_unaligned_be
184# define put_unaligned __put_unaligned_be
#define assert(condition)
Definition lz4.c:273
#define c(i)
Definition sha256.c:43
const lzma_allocator const uint8_t * in
Definition block.h:527
#define _IS_LITTLE_ENDIAN
Definition unaligned.h:14
void __bad_unaligned_access_size(void)