1 1.1 jkunz /* 2 1.1 jkunz * File: EndianUtilities.h 3 1.1 jkunz * 4 1.1 jkunz * Copyright (c) Freescale Semiconductor, Inc. All rights reserved. 5 1.1 jkunz * See included license file for license details. 6 1.1 jkunz */ 7 1.1 jkunz #if !defined(_EndianUtilities_h_) 8 1.1 jkunz #define _EndianUtilities_h_ 9 1.1 jkunz 10 1.1 jkunz //! \name Swap macros 11 1.1 jkunz //! These macros always swap the data. 12 1.1 jkunz //@{ 13 1.1 jkunz 14 1.1 jkunz //! Byte swap 16-bit value. 15 1.1 jkunz #define _BYTESWAP16(value) \ 16 1.1 jkunz (((((uint16_t)value)<<8) & 0xFF00) | \ 17 1.1 jkunz ((((uint16_t)value)>>8) & 0x00FF)) 18 1.1 jkunz 19 1.1 jkunz //! Byte swap 32-bit value. 20 1.1 jkunz #define _BYTESWAP32(value) \ 21 1.1 jkunz (((((uint32_t)value)<<24) & 0xFF000000) | \ 22 1.1 jkunz ((((uint32_t)value)<< 8) & 0x00FF0000) | \ 23 1.1 jkunz ((((uint32_t)value)>> 8) & 0x0000FF00) | \ 24 1.1 jkunz ((((uint32_t)value)>>24) & 0x000000FF)) 25 1.1 jkunz 26 1.1 jkunz //! Byte swap 64-bit value. 27 1.1 jkunz #define _BYTESWAP64(value) \ 28 1.1 jkunz (((((uint64_t)value)<<56) & 0xFF00000000000000ULL) | \ 29 1.1 jkunz ((((uint64_t)value)<<40) & 0x00FF000000000000ULL) | \ 30 1.1 jkunz ((((uint64_t)value)<<24) & 0x0000FF0000000000ULL) | \ 31 1.1 jkunz ((((uint64_t)value)<< 8) & 0x000000FF00000000ULL) | \ 32 1.1 jkunz ((((uint64_t)value)>> 8) & 0x00000000FF000000ULL) | \ 33 1.1 jkunz ((((uint64_t)value)>>24) & 0x0000000000FF0000ULL) | \ 34 1.1 jkunz ((((uint64_t)value)>>40) & 0x000000000000FF00ULL) | \ 35 1.1 jkunz ((((uint64_t)value)>>56) & 0x00000000000000FFULL)) 36 1.1 jkunz 37 1.1 jkunz //@} 38 1.1 jkunz 39 1.1 jkunz //! \name Inline swap functions 40 1.1 jkunz //@{ 41 1.1 jkunz 42 1.1 jkunz inline uint16_t _swap_u16(uint16_t value) { return _BYTESWAP16(value); } 43 1.1 jkunz inline int16_t _swap_s16(int16_t value) { return (int16_t)_BYTESWAP16((uint16_t)value); } 44 1.1 jkunz 45 1.1 jkunz inline uint32_t _swap_u32(uint32_t value) { return _BYTESWAP32(value); } 46 1.1 jkunz inline int32_t _swap_s32(int32_t value) { return (int32_t)_BYTESWAP32((uint32_t)value); } 47 1.1 jkunz 48 1.1 jkunz inline uint64_t _swap_u64(uint64_t value) { return _BYTESWAP64(value); } 49 1.1 jkunz inline int64_t _swap_s64(int64_t value) { return (uint64_t)_BYTESWAP64((uint64_t)value); } 50 1.1 jkunz 51 1.1 jkunz //@} 52 1.1 jkunz 53 1.1 jkunz #if defined(__LITTLE_ENDIAN__) 54 1.1 jkunz 55 1.1 jkunz /* little endian host */ 56 1.1 jkunz 57 1.1 jkunz #define ENDIAN_BIG_TO_HOST_U16(value) (_swap_u16(value)) 58 1.1 jkunz #define ENDIAN_HOST_TO_BIG_U16(value) (_swap_u16(value)) 59 1.1 jkunz 60 1.1 jkunz #define ENDIAN_BIG_TO_HOST_S16(value) (_swap_s16(value)) 61 1.1 jkunz #define ENDIAN_HOST_TO_BIG_S16(value) (_swap_s16(value)) 62 1.1 jkunz 63 1.1 jkunz #define ENDIAN_BIG_TO_HOST_U32(value) (_swap_u32(value)) 64 1.1 jkunz #define ENDIAN_HOST_TO_BIG_U32(value) (_swap_u32(value)) 65 1.1 jkunz 66 1.1 jkunz #define ENDIAN_BIG_TO_HOST_S32(value) (_swap_s32(value)) 67 1.1 jkunz #define ENDIAN_HOST_TO_BIG_S32(value) (_swap_s32(value)) 68 1.1 jkunz 69 1.1 jkunz #define ENDIAN_BIG_TO_HOST_U64(value) (_swap_u64(value)) 70 1.1 jkunz #define ENDIAN_HOST_TO_BIG_U64(value) (_swap_u64(value)) 71 1.1 jkunz 72 1.1 jkunz #define ENDIAN_BIG_TO_HOST_S64(value) (_swap_s64(value)) 73 1.1 jkunz #define ENDIAN_HOST_TO_BIG_S64(value) (_swap_s64(value)) 74 1.1 jkunz 75 1.1 jkunz /* no-ops */ 76 1.1 jkunz 77 1.1 jkunz #define ENDIAN_LITTLE_TO_HOST_U16(value) (value) 78 1.1 jkunz #define ENDIAN_HOST_TO_LITTLE_U16(value) (value) 79 1.1 jkunz 80 1.1 jkunz #define ENDIAN_LITTLE_TO_HOST_S16(value) (value) 81 1.1 jkunz #define ENDIAN_HOST_TO_LITTLE_S16(value) (value) 82 1.1 jkunz 83 1.1 jkunz #define ENDIAN_LITTLE_TO_HOST_U32(value) (value) 84 1.1 jkunz #define ENDIAN_HOST_TO_LITTLE_U32(value) (value) 85 1.1 jkunz 86 1.1 jkunz #define ENDIAN_LITTLE_TO_HOST_S32(value) (value) 87 1.1 jkunz #define ENDIAN_HOST_TO_LITTLE_S32(value) (value) 88 1.1 jkunz 89 1.1 jkunz #define ENDIAN_LITTLE_TO_HOST_U64(value) (value) 90 1.1 jkunz #define ENDIAN_HOST_TO_LITTLE_U64(value) (value) 91 1.1 jkunz 92 1.1 jkunz #define ENDIAN_LITTLE_TO_HOST_S64(value) (value) 93 1.1 jkunz #define ENDIAN_HOST_TO_LITTLE_S64(value) (value) 94 1.1 jkunz 95 1.1 jkunz #elif defined(__BIG_ENDIAN__) 96 1.1 jkunz 97 1.1 jkunz /* big endian host */ 98 1.1 jkunz 99 1.1 jkunz #define ENDIAN_LITTLE_TO_HOST_U16(value) (_swap_u16(value)) 100 1.1 jkunz #define ENDIAN_HOST_TO_LITTLE_U16(value) (_swap_u16(value)) 101 1.1 jkunz 102 1.1 jkunz #define ENDIAN_LITTLE_TO_HOST_S16(value) (_swap_s16(value)) 103 1.1 jkunz #define ENDIAN_HOST_TO_LITTLE_S16(value) (_swap_s16(value)) 104 1.1 jkunz 105 1.1 jkunz #define ENDIAN_LITTLE_TO_HOST_U32(value) (_swap_u32(value)) 106 1.1 jkunz #define ENDIAN_HOST_TO_LITTLE_U32(value) (_swap_u32(value)) 107 1.1 jkunz 108 1.1 jkunz #define ENDIAN_LITTLE_TO_HOST_S32(value) (_swap_s32(value)) 109 1.1 jkunz #define ENDIAN_HOST_TO_LITTLE_S32(value) (_swap_s32(value)) 110 1.1 jkunz 111 1.1 jkunz #define ENDIAN_LITTLE_TO_HOST_U64(value) (_swap_u64(value)) 112 1.1 jkunz #define ENDIAN_HOST_TO_LITTLE_U64(value) (_swap_u64(value)) 113 1.1 jkunz 114 1.1 jkunz #define ENDIAN_LITTLE_TO_HOST_S64(value) (_swap_s64(value)) 115 1.1 jkunz #define ENDIAN_HOST_TO_LITTLE_S64(value) (_swap_s64(value)) 116 1.1 jkunz 117 1.1 jkunz /* no-ops */ 118 1.1 jkunz 119 1.1 jkunz #define ENDIAN_BIG_TO_HOST_U16(value) (value) 120 1.1 jkunz #define ENDIAN_HOST_TO_BIG_U16(value) (value) 121 1.1 jkunz 122 1.1 jkunz #define ENDIAN_BIG_TO_HOST_S16(value) (value) 123 1.1 jkunz #define ENDIAN_HOST_TO_BIG_S16(value) (value) 124 1.1 jkunz 125 1.1 jkunz #define ENDIAN_BIG_TO_HOST_U32(value) (value) 126 1.1 jkunz #define ENDIAN_HOST_TO_BIG_U32(value) (value) 127 1.1 jkunz 128 1.1 jkunz #define ENDIAN_BIG_TO_HOST_S32(value) (value) 129 1.1 jkunz #define ENDIAN_HOST_TO_BIG_S32(value) (value) 130 1.1 jkunz 131 1.1 jkunz #define ENDIAN_BIG_TO_HOST_U64(value) (value) 132 1.1 jkunz #define ENDIAN_HOST_TO_BIG_U64(value) (value) 133 1.1 jkunz 134 1.1 jkunz #define ENDIAN_BIG_TO_HOST_S64(value) (value) 135 1.1 jkunz #define ENDIAN_HOST_TO_BIG_S64(value) (value) 136 1.1 jkunz 137 1.1 jkunz #endif 138 1.1 jkunz 139 1.1 jkunz 140 1.1 jkunz 141 1.1 jkunz #endif // _EndianUtilities_h_ 142