summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Forstall <brucefo@microsoft.com>2017-01-10 22:38:57 -0800
committerBruce Forstall <brucefo@microsoft.com>2017-01-25 16:25:03 -0800
commit71075ab95119af411a5d161f68d2eafea07b610d (patch)
tree26f89ab4392b3e1f4e81bfe3b483015264cae580
parent8f4cb1beaa68e74a16492510c86d9b2fec539e60 (diff)
downloadcoreclr-71075ab95119af411a5d161f68d2eafea07b610d.tar.gz
coreclr-71075ab95119af411a5d161f68d2eafea07b610d.tar.bz2
coreclr-71075ab95119af411a5d161f68d2eafea07b610d.zip
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.
-rw-r--r--src/vm/cgensys.h1
-rw-r--r--src/vm/codeman.cpp2
2 files changed, 2 insertions, 1 deletions
diff --git a/src/vm/cgensys.h b/src/vm/cgensys.h
index 4dd1ee4b4b..d55d15dd7d 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 bae1ced30a..8fc851d86b 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);