Skip to main content

luaur_code_gen/functions/
lower_ir_code_gen_lower_alt_b.rs

1//! @interface-stub
2use 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        &reg_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}