]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - tools/elftosb/common/EndianUtilities.h
Unified codebase for TX28, TX48, TX51, TX53
[karo-tx-uboot.git] / tools / elftosb / common / EndianUtilities.h
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_