arch_ops/x86/
features.rs

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}