luaur_code_gen/functions/
jump_on_number_cmp.rs1use crate::enums::category_x_64::CategoryX64;
2use crate::enums::condition_x_64::ConditionX64;
3use crate::enums::ir_condition::IrCondition;
4use crate::records::assembly_builder_x_64::AssemblyBuilderX64;
5use crate::records::label::Label;
6use crate::records::operand_x_64::OperandX64;
7use crate::records::register_x_64::RegisterX64;
8
9pub fn jump_on_number_cmp(
10 build: &mut AssemblyBuilderX64,
11 tmp: RegisterX64,
12 mut lhs: OperandX64,
13 mut rhs: OperandX64,
14 cond: IrCondition,
15 label: &mut Label,
16 float_precision: bool,
17) {
18 if matches!(
19 cond,
20 IrCondition::Greater
21 | IrCondition::GreaterEqual
22 | IrCondition::NotGreater
23 | IrCondition::NotGreaterEqual
24 ) {
25 core::mem::swap(&mut lhs, &mut rhs);
26 }
27
28 if float_precision {
29 if rhs.cat == CategoryX64::reg {
30 build.vucomiss(rhs, lhs);
31 } else {
32 build.vmovss_operand_x_64_operand_x_64(OperandX64::reg(tmp), rhs);
33 build.vucomiss(OperandX64::reg(tmp), lhs);
34 }
35 } else if rhs.cat == CategoryX64::reg {
36 build.vucomisd(rhs, lhs);
37 } else {
38 build.vmovsd_operand_x_64_operand_x_64(OperandX64::reg(tmp), rhs);
39 build.vucomisd(OperandX64::reg(tmp), lhs);
40 }
41
42 match cond {
43 IrCondition::NotLessEqual | IrCondition::NotGreaterEqual => {
44 build.jcc(ConditionX64::NotAboveEqual, label);
45 }
46 IrCondition::LessEqual | IrCondition::GreaterEqual => {
47 build.jcc(ConditionX64::AboveEqual, label);
48 }
49 IrCondition::NotLess | IrCondition::NotGreater => {
50 build.jcc(ConditionX64::NotAbove, label);
51 }
52 IrCondition::Less | IrCondition::Greater => {
53 build.jcc(ConditionX64::Above, label);
54 }
55 IrCondition::NotEqual => {
56 build.jcc(ConditionX64::NotZero, label);
57 build.jcc(ConditionX64::Parity, label);
58 }
59 _ => crate::macros::codegen_assert::CODEGEN_ASSERT!(false),
60 }
61}