@@ -39,63 +39,109 @@ pub(crate) fn detect_features() -> cache::Initializer {
39
39
}
40
40
} ;
41
41
42
- let asimd = _sysctlbyname ( c"hw.optional.AdvSIMD" ) ;
43
- let pmull = _sysctlbyname ( c"hw.optional.arm.FEAT_PMULL" ) ;
42
+ // Armv8.0 features not using the standard identifiers
44
43
let fp = _sysctlbyname ( c"hw.optional.floatingpoint" ) ;
45
- let fp16 = _sysctlbyname ( c"hw.optional.arm.FEAT_FP16 " ) ;
44
+ let asimd = _sysctlbyname ( c"hw.optional.AdvSIMD " ) ;
46
45
let crc = _sysctlbyname ( c"hw.optional.armv8_crc32" ) ;
47
- let lse = _sysctlbyname ( c"hw.optional.arm.FEAT_LSE" ) ;
48
- let lse2 = _sysctlbyname ( c"hw.optional.arm.FEAT_LSE2" ) ;
49
- let rdm = _sysctlbyname ( c"hw.optional.arm.FEAT_RDM" ) ;
50
- let rcpc = _sysctlbyname ( c"hw.optional.arm.FEAT_LRCPC" ) ;
51
- let rcpc2 = _sysctlbyname ( c"hw.optional.arm.FEAT_LRCPC2" ) ;
52
- let dotprod = _sysctlbyname ( c"hw.optional.arm.FEAT_DotProd" ) ;
53
- let fhm = _sysctlbyname ( c"hw.optional.arm.FEAT_FHM" ) ;
54
- let flagm = _sysctlbyname ( c"hw.optional.arm.FEAT_FlagM" ) ;
55
- let ssbs = _sysctlbyname ( c"hw.optional.arm.FEAT_SSBS" ) ;
56
- let sb = _sysctlbyname ( c"hw.optional.arm.FEAT_SB" ) ;
57
- let paca = _sysctlbyname ( c"hw.optional.arm.FEAT_PAuth" ) ;
46
+
47
+ // Armv8 and Armv9 features using the standard identifiers
48
+ let aes = _sysctlbyname ( c"hw.optional.arm.FEAT_AES" ) ;
49
+ let bf16 = _sysctlbyname ( c"hw.optional.arm.FEAT_BF16" ) ;
50
+ let bti = _sysctlbyname ( c"hw.optional.arm.FEAT_BTI" ) ;
51
+ let dit = _sysctlbyname ( c"hw.optional.arm.FEAT_DIT" ) ;
58
52
let dpb = _sysctlbyname ( c"hw.optional.arm.FEAT_DPB" ) ;
59
53
let dpb2 = _sysctlbyname ( c"hw.optional.arm.FEAT_DPB2" ) ;
54
+ let dotprod = _sysctlbyname ( c"hw.optional.arm.FEAT_DotProd" ) ;
55
+ let ecv = _sysctlbyname ( c"hw.optional.arm.FEAT_ECV" ) ;
56
+ let fcma = _sysctlbyname ( c"hw.optional.arm.FEAT_FCMA" ) ;
57
+ let fhm = _sysctlbyname ( c"hw.optional.arm.FEAT_FHM" ) ;
58
+ let fp16 = _sysctlbyname ( c"hw.optional.arm.FEAT_FP16" ) ;
60
59
let frintts = _sysctlbyname ( c"hw.optional.arm.FEAT_FRINTTS" ) ;
60
+ let flagm = _sysctlbyname ( c"hw.optional.arm.FEAT_FlagM" ) ;
61
+ let flagm2 = _sysctlbyname ( c"hw.optional.arm.FEAT_FlagM2" ) ;
61
62
let i8mm = _sysctlbyname ( c"hw.optional.arm.FEAT_I8MM" ) ;
62
- let bf16 = _sysctlbyname ( c"hw.optional.arm.FEAT_BF16" ) ;
63
- let bti = _sysctlbyname ( c"hw.optional.arm.FEAT_BTI" ) ;
64
- let fcma = _sysctlbyname ( c"hw.optional.arm.FEAT_FCMA" ) ;
65
- let aes = _sysctlbyname ( c"hw.optional.arm.FEAT_AES" ) ;
63
+ let jsconv = _sysctlbyname ( c"hw.optional.arm.FEAT_JSCVT" ) ;
64
+ let rcpc = _sysctlbyname ( c"hw.optional.arm.FEAT_LRCPC" ) ;
65
+ let rcpc2 = _sysctlbyname ( c"hw.optional.arm.FEAT_LRCPC2" ) ;
66
+ let lse = _sysctlbyname ( c"hw.optional.arm.FEAT_LSE" ) ;
67
+ let lse2 = _sysctlbyname ( c"hw.optional.arm.FEAT_LSE2" ) ;
68
+ let pauth = _sysctlbyname ( c"hw.optional.arm.FEAT_PAuth" ) ;
69
+ let pmull = _sysctlbyname ( c"hw.optional.arm.FEAT_PMULL" ) ;
70
+ let rdm = _sysctlbyname ( c"hw.optional.arm.FEAT_RDM" ) ;
71
+ let sb = _sysctlbyname ( c"hw.optional.arm.FEAT_SB" ) ;
66
72
let sha1 = _sysctlbyname ( c"hw.optional.arm.FEAT_SHA1" ) ;
67
- let sha2 = _sysctlbyname ( c"hw.optional.arm.FEAT_SHA256" ) ;
73
+ let sha256 = _sysctlbyname ( c"hw.optional.arm.FEAT_SHA256" ) ;
68
74
let sha3 = _sysctlbyname ( c"hw.optional.arm.FEAT_SHA3" ) ;
69
75
let sha512 = _sysctlbyname ( c"hw.optional.arm.FEAT_SHA512" ) ;
70
- let jsconv = _sysctlbyname ( c"hw.optional.arm.FEAT_JSCVT" ) ;
76
+ let sme = _sysctlbyname ( c"hw.optional.arm.FEAT_SME" ) ;
77
+ let sme2 = _sysctlbyname ( c"hw.optional.arm.FEAT_SME2" ) ;
78
+ let sme_f64f64 = _sysctlbyname ( c"hw.optional.arm.FEAT_SME_F64F64" ) ;
79
+ let sme_i16i64 = _sysctlbyname ( c"hw.optional.arm.FEAT_SME_I16I64" ) ;
80
+ let ssbs = _sysctlbyname ( c"hw.optional.arm.FEAT_SSBS" ) ;
81
+ let wfxt = _sysctlbyname ( c"hw.optional.arm.FEAT_WFxT" ) ;
82
+
83
+ // The following features are not exposed by `is_aarch64_feature_detected`,
84
+ // but *are* reported by `sysctl`. They are here as documentation that they
85
+ // exist, and may potentially be exposed later.
86
+ /*
87
+ let afp = _sysctlbyname(c"hw.optional.arm.FEAT_AFP");
88
+ let csv2 = _sysctlbyname(c"hw.optional.arm.FEAT_CSV2");
89
+ let csv3 = _sysctlbyname(c"hw.optional.arm.FEAT_CSV3");
90
+ let fpac = _sysctlbyname(c"hw.optional.arm.FEAT_FPAC");
91
+ let pauth2 = _sysctlbyname(c"hw.optional.arm.FEAT_PAuth2");
92
+ let rpres = _sysctlbyname(c"hw.optional.arm.FEAT_RPRES");
93
+ let specres = _sysctlbyname(c"hw.optional.arm.FEAT_SPECRES");
94
+ */
71
95
96
+ // The following "features" are reported by `sysctl` but are mandatory parts
97
+ // of SME or SME2, and so are not exposed separately by
98
+ // `is_aarch64_feature_detected`. They are here to document their
99
+ // existence, in case they're needed in the future.
100
+ /*
101
+ let sme_b16f32 = _sysctlbyname(c"hw.optional.arm.SME_B16F32");
102
+ let sme_bi32i32 = _sysctlbyname(c"hw.optional.arm.SME_BI32I32");
103
+ let sme_f16f32 = _sysctlbyname(c"hw.optional.arm.SME_F16F32");
104
+ let sme_f32f32 = _sysctlbyname(c"hw.optional.arm.SME_F32F32");
105
+ let sme_i16i32 = _sysctlbyname(c"hw.optional.arm.SME_I16I32");
106
+ let sme_i8i32 = _sysctlbyname(c"hw.optional.arm.SME_I8I32");
107
+ */
108
+
109
+ enable_feature ( Feature :: aes, aes && pmull) ;
72
110
enable_feature ( Feature :: asimd, asimd) ;
73
- enable_feature ( Feature :: pmull, pmull) ;
74
- enable_feature ( Feature :: fp, fp) ;
75
- enable_feature ( Feature :: fp16, fp16) ;
111
+ enable_feature ( Feature :: bf16, bf16) ;
112
+ enable_feature ( Feature :: bti, bti) ;
76
113
enable_feature ( Feature :: crc, crc) ;
77
- enable_feature ( Feature :: lse, lse) ;
78
- enable_feature ( Feature :: lse2, lse2) ;
79
- enable_feature ( Feature :: rdm, rdm) ;
80
- enable_feature ( Feature :: rcpc, rcpc) ;
81
- enable_feature ( Feature :: rcpc2, rcpc2) ;
114
+ enable_feature ( Feature :: dit, dit) ;
82
115
enable_feature ( Feature :: dotprod, dotprod) ;
83
- enable_feature ( Feature :: fhm, fhm) ;
84
- enable_feature ( Feature :: flagm, flagm) ;
85
- enable_feature ( Feature :: ssbs, ssbs) ;
86
- enable_feature ( Feature :: sb, sb) ;
87
- enable_feature ( Feature :: paca, paca) ;
88
116
enable_feature ( Feature :: dpb, dpb) ;
89
117
enable_feature ( Feature :: dpb2, dpb2) ;
118
+ enable_feature ( Feature :: ecv, ecv) ;
119
+ enable_feature ( Feature :: fcma, fcma) ;
120
+ enable_feature ( Feature :: fhm, fhm) ;
121
+ enable_feature ( Feature :: flagm, flagm) ;
122
+ enable_feature ( Feature :: flagm2, flagm2) ;
123
+ enable_feature ( Feature :: fp, fp) ;
124
+ enable_feature ( Feature :: fp16, fp16) ;
90
125
enable_feature ( Feature :: frintts, frintts) ;
91
126
enable_feature ( Feature :: i8mm, i8mm) ;
92
- enable_feature ( Feature :: bf16, bf16) ;
93
- enable_feature ( Feature :: bti, bti) ;
94
- enable_feature ( Feature :: fcma, fcma) ;
95
- enable_feature ( Feature :: aes, aes && pmull) ;
96
127
enable_feature ( Feature :: jsconv, jsconv) ;
97
- enable_feature ( Feature :: sha2, sha1 && sha2 && asimd) ;
128
+ enable_feature ( Feature :: lse, lse) ;
129
+ enable_feature ( Feature :: lse2, lse2) ;
130
+ enable_feature ( Feature :: paca, pauth) ;
131
+ enable_feature ( Feature :: pacg, pauth) ;
132
+ enable_feature ( Feature :: pmull, aes && pmull) ;
133
+ enable_feature ( Feature :: rcpc, rcpc) ;
134
+ enable_feature ( Feature :: rcpc2, rcpc2) ;
135
+ enable_feature ( Feature :: rdm, rdm) ;
136
+ enable_feature ( Feature :: sb, sb) ;
137
+ enable_feature ( Feature :: sha2, sha1 && sha256 && asimd) ;
98
138
enable_feature ( Feature :: sha3, sha512 && sha3 && asimd) ;
139
+ enable_feature ( Feature :: sme, sme) ;
140
+ enable_feature ( Feature :: sme2, sme2) ;
141
+ enable_feature ( Feature :: sme_f64f64, sme_f64f64) ;
142
+ enable_feature ( Feature :: sme_i16i64, sme_i16i64) ;
143
+ enable_feature ( Feature :: ssbs, ssbs) ;
144
+ enable_feature ( Feature :: wfxt, wfxt) ;
99
145
100
146
value
101
147
}
0 commit comments