Skip to main content

luaur_code_gen/functions/
jump_on_number_cmp.rs

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