11#ifndef MBEDTLS_LIBRARY_ALIGNMENT_H
12#define MBEDTLS_LIBRARY_ALIGNMENT_H
25#if defined(__ARM_FEATURE_UNALIGNED) \
26 || defined(MBEDTLS_ARCH_IS_X86) || defined(MBEDTLS_ARCH_IS_X64) \
27 || defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
37#define MBEDTLS_EFFICIENT_UNALIGNED_ACCESS
40#if defined(__IAR_SYSTEMS_ICC__) && \
41 (defined(MBEDTLS_ARCH_IS_ARM64) || defined(MBEDTLS_ARCH_IS_ARM32) \
42 || defined(__ICCRX__) || defined(__ICCRL78__) || defined(__ICCRISCV__))
44#pragma language=extended
45#define MBEDTLS_POP_IAR_LANGUAGE_PRAGMA
51 #define UINT_UNALIGNED
55#elif defined(MBEDTLS_COMPILER_IS_GCC) && (MBEDTLS_GCC_VERSION >= 40504) && \
56 ((MBEDTLS_GCC_VERSION < 60300) || (!defined(MBEDTLS_EFFICIENT_UNALIGNED_ACCESS)))
85 #define UINT_UNALIGNED_STRUCT
110#if defined(__IAR_SYSTEMS_ICC__)
111#pragma inline = forced
112#elif defined(__GNUC__)
115static inline uint16_t mbedtls_get_unaligned_uint16(
const void *p)
118#if defined(UINT_UNALIGNED)
119 mbedtls_uint16_unaligned_t *p16 = (mbedtls_uint16_unaligned_t *) p;
121#elif defined(UINT_UNALIGNED_STRUCT)
122 mbedtls_uint16_unaligned_t *p16 = (mbedtls_uint16_unaligned_t *) p;
137#if defined(__IAR_SYSTEMS_ICC__)
138#pragma inline = forced
139#elif defined(__GNUC__)
142static inline void mbedtls_put_unaligned_uint16(
void *p,
uint16_t x)
144#if defined(UINT_UNALIGNED)
145 mbedtls_uint16_unaligned_t *p16 = (mbedtls_uint16_unaligned_t *) p;
147#elif defined(UINT_UNALIGNED_STRUCT)
148 mbedtls_uint16_unaligned_t *p16 = (mbedtls_uint16_unaligned_t *) p;
162#if defined(__IAR_SYSTEMS_ICC__)
163#pragma inline = forced
164#elif defined(__GNUC__)
167static inline uint32_t mbedtls_get_unaligned_uint32(
const void *p)
170#if defined(UINT_UNALIGNED)
171 mbedtls_uint32_unaligned_t *p32 = (mbedtls_uint32_unaligned_t *) p;
173#elif defined(UINT_UNALIGNED_STRUCT)
174 mbedtls_uint32_unaligned_t *p32 = (mbedtls_uint32_unaligned_t *) p;
189#if defined(__IAR_SYSTEMS_ICC__)
190#pragma inline = forced
191#elif defined(__GNUC__)
194static inline void mbedtls_put_unaligned_uint32(
void *p,
uint32_t x)
196#if defined(UINT_UNALIGNED)
197 mbedtls_uint32_unaligned_t *p32 = (mbedtls_uint32_unaligned_t *) p;
199#elif defined(UINT_UNALIGNED_STRUCT)
200 mbedtls_uint32_unaligned_t *p32 = (mbedtls_uint32_unaligned_t *) p;
214#if defined(__IAR_SYSTEMS_ICC__)
215#pragma inline = forced
216#elif defined(__GNUC__)
219static inline uint64_t mbedtls_get_unaligned_uint64(
const void *p)
222#if defined(UINT_UNALIGNED)
223 mbedtls_uint64_unaligned_t *p64 = (mbedtls_uint64_unaligned_t *) p;
225#elif defined(UINT_UNALIGNED_STRUCT)
226 mbedtls_uint64_unaligned_t *p64 = (mbedtls_uint64_unaligned_t *) p;
241#if defined(__IAR_SYSTEMS_ICC__)
242#pragma inline = forced
243#elif defined(__GNUC__)
246static inline void mbedtls_put_unaligned_uint64(
void *p,
uint64_t x)
248#if defined(UINT_UNALIGNED)
249 mbedtls_uint64_unaligned_t *p64 = (mbedtls_uint64_unaligned_t *) p;
251#elif defined(UINT_UNALIGNED_STRUCT)
252 mbedtls_uint64_unaligned_t *p64 = (mbedtls_uint64_unaligned_t *) p;
259#if defined(MBEDTLS_POP_IAR_LANGUAGE_PRAGMA)
260#pragma language=restore
268#define MBEDTLS_BYTE_0(x) ((uint8_t) ((x) & 0xff))
269#define MBEDTLS_BYTE_1(x) ((uint8_t) (((x) >> 8) & 0xff))
270#define MBEDTLS_BYTE_2(x) ((uint8_t) (((x) >> 16) & 0xff))
271#define MBEDTLS_BYTE_3(x) ((uint8_t) (((x) >> 24) & 0xff))
272#define MBEDTLS_BYTE_4(x) ((uint8_t) (((x) >> 32) & 0xff))
273#define MBEDTLS_BYTE_5(x) ((uint8_t) (((x) >> 40) & 0xff))
274#define MBEDTLS_BYTE_6(x) ((uint8_t) (((x) >> 48) & 0xff))
275#define MBEDTLS_BYTE_7(x) ((uint8_t) (((x) >> 56) & 0xff))
280#if defined(__GNUC__) && defined(__GNUC_PREREQ)
281#if __GNUC_PREREQ(4, 8)
282#define MBEDTLS_BSWAP16 __builtin_bswap16
284#if __GNUC_PREREQ(4, 3)
285#define MBEDTLS_BSWAP32 __builtin_bswap32
286#define MBEDTLS_BSWAP64 __builtin_bswap64
293#if defined(__clang__) && defined(__has_builtin)
294#if __has_builtin(__builtin_bswap16) && !defined(MBEDTLS_BSWAP16)
295#define MBEDTLS_BSWAP16 __builtin_bswap16
297#if __has_builtin(__builtin_bswap32) && !defined(MBEDTLS_BSWAP32)
298#define MBEDTLS_BSWAP32 __builtin_bswap32
300#if __has_builtin(__builtin_bswap64) && !defined(MBEDTLS_BSWAP64)
301#define MBEDTLS_BSWAP64 __builtin_bswap64
309#if !defined(MBEDTLS_BSWAP16)
310#define MBEDTLS_BSWAP16 _byteswap_ushort
312#if !defined(MBEDTLS_BSWAP32)
313#define MBEDTLS_BSWAP32 _byteswap_ulong
315#if !defined(MBEDTLS_BSWAP64)
316#define MBEDTLS_BSWAP64 _byteswap_uint64
321#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 410000) && !defined(MBEDTLS_BSWAP32)
322#if defined(__ARM_ACLE)
325#define MBEDTLS_BSWAP32 __rev
329#if defined(__IAR_SYSTEMS_ICC__)
330#if defined(__ARM_ACLE)
332#define MBEDTLS_BSWAP16(x) ((uint16_t) __rev16((uint32_t) (x)))
333#define MBEDTLS_BSWAP32 __rev
334#define MBEDTLS_BSWAP64 __revll
343#if !defined(MBEDTLS_BSWAP16)
350#define MBEDTLS_BSWAP16 mbedtls_bswap16
353#if !defined(MBEDTLS_BSWAP32)
357 (
x & 0x000000ff) << 24 |
358 (
x & 0x0000ff00) << 8 |
359 (
x & 0x00ff0000) >> 8 |
360 (
x & 0xff000000) >> 24;
362#define MBEDTLS_BSWAP32 mbedtls_bswap32
365#if !defined(MBEDTLS_BSWAP64)
369 (
x & 0x00000000000000ffULL) << 56 |
370 (
x & 0x000000000000ff00ULL) << 40 |
371 (
x & 0x0000000000ff0000ULL) << 24 |
372 (
x & 0x00000000ff000000ULL) << 8 |
373 (
x & 0x000000ff00000000ULL) >> 8 |
374 (
x & 0x0000ff0000000000ULL) >> 24 |
375 (
x & 0x00ff000000000000ULL) >> 40 |
376 (
x & 0xff00000000000000ULL) >> 56;
378#define MBEDTLS_BSWAP64 mbedtls_bswap64
381#if !defined(__BYTE_ORDER__)
383#if defined(__LITTLE_ENDIAN__)
385#define MBEDTLS_IS_BIG_ENDIAN 0
386#elif defined(__BIG_ENDIAN__)
387#define MBEDTLS_IS_BIG_ENDIAN 1
389static const uint16_t mbedtls_byte_order_detector = { 0x100 };
390#define MBEDTLS_IS_BIG_ENDIAN (*((unsigned char *) (&mbedtls_byte_order_detector)) == 0x01)
395#if (__BYTE_ORDER__) == (__ORDER_BIG_ENDIAN__)
396#define MBEDTLS_IS_BIG_ENDIAN 1
398#define MBEDTLS_IS_BIG_ENDIAN 0
412#define MBEDTLS_GET_UINT32_BE(data, offset) \
413 ((MBEDTLS_IS_BIG_ENDIAN) \
414 ? mbedtls_get_unaligned_uint32((data) + (offset)) \
415 : MBEDTLS_BSWAP32(mbedtls_get_unaligned_uint32((data) + (offset))) \
427#define MBEDTLS_PUT_UINT32_BE(n, data, offset) \
429 if (MBEDTLS_IS_BIG_ENDIAN) \
431 mbedtls_put_unaligned_uint32((data) + (offset), (uint32_t) (n)); \
435 mbedtls_put_unaligned_uint32((data) + (offset), MBEDTLS_BSWAP32((uint32_t) (n))); \
448#define MBEDTLS_GET_UINT32_LE(data, offset) \
449 ((MBEDTLS_IS_BIG_ENDIAN) \
450 ? MBEDTLS_BSWAP32(mbedtls_get_unaligned_uint32((data) + (offset))) \
451 : mbedtls_get_unaligned_uint32((data) + (offset)) \
464#define MBEDTLS_PUT_UINT32_LE(n, data, offset) \
466 if (MBEDTLS_IS_BIG_ENDIAN) \
468 mbedtls_put_unaligned_uint32((data) + (offset), MBEDTLS_BSWAP32((uint32_t) (n))); \
472 mbedtls_put_unaligned_uint32((data) + (offset), ((uint32_t) (n))); \
485#define MBEDTLS_GET_UINT16_LE(data, offset) \
486 ((MBEDTLS_IS_BIG_ENDIAN) \
487 ? MBEDTLS_BSWAP16(mbedtls_get_unaligned_uint16((data) + (offset))) \
488 : mbedtls_get_unaligned_uint16((data) + (offset)) \
500#define MBEDTLS_PUT_UINT16_LE(n, data, offset) \
502 if (MBEDTLS_IS_BIG_ENDIAN) \
504 mbedtls_put_unaligned_uint16((data) + (offset), MBEDTLS_BSWAP16((uint16_t) (n))); \
508 mbedtls_put_unaligned_uint16((data) + (offset), (uint16_t) (n)); \
521#define MBEDTLS_GET_UINT16_BE(data, offset) \
522 ((MBEDTLS_IS_BIG_ENDIAN) \
523 ? mbedtls_get_unaligned_uint16((data) + (offset)) \
524 : MBEDTLS_BSWAP16(mbedtls_get_unaligned_uint16((data) + (offset))) \
536#define MBEDTLS_PUT_UINT16_BE(n, data, offset) \
538 if (MBEDTLS_IS_BIG_ENDIAN) \
540 mbedtls_put_unaligned_uint16((data) + (offset), (uint16_t) (n)); \
544 mbedtls_put_unaligned_uint16((data) + (offset), MBEDTLS_BSWAP16((uint16_t) (n))); \
557#define MBEDTLS_GET_UINT24_BE(data, offset) \
559 ((uint32_t) (data)[(offset)] << 16) \
560 | ((uint32_t) (data)[(offset) + 1] << 8) \
561 | ((uint32_t) (data)[(offset) + 2]) \
573#define MBEDTLS_PUT_UINT24_BE(n, data, offset) \
575 (data)[(offset)] = MBEDTLS_BYTE_2(n); \
576 (data)[(offset) + 1] = MBEDTLS_BYTE_1(n); \
577 (data)[(offset) + 2] = MBEDTLS_BYTE_0(n); \
589#define MBEDTLS_GET_UINT24_LE(data, offset) \
591 ((uint32_t) (data)[(offset)]) \
592 | ((uint32_t) (data)[(offset) + 1] << 8) \
593 | ((uint32_t) (data)[(offset) + 2] << 16) \
605#define MBEDTLS_PUT_UINT24_LE(n, data, offset) \
607 (data)[(offset)] = MBEDTLS_BYTE_0(n); \
608 (data)[(offset) + 1] = MBEDTLS_BYTE_1(n); \
609 (data)[(offset) + 2] = MBEDTLS_BYTE_2(n); \
621#define MBEDTLS_GET_UINT64_BE(data, offset) \
622 ((MBEDTLS_IS_BIG_ENDIAN) \
623 ? mbedtls_get_unaligned_uint64((data) + (offset)) \
624 : MBEDTLS_BSWAP64(mbedtls_get_unaligned_uint64((data) + (offset))) \
636#define MBEDTLS_PUT_UINT64_BE(n, data, offset) \
638 if (MBEDTLS_IS_BIG_ENDIAN) \
640 mbedtls_put_unaligned_uint64((data) + (offset), (uint64_t) (n)); \
644 mbedtls_put_unaligned_uint64((data) + (offset), MBEDTLS_BSWAP64((uint64_t) (n))); \
657#define MBEDTLS_GET_UINT64_LE(data, offset) \
658 ((MBEDTLS_IS_BIG_ENDIAN) \
659 ? MBEDTLS_BSWAP64(mbedtls_get_unaligned_uint64((data) + (offset))) \
660 : mbedtls_get_unaligned_uint64((data) + (offset)) \
672#define MBEDTLS_PUT_UINT64_LE(n, data, offset) \
674 if (MBEDTLS_IS_BIG_ENDIAN) \
676 mbedtls_put_unaligned_uint64((data) + (offset), MBEDTLS_BSWAP64((uint64_t) (n))); \
680 mbedtls_put_unaligned_uint64((data) + (offset), (uint64_t) (n)); \
typedef __attribute__
Definition list_sort.h:12
unsigned int uint32_t
Definition acefiex.h:163
COMPILER_DEPENDENT_UINT64 uint64_t
Definition acefiex.h:165
unsigned short int uint16_t
Definition acefiex.h:162
#define __packed
Definition compiler_attributes.h:300
int x
Definition layout.c:118