From d06379fc594e95faba1bc5cc0f8c56b1bc818d60 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 3 Apr 2013 12:42:58 -0500 Subject: [PATCH] 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. --- Source/Core/Common/Src/CommonFuncs.h | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Source/Core/Common/Src/CommonFuncs.h b/Source/Core/Common/Src/CommonFuncs.h index 56ada6ba4e..e5a52a28a6 100644 --- a/Source/Core/Common/Src/CommonFuncs.h +++ b/Source/Core/Common/Src/CommonFuncs.h @@ -67,32 +67,30 @@ _mm_shuffle_epi8(__m128i a, __m128i mask) #endif #define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) // GCC 4.8 defines all the rotate functions now -#ifdef _rotl -#define _rotl64 _lrotl -#define _rotr64 _lrotr -#else +// Small issue with GCC's lrotl/lrotr intrinsics is they are still 32bit while we require 64bit +#ifndef _rotl inline u32 _rotl(u32 x, int shift) { shift &= 31; if (!shift) return x; 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) { shift &= 31; if (!shift) return x; 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){ unsigned int n = shift % 64; return (x >> n) | (x << (64 - n)); } -#endif #else // WIN32 // Function Cross-Compatibility