From 71075ab95119af411a5d161f68d2eafea07b610d Mon Sep 17 00:00:00 2001 From: Bruce Forstall Date: Tue, 10 Jan 2017 22:38:57 -0800 Subject: [PATCH] Fix non-deterministic AVX2 detection The caller required ECX to be zero when calling CPUID, but wasn't calling the getextcpuid() function to cause that to happen. --- src/vm/cgensys.h | 1 + src/vm/codeman.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vm/cgensys.h b/src/vm/cgensys.h index 4dd1ee4..d55d15d 100644 --- a/src/vm/cgensys.h +++ b/src/vm/cgensys.h @@ -105,6 +105,7 @@ inline void GetSpecificCpuInfo(CORINFO_CPU * cpuInfo) #if (defined(_TARGET_X86_) || defined(_TARGET_AMD64_)) && !defined(CROSSGEN_COMPILE) extern "C" DWORD __stdcall getcpuid(DWORD arg, unsigned char result[16]); +extern "C" DWORD __stdcall getextcpuid(DWORD arg1, DWORD arg2, unsigned char result[16]); extern "C" DWORD __stdcall xmmYmmStateSupport(); #endif diff --git a/src/vm/codeman.cpp b/src/vm/codeman.cpp index bae1ced..8fc851d 100644 --- a/src/vm/codeman.cpp +++ b/src/vm/codeman.cpp @@ -1339,7 +1339,7 @@ void EEJitManager::SetCpuInfo() CPUCompileFlags.Set(CORJIT_FLAGS::CORJIT_FLAG_USE_AVX); if (maxCpuId >= 0x07) { - (void) getcpuid(0x07, buffer); + (void) getextcpuid(0, 0x07, buffer); if ((buffer[4] & 0x20) != 0) { CPUCompileFlags.Set(CORJIT_FLAGS::CORJIT_FLAG_USE_AVX2); -- 2.7.4