Home | History | Annotate | Line # | Download | only in common
      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