About
Contact
QtCreator
KDevelop
Solarized
1
#
if
__has_include
(<sys/auxv.h>)
2
#include
<sys/auxv.h>
3
#define
HAVE_SYS_AUXV_H
4
#
endif
5
6
static
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