luaur-code-gen 0.1.1

Native (A64/X64) code generation for Luau (Rust).
Documentation
use crate::enums::ir_cmd::IrCmd;
use crate::functions::builtin_check_double::builtin_check_double;
use crate::functions::builtin_check_int_64::builtin_check_int_64;
use crate::functions::builtin_load_double::builtin_load_double;
use crate::records::ir_builder::IrBuilder;
use crate::records::ir_op::IrOp;
use luaur_vm::enums::lua_type::lua_Type;

pub fn translate_buffer_args_and_check_bounds(
    build: &mut IrBuilder,
    nparams: i32,
    arg: i32,
    args: IrOp,
    arg3: IrOp,
    size: i32,
    pcpos: i32,
    buf: &mut IrOp,
    int_index: &mut IrOp,
    load_int_64: bool,
) {
    let loc = build.vm_reg(arg as u8);
    let fallback = build.vm_exit(pcpos as u32);
    build.load_and_check_tag(loc, lua_Type::LUA_TBUFFER as u8, fallback);

    builtin_check_double(build, args, pcpos);

    if nparams == 3 && load_int_64 {
        builtin_check_int_64(build, arg3, pcpos);
    } else if nparams == 3 {
        builtin_check_double(build, arg3, pcpos);
    }

    let reg_arg = build.vm_reg(arg as u8);
    *buf = build.inst_ir_cmd_ir_op(IrCmd::LOAD_POINTER, reg_arg);

    let num_index = builtin_load_double(build, args);
    *int_index = build.inst_ir_cmd_ir_op(IrCmd::NUM_TO_INT, num_index);

    let buf_op = *buf;
    let int_index_op = *int_index;
    let zero = build.const_int(0);
    let size_op = build.const_int(size);
    let undef_op = build.undef();
    let exit_op = build.vm_exit(pcpos as u32);

    build.inst_ir_cmd_ir_op_ir_op_ir_op_ir_op_ir_op_ir_op(
        IrCmd::CHECK_BUFFER_LEN,
        buf_op,
        int_index_op,
        zero,
        size_op,
        undef_op,
        exit_op,
    );
}