luaur_code_gen/methods/
ir_lowering_x_64_store_float.rs1use crate::enums::ir_op_kind::IrOpKind;
2use crate::enums::ir_value_kind::IrValueKind;
3use crate::enums::size_x_64::SizeX64;
4use crate::functions::get_cmd_value_kind::get_cmd_value_kind;
5use crate::macros::codegen_assert::CODEGEN_ASSERT;
6use crate::records::ir_lowering_x_64::IrLoweringX64;
7use crate::records::ir_op::IrOp;
8use crate::records::operand_x_64::OperandX64;
9use crate::records::register_x_64::RegisterX64;
10use crate::records::scoped_reg_x_64::ScopedRegX64;
11
12impl IrLoweringX64 {
13 pub fn store_float(&mut self, dst: OperandX64, src: IrOp) {
14 unsafe {
15 if src.kind() == IrOpKind::Constant {
16 let mut tmp = ScopedRegX64 {
17 owner: &mut self.regs,
18 reg: RegisterX64::noreg,
19 };
20 tmp.alloc(SizeX64::xmmword);
21 let float_val = self.double_op(src) as f32;
22 let tmp_reg = tmp.reg;
23 let imm = (*self.build).f32(float_val);
24 (*self.build).place_avx_c_char_operand_x_64_operand_x_64_u8_u8_bool_u8_u8(
25 c"vmovss".as_ptr(),
26 OperandX64::reg(tmp_reg),
27 imm,
28 0x10,
29 0x11,
30 false,
31 0b0000,
32 0b0010,
33 );
34 (*self.build).place_avx_c_char_operand_x_64_operand_x_64_u8_u8_bool_u8_u8(
35 c"vmovss".as_ptr(),
36 dst,
37 OperandX64::reg(tmp_reg),
38 0x10,
39 0x11,
40 false,
41 0b0000,
42 0b0010,
43 );
44 } else if src.kind() == IrOpKind::Inst {
45 let inst = (*self.function).inst_op(src);
46 CODEGEN_ASSERT!(get_cmd_value_kind(inst.cmd) == IrValueKind::Float);
47 (*self.build).place_avx_c_char_operand_x_64_operand_x_64_u8_u8_bool_u8_u8(
48 c"vmovss".as_ptr(),
49 dst,
50 OperandX64::reg(self.reg_op(src)),
51 0x10,
52 0x11,
53 false,
54 0b0000,
55 0b0010,
56 );
57 } else {
58 CODEGEN_ASSERT!(false, "Unsupported instruction form");
59 }
60 }
61 }
62}