Browse Source

Merge pull request #109169 from bruvzg/sse42_cpuid

[Windows] Additionally use `cpuid` instruction to detect SSE4.2 support.
Thaddeus Crews 1 month ago
parent
commit
7d4b7fa8da
1 changed files with 27 additions and 1 deletions
  1. 27 1
      platform/windows/cpu_feature_validation.c

+ 27 - 1
platform/windows/cpu_feature_validation.c

@@ -29,6 +29,23 @@
 /**************************************************************************/
 
 #include <windows.h>
+#ifdef _MSC_VER
+#include <intrin.h> // 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