Home | History | Annotate | Line # | Download | only in common
      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 
     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); }
     44 
     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); }
     47 
     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); }
     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