aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-04-03 10:19:51 +0100
committerMichael Williamson <mike@zwobble.org>2026-04-03 10:19:51 +0100
commit23a8738a2c836683afdf83ab22d06384bb6d208a (patch)
tree9fb32138a4558f42359ccc4e3478efe7b89ff198
parent698bec55c1d6fe07016b9d27a493ad927530ac7a (diff)
Implement int-equals and int-not-equal in patio-to-cranelift
-rw-r--r--patio-to-cranelift/src/lib.rs49
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);