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