From cf129af3e9841d56689bdc393cc5a25d4229347e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 3 Apr 2026 10:05:24 +0100 Subject: Implement Patio int-add for cranelift --- patio-to-cranelift/src/lib.rs | 25 +++++++++++++++++++++++-- 1 file 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); -- cgit v1.2.3