Skip to content

Commit ab19081

Browse files
Add more features, refactor
1 parent 889175d commit ab19081

File tree

1 file changed

+70
-11
lines changed
  • compiler-rt/lib/builtins/cpu_model/aarch64/fmv

1 file changed

+70
-11
lines changed

compiler-rt/lib/builtins/cpu_model/aarch64/fmv/windows.inc

Lines changed: 70 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,52 @@
44
#include <processthreadsapi.h>
55
#include <stdint.h>
66

7+
#ifndef PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE
8+
#define PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE -1
9+
#endif
10+
#ifndef PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE
11+
#define PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE -1
12+
#endif
13+
#ifndef PF_ARM_V83_LRCPC_INSTRUCTIONS_AVAILABLE
14+
#define PF_ARM_V83_LRCPC_INSTRUCTIONS_AVAILABLE -1
15+
#endif
16+
#ifndef PF_ARM_SVE_INSTRUCTIONS_AVAILABLE
17+
#define PF_ARM_SVE_INSTRUCTIONS_AVAILABLE -1
18+
#endif
19+
#ifndef PF_ARM_SVE2_INSTRUCTIONS_AVAILABLE
20+
#define PF_ARM_SVE2_INSTRUCTIONS_AVAILABLE -1
21+
#endif
22+
#ifndef PF_ARM_SVE_AES_INSTRUCTIONS_AVAILABLE
23+
#define PF_ARM_SVE_AES_INSTRUCTIONS_AVAILABLE -1
24+
#endif
25+
#ifndef PF_ARM_SVE_PMULL128_INSTRUCTIONS_AVAILABLE
26+
#define PF_ARM_SVE_PMULL128_INSTRUCTIONS_AVAILABLE -1
27+
#endif
28+
#ifndef PF_ARM_SVE_BITPERM_INSTRUCTIONS_AVAILABLE
29+
#define PF_ARM_SVE_BITPERM_INSTRUCTIONS_AVAILABLE -1
30+
#endif
31+
#ifndef PF_ARM_SVE_BF16_INSTRUCTIONS_AVAILABLE
32+
#define PF_ARM_SVE_BF16_INSTRUCTIONS_AVAILABLE -1
33+
#endif
34+
#ifndef PF_ARM_SVE_EBF16_INSTRUCTIONS_AVAILABLE
35+
#define PF_ARM_SVE_EBF16_INSTRUCTIONS_AVAILABLE -1
36+
#endif
37+
#ifndef PF_ARM_SVE_SHA3_INSTRUCTIONS_AVAILABLE
38+
#define PF_ARM_SVE_SHA3_INSTRUCTIONS_AVAILABLE -1
39+
#endif
40+
#ifndef PF_ARM_SVE_SM4_INSTRUCTIONS_AVAILABLE
41+
#define PF_ARM_SVE_SM4_INSTRUCTIONS_AVAILABLE -1
42+
#endif
43+
#ifndef PF_ARM_SVE_I8MM_INSTRUCTIONS_AVAILABLE
44+
#define PF_ARM_SVE_I8MM_INSTRUCTIONS_AVAILABLE -1
45+
#endif
46+
#ifndef PF_ARM_SVE_F32MM_INSTRUCTIONS_AVAILABLE
47+
#define PF_ARM_SVE_F32MM_INSTRUCTIONS_AVAILABLE -1
48+
#endif
49+
#ifndef PF_ARM_SVE_F64MM_INSTRUCTIONS_AVAILABLE
50+
#define PF_ARM_SVE_F64MM_INSTRUCTIONS_AVAILABLE -1
51+
#endif
52+
753
void __init_cpu_features_resolver(unsigned long hwcap,
854
const __ifunc_arg_t *arg) {}
955

@@ -19,23 +65,36 @@ void CONSTRUCTOR_ATTRIBUTE __init_cpu_features(void) {
1965
setCPUFeature(FEAT_FP);
2066

2167
// https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-isprocessorfeaturepresent
22-
if (IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE))
23-
setCPUFeature(FEAT_CRC);
24-
if (IsProcessorFeaturePresent(PF_ARM_V81_ATOMIC_INSTRUCTIONS_AVAILABLE))
25-
setCPUFeature(FEAT_LSE);
26-
if (IsProcessorFeaturePresent(PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE))
27-
setCPUFeature(FEAT_DOTPROD);
28-
2968
if (IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE)) {
3069
setCPUFeature(FEAT_AES);
3170
setCPUFeature(FEAT_SHA2);
3271
setCPUFeature(FEAT_PMULL);
3372
}
34-
if (IsProcessorFeaturePresent(PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE))
35-
setCPUFeature(FEAT_JSCVT);
3673

37-
if (IsProcessorFeaturePresent(PF_ARM_V83_LRCPC_INSTRUCTIONS_AVAILABLE))
38-
setCPUFeature(FEAT_RCPC);
74+
static const struct ProcessFeatureToFeatMap_t {
75+
int WinApiFeature;
76+
enum CPUFeatures CPUFeature;
77+
} FeatMap[] = {
78+
{PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE, FEAT_CRC},
79+
{PF_ARM_V81_ATOMIC_INSTRUCTIONS_AVAILABLE, FEAT_LSE},
80+
{PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE, FEAT_DOTPROD},
81+
{PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE, FEAT_JSCVT},
82+
{PF_ARM_V83_LRCPC_INSTRUCTIONS_AVAILABLE, FEAT_RCPC},
83+
{PF_ARM_SVE_INSTRUCTIONS_AVAILABLE, FEAT_SVE},
84+
{PF_ARM_SVE2_INSTRUCTIONS_AVAILABLE, FEAT_SVE2},
85+
{PF_ARM_SVE_AES_INSTRUCTIONS_AVAILABLE, FEAT_SVE_AES},
86+
{PF_ARM_SVE_BF16_INSTRUCTIONS_AVAILABLE, FEAT_SVE_BF16},
87+
{PF_ARM_SVE_EBF16_INSTRUCTIONS_AVAILABLE, FEAT_SVE_EBF16},
88+
{PF_ARM_SVE_SHA3_INSTRUCTIONS_AVAILABLE, FEAT_SVE_SHA3},
89+
{PF_ARM_SVE_SM4_INSTRUCTIONS_AVAILABLE, FEAT_SVE_SM4},
90+
{PF_ARM_SVE_F32MM_INSTRUCTIONS_AVAILABLE, FEAT_SVE_F32MM},
91+
{PF_ARM_SVE_F64MM_INSTRUCTIONS_AVAILABLE, FEAT_SVE_F64MM},
92+
};
93+
94+
for (size_t I = 0, E = sizeof(FeatMap) / sizeof(FeatMap[0]);
95+
I != E; ++I)
96+
if ((FeatMap[I].WinApiFeature != -1) && IsProcessorFeaturePresent(FeatMap[I].WinApiFeature))
97+
setCPUFeature(FeatMap[I].CPUFeature);
3998

4099
__atomic_store(&__aarch64_cpu_features.features, &features,
41100
__ATOMIC_RELAXED);

0 commit comments

Comments
 (0)