diff options
Diffstat (limited to 'celt/x86/x86cpu.c')
-rw-r--r-- | celt/x86/x86cpu.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/celt/x86/x86cpu.c b/celt/x86/x86cpu.c index accf0676..d95a9b94 100644 --- a/celt/x86/x86cpu.c +++ b/celt/x86/x86cpu.c @@ -68,7 +68,8 @@ static void cpuid(unsigned int CPUInfo[4], unsigned int InfoType) "=r" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) : - "0" (InfoType) + /* We clear ECX to avoid a valgrind false-positive prior to v3.17.0. */ + "0" (InfoType), "2" (0) ); #else __asm__ __volatile__ ( @@ -77,12 +78,15 @@ static void cpuid(unsigned int CPUInfo[4], unsigned int InfoType) "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) : - "0" (InfoType) + /* We clear ECX to avoid a valgrind false-positive prior to v3.17.0. */ + "0" (InfoType), "2" (0) ); #endif #elif defined(CPU_INFO_BY_C) - if !(__get_cpuid(InfoType, &(CPUInfo[0]), &(CPUInfo[1]), &(CPUInfo[2]), &(CPUInfo[3]))) { - /* Our function cannot fail, but __get_cpuid can. + /* We use __get_cpuid_count to clear ECX to avoid a valgrind false-positive + prior to v3.17.0.*/ + if (!__get_cpuid_count(InfoType, 0, &(CPUInfo[0]), &(CPUInfo[1]), &(CPUInfo[2]), &(CPUInfo[3]))) { + /* Our function cannot fail, but __get_cpuid{_count} can. Returning all zeroes will effectively disable all SIMD, which is what we want on CPUs that don't support CPUID. */ CPUInfo[3] = CPUInfo[2] = CPUInfo[1] = CPUInfo[0] = 0; |