mirror of
https://github.com/google/cpu_features.git
synced 2025-07-01 21:31:15 +02:00
Fix list_cpu_features.exe does not detect SSE42 on Xeon X5650 (Windows) (#220)
This commit is contained in:
@ -246,7 +246,7 @@ typedef struct {
|
||||
// These two functions have to be implemented by the OS, that is the file
|
||||
// including this file.
|
||||
static void OverrideOsPreserves(OsPreserves* os_preserves);
|
||||
static void DetectFeaturesFromOs(X86Features* features);
|
||||
static void DetectFeaturesFromOs(X86Info* info, X86Features* features);
|
||||
|
||||
// Reference https://en.wikipedia.org/wiki/CPUID.
|
||||
static void ParseCpuId(const Leaves* leaves, X86Info* info,
|
||||
@ -371,7 +371,7 @@ static void ParseCpuId(const Leaves* leaves, X86Info* info,
|
||||
} else {
|
||||
// When XCR0 is not available (Atom based or older cpus) we need to defer to
|
||||
// the OS via custom code.
|
||||
DetectFeaturesFromOs(features);
|
||||
DetectFeaturesFromOs(info, features);
|
||||
// Now that we have queried the OS for SSE support, we report this back to
|
||||
// os_preserves. This is needed in case of AMD CPU's to enable testing of
|
||||
// sse4a (See ParseExtraAMDCpuId below).
|
||||
|
@ -28,7 +28,8 @@ static void OverrideOsPreserves(OsPreserves* os_preserves) {
|
||||
#include "internal/stack_line_reader.h"
|
||||
#include "internal/string_view.h"
|
||||
|
||||
static void DetectFeaturesFromOs(X86Features* features) {
|
||||
static void DetectFeaturesFromOs(X86Info* info, X86Features* features) {
|
||||
(void)info;
|
||||
// Handling FreeBSD platform through parsing /var/run/dmesg.boot.
|
||||
const int fd = CpuFeatures_OpenFile("/var/run/dmesg.boot");
|
||||
if (fd >= 0) {
|
||||
|
@ -27,7 +27,8 @@ static void OverrideOsPreserves(OsPreserves* os_preserves) {
|
||||
#include "internal/filesystem.h"
|
||||
#include "internal/stack_line_reader.h"
|
||||
#include "internal/string_view.h"
|
||||
static void DetectFeaturesFromOs(X86Features* features) {
|
||||
static void DetectFeaturesFromOs(X86Info* info, X86Features* features) {
|
||||
(void)info;
|
||||
// Handling Linux platform through /proc/cpuinfo.
|
||||
const int fd = CpuFeatures_OpenFile("/proc/cpuinfo");
|
||||
if (fd >= 0) {
|
||||
|
@ -42,7 +42,8 @@ static void OverrideOsPreserves(OsPreserves* os_preserves) {
|
||||
os_preserves->avx512_registers = GetDarwinSysCtlByName("hw.optional.avx512f");
|
||||
}
|
||||
|
||||
static void DetectFeaturesFromOs(X86Features* features) {
|
||||
static void DetectFeaturesFromOs(X86Info* info, X86Features* features) {
|
||||
(void)info;
|
||||
// Handling Darwin platform through sysctlbyname.
|
||||
features->sse = GetDarwinSysCtlByName("hw.optional.sse");
|
||||
features->sse2 = GetDarwinSysCtlByName("hw.optional.sse2");
|
||||
|
@ -34,7 +34,7 @@ static bool GetWindowsIsProcessorFeaturePresent(DWORD ProcessorFeature) {
|
||||
}
|
||||
#endif
|
||||
|
||||
static void DetectFeaturesFromOs(X86Features* features) {
|
||||
static void DetectFeaturesFromOs(X86Info* info, X86Features* features) {
|
||||
// Handling Windows platform through IsProcessorFeaturePresent.
|
||||
// https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-isprocessorfeaturepresent
|
||||
features->sse =
|
||||
@ -43,6 +43,15 @@ static void DetectFeaturesFromOs(X86Features* features) {
|
||||
GetWindowsIsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE);
|
||||
features->sse3 =
|
||||
GetWindowsIsProcessorFeaturePresent(PF_SSE3_INSTRUCTIONS_AVAILABLE);
|
||||
|
||||
// https://github.com/google/cpu_features/issues/200
|
||||
#if (_WIN32_WINNT >= 0x0601) // Win7+
|
||||
if (GetX86Microarchitecture(info) == INTEL_WSM) {
|
||||
features->ssse3 = true;
|
||||
features->sse4_1 = true;
|
||||
features->sse4_2 = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // CPU_FEATURES_OS_WINDOWS
|
||||
|
Reference in New Issue
Block a user