arch_ops/x86/
cpu.rs

1use crate::x86::features::X86Feature;
2
3#[derive(Debug, PartialEq, Eq, Hash, Copy, Clone)]
4pub struct X86MachineFromStrError;
5
6impl core::fmt::Display for X86MachineFromStrError {
7    fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
8        f.write_str("Unknown x86 feature")
9    }
10}
11
12impl std::error::Error for X86MachineFromStrError {}
13
14macro_rules! define_x86_cpus{
15    {
16        $(($enum:ident, $cpu_type:literal $(| $($extra_names:literal)|*)?, [$($feature:ident),* $(,)?])),* $(,)?
17    } => {
18        #[derive(Copy,Clone,Hash,PartialEq,Eq)]
19        #[non_exhaustive]
20        #[repr(i32)]
21        pub enum X86Machine{
22            $($enum ,)*
23        }
24
25        impl X86Machine{
26            pub fn cpu_name(&self) -> &'static str{
27                match self{
28                    $(X86Machine:: $enum => $cpu_type,)*
29                }
30            }
31
32            pub fn cpu_features(&self) -> &'static [X86Feature]{
33                match self{
34                    $(Self::$enum => &[$(X86Feature:: $feature),*],)*
35                }
36            }
37        }
38
39        impl core::fmt::Display for X86Machine{
40            fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result{
41                match self{
42                    $(Self:: $enum => f.write_str($cpu_type),)*
43                }
44            }
45        }
46
47        impl core::str::FromStr for X86Machine{
48            type Err = X86MachineFromStrError;
49
50            fn from_str(x: &str) -> Result<Self,Self::Err>{
51                match x{
52                    $(
53                    #[allow(unreachable_patterns)] $cpu_type => Ok(Self:: $enum),
54                    $($(#[allow(unreachable_patterns)] $extra_names => Ok(Self:: $enum),)*)?
55                    )*
56                    _ => Err(X86MachineFromStrError)
57                }
58            }
59        }
60    }
61}
62
63define_x86_cpus! {
64    (I386, "i386", [X87]),
65    (I486, "i486", [X87]),
66    (I586, "i587", [X87]),
67    (Lakemont,"lakemont",[X87]),
68    (PentiumMmx, "pentium-mmx", [X87,Mmx]),
69    (PentiumPro, "pentiumpro" | "i686", [X87]),
70    (Pentium2, "pentium2", [X87, Mmx, Fxsr]),
71    (Pentium3, "pentium3", [X87, Mmx, Fxsr, Sse]),
72    (Pentium3m, "pentium3m", [X87, Mmx, Fxsr, Sse]),
73    (PentiumM, "pentium-m", [X87, Mmx, Fxsr, Sse, Sse2]),
74    (Pentium4, "pentium4" | "pentium4m", [X87, Mmx, Fxsr, Sse,Sse2]),
75    (Prescott, "prescott", [X87, Mmx, Fxsr, Sse, Sse2, Sse3]),
76    (X86_64, "x86-64", [X87, Mmx, Fxsr, Sse, Sse2, Cx8]),
77    (Nocona, "nocona", [X87, Mmx, Fxsr, Sse, Sse2, Cx8, Sse3]),
78    (Core2, "core2", [X87, Mmx, Fxsr, Sse, Sse2, Sse3, Ssse3, Cx8, Cx16]),
79    (Nehalem, "nehalem", [X87, Mmx, Fxsr, Sse, Sse2, Sse3, Sse4, Sse4_1, Sse4_2, Popcnt, Cx8, Cx16, Sahf]),
80    (Westmere, "westmere", [X87, Mmx, Fxsr, Sse, Sse2, Sse3, Ssse3, Sse4, Sse4_1, Sse4_2, Popcnt, Cx16, Pclmul]),
81    (SandyBridge, "sandybridge", [X87, Mmx, Fxsr, Sse, Sse2, Sse3, Ssse3, Sse4, Sse4_1, Sse4_2, Popcnt, Cx8, Cx16,Sahf, Avx, XSave, Pclmul]),
82    (IvyBridge, "ivybridge", [X87, Mmx, Fxsr, Sse, Sse2, Sse3, Ssse3, Sse4, Sse4_1, Sse4_2, Popcnt, Cx8, Cx16,Sahf, Avx, XSave, Pclmul, FsGsBase, Rdrand, F16c]),
83    (Haswell, "haswell", [X87, Mmx, Fxsr, Sse, Sse2, Sse3, Ssse3, Sse4, Sse4_1, Sse4_2, Popcnt, Cx8, Cx16,Sahf, Avx, XSave, Pclmul, FsGsBase,
84         Rdrand, F16c, Avx2, Bmi, Bmi2, Lzcnt, Fma, MovBe, Hle]),
85    (Broadwell, "broadwell",[X87, Mmx, Fxsr, Sse, Sse2, Sse3, Ssse3, Sse4, Sse4_1, Sse4_2, Popcnt, Cx8, Cx16,Sahf, Avx, XSave, Pclmul, FsGsBase,
86         Rdrand, F16c, Avx2, Bmi, Bmi2, Lzcnt, Fma, MovBe, Hle, Rdseed, Adcx, PrefecthW]),
87    (Skylake, "skylake",[X87, Mmx, Fxsr, Sse, Sse2, Sse3, Ssse3, Sse4, Sse4_1, Sse4_2, Popcnt, Cx8, Cx16,Sahf, Avx, XSave, Pclmul, FsGsBase,
88         Rdrand, F16c, Avx2, Bmi, Bmi2, Lzcnt, Fma, MovBe, Hle, Rdseed, Adcx, PrefecthW, Aes, ClFlushOpt, XSaveC, XSaveS, Sgx]),
89    (Bonnell, "bonnell", [X87, Mmx, Sse, Sse2, Sse3, Ssse3,MovBe]),
90    (Silvermont, "silvermont", [X87, Mmx, Sse, Sse2, Sse3, Ssse3, Sse4, Sse4_1, Sse4_2, Popcnt, Cx8, Cx16, Sahf, Fxsr, Pclmul, PrefecthW, Rdrand]),
91    (Goldmont, "goldmont", [X87, Mmx, Sse, Sse2, Sse3, Ssse3, Sse4, Sse4_1, Sse4_2, Popcnt, Cx8, Cx16, Sahf, Fxsr, Pclmul, PrefecthW, Rdrand, Aes, Sha, Rdseed,
92        XSave, XSaveC, XSaveS, XSaveOpt, ClFlushOpt, FsGsBase]),
93
94}
95
96pub mod timings;