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