diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-04-03 10:05:24 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-04-03 10:05:24 +0100 |
| commit | cf129af3e9841d56689bdc393cc5a25d4229347e (patch) | |
| tree | 19183f8aaeb2632f8c8515b1808433b98b865dc8 | |
| parent | 315578ad192940aaa5a24f535464b8cce5907d2e (diff) | |
Implement Patio int-add for cranelift
| -rw-r--r-- | patio-to-cranelift/src/lib.rs | 25 |
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); |
