aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-04-03 10:05:24 +0100
committerMichael Williamson <mike@zwobble.org>2026-04-03 10:05:24 +0100
commitcf129af3e9841d56689bdc393cc5a25d4229347e (patch)
tree19183f8aaeb2632f8c8515b1808433b98b865dc8
parent315578ad192940aaa5a24f535464b8cce5907d2e (diff)
Implement Patio int-add for cranelift
-rw-r--r--patio-to-cranelift/src/lib.rs25
1 files changed, 23 insertions, 2 deletions
diff --git a/patio-to-cranelift/src/lib.rs b/patio-to-cranelift/src/lib.rs
index 33cb0ffd..86ae1240 100644
--- a/patio-to-cranelift/src/lib.rs
+++ b/patio-to-cranelift/src/lib.rs
@@ -8,8 +8,8 @@ use crate::{
patio_generated::patio::{
PatioBlock, PatioBoolToInt, PatioCall, PatioCompilationUnitElement,
PatioCompilationUnitElementValue, PatioFunctionDefinition, PatioIf, PatioInstruction,
- PatioInstructionValue, PatioIntToBool, PatioIntValue, PatioIntValueValue, PatioLocal,
- PatioLocalStore, PatioLocalType, PatioOperand, PatioOperandValue, PatioReturn,
+ PatioInstructionValue, PatioIntAdd, PatioIntToBool, PatioIntValue, PatioIntValueValue,
+ PatioLocal, PatioLocalStore, PatioLocalType, PatioOperand, PatioOperandValue, PatioReturn,
PatioReturnVoid, PatioType, PatioTypeValue, PatioVisibility,
},
};
@@ -213,6 +213,13 @@ fn compile_instruction(
compile_if(if_, context);
}
+ PatioInstructionValue::PatioIntAdd => {
+ let int_add = instruction
+ .value_instruction_value_as_patio_int_add()
+ .unwrap();
+ compile_int_add(int_add, context);
+ }
+
PatioInstructionValue::PatioIntToBool => {
let int_to_bool = instruction
.value_instruction_value_as_patio_int_to_bool()
@@ -350,6 +357,20 @@ fn compile_if(if_: PatioIf<'_>, context: &mut CompilerFunctionContext<'_>) {
}
}
+fn compile_int_add(int_add: PatioIntAdd<'_>, context: &mut CompilerFunctionContext<'_>) {
+ let cranelift_left = compile_operand(int_add.left(), context);
+ let cranelift_right = compile_operand(int_add.right(), context);
+ let cranelift_result = context
+ .function_builder
+ .ins()
+ .iadd(cranelift_left, cranelift_right);
+
+ let cranelift_destination = context.var(int_add.destination().name());
+ context
+ .function_builder
+ .def_var(cranelift_destination, cranelift_result);
+}
+
fn compile_int_to_bool(int_to_bool: PatioIntToBool<'_>, context: &mut CompilerFunctionContext<'_>) {
let cranelift_var = context.var(int_to_bool.destination().name());
let cranelift_value = compile_operand(int_to_bool.value(), context);