cranelift_codegen_meta/isa/
mod.rs

1//! Define supported ISAs; includes ISA-specific instructions, encodings, registers, settings, etc.
2use crate::cdsl::isa::TargetIsa;
3use std::fmt;
4
5mod arm64;
6mod pulley;
7mod riscv64;
8mod s390x;
9pub(crate) mod x86;
10
11/// Represents known ISA target.
12#[derive(PartialEq, Copy, Clone)]
13pub enum Isa {
14    X86,
15    Arm64,
16    S390x,
17    Riscv64,
18    Pulley32,
19    Pulley64,
20}
21
22impl Isa {
23    /// Creates isa target using name.
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.
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.
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
57impl fmt::Display for Isa {
58    // These names should be kept in sync with the crate features.
59    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
71pub(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}