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