Skip to main content

luaur_code_gen/methods/
ir_builder_inst_ir_builder_alt_j.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;
8use crate::type_aliases::ir_ops::IrOps;
9
10const K_BLOCK_FLAG_SAFE_ENV_CLEAR: u8 = 1 << 1;
11
12impl IrBuilder {
13    pub fn inst_ir_cmd_ir_ops(&mut self, cmd: IrCmd, ops: &IrOps) -> IrOp {
14        let index = self.function.instructions.len() as u32;
15        self.function
16            .instructions
17            .push(crate::records::ir_inst::IrInst {
18                cmd,
19                ops: ops.clone(),
20                last_use: 0,
21                use_count: 0,
22                reg_x64: crate::records::register_x_64::RegisterX64::default(),
23                reg_a64: crate::records::register_a_64::RegisterA64::default(),
24                reused_reg: false,
25                spilled: false,
26                needs_reload: false,
27            });
28
29        CODEGEN_ASSERT!(!self.in_terminated_block);
30
31        if is_block_terminator(cmd) {
32            self.function.blocks[self.active_block_idx as usize].finish = index;
33            self.in_terminated_block = true;
34        }
35
36        if can_invalidate_safe_env(cmd) {
37            self.function.blocks[self.active_block_idx as usize].flags |=
38                K_BLOCK_FLAG_SAFE_ENV_CLEAR;
39        }
40
41        IrOp::ir_op_ir_op_kind_u32(IrOpKind::Inst, index)
42    }
43}