luaur_code_gen/methods/
assembly_builder_x_64_cmov.rs1use 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}