Skip to content

Commit 7c81d43

Browse files
committed
[Windows] Additionally use cpuid instruction to detect SSE4.2 support.
1 parent 45509c2 commit 7c81d43

File tree

1 file changed

+27
-1
lines changed

1 file changed

+27
-1
lines changed

platform/windows/cpu_feature_validation.c

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,23 @@
2929
/**************************************************************************/
3030

3131
#include <windows.h>
32+
#ifdef _MSC_VER
33+
#include <intrin.h> // For builtin __cpuid.
34+
#else
35+
void __cpuid(int *r_cpuinfo, int p_info) {
36+
// Note: Some compilers have a buggy `__cpuid` intrinsic, using inline assembly (based on LLVM-20 implementation) instead.
37+
__asm__ __volatile__(
38+
"xchgq %%rbx, %q1;"
39+
"cpuid;"
40+
"xchgq %%rbx, %q1;"
41+
: "=a"(r_cpuinfo[0]), "=r"(r_cpuinfo[1]), "=c"(r_cpuinfo[2]), "=d"(r_cpuinfo[3])
42+
: "0"(p_info));
43+
}
44+
#endif
45+
46+
#ifndef PF_SSE4_2_INSTRUCTIONS_AVAILABLE
47+
#define PF_SSE4_2_INSTRUCTIONS_AVAILABLE 38
48+
#endif
3249

3350
#ifdef WINDOWS_SUBSYSTEM_CONSOLE
3451
extern int WINAPI mainCRTStartup();
@@ -41,7 +58,16 @@ extern int WINAPI ShimMainCRTStartup() __attribute__((used));
4158
#endif
4259

4360
extern int WINAPI ShimMainCRTStartup() {
44-
if (IsProcessorFeaturePresent(PF_SSE4_2_INSTRUCTIONS_AVAILABLE)) {
61+
BOOL win_sse42_supported = FALSE;
62+
BOOL cpuid_sse42_supported = FALSE;
63+
64+
int cpuinfo[4];
65+
__cpuid(cpuinfo, 0x01);
66+
67+
win_sse42_supported = IsProcessorFeaturePresent(PF_SSE4_2_INSTRUCTIONS_AVAILABLE);
68+
cpuid_sse42_supported = cpuinfo[2] & (1 << 20);
69+
70+
if (win_sse42_supported || cpuid_sse42_supported) {
4571
#ifdef WINDOWS_SUBSYSTEM_CONSOLE
4672
return mainCRTStartup();
4773
#else

0 commit comments

Comments
 (0)