stb_image: Give up trying to runtime-detect SSE2 on GCC.

We tried but it was nothing but trouble. New rule: with
GCC/Clang, if you're compiling with -msse2, you get always-on
SSE2 code, otherwise you don't get any. Trying to ship
anything with proper runtime dispatch requires both working
around certain bugs and some fiddling with build settings,
which runs contrary to the intent of a one-file library,
so bail on it entirely.

Fixes issue #280.
Fixes issue #410.
This commit is contained in:
Fabian Giesen 2017-03-04 20:49:14 -08:00
parent 6f6e11f85f
commit 3e17544873

View File

@ -583,12 +583,14 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];
#define STBI__X86_TARGET #define STBI__X86_TARGET
#endif #endif
#if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) #if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
// NOTE: not clear do we actually need this for the 64-bit path?
// gcc doesn't support sse2 intrinsics unless you compile with -msse2, // gcc doesn't support sse2 intrinsics unless you compile with -msse2,
// (but compiling with -msse2 allows the compiler to use SSE2 everywhere; // which in turn means it gets to use SSE2 everywhere. This is unfortunate,
// this is just broken and gcc are jerks for not fixing it properly // but previous attempts to provide the SSE2 functions with runtime
// http://www.virtualdub.org/blog/pivot/entry.php?id=363 ) // detection caused numerous issues. The way architecture extensions are
// exposed in GCC/Clang is, sadly, not really suited for one-file libs.
// New behavior: if compiled with -msse2, we use SSE2 without any
// detection; if not, we don't use it at all.
#define STBI_NO_SIMD #define STBI_NO_SIMD
#endif #endif
@ -646,14 +648,10 @@ static int stbi__sse2_available()
static int stbi__sse2_available() static int stbi__sse2_available()
{ {
#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later // If we're even attempting to compile this on GCC/Clang, that means
// GCC 4.8+ has a nice way to do this // -msse2 is on, which means the compiler is allowed to use SSE2
return __builtin_cpu_supports("sse2"); // instructions at will, and so are we.
#else return 1;
// portable way to do this, preferably without using GCC inline ASM?
// just bail for now.
return 0;
#endif
} }
#endif #endif
#endif #endif