Fix 32bit Linux. GCC's lrotl/lrotr instrinsic functions are 32bit when building for 32bit, we require 64bit at all times, so keep using our own instead.

This commit is contained in:
Ryan Houdek 2013-04-03 12:42:58 -05:00
parent 61c327ba8b
commit d06379fc59

View File

@ -67,32 +67,30 @@ _mm_shuffle_epi8(__m128i a, __m128i mask)
#endif #endif
#define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) #define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0]))
// GCC 4.8 defines all the rotate functions now // GCC 4.8 defines all the rotate functions now
#ifdef _rotl // Small issue with GCC's lrotl/lrotr intrinsics is they are still 32bit while we require 64bit
#define _rotl64 _lrotl #ifndef _rotl
#define _rotr64 _lrotr
#else
inline u32 _rotl(u32 x, int shift) { inline u32 _rotl(u32 x, int shift) {
shift &= 31; shift &= 31;
if (!shift) return x; if (!shift) return x;
return (x << shift) | (x >> (32 - shift)); return (x << shift) | (x >> (32 - shift));
} }
inline u64 _rotl64(u64 x, unsigned int shift){
unsigned int n = shift % 64;
return (x << n) | (x >> (64 - n));
}
inline u32 _rotr(u32 x, int shift) { inline u32 _rotr(u32 x, int shift) {
shift &= 31; shift &= 31;
if (!shift) return x; if (!shift) return x;
return (x >> shift) | (x << (32 - shift)); return (x >> shift) | (x << (32 - shift));
} }
#endif
inline u64 _rotl64(u64 x, unsigned int shift){
unsigned int n = shift % 64;
return (x << n) | (x >> (64 - n));
}
inline u64 _rotr64(u64 x, unsigned int shift){ inline u64 _rotr64(u64 x, unsigned int shift){
unsigned int n = shift % 64; unsigned int n = shift % 64;
return (x >> n) | (x << (64 - n)); return (x >> n) | (x << (64 - n));
} }
#endif
#else // WIN32 #else // WIN32
// Function Cross-Compatibility // Function Cross-Compatibility