1 use crate::cdsl::instructions::InstructionPredicateMap;
2 use crate::cdsl::isa::TargetIsa;
3 use crate::cdsl::recipes::Recipes;
4 use crate::cdsl::regs::{IsaRegs, IsaRegsBuilder, RegBankBuilder, RegClassBuilder};
5 use crate::cdsl::settings::{SettingGroup, SettingGroupBuilder};
6
7 use crate::shared::Definitions as SharedDefinitions;
8
define_settings(_shared: &SettingGroup) -> SettingGroup9 fn define_settings(_shared: &SettingGroup) -> SettingGroup {
10 let setting = SettingGroupBuilder::new("arm32");
11 setting.build()
12 }
13
define_regs() -> IsaRegs14 fn define_regs() -> IsaRegs {
15 let mut regs = IsaRegsBuilder::new();
16
17 let builder = RegBankBuilder::new("FloatRegs", "s")
18 .units(64)
19 .track_pressure(true);
20 let float_regs = regs.add_bank(builder);
21
22 let builder = RegBankBuilder::new("IntRegs", "r")
23 .units(16)
24 .track_pressure(true);
25 let int_regs = regs.add_bank(builder);
26
27 let builder = RegBankBuilder::new("FlagRegs", "")
28 .units(1)
29 .names(vec!["nzcv"])
30 .track_pressure(false);
31 let flag_reg = regs.add_bank(builder);
32
33 let builder = RegClassBuilder::new_toplevel("S", float_regs).count(32);
34 regs.add_class(builder);
35
36 let builder = RegClassBuilder::new_toplevel("D", float_regs).width(2);
37 regs.add_class(builder);
38
39 let builder = RegClassBuilder::new_toplevel("Q", float_regs).width(4);
40 regs.add_class(builder);
41
42 let builder = RegClassBuilder::new_toplevel("GPR", int_regs);
43 regs.add_class(builder);
44
45 let builder = RegClassBuilder::new_toplevel("FLAG", flag_reg);
46 regs.add_class(builder);
47
48 regs.build()
49 }
50
define(shared_defs: &mut SharedDefinitions) -> TargetIsa51 pub(crate) fn define(shared_defs: &mut SharedDefinitions) -> TargetIsa {
52 let settings = define_settings(&shared_defs.settings);
53 let regs = define_regs();
54
55 let cpu_modes = vec![];
56
57 // TODO implement arm32 recipes.
58 let recipes = Recipes::new();
59
60 // TODO implement arm32 encodings and predicates.
61 let encodings_predicates = InstructionPredicateMap::new();
62
63 TargetIsa::new(
64 "arm32",
65 settings,
66 regs,
67 recipes,
68 cpu_modes,
69 encodings_predicates,
70 )
71 }
72