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