This commit adds the `wasmtime settings` command to print out available Cranelift settings for a target (defaults to the host). The compile command has been updated to remove the Cranelift ISA options in favor of encouraging users to use `wasmtime settings` to discover what settings are available. This will reduce the maintenance cost for syncing the compile command with Cranelift ISA flags.
141 lines
4.1 KiB
Rust
141 lines
4.1 KiB
Rust
use crate::cdsl::cpu_modes::CpuMode;
|
|
use crate::cdsl::instructions::InstructionGroupBuilder;
|
|
use crate::cdsl::isa::TargetIsa;
|
|
use crate::cdsl::regs::{IsaRegs, IsaRegsBuilder, RegBankBuilder, RegClassBuilder};
|
|
use crate::cdsl::settings::{PredicateNode, SettingGroup, SettingGroupBuilder};
|
|
|
|
use crate::shared::types::Float::{F32, F64};
|
|
use crate::shared::types::Int::{I32, I64};
|
|
use crate::shared::Definitions as SharedDefinitions;
|
|
|
|
mod encodings;
|
|
mod recipes;
|
|
|
|
fn define_settings(shared: &SettingGroup) -> SettingGroup {
|
|
let mut setting = SettingGroupBuilder::new("riscv");
|
|
|
|
let supports_m = setting.add_bool(
|
|
"supports_m",
|
|
"CPU supports the 'M' extension (mul/div)",
|
|
"",
|
|
false,
|
|
);
|
|
let supports_a = setting.add_bool(
|
|
"supports_a",
|
|
"CPU supports the 'A' extension (atomics)",
|
|
"",
|
|
false,
|
|
);
|
|
let supports_f = setting.add_bool(
|
|
"supports_f",
|
|
"CPU supports the 'F' extension (float)",
|
|
"",
|
|
false,
|
|
);
|
|
let supports_d = setting.add_bool(
|
|
"supports_d",
|
|
"CPU supports the 'D' extension (double)",
|
|
"",
|
|
false,
|
|
);
|
|
|
|
let enable_m = setting.add_bool(
|
|
"enable_m",
|
|
"Enable the use of 'M' instructions if available",
|
|
"",
|
|
true,
|
|
);
|
|
|
|
setting.add_bool(
|
|
"enable_e",
|
|
"Enable the 'RV32E' instruction set with only 16 registers",
|
|
"",
|
|
false,
|
|
);
|
|
|
|
let shared_enable_atomics = shared.get_bool("enable_atomics");
|
|
let shared_enable_float = shared.get_bool("enable_float");
|
|
let shared_enable_simd = shared.get_bool("enable_simd");
|
|
|
|
setting.add_predicate("use_m", predicate!(supports_m && enable_m));
|
|
setting.add_predicate("use_a", predicate!(supports_a && shared_enable_atomics));
|
|
setting.add_predicate("use_f", predicate!(supports_f && shared_enable_float));
|
|
setting.add_predicate("use_d", predicate!(supports_d && shared_enable_float));
|
|
setting.add_predicate(
|
|
"full_float",
|
|
predicate!(shared_enable_simd && supports_f && supports_d),
|
|
);
|
|
|
|
setting.build()
|
|
}
|
|
|
|
fn define_registers() -> IsaRegs {
|
|
let mut regs = IsaRegsBuilder::new();
|
|
|
|
let builder = RegBankBuilder::new("IntRegs", "x")
|
|
.units(32)
|
|
.track_pressure(true);
|
|
let int_regs = regs.add_bank(builder);
|
|
|
|
let builder = RegBankBuilder::new("FloatRegs", "f")
|
|
.units(32)
|
|
.track_pressure(true);
|
|
let float_regs = regs.add_bank(builder);
|
|
|
|
let builder = RegClassBuilder::new_toplevel("GPR", int_regs);
|
|
regs.add_class(builder);
|
|
|
|
let builder = RegClassBuilder::new_toplevel("FPR", float_regs);
|
|
regs.add_class(builder);
|
|
|
|
regs.build()
|
|
}
|
|
|
|
pub(crate) fn define(shared_defs: &mut SharedDefinitions) -> TargetIsa {
|
|
let settings = define_settings(&shared_defs.settings);
|
|
let regs = define_registers();
|
|
|
|
let inst_group = InstructionGroupBuilder::new(&mut shared_defs.all_instructions).build();
|
|
|
|
// CPU modes for 32-bit and 64-bit operation.
|
|
let mut rv_32 = CpuMode::new("RV32");
|
|
let mut rv_64 = CpuMode::new("RV64");
|
|
|
|
let expand = shared_defs.transform_groups.by_name("expand");
|
|
let narrow_no_flags = shared_defs.transform_groups.by_name("narrow_no_flags");
|
|
|
|
rv_32.legalize_monomorphic(expand);
|
|
rv_32.legalize_default(narrow_no_flags);
|
|
rv_32.legalize_type(I32, expand);
|
|
rv_32.legalize_type(F32, expand);
|
|
rv_32.legalize_type(F64, expand);
|
|
|
|
rv_64.legalize_monomorphic(expand);
|
|
rv_64.legalize_default(narrow_no_flags);
|
|
rv_64.legalize_type(I32, expand);
|
|
rv_64.legalize_type(I64, expand);
|
|
rv_64.legalize_type(F32, expand);
|
|
rv_64.legalize_type(F64, expand);
|
|
|
|
let recipes = recipes::define(shared_defs, ®s);
|
|
|
|
let encodings = encodings::define(shared_defs, &settings, &recipes);
|
|
rv_32.set_encodings(encodings.enc32);
|
|
rv_64.set_encodings(encodings.enc64);
|
|
let encodings_predicates = encodings.inst_pred_reg.extract();
|
|
|
|
let recipes = recipes.collect();
|
|
|
|
let cpu_modes = vec![rv_32, rv_64];
|
|
|
|
TargetIsa::new(
|
|
"riscv",
|
|
inst_group,
|
|
settings,
|
|
regs,
|
|
recipes,
|
|
cpu_modes,
|
|
encodings_predicates,
|
|
)
|
|
}
|