windows/msvc: use high level processor feature detection API

see https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-isprocessorfeaturepresent
This commit is contained in:
Aaron Miller 2023-07-12 11:44:08 -04:00 committed by AT
parent ad0e7fd01f
commit 95b8fb312e

View File

@ -10,6 +10,9 @@
#include <cassert> #include <cassert>
#include <cstdlib> #include <cstdlib>
#include <sstream> #include <sstream>
#ifdef _MSC_VER
#include <processthreadsapi.h>
#endif
std::string s_implementations_search_path = "."; std::string s_implementations_search_path = ".";
@ -18,9 +21,7 @@ static bool has_at_least_minimal_hardware() {
#ifndef _MSC_VER #ifndef _MSC_VER
return __builtin_cpu_supports("avx"); return __builtin_cpu_supports("avx");
#else #else
int cpuInfo[4]; return IsProcessorFeaturePresent(PF_AVX_INSTRUCTIONS_AVAILABLE);
__cpuid(cpuInfo, 1);
return cpuInfo[2] & (1 << 28);
#endif #endif
#else #else
return true; // Don't know how to handle non-x86_64 return true; // Don't know how to handle non-x86_64
@ -32,9 +33,7 @@ static bool requires_avxonly() {
#ifndef _MSC_VER #ifndef _MSC_VER
return !__builtin_cpu_supports("avx2"); return !__builtin_cpu_supports("avx2");
#else #else
int cpuInfo[4]; return !IsProcessorFeaturePresent(PF_AVX2_INSTRUCTIONS_AVAILABLE);
__cpuidex(cpuInfo, 7, 0);
return !(cpuInfo[1] & (1 << 5));
#endif #endif
#else #else
return false; // Don't know how to handle non-x86_64 return false; // Don't know how to handle non-x86_64