luaur_code_gen/methods/
ir_builder_inst_ir_builder_alt_i.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;
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}