1 //! Define supported ISAs; includes ISA-specific instructions, encodings, registers, settings, etc.
2 use crate::cdsl::isa::TargetIsa;
3 use std::fmt;
4 
5 mod arm64;
6 mod pulley;
7 mod riscv64;
8 mod s390x;
9 pub(crate) mod x86;
10 
11 /// Represents known ISA target.
12 #[derive(PartialEq, Copy, Clone)]
13 pub enum Isa {
14     X86,
15     Arm64,
16     S390x,
17     Riscv64,
18     Pulley32,
19     Pulley64,
20 }
21 
22 impl Isa {
23     /// Creates isa target using name.
from_name(name: &str) -> Option<Self>24     pub fn from_name(name: &str) -> Option<Self> {
25         Isa::all()
26             .iter()
27             .cloned()
28             .find(|isa| isa.to_string() == name)
29     }
30 
31     /// Creates isa target from arch.
from_arch(arch: &str) -> Option<Self>32     pub fn from_arch(arch: &str) -> Option<Self> {
33         match arch {
34             "aarch64" => Some(Isa::Arm64),
35             "s390x" => Some(Isa::S390x),
36             x if ["x86_64", "i386", "i586", "i686"].contains(&x) => Some(Isa::X86),
37             "riscv64" | "riscv64gc" | "riscv64imac" => Some(Isa::Riscv64),
38             "pulley32" => Some(Isa::Pulley32),
39             "pulley64" => Some(Isa::Pulley64),
40             _ => None,
41         }
42     }
43 
44     /// Returns all supported isa targets.
all() -> &'static [Isa]45     pub fn all() -> &'static [Isa] {
46         &[
47             Isa::X86,
48             Isa::Arm64,
49             Isa::S390x,
50             Isa::Riscv64,
51             Isa::Pulley32,
52             Isa::Pulley64,
53         ]
54     }
55 }
56 
57 impl fmt::Display for Isa {
58     // These names should be kept in sync with the crate features.
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result59     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
60         match *self {
61             Isa::X86 => write!(f, "x86"),
62             Isa::Arm64 => write!(f, "arm64"),
63             Isa::S390x => write!(f, "s390x"),
64             Isa::Riscv64 => write!(f, "riscv64"),
65             Isa::Pulley32 => write!(f, "pulley32"),
66             Isa::Pulley64 => write!(f, "pulley64"),
67         }
68     }
69 }
70 
define(isas: &[Isa]) -> Vec<TargetIsa>71 pub(crate) fn define(isas: &[Isa]) -> Vec<TargetIsa> {
72     isas.iter()
73         .map(|isa| match isa {
74             Isa::X86 => x86::define(),
75             Isa::Arm64 => arm64::define(),
76             Isa::S390x => s390x::define(),
77             Isa::Riscv64 => riscv64::define(),
78             Isa::Pulley32 | Isa::Pulley64 => pulley::define(),
79         })
80         .collect()
81 }
82