Skip to main content

luaur_code_gen/methods/
ir_lowering_x_64_store_float.rs

1use 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}