luaur-code-gen 0.1.0

Native (A64/X64) code generation for Luau (Rust).
Documentation
use crate::enums::category_x_64::CategoryX64;
use crate::enums::condition_x_64::ConditionX64;
use crate::enums::ir_condition::IrCondition;
use crate::records::assembly_builder_x_64::AssemblyBuilderX64;
use crate::records::label::Label;
use crate::records::operand_x_64::OperandX64;
use crate::records::register_x_64::RegisterX64;

pub fn jump_on_number_cmp(
    build: &mut AssemblyBuilderX64,
    tmp: RegisterX64,
    mut lhs: OperandX64,
    mut rhs: OperandX64,
    cond: IrCondition,
    label: &mut Label,
    float_precision: bool,
) {
    if matches!(
        cond,
        IrCondition::Greater
            | IrCondition::GreaterEqual
            | IrCondition::NotGreater
            | IrCondition::NotGreaterEqual
    ) {
        core::mem::swap(&mut lhs, &mut rhs);
    }

    if float_precision {
        if rhs.cat == CategoryX64::reg {
            build.vucomiss(rhs, lhs);
        } else {
            build.vmovss_operand_x_64_operand_x_64(OperandX64::reg(tmp), rhs);
            build.vucomiss(OperandX64::reg(tmp), lhs);
        }
    } else if rhs.cat == CategoryX64::reg {
        build.vucomisd(rhs, lhs);
    } else {
        build.vmovsd_operand_x_64_operand_x_64(OperandX64::reg(tmp), rhs);
        build.vucomisd(OperandX64::reg(tmp), lhs);
    }

    match cond {
        IrCondition::NotLessEqual | IrCondition::NotGreaterEqual => {
            build.jcc(ConditionX64::NotAboveEqual, label);
        }
        IrCondition::LessEqual | IrCondition::GreaterEqual => {
            build.jcc(ConditionX64::AboveEqual, label);
        }
        IrCondition::NotLess | IrCondition::NotGreater => {
            build.jcc(ConditionX64::NotAbove, label);
        }
        IrCondition::Less | IrCondition::Greater => {
            build.jcc(ConditionX64::Above, label);
        }
        IrCondition::NotEqual => {
            build.jcc(ConditionX64::NotZero, label);
            build.jcc(ConditionX64::Parity, label);
        }
        _ => crate::macros::codegen_assert::CODEGEN_ASSERT!(false),
    }
}