https://git.reactos.org/?p=reactos.git;a=commitdiff;h=8aab548ecdd7bb5230ad7…
commit 8aab548ecdd7bb5230ad774fb8df09cb15c9ac76
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Mon Dec 2 13:56:48 2024 +0200
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Sun Jan 26 18:08:55 2025 +0200
[UCRT:VCRUNTIME] Implement __isa_available_init()
---
sdk/lib/ucrt/vcruntime/isa_available.cpp | 65 ++++++++++++++++++++++++++++++++
sdk/lib/ucrt/vcruntime/vcruntime.cmake | 1 +
2 files changed, 66 insertions(+)
diff --git a/sdk/lib/ucrt/vcruntime/isa_available.cpp
b/sdk/lib/ucrt/vcruntime/isa_available.cpp
new file mode 100644
index 00000000000..f2806f29084
--- /dev/null
+++ b/sdk/lib/ucrt/vcruntime/isa_available.cpp
@@ -0,0 +1,65 @@
+//
+// isa_available.c
+//
+// Copyright (c) 2024 Timo Kreuzer
+//
+// Implementation of __isa_available_init.
+//
+// SPDX-License-Identifier: MIT
+//
+
+#include <isa_availability.h>
+#include <intrin.h>
+#include <windef.h>
+#include <winbase.h>
+
+extern "C" { int __isa_available = 0; }
+
+extern "C"
+int
+__cdecl
+__isa_available_init(void)
+{
+#if defined(_M_IX86) || defined(_M_X64)
+ if (IsProcessorFeaturePresent(PF_AVX512F_INSTRUCTIONS_AVAILABLE))
+ {
+ __isa_available = __ISA_AVAILABLE_AVX512;
+ }
+ else if (IsProcessorFeaturePresent(PF_AVX2_INSTRUCTIONS_AVAILABLE))
+ {
+ __isa_available = __ISA_AVAILABLE_AVX2;
+ }
+ else if (IsProcessorFeaturePresent(PF_AVX_INSTRUCTIONS_AVAILABLE))
+ {
+ __isa_available = __ISA_AVAILABLE_AVX;
+ }
+ else if (IsProcessorFeaturePresent(PF_SSE4_2_INSTRUCTIONS_AVAILABLE))
+ {
+ __isa_available = __ISA_AVAILABLE_SSE42;
+ }
+ else if (IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE))
+ {
+ __isa_available = __ISA_AVAILABLE_SSE2;
+ }
+ else
+ {
+ __isa_available = __ISA_AVAILABLE_X86;
+ }
+#elif defined(_M_ARM) || defined(_M_ARM64)
+ // CHECKME: Is this correct?
+ if (IsProcessorFeaturePresent(PF_ARM_V8_INSTRUCTIONS_AVAILABLE))
+ {
+#ifdef _M_ARM64
+ __isa_available = __ISA_AVAILABLE_NEON_ARM64;
+#else
+ __isa_available = __ISA_AVAILABLE_NEON;
+#endif
+ }
+ else
+ {
+ __isa_available = __ISA_AVAILABLE_ARMNT;
+ }
+#endif
+
+ return 0;
+}
diff --git a/sdk/lib/ucrt/vcruntime/vcruntime.cmake
b/sdk/lib/ucrt/vcruntime/vcruntime.cmake
index 2c3ab680910..dc610565944 100644
--- a/sdk/lib/ucrt/vcruntime/vcruntime.cmake
+++ b/sdk/lib/ucrt/vcruntime/vcruntime.cmake
@@ -5,6 +5,7 @@ list(APPEND UCRT_VCRUNTIME_SOURCES
vcruntime/__security_init_cookie.c
vcruntime/__vcrt_init.c
vcruntime/initializers.cpp
+ vcruntime/isa_available.cpp
)
if(${ARCH} STREQUAL "i386")