annotate SDL3/SDL_endian.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 Simple DirectMedia Layer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 This software is provided 'as-is', without any express or implied
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 warranty. In no event will the authors be held liable for any damages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 arising from the use of this software.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 Permission is granted to anyone to use this software for any purpose,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 including commercial applications, and to alter it and redistribute it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 freely, subject to the following restrictions:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 1. The origin of this software must not be misrepresented; you must not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 claim that you wrote the original software. If you use this software
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 in a product, an acknowledgment in the product documentation would be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 appreciated but is not required.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 2. Altered source versions must be plainly marked as such, and must not be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 misrepresented as being the original software.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 3. This notice may not be removed or altered from any source distribution.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 * # CategoryEndian
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 * Functions converting endian-specific values to different byte orders.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 * These functions either unconditionally swap byte order (SDL_Swap16,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 * SDL_Swap32, SDL_Swap64, SDL_SwapFloat), or they swap to/from the system's
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 * native byte order (SDL_Swap16LE, SDL_Swap16BE, SDL_Swap32LE, SDL_Swap32BE,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 * SDL_Swap32LE, SDL_Swap32BE, SDL_SwapFloatLE, SDL_SwapFloatBE). In the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 * latter case, the functionality is provided by macros that become no-ops if
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 * a swap isn't necessary: on an x86 (littleendian) processor, SDL_Swap32LE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 * does nothing, but SDL_Swap32BE reverses the bytes of the data. On a PowerPC
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 * processor (bigendian), the macros behavior is reversed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 * The swap routines are inline functions, and attempt to use compiler
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 * intrinsics, inline assembly, and other magic to make byteswapping
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 * efficient.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 #ifndef SDL_endian_h_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 #define SDL_endian_h_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 #include <SDL3/SDL_stdinc.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 #if defined(_MSC_VER) && (_MSC_VER >= 1400)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 /* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 #if defined(__clang__) && !SDL_HAS_BUILTIN(_m_prefetch)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 #ifndef __PRFCHWINTRIN_H
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 #define __PRFCHWINTRIN_H
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 static __inline__ void __attribute__((__always_inline__, __nodebug__))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 _m_prefetch(void *__P)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 __builtin_prefetch(__P, 0, 3 /* _MM_HINT_T0 */);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 #endif /* __PRFCHWINTRIN_H */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 #endif /* __clang__ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 #include <intrin.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 * \name The two types of endianness
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 /* @{ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 * A value to represent littleendian byteorder.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 * This is used with the preprocessor macro SDL_BYTEORDER, to determine a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 * platform's byte ordering:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 * ```c
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 * #if SDL_BYTEORDER == SDL_LIL_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 * SDL_Log("This system is littleendian.");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 * #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 * ```
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 * \sa SDL_BYTEORDER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 * \sa SDL_BIG_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 #define SDL_LIL_ENDIAN 1234
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 * A value to represent bigendian byteorder.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 * This is used with the preprocessor macro SDL_BYTEORDER, to determine a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 * platform's byte ordering:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 * ```c
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 * #if SDL_BYTEORDER == SDL_BIG_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 * SDL_Log("This system is bigendian.");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 * #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 * ```
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 * \sa SDL_BYTEORDER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 * \sa SDL_LIL_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 #define SDL_BIG_ENDIAN 4321
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 /* @} */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 #ifndef SDL_BYTEORDER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 #ifdef SDL_WIKI_DOCUMENTATION_SECTION
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 * A macro that reports the target system's byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 * This is set to either SDL_LIL_ENDIAN or SDL_BIG_ENDIAN (and maybe other
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 * values in the future, if something else becomes popular). This can be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 * tested with the preprocessor, so decisions can be made at compile time.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 * ```c
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 * #if SDL_BYTEORDER == SDL_BIG_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 * SDL_Log("This system is bigendian.");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 * #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 * ```
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 * \sa SDL_LIL_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 * \sa SDL_BIG_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 #define SDL_BYTEORDER SDL_LIL_ENDIAN___or_maybe___SDL_BIG_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 #elif defined(SDL_PLATFORM_LINUX) || defined(__GLIBC__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 #include <endian.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 #define SDL_BYTEORDER __BYTE_ORDER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 #elif defined(SDL_PLATFORM_SOLARIS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 #include <sys/byteorder.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 #if defined(_LITTLE_ENDIAN)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 #define SDL_BYTEORDER SDL_LIL_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 #elif defined(_BIG_ENDIAN)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 #define SDL_BYTEORDER SDL_BIG_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 #error Unsupported endianness
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 #elif defined(SDL_PLATFORM_OPENBSD) || defined(__DragonFly__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 #include <endian.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 #define SDL_BYTEORDER BYTE_ORDER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 #elif defined(SDL_PLATFORM_FREEBSD) || defined(SDL_PLATFORM_NETBSD)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 #include <sys/endian.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 #define SDL_BYTEORDER BYTE_ORDER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 /* predefs from newer gcc and clang versions: */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 #elif defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__BYTE_ORDER__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 #if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 #define SDL_BYTEORDER SDL_LIL_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 #elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 #define SDL_BYTEORDER SDL_BIG_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 #error Unsupported endianness
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 #endif /**/
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 #if defined(__hppa__) || \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 (defined(__MIPS__) && defined(__MIPSEB__)) || \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 defined(__ppc__) || defined(__POWERPC__) || defined(__powerpc__) || defined(__PPC__) || \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 defined(__sparc__) || defined(__sparc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 #define SDL_BYTEORDER SDL_BIG_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 #define SDL_BYTEORDER SDL_LIL_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 #endif /* SDL_PLATFORM_LINUX */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 #endif /* !SDL_BYTEORDER */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 #ifndef SDL_FLOATWORDORDER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 #ifdef SDL_WIKI_DOCUMENTATION_SECTION
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 * A macro that reports the target system's floating point word order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 * This is set to either SDL_LIL_ENDIAN or SDL_BIG_ENDIAN (and maybe other
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 * values in the future, if something else becomes popular). This can be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 * tested with the preprocessor, so decisions can be made at compile time.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 * ```c
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 * #if SDL_FLOATWORDORDER == SDL_BIG_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 * SDL_Log("This system's floats are bigendian.");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 * #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 * ```
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 * \sa SDL_LIL_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 * \sa SDL_BIG_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 #define SDL_FLOATWORDORDER SDL_LIL_ENDIAN___or_maybe___SDL_BIG_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 /* predefs from newer gcc versions: */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 #elif defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__FLOAT_WORD_ORDER__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 #if (__FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 #define SDL_FLOATWORDORDER SDL_LIL_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 #elif (__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 #define SDL_FLOATWORDORDER SDL_BIG_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 #error Unsupported endianness
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 #endif /**/
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 #elif defined(__MAVERICK__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 /* For Maverick, float words are always little-endian. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 #define SDL_FLOATWORDORDER SDL_LIL_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 #elif (defined(__arm__) || defined(__thumb__)) && !defined(__VFP_FP__) && !defined(__ARM_EABI__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 /* For FPA, float words are always big-endian. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 #define SDL_FLOATWORDORDER SDL_BIG_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 /* By default, assume that floats words follow the memory system mode. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 #define SDL_FLOATWORDORDER SDL_BYTEORDER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 #endif /* __FLOAT_WORD_ORDER__ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 #endif /* !SDL_FLOATWORDORDER */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 #include <SDL3/SDL_begin_code.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 /* Set up for C function definitions, even when using C++ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 #ifdef __cplusplus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 extern "C" {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 /* various modern compilers may have builtin swap */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 #if defined(__GNUC__) || defined(__clang__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 # define HAS_BUILTIN_BSWAP16 (SDL_HAS_BUILTIN(__builtin_bswap16)) || \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 # define HAS_BUILTIN_BSWAP32 (SDL_HAS_BUILTIN(__builtin_bswap32)) || \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 # define HAS_BUILTIN_BSWAP64 (SDL_HAS_BUILTIN(__builtin_bswap64)) || \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 /* this one is broken */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 # define HAS_BROKEN_BSWAP (__GNUC__ == 2 && __GNUC_MINOR__ <= 95)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 # define HAS_BUILTIN_BSWAP16 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 # define HAS_BUILTIN_BSWAP32 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 # define HAS_BUILTIN_BSWAP64 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 # define HAS_BROKEN_BSWAP 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 /* Byte swap 16-bit integer. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 #ifndef SDL_WIKI_DOCUMENTATION_SECTION
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 #if HAS_BUILTIN_BSWAP16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 #define SDL_Swap16(x) __builtin_bswap16(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 #elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 #pragma intrinsic(_byteswap_ushort)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 #define SDL_Swap16(x) _byteswap_ushort(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 #elif defined(__i386__) && !HAS_BROKEN_BSWAP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 __asm__("xchgb %b0,%h0": "=q"(x):"0"(x));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 return x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 #elif defined(__x86_64__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 __asm__("xchgb %b0,%h0": "=abcd"(x):"0"(x));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 return x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 #elif (defined(__powerpc__) || defined(__ppc__))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 int result;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 __asm__("rlwimi %0,%2,8,16,23": "=&r"(result):"0"(x >> 8), "r"(x));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 return (Uint16)result;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 #elif (defined(__m68k__) && !defined(__mcoldfire__))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 __asm__("rorw #8,%0": "=d"(x): "0"(x):"cc");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 return x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 #elif defined(__WATCOMC__) && defined(__386__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 extern __inline Uint16 SDL_Swap16(Uint16);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 #pragma aux SDL_Swap16 = \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 "xchg al, ah" \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 parm [ax] \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 modify [ax];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 return SDL_static_cast(Uint16, ((x << 8) | (x >> 8)));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 /* Byte swap 32-bit integer. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 #ifndef SDL_WIKI_DOCUMENTATION_SECTION
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 #if HAS_BUILTIN_BSWAP32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 #define SDL_Swap32(x) __builtin_bswap32(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 #elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 #pragma intrinsic(_byteswap_ulong)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 #define SDL_Swap32(x) _byteswap_ulong(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 #elif defined(__i386__) && !HAS_BROKEN_BSWAP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 __asm__("bswap %0": "=r"(x):"0"(x));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 return x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 #elif defined(__x86_64__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 __asm__("bswapl %0": "=r"(x):"0"(x));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 return x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 #elif (defined(__powerpc__) || defined(__ppc__))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 Uint32 result;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 __asm__("rlwimi %0,%2,24,16,23": "=&r"(result): "0" (x>>24), "r"(x));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 __asm__("rlwimi %0,%2,8,8,15" : "=&r"(result): "0" (result), "r"(x));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 __asm__("rlwimi %0,%2,24,0,7" : "=&r"(result): "0" (result), "r"(x));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 return result;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 #elif (defined(__m68k__) && !defined(__mcoldfire__))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0": "=d"(x): "0"(x):"cc");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 return x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 #elif defined(__WATCOMC__) && defined(__386__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 extern __inline Uint32 SDL_Swap32(Uint32);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 #pragma aux SDL_Swap32 = \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 "bswap eax" \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 parm [eax] \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 modify [eax];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 return SDL_static_cast(Uint32, ((x << 24) | ((x << 8) & 0x00FF0000) |
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 ((x >> 8) & 0x0000FF00) | (x >> 24)));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 /* Byte swap 64-bit integer. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 #ifndef SDL_WIKI_DOCUMENTATION_SECTION
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 #if HAS_BUILTIN_BSWAP64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 #define SDL_Swap64(x) __builtin_bswap64(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 #elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 #pragma intrinsic(_byteswap_uint64)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 #define SDL_Swap64(x) _byteswap_uint64(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 #elif defined(__i386__) && !HAS_BROKEN_BSWAP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 union {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 struct {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 Uint32 a, b;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 } s;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 Uint64 u;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 } v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 v.u = x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 : "=r"(v.s.a), "=r"(v.s.b)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 : "0" (v.s.a), "1"(v.s.b));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 return v.u;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 #elif defined(__x86_64__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 __asm__("bswapq %0": "=r"(x):"0"(x));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 return x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 #elif defined(__WATCOMC__) && defined(__386__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 extern __inline Uint64 SDL_Swap64(Uint64);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 #pragma aux SDL_Swap64 = \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 "bswap eax" \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 "bswap edx" \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 "xchg eax,edx" \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 parm [eax edx] \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 modify [eax edx];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 Uint32 hi, lo;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 /* Separate into high and low 32-bit values and swap them */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 x >>= 32;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 x = SDL_Swap32(lo);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 x <<= 32;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 x |= SDL_Swap32(hi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 return (x);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 * Byte-swap a floating point number.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 * This will always byte-swap the value, whether it's currently in the native
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 * byteorder of the system or not. You should use SDL_SwapFloatLE or
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 * SDL_SwapFloatBE instead, in most cases.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 * Note that this is a forced-inline function in a header, and not a public
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 * API function available in the SDL library (which is to say, the code is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 * embedded in the calling program and the linker and dynamic loader will not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 * be able to find this function inside SDL itself).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 * \param x the value to byte-swap.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 * \returns x, with its bytes in the opposite endian order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 SDL_FORCE_INLINE float SDL_SwapFloat(float x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 union {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 float f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 Uint32 ui32;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 } swapper;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 swapper.f = x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 swapper.ui32 = SDL_Swap32(swapper.ui32);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 return swapper.f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 /* remove extra macros */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 #undef HAS_BROKEN_BSWAP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 #undef HAS_BUILTIN_BSWAP16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 #undef HAS_BUILTIN_BSWAP32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 #undef HAS_BUILTIN_BSWAP64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 #ifdef SDL_WIKI_DOCUMENTATION_SECTION
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 * Byte-swap an unsigned 16-bit number.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 * This will always byte-swap the value, whether it's currently in the native
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 * byteorder of the system or not. You should use SDL_Swap16LE or SDL_Swap16BE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 * instead, in most cases.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 * Note that this is a forced-inline function in a header, and not a public
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 * API function available in the SDL library (which is to say, the code is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 * embedded in the calling program and the linker and dynamic loader will not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 * be able to find this function inside SDL itself).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 * \param x the value to byte-swap.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 * \returns `x`, with its bytes in the opposite endian order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { return x_but_byteswapped; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 * Byte-swap an unsigned 32-bit number.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 * This will always byte-swap the value, whether it's currently in the native
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 * byteorder of the system or not. You should use SDL_Swap32LE or SDL_Swap32BE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 * instead, in most cases.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 * Note that this is a forced-inline function in a header, and not a public
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 * API function available in the SDL library (which is to say, the code is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 * embedded in the calling program and the linker and dynamic loader will not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 * be able to find this function inside SDL itself).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 * \param x the value to byte-swap.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 * \returns `x`, with its bytes in the opposite endian order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { return x_but_byteswapped; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 * Byte-swap an unsigned 64-bit number.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 * This will always byte-swap the value, whether it's currently in the native
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 * byteorder of the system or not. You should use SDL_Swap64LE or SDL_Swap64BE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 * instead, in most cases.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 * Note that this is a forced-inline function in a header, and not a public
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 * API function available in the SDL library (which is to say, the code is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 * embedded in the calling program and the linker and dynamic loader will not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 * be able to find this function inside SDL itself).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 * \param x the value to byte-swap.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 * \returns `x`, with its bytes in the opposite endian order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x) { return x_but_byteswapped; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 * Swap a 16-bit value from littleendian to native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 * If this is running on a littleendian system, `x` is returned unchanged.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 * This macro never references `x` more than once, avoiding side effects.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 * \param x the value to swap, in littleendian byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 * \returns `x` in native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 * \threadsafety It is safe to call this macro from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 #define SDL_Swap16LE(x) SwapOnlyIfNecessary(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 * Swap a 32-bit value from littleendian to native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 * If this is running on a littleendian system, `x` is returned unchanged.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 * This macro never references `x` more than once, avoiding side effects.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 * \param x the value to swap, in littleendian byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 * \returns `x` in native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 * \threadsafety It is safe to call this macro from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 #define SDL_Swap32LE(x) SwapOnlyIfNecessary(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 * Swap a 64-bit value from littleendian to native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 * If this is running on a littleendian system, `x` is returned unchanged.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 * This macro never references `x` more than once, avoiding side effects.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 * \param x the value to swap, in littleendian byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 * \returns `x` in native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 * \threadsafety It is safe to call this macro from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 #define SDL_Swap64LE(x) SwapOnlyIfNecessary(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 * Swap a floating point value from littleendian to native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 * If this is running on a littleendian system, `x` is returned unchanged.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 * This macro never references `x` more than once, avoiding side effects.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 * \param x the value to swap, in littleendian byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 * \returns `x` in native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 * \threadsafety It is safe to call this macro from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 #define SDL_SwapFloatLE(x) SwapOnlyIfNecessary(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 * Swap a 16-bit value from bigendian to native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 * If this is running on a bigendian system, `x` is returned unchanged.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 * This macro never references `x` more than once, avoiding side effects.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 * \param x the value to swap, in bigendian byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 * \returns `x` in native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 * \threadsafety It is safe to call this macro from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 #define SDL_Swap16BE(x) SwapOnlyIfNecessary(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 * Swap a 32-bit value from bigendian to native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574 * If this is running on a bigendian system, `x` is returned unchanged.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 * This macro never references `x` more than once, avoiding side effects.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 * \param x the value to swap, in bigendian byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 * \returns `x` in native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581 * \threadsafety It is safe to call this macro from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 #define SDL_Swap32BE(x) SwapOnlyIfNecessary(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588 * Swap a 64-bit value from bigendian to native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590 * If this is running on a bigendian system, `x` is returned unchanged.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 * This macro never references `x` more than once, avoiding side effects.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594 * \param x the value to swap, in bigendian byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595 * \returns `x` in native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 * \threadsafety It is safe to call this macro from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 #define SDL_Swap64BE(x) SwapOnlyIfNecessary(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 * Swap a floating point value from bigendian to native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 * If this is running on a bigendian system, `x` is returned unchanged.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 * This macro never references `x` more than once, avoiding side effects.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 * \param x the value to swap, in bigendian byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 * \returns `x` in native byte order.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613 * \threadsafety It is safe to call this macro from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 #define SDL_SwapFloatBE(x) SwapOnlyIfNecessary(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619 #elif SDL_BYTEORDER == SDL_LIL_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620 #define SDL_Swap16LE(x) (x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 #define SDL_Swap32LE(x) (x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622 #define SDL_Swap64LE(x) (x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623 #define SDL_SwapFloatLE(x) (x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624 #define SDL_Swap16BE(x) SDL_Swap16(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 #define SDL_Swap32BE(x) SDL_Swap32(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 #define SDL_Swap64BE(x) SDL_Swap64(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627 #define SDL_SwapFloatBE(x) SDL_SwapFloat(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 #define SDL_Swap16LE(x) SDL_Swap16(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 #define SDL_Swap32LE(x) SDL_Swap32(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 #define SDL_Swap64LE(x) SDL_Swap64(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632 #define SDL_SwapFloatLE(x) SDL_SwapFloat(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633 #define SDL_Swap16BE(x) (x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634 #define SDL_Swap32BE(x) (x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 #define SDL_Swap64BE(x) (x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636 #define SDL_SwapFloatBE(x) (x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 /* Ends C function definitions when using C++ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 #ifdef __cplusplus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 #include <SDL3/SDL_close_code.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 #endif /* SDL_endian_h_ */