luaur_code_gen/functions/
translate_binary_numeric_fallback_if_required.rs1use crate::enums::ir_cmd::IrCmd;
2use crate::enums::ir_op_kind::IrOpKind;
3use crate::records::fallback_stream_scope::FallbackStreamScope;
4use crate::records::ir_builder::IrBuilder;
5use crate::records::ir_op::IrOp;
6use luaur_vm::type_aliases::tms::TMS;
7
8pub fn translate_binary_numeric_fallback_if_required(
9 build: &mut IrBuilder,
10 fallback: IrOp,
11 ra: i32,
12 opb: IrOp,
13 opc: IrOp,
14 tm: TMS,
15 pcpos: i32,
16) {
17 if fallback.kind() != IrOpKind::None {
18 let next = build.block_at_inst((pcpos + 1) as u32);
19 let mut scope = FallbackStreamScope::new(build, fallback, next);
20
21 let pcpos_op = scope.build.const_uint((pcpos + 1) as u32);
22 scope.build.inst_ir_cmd_ir_op(IrCmd::SET_SAVEDPC, pcpos_op);
23
24 let reg_ra = scope.build.vm_reg(ra as u8);
25 let tm_op = scope.build.const_int(tm as i32);
26 scope
27 .build
28 .inst_ir_cmd_ir_op_ir_op_ir_op_ir_op(IrCmd::DO_ARITH, reg_ra, opb, opc, tm_op);
29
30 scope.build.inst_ir_cmd_ir_op(IrCmd::JUMP, next);
31 }
32}