46#if defined(_MSC_VER) && (_MSC_VER >= 1400)
50#ifndef __PRFCHWINTRIN_H
51#define __PRFCHWINTRIN_H
52static __inline__ void __attribute__((__always_inline__, __nodebug__))
55 __builtin_prefetch(__P, 0, 3 );
86#define SDL_LIL_ENDIAN 1234
105#define SDL_BIG_ENDIAN 4321
110#ifdef SDL_WIKI_DOCUMENTATION_SECTION
130#define SDL_BYTEORDER SDL_LIL_ENDIAN___or_maybe___SDL_BIG_ENDIAN
131#elif defined(SDL_PLATFORM_LINUX)
133#define SDL_BYTEORDER __BYTE_ORDER
134#elif defined(SDL_PLATFORM_SOLARIS)
135#include <sys/byteorder.h>
136#if defined(_LITTLE_ENDIAN)
137#define SDL_BYTEORDER SDL_LIL_ENDIAN
138#elif defined(_BIG_ENDIAN)
139#define SDL_BYTEORDER SDL_BIG_ENDIAN
141#error Unsupported endianness
143#elif defined(SDL_PLATFORM_OPENBSD) || defined(__DragonFly__)
145#define SDL_BYTEORDER BYTE_ORDER
146#elif defined(SDL_PLATFORM_FREEBSD) || defined(SDL_PLATFORM_NETBSD)
147#include <sys/endian.h>
148#define SDL_BYTEORDER BYTE_ORDER
150#elif defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__BYTE_ORDER__)
151#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
152#define SDL_BYTEORDER SDL_LIL_ENDIAN
153#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
154#define SDL_BYTEORDER SDL_BIG_ENDIAN
156#error Unsupported endianness
159#if defined(__hppa__) || \
160 defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
161 (defined(__MIPS__) && defined(__MIPSEB__)) || \
162 defined(__ppc__) || defined(__POWERPC__) || defined(__powerpc__) || defined(__PPC__) || \
163 defined(__sparc__) || defined(__sparc)
164#define SDL_BYTEORDER SDL_BIG_ENDIAN
166#define SDL_BYTEORDER SDL_LIL_ENDIAN
171#ifndef SDL_FLOATWORDORDER
172#ifdef SDL_WIKI_DOCUMENTATION_SECTION
192#define SDL_FLOATWORDORDER SDL_LIL_ENDIAN___or_maybe___SDL_BIG_ENDIAN
194#elif defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__FLOAT_WORD_ORDER__)
195#if (__FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__)
196#define SDL_FLOATWORDORDER SDL_LIL_ENDIAN
197#elif (__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__)
198#define SDL_FLOATWORDORDER SDL_BIG_ENDIAN
200#error Unsupported endianness
202#elif defined(__MAVERICK__)
204#define SDL_FLOATWORDORDER SDL_LIL_ENDIAN
205#elif (defined(__arm__) || defined(__thumb__)) && !defined(__VFP_FP__) && !defined(__ARM_EABI__)
207#define SDL_FLOATWORDORDER SDL_BIG_ENDIAN
210#define SDL_FLOATWORDORDER SDL_BYTEORDER
222#if defined(__GNUC__) || defined(__clang__)
223# define HAS_BUILTIN_BSWAP16 (SDL_HAS_BUILTIN(__builtin_bswap16)) || \
224 (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))
225# define HAS_BUILTIN_BSWAP32 (SDL_HAS_BUILTIN(__builtin_bswap32)) || \
226 (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
227# define HAS_BUILTIN_BSWAP64 (SDL_HAS_BUILTIN(__builtin_bswap64)) || \
228 (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
231# define HAS_BROKEN_BSWAP (__GNUC__ == 2 && __GNUC_MINOR__ <= 95)
233# define HAS_BUILTIN_BSWAP16 0
234# define HAS_BUILTIN_BSWAP32 0
235# define HAS_BUILTIN_BSWAP64 0
236# define HAS_BROKEN_BSWAP 0
240#ifndef SDL_WIKI_DOCUMENTATION_SECTION
241#if HAS_BUILTIN_BSWAP16
242#define SDL_Swap16(x) __builtin_bswap16(x)
243#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL)
244#pragma intrinsic(_byteswap_ushort)
245#define SDL_Swap16(x) _byteswap_ushort(x)
246#elif defined(__i386__) && !HAS_BROKEN_BSWAP
249 __asm__(
"xchgb %b0,%h0":
"=q"(x):
"0"(x));
252#elif defined(__x86_64__)
255 __asm__(
"xchgb %b0,%h0":
"=Q"(x):
"0"(x));
258#elif (defined(__powerpc__) || defined(__ppc__))
263 __asm__(
"rlwimi %0,%2,8,16,23":
"=&r"(result):
"0"(x >> 8),
"r"(x));
266#elif (defined(__m68k__) && !defined(__mcoldfire__))
269 __asm__(
"rorw #8,%0":
"=d"(x):
"0"(x):
"cc");
272#elif defined(__WATCOMC__) && defined(__386__)
274#pragma aux SDL_Swap16 = \
287#ifndef SDL_WIKI_DOCUMENTATION_SECTION
288#if HAS_BUILTIN_BSWAP32
289#define SDL_Swap32(x) __builtin_bswap32(x)
290#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL)
291#pragma intrinsic(_byteswap_ulong)
292#define SDL_Swap32(x) _byteswap_ulong(x)
293#elif defined(__i386__) && !HAS_BROKEN_BSWAP
296 __asm__(
"bswap %0":
"=r"(x):
"0"(x));
299#elif defined(__x86_64__)
302 __asm__(
"bswapl %0":
"=r"(x):
"0"(x));
305#elif (defined(__powerpc__) || defined(__ppc__))
310 __asm__(
"rlwimi %0,%2,24,16,23":
"=&r"(result):
"0" (x>>24),
"r"(x));
311 __asm__(
"rlwimi %0,%2,8,8,15" :
"=&r"(result):
"0" (result),
"r"(x));
312 __asm__(
"rlwimi %0,%2,24,0,7" :
"=&r"(result):
"0" (result),
"r"(x));
315#elif (defined(__m68k__) && !defined(__mcoldfire__))
318 __asm__(
"rorw #8,%0\n\tswap %0\n\trorw #8,%0":
"=d"(x):
"0"(x):
"cc");
321#elif defined(__WATCOMC__) && defined(__386__)
323#pragma aux SDL_Swap32 = \
331 ((x >> 8) & 0x0000FF00) | (x >> 24)));
337#ifndef SDL_WIKI_DOCUMENTATION_SECTION
338#if HAS_BUILTIN_BSWAP64
339#define SDL_Swap64(x) __builtin_bswap64(x)
340#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL)
341#pragma intrinsic(_byteswap_uint64)
342#define SDL_Swap64(x) _byteswap_uint64(x)
343#elif defined(__i386__) && !HAS_BROKEN_BSWAP
353 __asm__(
"bswapl %0 ; bswapl %1 ; xchgl %0,%1"
354 :
"=r"(v.s.a),
"=r"(v.s.b)
355 :
"0" (v.s.a),
"1"(v.s.b));
358#elif defined(__x86_64__)
361 __asm__(
"bswapq %0":
"=r"(x):
"0"(x));
364#elif defined(__WATCOMC__) && defined(__386__)
366#pragma aux SDL_Swap64 = \
420#undef HAS_BROKEN_BSWAP
421#undef HAS_BUILTIN_BSWAP16
422#undef HAS_BUILTIN_BSWAP32
423#undef HAS_BUILTIN_BSWAP64
426#ifdef SDL_WIKI_DOCUMENTATION_SECTION
505#define SDL_Swap16LE(x) SwapOnlyIfNecessary(x)
521#define SDL_Swap32LE(x) SwapOnlyIfNecessary(x)
537#define SDL_Swap64LE(x) SwapOnlyIfNecessary(x)
553#define SDL_SwapFloatLE(x) SwapOnlyIfNecessary(x)
569#define SDL_Swap16BE(x) SwapOnlyIfNecessary(x)
585#define SDL_Swap32BE(x) SwapOnlyIfNecessary(x)
601#define SDL_Swap64BE(x) SwapOnlyIfNecessary(x)
617#define SDL_SwapFloatBE(x) SwapOnlyIfNecessary(x)
619#elif SDL_BYTEORDER == SDL_LIL_ENDIAN
620#define SDL_Swap16LE(x) (x)
621#define SDL_Swap32LE(x) (x)
622#define SDL_Swap64LE(x) (x)
623#define SDL_SwapFloatLE(x) (x)
624#define SDL_Swap16BE(x) SDL_Swap16(x)
625#define SDL_Swap32BE(x) SDL_Swap32(x)
626#define SDL_Swap64BE(x) SDL_Swap64(x)
627#define SDL_SwapFloatBE(x) SDL_SwapFloat(x)
629#define SDL_Swap16LE(x) SDL_Swap16(x)
630#define SDL_Swap32LE(x) SDL_Swap32(x)
631#define SDL_Swap64LE(x) SDL_Swap64(x)
632#define SDL_SwapFloatLE(x) SDL_SwapFloat(x)
633#define SDL_Swap16BE(x) (x)
634#define SDL_Swap32BE(x) (x)
635#define SDL_Swap64BE(x) (x)
636#define SDL_SwapFloatBE(x) (x)
SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
SDL_FORCE_INLINE float SDL_SwapFloat(float x)
SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x)
#define SDL_static_cast(type, expression)