Skip to main content

luaur_code_gen/functions/
substitute_with_truncated_uint.rs

1use crate::enums::ir_cmd::IrCmd;
2use crate::functions::produces_dirty_high_register_bits::produces_dirty_high_register_bits;
3use crate::functions::replace_ir_utils_alt_b::replace_ir_function_ir_block_u32_ir_inst;
4use crate::functions::substitute::substitute;
5use crate::records::ir_block::IrBlock;
6use crate::records::ir_function::IrFunction;
7use crate::records::ir_inst::IrInst;
8use crate::records::ir_op::IrOp;
9use crate::type_aliases::ir_ops::IrOps;
10
11pub fn substitute_with_truncated_uint(
12    function: &mut IrFunction,
13    block: &mut IrBlock,
14    inst: &mut IrInst,
15    op: IrOp,
16) {
17    let src_of_src: *mut IrInst = function.as_inst_op(op);
18    if !src_of_src.is_null() && produces_dirty_high_register_bits(unsafe { (*src_of_src).cmd }) {
19        let inst_index = function.get_inst_index(inst);
20        let mut ops = IrOps::new();
21        ops.push(op);
22        let replacement = IrInst {
23            cmd: IrCmd::TRUNCATE_UINT,
24            ops,
25            ..Default::default()
26        };
27        replace_ir_function_ir_block_u32_ir_inst(function, block, inst_index, replacement);
28    } else {
29        substitute(function, inst, op);
30    }
31}