diff options
Diffstat (limited to 'vendor/SDL2/include/SDL_endian.h')
-rw-r--r-- | vendor/SDL2/include/SDL_endian.h | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/vendor/SDL2/include/SDL_endian.h b/vendor/SDL2/include/SDL_endian.h new file mode 100644 index 0000000..46c2962 --- /dev/null +++ b/vendor/SDL2/include/SDL_endian.h | |||
@@ -0,0 +1,317 @@ | |||
1 | /* | ||
2 | Simple DirectMedia Layer | ||
3 | Copyright (C) 1997-2022 Sam Lantinga <slouken@libsdl.org> | ||
4 | |||
5 | This software is provided 'as-is', without any express or implied | ||
6 | warranty. In no event will the authors be held liable for any damages | ||
7 | arising from the use of this software. | ||
8 | |||
9 | Permission is granted to anyone to use this software for any purpose, | ||
10 | including commercial applications, and to alter it and redistribute it | ||
11 | freely, subject to the following restrictions: | ||
12 | |||
13 | 1. The origin of this software must not be misrepresented; you must not | ||
14 | claim that you wrote the original software. If you use this software | ||
15 | in a product, an acknowledgment in the product documentation would be | ||
16 | appreciated but is not required. | ||
17 | 2. Altered source versions must be plainly marked as such, and must not be | ||
18 | misrepresented as being the original software. | ||
19 | 3. This notice may not be removed or altered from any source distribution. | ||
20 | */ | ||
21 | |||
22 | /** | ||
23 | * \file SDL_endian.h | ||
24 | * | ||
25 | * Functions for reading and writing endian-specific values | ||
26 | */ | ||
27 | |||
28 | #ifndef SDL_endian_h_ | ||
29 | #define SDL_endian_h_ | ||
30 | |||
31 | #include "SDL_stdinc.h" | ||
32 | |||
33 | #if defined(_MSC_VER) && (_MSC_VER >= 1400) | ||
34 | /* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version, | ||
35 | so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */ | ||
36 | #ifdef __clang__ | ||
37 | #ifndef __PRFCHWINTRIN_H | ||
38 | #define __PRFCHWINTRIN_H | ||
39 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) | ||
40 | _m_prefetch(void *__P) | ||
41 | { | ||
42 | __builtin_prefetch (__P, 0, 3 /* _MM_HINT_T0 */); | ||
43 | } | ||
44 | #endif /* __PRFCHWINTRIN_H */ | ||
45 | #endif /* __clang__ */ | ||
46 | |||
47 | #include <intrin.h> | ||
48 | #endif | ||
49 | |||
50 | /** | ||
51 | * \name The two types of endianness | ||
52 | */ | ||
53 | /* @{ */ | ||
54 | #define SDL_LIL_ENDIAN 1234 | ||
55 | #define SDL_BIG_ENDIAN 4321 | ||
56 | /* @} */ | ||
57 | |||
58 | #ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */ | ||
59 | #ifdef __linux__ | ||
60 | #include <endian.h> | ||
61 | #define SDL_BYTEORDER __BYTE_ORDER | ||
62 | #elif defined(__OpenBSD__) | ||
63 | #include <endian.h> | ||
64 | #define SDL_BYTEORDER BYTE_ORDER | ||
65 | #elif defined(__FreeBSD__) || defined(__NetBSD__) | ||
66 | #include <sys/endian.h> | ||
67 | #define SDL_BYTEORDER BYTE_ORDER | ||
68 | #else | ||
69 | #if defined(__hppa__) || \ | ||
70 | defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ | ||
71 | (defined(__MIPS__) && defined(__MIPSEB__)) || \ | ||
72 | defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \ | ||
73 | defined(__sparc__) | ||
74 | #define SDL_BYTEORDER SDL_BIG_ENDIAN | ||
75 | #else | ||
76 | #define SDL_BYTEORDER SDL_LIL_ENDIAN | ||
77 | #endif | ||
78 | #endif /* __linux__ */ | ||
79 | #endif /* !SDL_BYTEORDER */ | ||
80 | |||
81 | |||
82 | #include "begin_code.h" | ||
83 | /* Set up for C function definitions, even when using C++ */ | ||
84 | #ifdef __cplusplus | ||
85 | extern "C" { | ||
86 | #endif | ||
87 | |||
88 | /** | ||
89 | * \file SDL_endian.h | ||
90 | */ | ||
91 | |||
92 | /* various modern compilers may have builtin swap */ | ||
93 | #if defined(__GNUC__) || defined(__clang__) | ||
94 | # define HAS_BUILTIN_BSWAP16 (_SDL_HAS_BUILTIN(__builtin_bswap16)) || \ | ||
95 | (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) | ||
96 | # define HAS_BUILTIN_BSWAP32 (_SDL_HAS_BUILTIN(__builtin_bswap32)) || \ | ||
97 | (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) | ||
98 | # define HAS_BUILTIN_BSWAP64 (_SDL_HAS_BUILTIN(__builtin_bswap64)) || \ | ||
99 | (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) | ||
100 | |||
101 | /* this one is broken */ | ||
102 | # define HAS_BROKEN_BSWAP (__GNUC__ == 2 && __GNUC_MINOR__ <= 95) | ||
103 | #else | ||
104 | # define HAS_BUILTIN_BSWAP16 0 | ||
105 | # define HAS_BUILTIN_BSWAP32 0 | ||
106 | # define HAS_BUILTIN_BSWAP64 0 | ||
107 | # define HAS_BROKEN_BSWAP 0 | ||
108 | #endif | ||
109 | |||
110 | #if HAS_BUILTIN_BSWAP16 | ||
111 | #define SDL_Swap16(x) __builtin_bswap16(x) | ||
112 | #elif defined(_MSC_VER) && (_MSC_VER >= 1400) | ||
113 | #pragma intrinsic(_byteswap_ushort) | ||
114 | #define SDL_Swap16(x) _byteswap_ushort(x) | ||
115 | #elif defined(__i386__) && !HAS_BROKEN_BSWAP | ||
116 | SDL_FORCE_INLINE Uint16 | ||
117 | SDL_Swap16(Uint16 x) | ||
118 | { | ||
119 | __asm__("xchgb %b0,%h0": "=q"(x):"0"(x)); | ||
120 | return x; | ||
121 | } | ||
122 | #elif defined(__x86_64__) | ||
123 | SDL_FORCE_INLINE Uint16 | ||
124 | SDL_Swap16(Uint16 x) | ||
125 | { | ||
126 | __asm__("xchgb %b0,%h0": "=Q"(x):"0"(x)); | ||
127 | return x; | ||
128 | } | ||
129 | #elif (defined(__powerpc__) || defined(__ppc__)) | ||
130 | SDL_FORCE_INLINE Uint16 | ||
131 | SDL_Swap16(Uint16 x) | ||
132 | { | ||
133 | int result; | ||
134 | |||
135 | __asm__("rlwimi %0,%2,8,16,23": "=&r"(result):"0"(x >> 8), "r"(x)); | ||
136 | return (Uint16)result; | ||
137 | } | ||
138 | #elif (defined(__m68k__) && !defined(__mcoldfire__)) | ||
139 | SDL_FORCE_INLINE Uint16 | ||
140 | SDL_Swap16(Uint16 x) | ||
141 | { | ||
142 | __asm__("rorw #8,%0": "=d"(x): "0"(x):"cc"); | ||
143 | return x; | ||
144 | } | ||
145 | #elif defined(__WATCOMC__) && defined(__386__) | ||
146 | extern __inline Uint16 SDL_Swap16(Uint16); | ||
147 | #pragma aux SDL_Swap16 = \ | ||
148 | "xchg al, ah" \ | ||
149 | parm [ax] \ | ||
150 | modify [ax]; | ||
151 | #else | ||
152 | SDL_FORCE_INLINE Uint16 | ||
153 | SDL_Swap16(Uint16 x) | ||
154 | { | ||
155 | return SDL_static_cast(Uint16, ((x << 8) | (x >> 8))); | ||
156 | } | ||
157 | #endif | ||
158 | |||
159 | #if HAS_BUILTIN_BSWAP32 | ||
160 | #define SDL_Swap32(x) __builtin_bswap32(x) | ||
161 | #elif defined(_MSC_VER) && (_MSC_VER >= 1400) | ||
162 | #pragma intrinsic(_byteswap_ulong) | ||
163 | #define SDL_Swap32(x) _byteswap_ulong(x) | ||
164 | #elif defined(__i386__) && !HAS_BROKEN_BSWAP | ||
165 | SDL_FORCE_INLINE Uint32 | ||
166 | SDL_Swap32(Uint32 x) | ||
167 | { | ||
168 | __asm__("bswap %0": "=r"(x):"0"(x)); | ||
169 | return x; | ||
170 | } | ||
171 | #elif defined(__x86_64__) | ||
172 | SDL_FORCE_INLINE Uint32 | ||
173 | SDL_Swap32(Uint32 x) | ||
174 | { | ||
175 | __asm__("bswapl %0": "=r"(x):"0"(x)); | ||
176 | return x; | ||
177 | } | ||
178 | #elif (defined(__powerpc__) || defined(__ppc__)) | ||
179 | SDL_FORCE_INLINE Uint32 | ||
180 | SDL_Swap32(Uint32 x) | ||
181 | { | ||
182 | Uint32 result; | ||
183 | |||
184 | __asm__("rlwimi %0,%2,24,16,23": "=&r"(result): "0" (x>>24), "r"(x)); | ||
185 | __asm__("rlwimi %0,%2,8,8,15" : "=&r"(result): "0" (result), "r"(x)); | ||
186 | __asm__("rlwimi %0,%2,24,0,7" : "=&r"(result): "0" (result), "r"(x)); | ||
187 | return result; | ||
188 | } | ||
189 | #elif (defined(__m68k__) && !defined(__mcoldfire__)) | ||
190 | SDL_FORCE_INLINE Uint32 | ||
191 | SDL_Swap32(Uint32 x) | ||
192 | { | ||
193 | __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0": "=d"(x): "0"(x):"cc"); | ||
194 | return x; | ||
195 | } | ||
196 | #elif defined(__WATCOMC__) && defined(__386__) | ||
197 | extern __inline Uint32 SDL_Swap32(Uint32); | ||
198 | #pragma aux SDL_Swap32 = \ | ||
199 | "bswap eax" \ | ||
200 | parm [eax] \ | ||
201 | modify [eax]; | ||
202 | #else | ||
203 | SDL_FORCE_INLINE Uint32 | ||
204 | SDL_Swap32(Uint32 x) | ||
205 | { | ||
206 | return SDL_static_cast(Uint32, ((x << 24) | ((x << 8) & 0x00FF0000) | | ||
207 | ((x >> 8) & 0x0000FF00) | (x >> 24))); | ||
208 | } | ||
209 | #endif | ||
210 | |||
211 | #if HAS_BUILTIN_BSWAP64 | ||
212 | #define SDL_Swap64(x) __builtin_bswap64(x) | ||
213 | #elif defined(_MSC_VER) && (_MSC_VER >= 1400) | ||
214 | #pragma intrinsic(_byteswap_uint64) | ||
215 | #define SDL_Swap64(x) _byteswap_uint64(x) | ||
216 | #elif defined(__i386__) && !HAS_BROKEN_BSWAP | ||
217 | SDL_FORCE_INLINE Uint64 | ||
218 | SDL_Swap64(Uint64 x) | ||
219 | { | ||
220 | union { | ||
221 | struct { | ||
222 | Uint32 a, b; | ||
223 | } s; | ||
224 | Uint64 u; | ||
225 | } v; | ||
226 | v.u = x; | ||
227 | __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1" | ||
228 | : "=r"(v.s.a), "=r"(v.s.b) | ||
229 | : "0" (v.s.a), "1"(v.s.b)); | ||
230 | return v.u; | ||
231 | } | ||
232 | #elif defined(__x86_64__) | ||
233 | SDL_FORCE_INLINE Uint64 | ||
234 | SDL_Swap64(Uint64 x) | ||
235 | { | ||
236 | __asm__("bswapq %0": "=r"(x):"0"(x)); | ||
237 | return x; | ||
238 | } | ||
239 | #elif defined(__WATCOMC__) && defined(__386__) | ||
240 | extern __inline Uint64 SDL_Swap64(Uint64); | ||
241 | #pragma aux SDL_Swap64 = \ | ||
242 | "bswap eax" \ | ||
243 | "bswap edx" \ | ||
244 | "xchg eax,edx" \ | ||
245 | parm [eax edx] \ | ||
246 | modify [eax edx]; | ||
247 | #else | ||
248 | SDL_FORCE_INLINE Uint64 | ||
249 | SDL_Swap64(Uint64 x) | ||
250 | { | ||
251 | Uint32 hi, lo; | ||
252 | |||
253 | /* Separate into high and low 32-bit values and swap them */ | ||
254 | lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF); | ||
255 | x >>= 32; | ||
256 | hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF); | ||
257 | x = SDL_Swap32(lo); | ||
258 | x <<= 32; | ||
259 | x |= SDL_Swap32(hi); | ||
260 | return (x); | ||
261 | } | ||
262 | #endif | ||
263 | |||
264 | |||
265 | SDL_FORCE_INLINE float | ||
266 | SDL_SwapFloat(float x) | ||
267 | { | ||
268 | union { | ||
269 | float f; | ||
270 | Uint32 ui32; | ||
271 | } swapper; | ||
272 | swapper.f = x; | ||
273 | swapper.ui32 = SDL_Swap32(swapper.ui32); | ||
274 | return swapper.f; | ||
275 | } | ||
276 | |||
277 | /* remove extra macros */ | ||
278 | #undef HAS_BROKEN_BSWAP | ||
279 | #undef HAS_BUILTIN_BSWAP16 | ||
280 | #undef HAS_BUILTIN_BSWAP32 | ||
281 | #undef HAS_BUILTIN_BSWAP64 | ||
282 | |||
283 | /** | ||
284 | * \name Swap to native | ||
285 | * Byteswap item from the specified endianness to the native endianness. | ||
286 | */ | ||
287 | /* @{ */ | ||
288 | #if SDL_BYTEORDER == SDL_LIL_ENDIAN | ||
289 | #define SDL_SwapLE16(X) (X) | ||
290 | #define SDL_SwapLE32(X) (X) | ||
291 | #define SDL_SwapLE64(X) (X) | ||
292 | #define SDL_SwapFloatLE(X) (X) | ||
293 | #define SDL_SwapBE16(X) SDL_Swap16(X) | ||
294 | #define SDL_SwapBE32(X) SDL_Swap32(X) | ||
295 | #define SDL_SwapBE64(X) SDL_Swap64(X) | ||
296 | #define SDL_SwapFloatBE(X) SDL_SwapFloat(X) | ||
297 | #else | ||
298 | #define SDL_SwapLE16(X) SDL_Swap16(X) | ||
299 | #define SDL_SwapLE32(X) SDL_Swap32(X) | ||
300 | #define SDL_SwapLE64(X) SDL_Swap64(X) | ||
301 | #define SDL_SwapFloatLE(X) SDL_SwapFloat(X) | ||
302 | #define SDL_SwapBE16(X) (X) | ||
303 | #define SDL_SwapBE32(X) (X) | ||
304 | #define SDL_SwapBE64(X) (X) | ||
305 | #define SDL_SwapFloatBE(X) (X) | ||
306 | #endif | ||
307 | /* @} *//* Swap to native */ | ||
308 | |||
309 | /* Ends C function definitions when using C++ */ | ||
310 | #ifdef __cplusplus | ||
311 | } | ||
312 | #endif | ||
313 | #include "close_code.h" | ||
314 | |||
315 | #endif /* SDL_endian_h_ */ | ||
316 | |||
317 | /* vi: set ts=4 sw=4 expandtab: */ | ||