luaur-code-gen 0.1.3

Native (A64/X64) code generation for Luau (Rust).
Documentation
use crate::enums::ir_op_kind::IrOpKind;
use crate::enums::ir_value_kind::IrValueKind;
use crate::enums::size_x_64::SizeX64;
use crate::functions::get_cmd_value_kind::get_cmd_value_kind;
use crate::macros::codegen_assert::CODEGEN_ASSERT;
use crate::records::ir_lowering_x_64::IrLoweringX64;
use crate::records::ir_op::IrOp;
use crate::records::operand_x_64::OperandX64;
use crate::records::register_x_64::RegisterX64;
use crate::records::scoped_reg_x_64::ScopedRegX64;

impl IrLoweringX64 {
    pub fn store_float(&mut self, dst: OperandX64, src: IrOp) {
        unsafe {
            if src.kind() == IrOpKind::Constant {
                let mut tmp = ScopedRegX64 {
                    owner: &mut self.regs,
                    reg: RegisterX64::noreg,
                };
                tmp.alloc(SizeX64::xmmword);
                let float_val = self.double_op(src) as f32;
                let tmp_reg = tmp.reg;
                let imm = (*self.build).f32(float_val);
                (*self.build).place_avx_c_char_operand_x_64_operand_x_64_u8_u8_bool_u8_u8(
                    c"vmovss".as_ptr(),
                    OperandX64::reg(tmp_reg),
                    imm,
                    0x10,
                    0x11,
                    false,
                    0b0000,
                    0b0010,
                );
                (*self.build).place_avx_c_char_operand_x_64_operand_x_64_u8_u8_bool_u8_u8(
                    c"vmovss".as_ptr(),
                    dst,
                    OperandX64::reg(tmp_reg),
                    0x10,
                    0x11,
                    false,
                    0b0000,
                    0b0010,
                );
            } else if src.kind() == IrOpKind::Inst {
                let inst = (*self.function).inst_op(src);
                CODEGEN_ASSERT!(get_cmd_value_kind(inst.cmd) == IrValueKind::Float);
                (*self.build).place_avx_c_char_operand_x_64_operand_x_64_u8_u8_bool_u8_u8(
                    c"vmovss".as_ptr(),
                    dst,
                    OperandX64::reg(self.reg_op(src)),
                    0x10,
                    0x11,
                    false,
                    0b0000,
                    0b0010,
                );
            } else {
                CODEGEN_ASSERT!(false, "Unsupported instruction form");
            }
        }
    }
}