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