Before this patch, running the x64 new backend would require both
compiling with --features experimental_x64 and running with
`use_new_backend`.
This patches changes this behavior so that the runtime flag is not
needed anymore: using the feature flag will enforce usage of the new
backend everywhere, making using and testing it much simpler:
cargo run --features experimental_x64 ;; other CLI options/flags
This also gives a hint at what the meta language generation would look
like after switching to the new backend.
Compiling only with the x64 codegen flag gives a nice compile time speedup.
68 lines
1.9 KiB
Rust
68 lines
1.9 KiB
Rust
//! Define supported ISAs; includes ISA-specific instructions, encodings, registers, settings, etc.
|
|
use crate::cdsl::isa::TargetIsa;
|
|
use crate::shared::Definitions as SharedDefinitions;
|
|
use std::fmt;
|
|
|
|
mod arm32;
|
|
mod arm64;
|
|
mod riscv;
|
|
pub(crate) mod x86;
|
|
|
|
/// Represents known ISA target.
|
|
#[derive(PartialEq, Copy, Clone)]
|
|
pub enum Isa {
|
|
Riscv,
|
|
X86,
|
|
Arm32,
|
|
Arm64,
|
|
}
|
|
|
|
impl Isa {
|
|
/// Creates isa target using name.
|
|
pub fn from_name(name: &str) -> Option<Self> {
|
|
Isa::all()
|
|
.iter()
|
|
.cloned()
|
|
.find(|isa| isa.to_string() == name)
|
|
}
|
|
|
|
/// Creates isa target from arch.
|
|
pub fn from_arch(arch: &str) -> Option<Self> {
|
|
match arch {
|
|
"riscv" => Some(Isa::Riscv),
|
|
"aarch64" => Some(Isa::Arm64),
|
|
x if ["x86_64", "i386", "i586", "i686"].contains(&x) => Some(Isa::X86),
|
|
x if x.starts_with("arm") || arch.starts_with("thumb") => Some(Isa::Arm32),
|
|
_ => None,
|
|
}
|
|
}
|
|
|
|
/// Returns all supported isa targets.
|
|
pub fn all() -> &'static [Isa] {
|
|
&[Isa::Riscv, Isa::X86, Isa::Arm32, Isa::Arm64]
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for Isa {
|
|
// These names should be kept in sync with the crate features.
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
match *self {
|
|
Isa::Riscv => write!(f, "riscv"),
|
|
Isa::X86 => write!(f, "x86"),
|
|
Isa::Arm32 => write!(f, "arm32"),
|
|
Isa::Arm64 => write!(f, "arm64"),
|
|
}
|
|
}
|
|
}
|
|
|
|
pub(crate) fn define(isas: &[Isa], shared_defs: &mut SharedDefinitions) -> Vec<TargetIsa> {
|
|
isas.iter()
|
|
.map(|isa| match isa {
|
|
Isa::Riscv => riscv::define(shared_defs),
|
|
Isa::X86 => x86::define(shared_defs),
|
|
Isa::Arm32 => arm32::define(shared_defs),
|
|
Isa::Arm64 => arm64::define(shared_defs),
|
|
})
|
|
.collect()
|
|
}
|