mirror of
https://github.com/reactos/reactos.git
synced 2026-07-01 23:44:57 +08:00
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.
66 lines
1.5 KiB
C++
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;
|
|
}
|