Skip to main content

luaur_code_gen/methods/
ir_builder_inst_ir_builder_alt_i.rs

1use crate::enums::ir_cmd::IrCmd;
2use crate::enums::ir_op_kind::IrOpKind;
3use crate::functions::can_invalidate_safe_env::can_invalidate_safe_env;
4use crate::functions::is_block_terminator::is_block_terminator;
5use crate::macros::codegen_assert::CODEGEN_ASSERT;
6use crate::records::ir_builder::IrBuilder;
7use crate::records::ir_op::IrOp;
8
9const K_BLOCK_FLAG_SAFE_ENV_CLEAR: u8 = 1 << 1;
10
11impl IrBuilder {
12    pub fn inst_ir_cmd_initializer_list_ir_op(&mut self, cmd: IrCmd, ops: &[IrOp]) -> IrOp {
13        let index = self.function.instructions.len() as u32;
14        self.function
15            .instructions
16            .push(crate::records::ir_inst::IrInst {
17                cmd,
18                ops: ops.iter().cloned().collect(),
19                last_use: 0,
20                use_count: 0,
21                reg_x64: crate::records::register_x_64::RegisterX64::default(),
22                reg_a64: crate::records::register_a_64::RegisterA64::default(),
23                reused_reg: false,
24                spilled: false,
25                needs_reload: false,
26            });
27
28        CODEGEN_ASSERT!(!self.in_terminated_block);
29
30        if is_block_terminator(cmd) {
31            self.function.blocks[self.active_block_idx as usize].finish = index;
32            self.in_terminated_block = true;
33        }
34
35        if can_invalidate_safe_env(cmd) {
36            self.function.blocks[self.active_block_idx as usize].flags |=
37                K_BLOCK_FLAG_SAFE_ENV_CLEAR;
38        }
39
40        IrOp::ir_op_ir_op_kind_u32(IrOpKind::Inst, index)
41    }
42}