@@ -103,13 +103,26 @@ struct AtHwcap {
103103 // afp: bool,
104104 // rpres: bool,
105105 // mte3: bool,
106+ sme : bool ,
107+ smei16i64 : bool ,
108+ smef64f64 : bool ,
109+ // smei8i32: bool,
110+ // smef16f32: bool,
111+ // smeb16f32: bool,
112+ // smef32f32: bool,
113+ smefa64 : bool ,
106114 wfxt : bool ,
107115 // ebf16: bool,
108116 // sveebf16: bool,
109117 cssc : bool ,
110118 // rprfm: bool,
111119 sve2p1 : bool ,
120+ sme2 : bool ,
121+ sme2p1 : bool ,
122+ // smei16i32: bool,
123+ // smebi32i32: bool,
112124 smeb16b16 : bool ,
125+ smef16f16 : bool ,
113126 mops : bool ,
114127 hbc : bool ,
115128 sveb16b16 : bool ,
@@ -124,6 +137,12 @@ struct AtHwcap {
124137 f8dp2 : bool ,
125138 f8e4m3 : bool ,
126139 f8e5m2 : bool ,
140+ smelutv2 : bool ,
141+ smef8f16 : bool ,
142+ smef8f32 : bool ,
143+ smesf8fma : bool ,
144+ smesf8dp4 : bool ,
145+ smesf8dp2 : bool ,
127146}
128147
129148impl From < auxvec:: AuxVec > for AtHwcap {
@@ -187,13 +206,26 @@ impl From<auxvec::AuxVec> for AtHwcap {
187206 // afp: bit::test(auxv.hwcap2, 20),
188207 // rpres: bit::test(auxv.hwcap2, 21),
189208 // mte3: bit::test(auxv.hwcap2, 22),
209+ sme : bit:: test ( auxv. hwcap2 , 23 ) ,
210+ smei16i64 : bit:: test ( auxv. hwcap2 , 24 ) ,
211+ smef64f64 : bit:: test ( auxv. hwcap2 , 25 ) ,
212+ // smei8i32: bit::test(auxv.hwcap2, 26),
213+ // smef16f32: bit::test(auxv.hwcap2, 27),
214+ // smeb16f32: bit::test(auxv.hwcap2, 28),
215+ // smef32f32: bit::test(auxv.hwcap2, 29),
216+ smefa64 : bit:: test ( auxv. hwcap2 , 30 ) ,
190217 wfxt : bit:: test ( auxv. hwcap2 , 31 ) ,
191218 // ebf16: bit::test(auxv.hwcap2, 32),
192219 // sveebf16: bit::test(auxv.hwcap2, 33),
193220 cssc : bit:: test ( auxv. hwcap2 , 34 ) ,
194221 // rprfm: bit::test(auxv.hwcap2, 35),
195222 sve2p1 : bit:: test ( auxv. hwcap2 , 36 ) ,
223+ sme2 : bit:: test ( auxv. hwcap2 , 37 ) ,
224+ sme2p1 : bit:: test ( auxv. hwcap2 , 38 ) ,
225+ // smei16i32: bit::test(auxv.hwcap2, 39),
226+ // smebi32i32: bit::test(auxv.hwcap2, 40),
196227 smeb16b16 : bit:: test ( auxv. hwcap2 , 41 ) ,
228+ smef16f16 : bit:: test ( auxv. hwcap2 , 42 ) ,
197229 mops : bit:: test ( auxv. hwcap2 , 43 ) ,
198230 hbc : bit:: test ( auxv. hwcap2 , 44 ) ,
199231 sveb16b16 : bit:: test ( auxv. hwcap2 , 45 ) ,
@@ -208,6 +240,12 @@ impl From<auxvec::AuxVec> for AtHwcap {
208240 f8dp2 : bit:: test ( auxv. hwcap2 , 54 ) ,
209241 f8e4m3 : bit:: test ( auxv. hwcap2 , 55 ) ,
210242 f8e5m2 : bit:: test ( auxv. hwcap2 , 56 ) ,
243+ smelutv2 : bit:: test ( auxv. hwcap2 , 57 ) ,
244+ smef8f16 : bit:: test ( auxv. hwcap2 , 58 ) ,
245+ smef8f32 : bit:: test ( auxv. hwcap2 , 59 ) ,
246+ smesf8fma : bit:: test ( auxv. hwcap2 , 60 ) ,
247+ smesf8dp4 : bit:: test ( auxv. hwcap2 , 61 ) ,
248+ smesf8dp2 : bit:: test ( auxv. hwcap2 , 62 ) ,
211249 }
212250 }
213251}
@@ -278,13 +316,26 @@ impl From<super::cpuinfo::CpuInfo> for AtHwcap {
278316 // afp: f.has("afp"),
279317 // rpres: f.has("rpres"),
280318 // mte3: f.has("mte3"),
319+ sme : f. has ( "sme" ) ,
320+ smei16i64 : f. has ( "smei16i64" ) ,
321+ smef64f64 : f. has ( "smef64f64" ) ,
322+ // smei8i32: f.has("smei8i32"),
323+ // smef16f32: f.has("smef16f32"),
324+ // smeb16f32: f.has("smeb16f32"),
325+ // smef32f32: f.has("smef32f32"),
326+ smefa64 : f. has ( "smefa64" ) ,
281327 wfxt : f. has ( "wfxt" ) ,
282328 // ebf16: f.has("ebf16"),
283329 // sveebf16: f.has("sveebf16"),
284330 cssc : f. has ( "cssc" ) ,
285331 // rprfm: f.has("rprfm"),
286332 sve2p1 : f. has ( "sve2p1" ) ,
333+ sme2 : f. has ( "sme2" ) ,
334+ sme2p1 : f. has ( "sme2p1" ) ,
335+ // smei16i32: f.has("smei16i32"),
336+ // smebi32i32: f.has("smebi32i32"),
287337 smeb16b16 : f. has ( "smeb16b16" ) ,
338+ smef16f16 : f. has ( "smef16f16" ) ,
288339 mops : f. has ( "mops" ) ,
289340 hbc : f. has ( "hbc" ) ,
290341 sveb16b16 : f. has ( "sveb16b16" ) ,
@@ -299,6 +350,12 @@ impl From<super::cpuinfo::CpuInfo> for AtHwcap {
299350 f8dp2 : f. has ( "f8dp2" ) ,
300351 f8e4m3 : f. has ( "f8e4m3" ) ,
301352 f8e5m2 : f. has ( "f8e5m2" ) ,
353+ smelutv2 : f. has ( "smelutv2" ) ,
354+ smef8f16 : f. has ( "smef8f16" ) ,
355+ smef8f32 : f. has ( "smef8f32" ) ,
356+ smesf8fma : f. has ( "smesf8fma" ) ,
357+ smesf8dp4 : f. has ( "smesf8dp4" ) ,
358+ smesf8dp2 : f. has ( "smesf8dp2" ) ,
302359 }
303360 }
304361}
@@ -431,6 +488,25 @@ impl AtHwcap {
431488 enable_feature ( Feature :: fp8dot4, self . f8dp4 ) ;
432489 enable_feature ( Feature :: fp8dot2, self . f8dp2 ) ;
433490 enable_feature ( Feature :: wfxt, self . wfxt ) ;
491+ enable_feature ( Feature :: sme, self . sme && self . bf16 ) ;
492+ enable_feature ( Feature :: sme_i16i64, self . smei16i64 && self . sme ) ;
493+ enable_feature ( Feature :: sme_f64f64, self . smef64f64 && self . sme ) ;
494+ // enable_feature(Feature::sme_i8i32, self.smei8i32);
495+ // enable_feature(Feature::sme_f16f32, self.smef16f32);
496+ // enable_feature(Feature::sme_b16f32, self.smeb16f32);
497+ // enable_feature(Feature::sme_f32f32, self.smef32f32);
498+ enable_feature ( Feature :: sme_fa64, self . smefa64 && self . sme && sve2) ;
499+ enable_feature ( Feature :: sme2, self . sme2 && self . sme ) ;
500+ enable_feature ( Feature :: sme2p1, self . sme2p1 && self . sme2 && self . sme ) ;
501+ // enable_feature(Feature::sme_i16i32, self.smei16i32);
502+ // enable_feature(Feature::sme_bi32i32, self.smebi32i32);
503+ enable_feature ( Feature :: sme_f16f16, self . smef16f16 ) ;
504+ enable_feature ( Feature :: sme_lutv2, self . smelutv2 ) ;
505+ enable_feature ( Feature :: sme_f8f16, self . smef8f16 && self . sme2 && self . f8cvt ) ;
506+ enable_feature ( Feature :: sme_f8f32, self . smef8f32 && self . sme2 && self . f8cvt ) ;
507+ enable_feature ( Feature :: ssve_fp8fma, self . smesf8fma && self . sme2 ) ;
508+ enable_feature ( Feature :: ssve_fp8dot4, self . smesf8dp4 && self . sme2 ) ;
509+ enable_feature ( Feature :: ssve_fp8dot2, self . smesf8dp2 && self . sme2 ) ;
434510 }
435511 value
436512 }
0 commit comments