1#if __has_include(<sys/auxv.h>)
2#include <sys/auxv.h>
3#define HAVE_SYS_AUXV_H
4#endif
5
6static void __init_cpu_features_constructor(unsigned long hwcap,
7 const __ifunc_arg_t *arg) {
8 unsigned long long feat = 0;
9#define setCPUFeature(F) feat |= 1ULL << F
10#define getCPUFeature(id, ftr) __asm__("mrs %0, " #id : "=r"(ftr))
11#define extractBits(val, start, number) \
12 (val & ((1ULL << number) - 1ULL) << start) >> start
13 unsigned long hwcap2 = 0;
14 if (hwcap & _IFUNC_ARG_HWCAP)
15 hwcap2 = arg->_hwcap2;
16 if (hwcap & HWCAP_CRC32)
17 setCPUFeature(FEAT_CRC);
18 if (hwcap & HWCAP_PMULL)
19 setCPUFeature(FEAT_PMULL);
20 if (hwcap & HWCAP_FLAGM)
21 setCPUFeature(FEAT_FLAGM);
22 if (hwcap2 & HWCAP2_FLAGM2)
23 setCPUFeature(FEAT_FLAGM2);
24 if (hwcap & HWCAP_SM4)
25 setCPUFeature(FEAT_SM4);
26 if (hwcap & HWCAP_ASIMDDP)
27 setCPUFeature(FEAT_DOTPROD);
28 if (hwcap & HWCAP_ASIMDFHM)
29 setCPUFeature(FEAT_FP16FML);
30 if (hwcap & HWCAP_FPHP)
31 setCPUFeature(FEAT_FP16);
32 if (hwcap & HWCAP_DIT)
33 setCPUFeature(FEAT_DIT);
34 if (hwcap & HWCAP_ASIMDRDM)
35 setCPUFeature(FEAT_RDM);
36 if (hwcap & HWCAP_SHA2)
37 setCPUFeature(FEAT_SHA2);
38 if (hwcap & HWCAP_JSCVT)
39 setCPUFeature(FEAT_JSCVT);
40 if (hwcap & HWCAP_FCMA)
41 setCPUFeature(FEAT_FCMA);
42 if (hwcap & HWCAP_SB)
43 setCPUFeature(FEAT_SB);
44 if (hwcap & HWCAP_SSBS)
45 setCPUFeature(FEAT_SSBS2);
46 if (hwcap2 & HWCAP2_MTE)
47 setCPUFeature(FEAT_MEMTAG2);
48 if (hwcap2 & HWCAP2_SVEPMULL)
49 setCPUFeature(FEAT_SVE_PMULL128);
50 if (hwcap2 & HWCAP2_SVEBITPERM)
51 setCPUFeature(FEAT_SVE_BITPERM);
52 if (hwcap2 & HWCAP2_SVESHA3)
53 setCPUFeature(FEAT_SVE_SHA3);
54 if (hwcap2 & HWCAP2_SVESM4)
55 setCPUFeature(FEAT_SVE_SM4);
56 if (hwcap2 & HWCAP2_DCPODP)
57 setCPUFeature(FEAT_DPB2);
58 if (hwcap & HWCAP_ATOMICS)
59 setCPUFeature(FEAT_LSE);
60 if (hwcap2 & HWCAP2_RNG)
61 setCPUFeature(FEAT_RNG);
62 if (hwcap2 & HWCAP2_I8MM)
63 setCPUFeature(FEAT_I8MM);
64 if (hwcap2 & HWCAP2_FRINT)
65 setCPUFeature(FEAT_FRINTTS);
66 if (hwcap2 & HWCAP2_SVEF32MM)
67 setCPUFeature(FEAT_SVE_F32MM);
68 if (hwcap2 & HWCAP2_SVEF64MM)
69 setCPUFeature(FEAT_SVE_F64MM);
70 if (hwcap2 & HWCAP2_BTI)
71 setCPUFeature(FEAT_BTI);
72 if (hwcap2 & HWCAP2_WFXT)
73 setCPUFeature(FEAT_WFXT);
74 if (hwcap2 & HWCAP2_SME)
75 setCPUFeature(FEAT_SME);
76 if (hwcap2 & HWCAP2_SME2)
77 setCPUFeature(FEAT_SME2);
78 if (hwcap2 & HWCAP2_SME_I16I64)
79 setCPUFeature(FEAT_SME_I64);
80 if (hwcap2 & HWCAP2_SME_F64F64)
81 setCPUFeature(FEAT_SME_F64);
82 if (hwcap2 & HWCAP2_MOPS)
83 setCPUFeature(FEAT_MOPS);
84 if (hwcap2 & HWCAP2_CSSC)
85 setCPUFeature(FEAT_CSSC);
86 if (hwcap & HWCAP_FP) {
87 setCPUFeature(FEAT_FP);
88 // FP and AdvSIMD fields have the same value
89 setCPUFeature(FEAT_SIMD);
90 }
91 if (hwcap & HWCAP_DCPOP)
92 setCPUFeature(FEAT_DPB);
93 if (hwcap & HWCAP_LRCPC)
94 setCPUFeature(FEAT_RCPC);
95 if (hwcap & HWCAP_ILRCPC)
96 setCPUFeature(FEAT_RCPC2);
97 if (hwcap2 & HWCAP2_LRCPC3)
98 setCPUFeature(FEAT_RCPC3);
99 if (hwcap2 & HWCAP2_BF16)
100 setCPUFeature(FEAT_BF16);
101 if (hwcap & HWCAP_SVE)
102 setCPUFeature(FEAT_SVE);
103 if (hwcap2 & HWCAP2_SVE2)
104 setCPUFeature(FEAT_SVE2);
105 if (hwcap & HWCAP_SHA3)
106 setCPUFeature(FEAT_SHA3);
107 setCPUFeature(FEAT_INIT);
108
109 __atomic_store_n(&__aarch64_cpu_features.features, feat, __ATOMIC_RELAXED);
110}
111

source code of compiler-rt/lib/builtins/cpu_model/aarch64/fmv/mrs.inc