1#[derive(Debug)]
2pub struct X86FeatureFromStrError;
3
4impl core::fmt::Display for X86FeatureFromStrError {
5 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
6 f.write_str("Unknown x86 feature")
7 }
8}
9
10impl std::error::Error for X86FeatureFromStrError {}
11
12macro_rules! define_x86_features{
13 {
14 $(($enum:ident, $feature:literal)),* $(,)?
15 } => {
16 #[derive(Copy,Clone,Debug,Hash,PartialEq,Eq)]
17 #[non_exhaustive]
18 #[repr(i32)]
19 pub enum X86Feature{
20 $($enum,)*
21 }
22
23 impl X86Feature{
24 pub fn feature_name(&self) -> &'static str{
25 match self{
26 $(#[allow(unreachable_patterns)] Self::$enum => $feature,)*
27 }
28 }
29 }
30
31 impl core::str::FromStr for X86Feature{
32 type Err = X86FeatureFromStrError;
33 fn from_str(x: &str) -> Result<Self,Self::Err>{
34 match x{
35
36 $(#[allow(unreachable_patterns)] $feature => Ok(X86Feature::$enum),)*
37 _ => Err(X86FeatureFromStrError)
38 }
39 }
40 }
41
42 impl core::fmt::Display for X86Feature{
43 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result{
44 match self{
45 $(Self::$enum => f.write_str($feature),)*
46 }
47 }
48 }
49 }
50}
51
52define_x86_features! {
53 (Sce, "sce"),
54 (Mmx, "mmx"),
55 (Sse, "sse"),
56 (Sse2, "sse2"),
57 (Sse3, "sse3"),
58 (Ssse3, "ssse3"),
59 (Sse4, "sse4"),
60 (Sse4_1,"sse4.1"),
61 (Sse4_2, "sse4.2"),
62 (Avx, "avx"),
63 (Avx2,"avx2"),
64 (Avx512f,"avx512f"),
65 (Avx512pf,"avx512pf"),
66 (Avx512er, "avx512er"),
67 (Avx512cd, "avx512cd"),
68 (Avx512vl, "avx512vl"),
69 (Avx512bw, "avx512bw"),
70 (Avx512dq,"avx512dq"),
71 (Avx512ifma, "avx512ifma"),
72 (Avx512vbmi, "avx512vbmi"),
73 (Sha, "sha"),
74 (Aes, "aes"),
75 (Pclmul, "pclmul"),
76 (ClFlushOpt, "clflushopt"),
77 (Clwb, "clwb"),
78 (FsGsBase, "fsgsbase"),
79 (Ptwrite, "ptwrite"),
80 (Rdrand, "rdrand"),
81 (F16c, "f16c"),
82 (Fma, "fma"),
83 (Pconfig,"pconfig"),
84 (Wbnoinvd, "wbnoinvd"),
85 (Fma4, "fma4"),
86 (Prfchw,"prfchw"),
87 (Rdpid, "rdpid"),
88 (PrefetchWt11,"prefetchwt11"),
89 (Rdseed, "rdseed"),
90 (Sgx, "sgx"),
91 (Xop, "xop"),
92 (Lwp, "lwp"),
93 (M3dNow, "3dnow"),
94 (M3dNowA, "3dnowa"),
95 (Popcnt, "popcnt"),
96 (Abm, "abm"),
97 (Adx, "adx"),
98 (Bmi, "bmi"),
99 (Bmi2, "bmi2"),
100 (Lzcnt, "lzcnt"),
101 (Fxsr, "fxsr"),
102 (XSave, "xsave"),
103 (XSaveOpt, "xsaveopt"),
104 (XSaveC, "xsavec"),
105 (XSaveS,"xsaves"),
106 (Rtm, "rtm"),
107 (Hle, "hle"),
108 (Tbm, "tbm"),
109 (MWaitX, "mwaitx"),
110 (ClZero, "clzero"),
111 (Pku, "pku"),
112 (Avx512vbmi2, "avx512vbmi"),
113 (Avx512bf16, "avx512bf16"),
114 (Avx512fp16, "avx512fp16"),
115 (Gfni, "gfni"),
116 (Vaes, "vaes"),
117 (WaitPkg, "waitpkg"),
118 (VpclMulQdq, "vpclmulqdq"),
119 (Avx512BitAlg, "avx512bitalg"),
120 (MovDirI,"movdiri"),
121 (MovDir64b, "movdir64b"),
122 (Enqcmd, "enqcmd"),
123 (Uintr, "uintr"),
124 (Tsxldtrk, "tsxldtrk"),
125 (Avx512VPopcntDq, "avx512vpopcntdq"),
126 (Avx512Vp2Intersect, "avx512vp2intersect"),
127 (Avx5124Fmaps, "avx5124fmaps"),
128 (Avx512Vnni, "avx512vnni"),
129 (AvxVnni, "avxvnni"),
130 (Avx5124VnniW, "avx512fvnniw"),
131 (ClDemote, "cldemote"),
132 (Serialize, "serialize"),
133 (AmxTile, "amx-tile"),
134 (AmxInt8, "amx-int8"),
135 (AmxBf16, "amx-bf16"),
136 (HReset, "hreset"),
137 (Kl, "kl"),
138 (WideKl, "widekl"),
139 (X87, "x87"),
140 (Cx8, "cx8"),
141 (Cx16, "cx16"),
142 (Sahf, "sahf"),
143 (MovBe, "movbe"),
144 (Adcx, "adcx"),
145 (PrefecthW, "prefetchw")
146}