2 * File: EndianUtilities.h
4 * Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
5 * See included license file for license details.
7 #if !defined(_EndianUtilities_h_)
8 #define _EndianUtilities_h_
11 //! These macros always swap the data.
14 //! Byte swap 16-bit value.
15 #define _BYTESWAP16(value) \
16 (((((uint16_t)value)<<8) & 0xFF00) | \
17 ((((uint16_t)value)>>8) & 0x00FF))
19 //! Byte swap 32-bit value.
20 #define _BYTESWAP32(value) \
21 (((((uint32_t)value)<<24) & 0xFF000000) | \
22 ((((uint32_t)value)<< 8) & 0x00FF0000) | \
23 ((((uint32_t)value)>> 8) & 0x0000FF00) | \
24 ((((uint32_t)value)>>24) & 0x000000FF))
26 //! Byte swap 64-bit value.
27 #define _BYTESWAP64(value) \
28 (((((uint64_t)value)<<56) & 0xFF00000000000000ULL) | \
29 ((((uint64_t)value)<<40) & 0x00FF000000000000ULL) | \
30 ((((uint64_t)value)<<24) & 0x0000FF0000000000ULL) | \
31 ((((uint64_t)value)<< 8) & 0x000000FF00000000ULL) | \
32 ((((uint64_t)value)>> 8) & 0x00000000FF000000ULL) | \
33 ((((uint64_t)value)>>24) & 0x0000000000FF0000ULL) | \
34 ((((uint64_t)value)>>40) & 0x000000000000FF00ULL) | \
35 ((((uint64_t)value)>>56) & 0x00000000000000FFULL))
39 //! \name Inline swap functions
42 inline uint16_t _swap_u16(uint16_t value) { return _BYTESWAP16(value); }
43 inline int16_t _swap_s16(int16_t value) { return (int16_t)_BYTESWAP16((uint16_t)value); }
45 inline uint32_t _swap_u32(uint32_t value) { return _BYTESWAP32(value); }
46 inline int32_t _swap_s32(int32_t value) { return (int32_t)_BYTESWAP32((uint32_t)value); }
48 inline uint64_t _swap_u64(uint64_t value) { return _BYTESWAP64(value); }
49 inline int64_t _swap_s64(int64_t value) { return (uint64_t)_BYTESWAP64((uint64_t)value); }
53 #if defined(__LITTLE_ENDIAN__)
55 /* little endian host */
57 #define ENDIAN_BIG_TO_HOST_U16(value) (_swap_u16(value))
58 #define ENDIAN_HOST_TO_BIG_U16(value) (_swap_u16(value))
60 #define ENDIAN_BIG_TO_HOST_S16(value) (_swap_s16(value))
61 #define ENDIAN_HOST_TO_BIG_S16(value) (_swap_s16(value))
63 #define ENDIAN_BIG_TO_HOST_U32(value) (_swap_u32(value))
64 #define ENDIAN_HOST_TO_BIG_U32(value) (_swap_u32(value))
66 #define ENDIAN_BIG_TO_HOST_S32(value) (_swap_s32(value))
67 #define ENDIAN_HOST_TO_BIG_S32(value) (_swap_s32(value))
69 #define ENDIAN_BIG_TO_HOST_U64(value) (_swap_u64(value))
70 #define ENDIAN_HOST_TO_BIG_U64(value) (_swap_u64(value))
72 #define ENDIAN_BIG_TO_HOST_S64(value) (_swap_s64(value))
73 #define ENDIAN_HOST_TO_BIG_S64(value) (_swap_s64(value))
77 #define ENDIAN_LITTLE_TO_HOST_U16(value) (value)
78 #define ENDIAN_HOST_TO_LITTLE_U16(value) (value)
80 #define ENDIAN_LITTLE_TO_HOST_S16(value) (value)
81 #define ENDIAN_HOST_TO_LITTLE_S16(value) (value)
83 #define ENDIAN_LITTLE_TO_HOST_U32(value) (value)
84 #define ENDIAN_HOST_TO_LITTLE_U32(value) (value)
86 #define ENDIAN_LITTLE_TO_HOST_S32(value) (value)
87 #define ENDIAN_HOST_TO_LITTLE_S32(value) (value)
89 #define ENDIAN_LITTLE_TO_HOST_U64(value) (value)
90 #define ENDIAN_HOST_TO_LITTLE_U64(value) (value)
92 #define ENDIAN_LITTLE_TO_HOST_S64(value) (value)
93 #define ENDIAN_HOST_TO_LITTLE_S64(value) (value)
95 #elif defined(__BIG_ENDIAN__)
99 #define ENDIAN_LITTLE_TO_HOST_U16(value) (_swap_u16(value))
100 #define ENDIAN_HOST_TO_LITTLE_U16(value) (_swap_u16(value))
102 #define ENDIAN_LITTLE_TO_HOST_S16(value) (_swap_s16(value))
103 #define ENDIAN_HOST_TO_LITTLE_S16(value) (_swap_s16(value))
105 #define ENDIAN_LITTLE_TO_HOST_U32(value) (_swap_u32(value))
106 #define ENDIAN_HOST_TO_LITTLE_U32(value) (_swap_u32(value))
108 #define ENDIAN_LITTLE_TO_HOST_S32(value) (_swap_s32(value))
109 #define ENDIAN_HOST_TO_LITTLE_S32(value) (_swap_s32(value))
111 #define ENDIAN_LITTLE_TO_HOST_U64(value) (_swap_u64(value))
112 #define ENDIAN_HOST_TO_LITTLE_U64(value) (_swap_u64(value))
114 #define ENDIAN_LITTLE_TO_HOST_S64(value) (_swap_s64(value))
115 #define ENDIAN_HOST_TO_LITTLE_S64(value) (_swap_s64(value))
119 #define ENDIAN_BIG_TO_HOST_U16(value) (value)
120 #define ENDIAN_HOST_TO_BIG_U16(value) (value)
122 #define ENDIAN_BIG_TO_HOST_S16(value) (value)
123 #define ENDIAN_HOST_TO_BIG_S16(value) (value)
125 #define ENDIAN_BIG_TO_HOST_U32(value) (value)
126 #define ENDIAN_HOST_TO_BIG_U32(value) (value)
128 #define ENDIAN_BIG_TO_HOST_S32(value) (value)
129 #define ENDIAN_HOST_TO_BIG_S32(value) (value)
131 #define ENDIAN_BIG_TO_HOST_U64(value) (value)
132 #define ENDIAN_HOST_TO_BIG_U64(value) (value)
134 #define ENDIAN_BIG_TO_HOST_S64(value) (value)
135 #define ENDIAN_HOST_TO_BIG_S64(value) (value)
141 #endif // _EndianUtilities_h_