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