luaur_code_gen/functions/
lower_ir_code_gen_lower_alt_b.rs1use crate::enums::kind_a_64::KindA64;
3use crate::functions::lower_impl::lower_impl_a_64;
4use crate::records::assembly_builder_a_64::AssemblyBuilderA64;
5use crate::records::assembly_options::AssemblyOptions;
6use crate::records::ir_builder::IrBuilder;
7use crate::records::ir_lowering_a_64::IrLoweringA64;
8use crate::records::ir_reg_alloc_a_64::IrRegAllocA64;
9use crate::records::ir_value_location_tracking::IrValueLocationTracking;
10use crate::records::lowering_stats::LoweringStats;
11use crate::records::module_helpers::ModuleHelpers;
12use crate::records::register_a_64::RegisterA64;
13use luaur_common::records::dense_hash_map::DenseHashMap;
14use luaur_vm::records::proto::Proto;
15
16pub fn lower_ir_a_64_assembly_builder_a_64_ir_builder_vector_u32_module_helpers_proto_assembly_options_lowering_stats(
17 build: &mut AssemblyBuilderA64,
18 ir: &mut IrBuilder,
19 sorted_blocks: &[u32],
20 helpers: &mut ModuleHelpers,
21 proto: *mut Proto,
22 options: AssemblyOptions,
23 stats: *mut LoweringStats,
24) -> bool {
25 let reg_ranges = [
26 (
27 RegisterA64 {
28 bits: KindA64::x as u8 | (0u8 << RegisterA64::INDEX_SHIFT),
29 },
30 RegisterA64 {
31 bits: KindA64::x as u8 | (15u8 << RegisterA64::INDEX_SHIFT),
32 },
33 ),
34 (
35 RegisterA64 {
36 bits: KindA64::x as u8 | (16u8 << RegisterA64::INDEX_SHIFT),
37 },
38 RegisterA64 {
39 bits: KindA64::x as u8 | (17u8 << RegisterA64::INDEX_SHIFT),
40 },
41 ),
42 (
43 RegisterA64 {
44 bits: KindA64::q as u8 | (0u8 << RegisterA64::INDEX_SHIFT),
45 },
46 RegisterA64 {
47 bits: KindA64::q as u8 | (7u8 << RegisterA64::INDEX_SHIFT),
48 },
49 ),
50 (
51 RegisterA64 {
52 bits: KindA64::q as u8 | (16u8 << RegisterA64::INDEX_SHIFT),
53 },
54 RegisterA64 {
55 bits: KindA64::q as u8 | (31u8 << RegisterA64::INDEX_SHIFT),
56 },
57 ),
58 ];
59
60 let regs = IrRegAllocA64::ir_reg_alloc_a_64_ir_reg_alloc_a_64(
61 build,
62 &mut ir.function,
63 stats,
64 ®_ranges,
65 );
66 let value_tracker = IrValueLocationTracking::new(&mut ir.function);
67
68 let mut lowering = IrLoweringA64 {
69 build: build as *mut AssemblyBuilderA64,
70 helpers: helpers as *mut ModuleHelpers,
71 function: &mut ir.function as *mut _,
72 stats,
73 regs,
74 value_tracker,
75 interrupt_handlers: Vec::new(),
76 exit_handlers: Vec::new(),
77 exit_handler_map: DenseHashMap::new(!0u32),
78 exit_sync_alloc_token: 0,
79 exit_sync_inst_idx: IrLoweringA64::kInvalidInstIdx,
80 error: false,
81 };
82 lowering.ir_lowering_a_64_ir_lowering_a_64();
83
84 let bytecodeid = unsafe {
85 if proto.is_null() {
86 0
87 } else {
88 (*proto).bytecodeid
89 }
90 };
91
92 unsafe {
93 lower_impl_a_64(
94 build,
95 &mut lowering,
96 &mut ir.function,
97 sorted_blocks,
98 bytecodeid,
99 &options,
100 )
101 }
102}