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 +#include +#include +#include + +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")