use crate::cdsl::inst::InstructionGroup; use crate::cdsl::isa::TargetIsa; use crate::cdsl::regs::{IsaRegs, IsaRegsBuilder, RegBankBuilder, RegClassBuilder}; use crate::cdsl::settings::{SettingGroup, SettingGroupBuilder}; use crate::shared::Definitions as SharedDefinitions; fn define_settings(_shared: &SettingGroup) -> SettingGroup { let setting = SettingGroupBuilder::new("arm64"); setting.finish() } fn define_registers() -> IsaRegs { let mut regs = IsaRegsBuilder::new(); // The `x31` regunit serves as the stack pointer / zero register depending on context. We // reserve it and don't model the difference. let builder = RegBankBuilder::new("IntRegs", "x") .units(32) .track_pressure(true); let int_regs = regs.add_bank(builder); let builder = RegBankBuilder::new("FloatRegs", "v") .units(32) .track_pressure(true); let float_regs = regs.add_bank(builder); let builder = RegBankBuilder::new("FlagRegs", "") .units(1) .names(vec!["nzcv"]) .track_pressure(false); let flag_reg = 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); let builder = RegClassBuilder::new_toplevel("FLAG", flag_reg); regs.add_class(builder); regs.finish() } pub fn define(shared_defs: &mut SharedDefinitions) -> TargetIsa { let settings = define_settings(&shared_defs.settings); let regs = define_registers(); let inst_group = InstructionGroup::new("arm64", "arm64 specific instruction set"); TargetIsa::new("arm64", inst_group, settings, regs) }