Index: source/cpu_id.cc |
diff --git a/source/cpu_id.cc b/source/cpu_id.cc |
index 28155466a770a8400f910b1253e63e695de8bdd5..73675ac9e8a528d4376f933f7c632ecaab6f5278 100644 |
--- a/source/cpu_id.cc |
+++ b/source/cpu_id.cc |
@@ -198,7 +198,7 @@ static LIBYUV_BOOL TestEnv(const char*) { |
LIBYUV_API SAFEBUFFERS |
int InitCpuFlags(void) { |
#if !defined(__pnacl__) && !defined(__CLR_VER) && defined(CPU_X86) |
- |
+ int cpu_info; |
uint32 cpu_info0[4] = { 0, 0, 0, 0 }; |
uint32 cpu_info1[4] = { 0, 0, 0, 0 }; |
uint32 cpu_info7[4] = { 0, 0, 0, 0 }; |
@@ -207,64 +207,63 @@ int InitCpuFlags(void) { |
if (cpu_info0[0] >= 7) { |
CpuId(7, 0, cpu_info7); |
} |
- cpu_info_ = ((cpu_info1[3] & 0x04000000) ? kCpuHasSSE2 : 0) | |
- ((cpu_info1[2] & 0x00000200) ? kCpuHasSSSE3 : 0) | |
- ((cpu_info1[2] & 0x00080000) ? kCpuHasSSE41 : 0) | |
- ((cpu_info1[2] & 0x00100000) ? kCpuHasSSE42 : 0) | |
- ((cpu_info7[1] & 0x00000200) ? kCpuHasERMS : 0) | |
- ((cpu_info1[2] & 0x00001000) ? kCpuHasFMA3 : 0) | |
- kCpuHasX86; |
+ cpu_info = ((cpu_info1[3] & 0x04000000) ? kCpuHasSSE2 : 0) | |
+ ((cpu_info1[2] & 0x00000200) ? kCpuHasSSSE3 : 0) | |
+ ((cpu_info1[2] & 0x00080000) ? kCpuHasSSE41 : 0) | |
+ ((cpu_info1[2] & 0x00100000) ? kCpuHasSSE42 : 0) | |
+ ((cpu_info7[1] & 0x00000200) ? kCpuHasERMS : 0) | |
+ ((cpu_info1[2] & 0x00001000) ? kCpuHasFMA3 : 0) | |
+ kCpuHasX86; |
#ifdef HAS_XGETBV |
// AVX requires CPU has AVX, XSAVE and OSXSave for xgetbv |
if ((cpu_info1[2] & 0x1c000000) == 0x1c000000 && // AVX and OSXSave |
!TestEnv("LIBYUV_DISABLE_AVX") && TestOsSaveYmm()) { // Saves YMM. |
- cpu_info_ |= ((cpu_info7[1] & 0x00000020) ? kCpuHasAVX2 : 0) | |
- kCpuHasAVX; |
+ cpu_info |= ((cpu_info7[1] & 0x00000020) ? kCpuHasAVX2 : 0) | kCpuHasAVX; |
} |
#endif |
// Environment variable overrides for testing. |
if (TestEnv("LIBYUV_DISABLE_X86")) { |
- cpu_info_ &= ~kCpuHasX86; |
+ cpu_info &= ~kCpuHasX86; |
} |
if (TestEnv("LIBYUV_DISABLE_SSE2")) { |
- cpu_info_ &= ~kCpuHasSSE2; |
+ cpu_info &= ~kCpuHasSSE2; |
} |
if (TestEnv("LIBYUV_DISABLE_SSSE3")) { |
- cpu_info_ &= ~kCpuHasSSSE3; |
+ cpu_info &= ~kCpuHasSSSE3; |
} |
if (TestEnv("LIBYUV_DISABLE_SSE41")) { |
- cpu_info_ &= ~kCpuHasSSE41; |
+ cpu_info &= ~kCpuHasSSE41; |
} |
if (TestEnv("LIBYUV_DISABLE_SSE42")) { |
- cpu_info_ &= ~kCpuHasSSE42; |
+ cpu_info &= ~kCpuHasSSE42; |
} |
if (TestEnv("LIBYUV_DISABLE_AVX2")) { |
- cpu_info_ &= ~kCpuHasAVX2; |
+ cpu_info &= ~kCpuHasAVX2; |
} |
if (TestEnv("LIBYUV_DISABLE_ERMS")) { |
- cpu_info_ &= ~kCpuHasERMS; |
+ cpu_info &= ~kCpuHasERMS; |
} |
if (TestEnv("LIBYUV_DISABLE_FMA3")) { |
- cpu_info_ &= ~kCpuHasFMA3; |
+ cpu_info &= ~kCpuHasFMA3; |
} |
#endif |
#if defined(__mips__) && defined(__linux__) |
// Linux mips parse text file for dsp detect. |
- cpu_info_ = MipsCpuCaps("dsp"); // set kCpuHasMIPS_DSP. |
+ cpu_info = MipsCpuCaps("dsp"); // set kCpuHasMIPS_DSP. |
#if defined(__mips_dspr2) |
- cpu_info_ |= kCpuHasMIPS_DSPR2; |
+ cpu_info |= kCpuHasMIPS_DSPR2; |
#endif |
- cpu_info_ |= kCpuHasMIPS; |
+ cpu_info |= kCpuHasMIPS; |
if (getenv("LIBYUV_DISABLE_MIPS")) { |
- cpu_info_ &= ~kCpuHasMIPS; |
+ cpu_info &= ~kCpuHasMIPS; |
} |
if (getenv("LIBYUV_DISABLE_MIPS_DSP")) { |
- cpu_info_ &= ~kCpuHasMIPS_DSP; |
+ cpu_info &= ~kCpuHasMIPS_DSP; |
} |
if (getenv("LIBYUV_DISABLE_MIPS_DSPR2")) { |
- cpu_info_ &= ~kCpuHasMIPS_DSPR2; |
+ cpu_info &= ~kCpuHasMIPS_DSPR2; |
} |
#endif |
#if defined(__arm__) || defined(__aarch64__) |
@@ -272,28 +271,30 @@ int InitCpuFlags(void) { |
// __ARM_NEON__ generates code that requires Neon. NaCL also requires Neon. |
// For Linux, /proc/cpuinfo can be tested but without that assume Neon. |
#if defined(__ARM_NEON__) || defined(__native_client__) || !defined(__linux__) |
- cpu_info_ = kCpuHasNEON; |
+ cpu_info = kCpuHasNEON; |
// For aarch64(arm64), /proc/cpuinfo's feature is not complete, e.g. no neon |
// flag in it. |
// So for aarch64, neon enabling is hard coded here. |
#endif |
#if defined(__aarch64__) |
- cpu_info_ = kCpuHasNEON; |
+ cpu_info = kCpuHasNEON; |
#else |
// Linux arm parse text file for neon detect. |
- cpu_info_ = ArmCpuCaps("/proc/cpuinfo"); |
+ cpu_info = ArmCpuCaps("/proc/cpuinfo"); |
#endif |
- cpu_info_ |= kCpuHasARM; |
+ cpu_info |= kCpuHasARM; |
if (TestEnv("LIBYUV_DISABLE_NEON")) { |
- cpu_info_ &= ~kCpuHasNEON; |
+ cpu_info &= ~kCpuHasNEON; |
} |
#endif // __arm__ |
if (TestEnv("LIBYUV_DISABLE_ASM")) { |
- cpu_info_ = 0; |
+ cpu_info = 0; |
} |
+ cpu_info_ = cpu_info; |
return cpu_info_; |
} |
+// Note that use of this function is not thread safe. |
LIBYUV_API |
void MaskCpuFlags(int enable_flags) { |
cpu_info_ = InitCpuFlags() & enable_flags; |