diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-04-03 10:19:51 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-04-03 10:19:51 +0100 |
| commit | 23a8738a2c836683afdf83ab22d06384bb6d208a (patch) | |
| tree | 9fb32138a4558f42359ccc4e3478efe7b89ff198 | |
| parent | 698bec55c1d6fe07016b9d27a493ad927530ac7a (diff) | |
Implement int-equals and int-not-equal in patio-to-cranelift
| -rw-r--r-- | patio-to-cranelift/src/lib.rs | 49 |
1 files 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); |
