add riscv64 backend for cranelift. (#4271)
Add a RISC-V 64 (`riscv64`, RV64GC) backend. Co-authored-by: yuyang <756445638@qq.com> Co-authored-by: Chris Fallin <chris@cfallin.org> Co-authored-by: Afonso Bordado <afonsobordado@az8.co>
This commit is contained in:
@@ -4,6 +4,7 @@ use crate::shared::Definitions as SharedDefinitions;
|
||||
use std::fmt;
|
||||
|
||||
mod arm64;
|
||||
mod riscv64;
|
||||
mod s390x;
|
||||
pub(crate) mod x86;
|
||||
|
||||
@@ -13,6 +14,7 @@ pub enum Isa {
|
||||
X86,
|
||||
Arm64,
|
||||
S390x,
|
||||
Riscv64,
|
||||
}
|
||||
|
||||
impl Isa {
|
||||
@@ -30,13 +32,14 @@ impl Isa {
|
||||
"aarch64" => Some(Isa::Arm64),
|
||||
"s390x" => Some(Isa::S390x),
|
||||
x if ["x86_64", "i386", "i586", "i686"].contains(&x) => Some(Isa::X86),
|
||||
"riscv64" | "riscv64gc" | "riscv64imac" => Some(Isa::Riscv64),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns all supported isa targets.
|
||||
pub fn all() -> &'static [Isa] {
|
||||
&[Isa::X86, Isa::Arm64, Isa::S390x]
|
||||
&[Isa::X86, Isa::Arm64, Isa::S390x, Isa::Riscv64]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,6 +50,7 @@ impl fmt::Display for Isa {
|
||||
Isa::X86 => write!(f, "x86"),
|
||||
Isa::Arm64 => write!(f, "arm64"),
|
||||
Isa::S390x => write!(f, "s390x"),
|
||||
Isa::Riscv64 => write!(f, "riscv64"),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -57,6 +61,7 @@ pub(crate) fn define(isas: &[Isa], shared_defs: &mut SharedDefinitions) -> Vec<T
|
||||
Isa::X86 => x86::define(shared_defs),
|
||||
Isa::Arm64 => arm64::define(shared_defs),
|
||||
Isa::S390x => s390x::define(shared_defs),
|
||||
Isa::Riscv64 => riscv64::define(shared_defs),
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
27
cranelift/codegen/meta/src/isa/riscv64.rs
Normal file
27
cranelift/codegen/meta/src/isa/riscv64.rs
Normal file
@@ -0,0 +1,27 @@
|
||||
use crate::cdsl::isa::TargetIsa;
|
||||
use crate::cdsl::settings::{SettingGroup, SettingGroupBuilder};
|
||||
|
||||
use crate::shared::Definitions as SharedDefinitions;
|
||||
|
||||
fn define_settings(_shared: &SettingGroup) -> SettingGroup {
|
||||
let mut setting = SettingGroupBuilder::new("riscv64");
|
||||
|
||||
let _has_m = setting.add_bool("has_m", "has extension M?", "", false);
|
||||
let _has_a = setting.add_bool("has_a", "has extension A?", "", false);
|
||||
let _has_f = setting.add_bool("has_f", "has extension F?", "", false);
|
||||
let _has_d = setting.add_bool("has_d", "has extension D?", "", false);
|
||||
let _has_v = setting.add_bool("has_v", "has extension V?", "", false);
|
||||
let _has_b = setting.add_bool("has_b", "has extension B?", "", false);
|
||||
let _has_c = setting.add_bool("has_c", "has extension C?", "", false);
|
||||
let _has_zbkb = setting.add_bool("has_zbkb", "has extension zbkb?", "", false);
|
||||
|
||||
let _has_zicsr = setting.add_bool("has_zicsr", "has extension zicsr?", "", false);
|
||||
let _has_zifencei = setting.add_bool("has_zifencei", "has extension zifencei?", "", false);
|
||||
|
||||
setting.build()
|
||||
}
|
||||
|
||||
pub(crate) fn define(shared_defs: &mut SharedDefinitions) -> TargetIsa {
|
||||
let settings = define_settings(&shared_defs.settings);
|
||||
TargetIsa::new("riscv64", settings)
|
||||
}
|
||||
Reference in New Issue
Block a user