luaur_code_gen/methods/
ir_builder_inst_ir_builder_alt_j.rs1use 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}