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+
753void __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