luaur-code-gen 0.1.3

Native (A64/X64) code generation for Luau (Rust).
Documentation
use crate::enums::ir_cmd::IrCmd;
use crate::records::ir_builder::IrBuilder;
use luaur_common::FFlag;
use luaur_vm::enums::lua_type::lua_Type;
use luaur_vm::type_aliases::t_value::TValue;

pub fn translate_inst_load_constant(build: &mut IrBuilder, ra: i32, k: i32) {
    let proto = unsafe { &(*build.function.proto) };
    let protok = unsafe { *proto.k.add(k as usize) } as TValue;

    if protok.tt == lua_Type::LUA_TNIL as i32 {
        let ra_reg = build.vm_reg(ra as u8);
        let tag = build.const_tag(lua_Type::LUA_TNIL as u8);
        build.inst_ir_cmd_ir_op_ir_op(IrCmd::STORE_TAG, ra_reg, tag);
    } else if protok.tt == lua_Type::LUA_TBOOLEAN as i32 {
        let ra_reg = build.vm_reg(ra as u8);
        let value = build.const_int(unsafe { protok.value.b } as i32);
        build.inst_ir_cmd_ir_op_ir_op(IrCmd::STORE_INT, ra_reg, value);
        let tag = build.const_tag(lua_Type::LUA_TBOOLEAN as u8);
        build.inst_ir_cmd_ir_op_ir_op(IrCmd::STORE_TAG, ra_reg, tag);
    } else if FFlag::LuauCodegenInteger2.get() && protok.tt == lua_Type::LUA_TINTEGER as i32 {
        let ra_reg = build.vm_reg(ra as u8);
        let value = build.const_int_64(unsafe { protok.value.l });
        build.inst_ir_cmd_ir_op_ir_op(IrCmd::STORE_INT64, ra_reg, value);
        let tag = build.const_tag(lua_Type::LUA_TINTEGER as u8);
        build.inst_ir_cmd_ir_op_ir_op(IrCmd::STORE_TAG, ra_reg, tag);
    } else if protok.tt == lua_Type::LUA_TNUMBER as i32 {
        let ra_reg = build.vm_reg(ra as u8);
        let value = build.const_double(unsafe { protok.value.n });
        build.inst_ir_cmd_ir_op_ir_op(IrCmd::STORE_DOUBLE, ra_reg, value);
        let tag = build.const_tag(lua_Type::LUA_TNUMBER as u8);
        build.inst_ir_cmd_ir_op_ir_op(IrCmd::STORE_TAG, ra_reg, tag);
    } else {
        let const_op = build.vm_const(k as u32);
        let offset = build.const_int(0);
        let tag = build.const_tag(protok.tt as u8);
        let load = build.inst_ir_cmd_ir_op_ir_op_ir_op(IrCmd::LOAD_TVALUE, const_op, offset, tag);
        let ra_reg = build.vm_reg(ra as u8);
        build.inst_ir_cmd_ir_op_ir_op(IrCmd::STORE_TVALUE, ra_reg, load);
    }
}