From 7c81d43b10f3e594f512c9d6272da3e73f4cbead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pa=CC=84vels=20Nadtoc=CC=8Cajevs?= <7645683+bruvzg@users.noreply.github.com> Date: Thu, 31 Jul 2025 19:52:42 +0300 Subject: [PATCH] [Windows] Additionally use `cpuid` instruction to detect SSE4.2 support. --- platform/windows/cpu_feature_validation.c | 28 ++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/platform/windows/cpu_feature_validation.c b/platform/windows/cpu_feature_validation.c index 221b1a371a6..99f7f3f32b5 100644 --- a/platform/windows/cpu_feature_validation.c +++ b/platform/windows/cpu_feature_validation.c @@ -29,6 +29,23 @@ /**************************************************************************/ #include +#ifdef _MSC_VER +#include // For builtin __cpuid. +#else +void __cpuid(int *r_cpuinfo, int p_info) { + // Note: Some compilers have a buggy `__cpuid` intrinsic, using inline assembly (based on LLVM-20 implementation) instead. + __asm__ __volatile__( + "xchgq %%rbx, %q1;" + "cpuid;" + "xchgq %%rbx, %q1;" + : "=a"(r_cpuinfo[0]), "=r"(r_cpuinfo[1]), "=c"(r_cpuinfo[2]), "=d"(r_cpuinfo[3]) + : "0"(p_info)); +} +#endif + +#ifndef PF_SSE4_2_INSTRUCTIONS_AVAILABLE +#define PF_SSE4_2_INSTRUCTIONS_AVAILABLE 38 +#endif #ifdef WINDOWS_SUBSYSTEM_CONSOLE extern int WINAPI mainCRTStartup(); @@ -41,7 +58,16 @@ extern int WINAPI ShimMainCRTStartup() __attribute__((used)); #endif extern int WINAPI ShimMainCRTStartup() { - if (IsProcessorFeaturePresent(PF_SSE4_2_INSTRUCTIONS_AVAILABLE)) { + BOOL win_sse42_supported = FALSE; + BOOL cpuid_sse42_supported = FALSE; + + int cpuinfo[4]; + __cpuid(cpuinfo, 0x01); + + win_sse42_supported = IsProcessorFeaturePresent(PF_SSE4_2_INSTRUCTIONS_AVAILABLE); + cpuid_sse42_supported = cpuinfo[2] & (1 << 20); + + if (win_sse42_supported || cpuid_sse42_supported) { #ifdef WINDOWS_SUBSYSTEM_CONSOLE return mainCRTStartup(); #else