From 23a8738a2c836683afdf83ab22d06384bb6d208a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 3 Apr 2026 10:19:51 +0100 Subject: Implement int-equals and int-not-equal in patio-to-cranelift --- patio-to-cranelift/src/lib.rs | 49 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/patio-to-cranelift/src/lib.rs b/patio-to-cranelift/src/lib.rs index d9ff6c5d..c5bbac78 100644 --- a/patio-to-cranelift/src/lib.rs +++ b/patio-to-cranelift/src/lib.rs @@ -8,10 +8,10 @@ use crate::{ patio_generated::patio::{ PatioBlock, PatioBoolToInt, PatioCall, PatioCompilationUnitElement, PatioCompilationUnitElementValue, PatioFunctionDefinition, PatioIf, PatioInstruction, - PatioInstructionValue, PatioIntAdd, PatioIntSub, PatioIntToBool, PatioIntValue, - PatioIntValueValue, PatioLocal, PatioLocalRef, PatioLocalStore, PatioLocalType, - PatioOperand, PatioOperandValue, PatioReturn, PatioReturnVoid, PatioType, PatioTypeValue, - PatioVisibility, + PatioInstructionValue, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub, + PatioIntToBool, PatioIntValue, PatioIntValueValue, PatioLocal, PatioLocalRef, + PatioLocalStore, PatioLocalType, PatioOperand, PatioOperandValue, PatioReturn, + PatioReturnVoid, PatioType, PatioTypeValue, PatioVisibility, }, }; @@ -221,6 +221,20 @@ fn compile_instruction( compile_int_add(int_add, context); } + PatioInstructionValue::PatioIntEquals => { + let int_equals = instruction + .value_instruction_value_as_patio_int_equals() + .unwrap(); + compile_int_equals(int_equals, context); + } + + PatioInstructionValue::PatioIntNotEqual => { + let int_not_equal = instruction + .value_instruction_value_as_patio_int_not_equal() + .unwrap(); + compile_int_not_equal(int_not_equal, context); + } + PatioInstructionValue::PatioIntSub => { let int_sub = instruction .value_instruction_value_as_patio_int_sub() @@ -369,6 +383,33 @@ fn compile_int_add(int_add: PatioIntAdd<'_>, context: &mut CompilerFunctionConte def_destination(int_add.destination(), cranelift_result, context); } +fn compile_int_equals(int_equals: PatioIntEquals<'_>, context: &mut CompilerFunctionContext<'_>) { + let cranelift_left = compile_operand(int_equals.left(), context); + let cranelift_right = compile_operand(int_equals.right(), context); + let cranelift_result = context.function_builder.ins().icmp( + cranelift_codegen::ir::condcodes::IntCC::Equal, + cranelift_left, + cranelift_right, + ); + + def_destination(int_equals.destination(), cranelift_result, context); +} + +fn compile_int_not_equal( + int_not_equal: PatioIntNotEqual<'_>, + context: &mut CompilerFunctionContext<'_>, +) { + let cranelift_left = compile_operand(int_not_equal.left(), context); + let cranelift_right = compile_operand(int_not_equal.right(), context); + let cranelift_result = context.function_builder.ins().icmp( + cranelift_codegen::ir::condcodes::IntCC::NotEqual, + cranelift_left, + cranelift_right, + ); + + def_destination(int_not_equal.destination(), cranelift_result, context); +} + fn compile_int_sub(int_sub: PatioIntSub<'_>, context: &mut CompilerFunctionContext<'_>) { let cranelift_left = compile_operand(int_sub.left(), context); let cranelift_right = compile_operand(int_sub.right(), context); -- cgit v1.2.3