Use MSVC _byteswap intrinsics for SDL byteswapping functions

This generates bswap on x86/x64 and rev on ARM
This commit is contained in:
Cameron Gutman 2021-01-02 12:50:01 -06:00
parent 6cbd4417f0
commit 115d66e756
1 changed files with 13 additions and 0 deletions

View File

@ -30,6 +30,10 @@
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#ifdef _MSC_VER
#include <intrin.h>
#endif
/** /**
* \name The two types of endianness * \name The two types of endianness
*/ */
@ -109,6 +113,9 @@ SDL_Swap16(Uint16 x)
__asm__("rorw #8,%0": "=d"(x): "0"(x):"cc"); __asm__("rorw #8,%0": "=d"(x): "0"(x):"cc");
return x; return x;
} }
#elif defined(_MSC_VER)
#pragma intrinsic(_byteswap_ushort)
#define SDL_Swap16(x) _byteswap_ushort(x)
#elif defined(__WATCOMC__) && defined(__386__) #elif defined(__WATCOMC__) && defined(__386__)
extern _inline Uint16 SDL_Swap16(Uint16); extern _inline Uint16 SDL_Swap16(Uint16);
#pragma aux SDL_Swap16 = \ #pragma aux SDL_Swap16 = \
@ -178,6 +185,9 @@ extern _inline Uint32 SDL_Swap32(Uint32);
parm [eax] \ parm [eax] \
modify [eax]; modify [eax];
#endif #endif
#elif defined(_MSC_VER)
#pragma intrinsic(_byteswap_ulong)
#define SDL_Swap32(x) _byteswap_ulong(x)
#else #else
SDL_FORCE_INLINE Uint32 SDL_FORCE_INLINE Uint32
SDL_Swap32(Uint32 x) SDL_Swap32(Uint32 x)
@ -213,6 +223,9 @@ SDL_Swap64(Uint64 x)
__asm__("bswapq %0": "=r"(x):"0"(x)); __asm__("bswapq %0": "=r"(x):"0"(x));
return x; return x;
} }
#elif defined(_MSC_VER)
#pragma intrinsic(_byteswap_uint64)
#define SDL_Swap64(x) _byteswap_uint64(x)
#else #else
SDL_FORCE_INLINE Uint64 SDL_FORCE_INLINE Uint64
SDL_Swap64(Uint64 x) SDL_Swap64(Uint64 x)