Files
reactos/sdk/lib/vcstartup/isa_available.cpp
Timo Kreuzer d0b292cda6 [VCSTARTUP] Separate the library from vcruntime
Previously this was mixed with vcruntime, with some objects being shared. But this is messy. Instead use a separate library and link ucrtbase to this as well. This also matches more closely how native libraries are organized, where vcstartup is merged into the CRT import libraries, while vcruntime is merged into the static CRT libraries.
2026-06-21 12:30:32 +00:00

66 lines
1.5 KiB
C++

//
// 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;
}