diff --git a/Source/Core/Common/CommonFuncs.h b/Source/Core/Common/CommonFuncs.h index 7a7a19a7b4..bb11f87dc4 100644 --- a/Source/Core/Common/CommonFuncs.h +++ b/Source/Core/Common/CommonFuncs.h @@ -34,24 +34,6 @@ struct ArraySizeImpl : public std::extent #define b32(x) (b16(x) | (b16(x) >>16) ) #define ROUND_UP_POW2(x) (b32(x - 1) + 1) -#ifndef __GNUC_PREREQ - #define __GNUC_PREREQ(a, b) 0 -#endif - -#if (defined __GNUC__ && !__GNUC_PREREQ(4,9)) && \ - !defined __SSSE3__ && defined _M_X86 -#include -static __inline __m128i __attribute__((__always_inline__)) -_mm_shuffle_epi8(__m128i a, __m128i mask) -{ - __m128i result; - __asm__("pshufb %1, %0" - : "=x" (result) - : "xm" (mask), "0" (a)); - return result; -} -#endif - #ifndef _WIN32 #include diff --git a/Source/Core/Common/Intrinsics.h b/Source/Core/Common/Intrinsics.h index 6847387615..d5ea887e2b 100644 --- a/Source/Core/Common/Intrinsics.h +++ b/Source/Core/Common/Intrinsics.h @@ -12,4 +12,24 @@ #include #endif +#ifndef __GNUC_PREREQ +#define __GNUC_PREREQ(maj, min) 0 +#endif + +#if defined __GNUC__ && !__GNUC_PREREQ(4, 9) && !defined __SSSE3__ +// GCC <= 4.8 only enables intrinsics based on the command-line. +// GCC >= 4.9 always declares all intrinsics. +// We only want to require SSE2 and thus compile with -msse2, +// so define the one post-SSE2 intrinsic that we dispatch at runtime. +static __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +_mm_shuffle_epi8(__m128i a, __m128i mask) +{ + __m128i result; + __asm__("pshufb %1, %0" + : "=x" (result) + : "xm" (mask), "0" (a)); + return result; +} +#endif + #endif // _M_X86