Reactos
1//
2// isa_available.c
3//
4// Copyright (c) 2024 Timo Kreuzer
5//
6// Implementation of __isa_available_init.
7//
8// SPDX-License-Identifier: MIT
9//
10
11#include <isa_availability.h>
12#include <intrin.h>
13#include <windef.h>
14#include <winbase.h>
15
16extern "C" { int __isa_available = 0; }
17
18extern "C"
19int
20__cdecl
21__isa_available_init(void)
22{
23#if defined(_M_IX86) || defined(_M_X64)
24 if (IsProcessorFeaturePresent(PF_AVX512F_INSTRUCTIONS_AVAILABLE))
25 {
26 __isa_available = __ISA_AVAILABLE_AVX512;
27 }
28 else if (IsProcessorFeaturePresent(PF_AVX2_INSTRUCTIONS_AVAILABLE))
29 {
30 __isa_available = __ISA_AVAILABLE_AVX2;
31 }
32 else if (IsProcessorFeaturePresent(PF_AVX_INSTRUCTIONS_AVAILABLE))
33 {
34 __isa_available = __ISA_AVAILABLE_AVX;
35 }
36 else if (IsProcessorFeaturePresent(PF_SSE4_2_INSTRUCTIONS_AVAILABLE))
37 {
38 __isa_available = __ISA_AVAILABLE_SSE42;
39 }
40 else if (IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE))
41 {
42 __isa_available = __ISA_AVAILABLE_SSE2;
43 }
44 else
45 {
46 __isa_available = __ISA_AVAILABLE_X86;
47 }
48#elif defined(_M_ARM) || defined(_M_ARM64)
49 // CHECKME: Is this correct?
50 if (IsProcessorFeaturePresent(PF_ARM_V8_INSTRUCTIONS_AVAILABLE))
51 {
52#ifdef _M_ARM64
53 __isa_available = __ISA_AVAILABLE_NEON_ARM64;
54#else
55 __isa_available = __ISA_AVAILABLE_NEON;
56#endif
57 }
58 else
59 {
60 __isa_available = __ISA_AVAILABLE_ARMNT;
61 }
62#endif
63
64 return 0;
65}