Skip to main content

luaur_code_gen/methods/
assembly_builder_x_64_cmov.rs

1use crate::enums::category_x_64::CategoryX64;
2use crate::enums::condition_x_64::ConditionX64;
3use crate::enums::size_x_64::SizeX64;
4use crate::macros::codegen_assert::CODEGEN_ASSERT;
5use crate::records::assembly_builder_x_64::AssemblyBuilderX64;
6use crate::records::operand_x_64::OperandX64;
7use crate::records::register_x_64::RegisterX64;
8
9impl AssemblyBuilderX64 {
10    pub fn cmov(&mut self, cond: ConditionX64, lhs: RegisterX64, rhs: OperandX64) {
11        let size = if rhs.cat == CategoryX64::reg {
12            rhs.base.size()
13        } else {
14            rhs.memSize
15        };
16
17        if !(size != SizeX64::byte && size == lhs.size()) {
18            luaur_common::LUAU_DEBUGBREAK!();
19        }
20
21        if self.log_text {
22            let cond_idx = cond as usize;
23            let cmov_text = [
24                c"cmovo", c"cmovno", c"cmovc", c"cmovnc", c"cmovb", c"cmovbe", c"cmova", c"cmovae",
25                c"cmove", c"cmovl", c"cmovle", c"cmovg", c"cmovge", c"cmovnb", c"cmovnbe",
26                c"cmovna", c"cmovnae", c"cmovne", c"cmovnl", c"cmovnle", c"cmovng", c"cmovnge",
27                c"cmovz", c"cmovnz", c"cmovp", c"cmovnp",
28            ];
29            self.log_c_char_operand_x_64_operand_x_64(
30                cmov_text[cond_idx].as_ptr(),
31                OperandX64::reg(lhs),
32                rhs,
33            );
34        }
35
36        self.place_rex_register_x_64_operand_x_64(lhs, rhs);
37        self.place(0x0f);
38
39        let code_for_condition = [
40            0x0, 0x1, 0x2, 0x3, 0x2, 0x6, 0x7, 0x3, 0x4, 0xc, 0xe, 0xf, 0xd, 0x3, 0x7, 0x6, 0x2,
41            0x5, 0xd, 0xf, 0xe, 0xc, 0x4, 0x5, 0xa, 0xb,
42        ];
43        self.place(0x40 | code_for_condition[cond as usize]);
44
45        self.place_reg_and_mod_reg_mem(OperandX64::reg(lhs), rhs, 0);
46        self.commit();
47    }
48}