diff --git a/polymer/eduke32/build/include/compat.h b/polymer/eduke32/build/include/compat.h index 654f037fa..c4b4f6779 100644 --- a/polymer/eduke32/build/include/compat.h +++ b/polymer/eduke32/build/include/compat.h @@ -248,12 +248,12 @@ # define B_LITTLE_ENDIAN 0 # define B_BIG_ENDIAN 1 # endif -# define B_ENDIAN_C_INLINE 1 +# define B_USE_COMPAT_SWAP 1 #elif defined(GEKKO) || defined(__ANDROID__) # define B_LITTLE_ENDIAN 0 # define B_BIG_ENDIAN 1 -# define B_ENDIAN_C_INLINE 1 +# define B_USE_COMPAT_SWAP 1 #elif defined(__OpenBSD__) # include @@ -316,7 +316,7 @@ # define B_LITTLE_ENDIAN 0 # define B_BIG_ENDIAN 1 # endif -# define B_ENDIAN_C_INLINE 1 +# define B_USE_COMPAT_SWAP 1 #elif defined(__QNX__) # if defined __LITTLEENDIAN__ @@ -326,7 +326,7 @@ # define B_LITTLE_ENDIAN 0 # define B_BIG_ENDIAN 1 # endif -# define B_ENDIAN_C_INLINE 1 +# define B_USE_COMPAT_SWAP 1 #elif defined(__sun) # if defined _LITTLE_ENDIAN @@ -336,12 +336,12 @@ # define B_LITTLE_ENDIAN 0 # define B_BIG_ENDIAN 1 # endif -# define B_ENDIAN_C_INLINE 1 +# define B_USE_COMPAT_SWAP 1 #elif defined(_WIN32) || defined(SKYOS) || defined(__SYLLABLE__) # define B_LITTLE_ENDIAN 1 # define B_BIG_ENDIAN 0 -# define B_ENDIAN_C_INLINE 1 +# define B_USE_COMPAT_SWAP 1 #endif #if !defined(B_LITTLE_ENDIAN) || !defined(B_BIG_ENDIAN) @@ -365,18 +365,30 @@ defined __x86_64__ || defined __amd64__ || defined _M_X64 || defined _M_IA64 || extern "C" { #endif -#if defined B_ENDIAN_X86_INLINE -# if defined(_MSC_VER) - // inline asm using bswap/xchg -# elif defined(__GNUC__) - // inline asm using bswap/xchg -# endif -#elif defined B_ENDIAN_C_INLINE +#if defined B_USE_COMPAT_SWAP FORCE_INLINE uint16_t B_SWAP16(uint16_t s) { return (s >> 8) | (s << 8); } + +# if !defined NOASM && defined __i386__ && defined _MSC_VER +FORCE_INLINE uint32_t B_SWAP32(uint32_t a) +{ + _asm + { + mov eax, a + bswap eax + } +} +# elif !defined NOASM && defined __i386__ && defined __GNUC__ +FORCE_INLINE uint32_t B_SWAP32(uint32_t a) +{ + __asm__ __volatile__("bswap %0" : "+r"(a) : : "cc"); + return a; +} +# else FORCE_INLINE uint32_t B_SWAP32(uint32_t l) { return ((l >> 8) & 0xff00) | ((l & 0xff00) << 8) | (l << 24) | (l >> 24); } +# endif FORCE_INLINE uint64_t B_SWAP64(uint64_t l) { return (l >> 56) | ((l >> 40) & 0xff00) | ((l >> 24) & 0xff0000) | ((l >> 8) & 0xff000000) | diff --git a/polymer/eduke32/build/src/kplib.c b/polymer/eduke32/build/src/kplib.c index a4eb3b7a5..625f0215e 100644 --- a/polymer/eduke32/build/src/kplib.c +++ b/polymer/eduke32/build/src/kplib.c @@ -72,11 +72,6 @@ static __inline int32_t _lrotl(int32_t i, int sh) #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif -#if defined __clang__ && __clang_major__==3 && __clang_minor__==1 -// clang 3.1 SVN r149129, assertion failure with inline asm -# define NOASM 1 -#endif - #if defined(__GNUC__) #undef _inline #define _inline inline @@ -177,17 +172,6 @@ static uint8_t qhufbit0[1<>8) + ((a&0xff00)<<8) + (a<<24) + (a>>24)); -} -#endif - static inline int32_t bitrev(int32_t b, int32_t c) { int32_t i, j; @@ -1120,9 +1089,9 @@ static void initkpeg() #if B_BIG_ENDIAN == 1 for (i=0; i<1024; i++) { - colclip[i] = bswap(colclip[i]); - colclipup8[i] = bswap(colclipup8[i]); - colclipup16[i] = bswap(colclipup16[i]); + colclip[i] = B_SWAP32(colclip[i]); + colclipup8[i] = B_SWAP32(colclipup8[i]); + colclipup16[i] = B_SWAP32(colclipup16[i]); } #endif