xref: /netbsd-src/external/bsd/elftosb/dist/common/EndianUtilities.h (revision 993229b6fea628ff8b1fa09146c80b0cfb2768eb)
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*993229b6Sjkunz inline uint16_t _swap_u16(uint16_t value) { return _BYTESWAP16(value); }
_swap_s16(int16_t value)43*993229b6Sjkunz inline int16_t _swap_s16(int16_t value) { return (int16_t)_BYTESWAP16((uint16_t)value); }
44*993229b6Sjkunz 
_swap_u32(uint32_t value)45*993229b6Sjkunz inline uint32_t _swap_u32(uint32_t value) { return _BYTESWAP32(value); }
_swap_s32(int32_t value)46*993229b6Sjkunz inline int32_t _swap_s32(int32_t value) { return (int32_t)_BYTESWAP32((uint32_t)value); }
47*993229b6Sjkunz 
_swap_u64(uint64_t value)48*993229b6Sjkunz inline uint64_t _swap_u64(uint64_t value) { return _BYTESWAP64(value); }
_swap_s64(int64_t value)49*993229b6Sjkunz inline 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