aboutsummaryrefslogtreecommitdiff
path: root/patio-to-cranelift
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-04-08 18:52:26 +0100
committerMichael Williamson <mike@zwobble.org>2026-04-08 18:52:26 +0100
commit634a91a27700a139d714501a27021a1db732c966 (patch)
treeafa9a38bb6f85e9293f8514bd252c255de3dbb33 /patio-to-cranelift
parent109eb835082418d55b099301e151a7d9331135e0 (diff)
Allow multiple destinations in Patio calls
Diffstat (limited to 'patio-to-cranelift')
-rw-r--r--patio-to-cranelift/src/codegen/mod.rs27
-rw-r--r--patio-to-cranelift/src/patio/flatbuffers.rs4
-rw-r--r--patio-to-cranelift/src/patio/instructions.rs4
3 files changed, 21 insertions, 14 deletions
diff --git a/patio-to-cranelift/src/codegen/mod.rs b/patio-to-cranelift/src/codegen/mod.rs
index 97414753..be98a0a3 100644
--- a/patio-to-cranelift/src/codegen/mod.rs
+++ b/patio-to-cranelift/src/codegen/mod.rs
@@ -413,9 +413,10 @@ fn compile_call(call: &PatioCall, context: &mut CompilerFunctionContext<'_>) {
.ins()
.call(func_ref, &cranelift_args);
- if let Some(destination) = &call.destination {
- let cranelift_value = context.function_builder.inst_results(cranelift_call)[0];
- def_destination(destination, cranelift_value, context);
+ let cranelift_results = Vec::from(context.function_builder.inst_results(cranelift_call));
+ assert_eq!(cranelift_results.len(), call.destinations.len());
+ for (cranelift_result, destination) in cranelift_results.iter().zip(&call.destinations) {
+ def_destination(destination, *cranelift_result, context);
}
}
@@ -431,11 +432,13 @@ fn compile_call_pointer(
patio_operand_to_cranelift_type(arg, context),
));
}
- cranelift_signature
- .returns
- .push(cranelift_codegen::ir::AbiParam::new(
- context.local_type(&call_pointer.destination.name),
- ));
+ for destination in &call_pointer.destinations {
+ cranelift_signature
+ .returns
+ .push(cranelift_codegen::ir::AbiParam::new(
+ context.local_type(&destination.name),
+ ));
+ }
let cranelift_signature_ref = context
.function_builder
@@ -450,8 +453,12 @@ fn compile_call_pointer(
&cranelift_args,
);
- let cranelift_value = context.function_builder.inst_results(cranelift_call)[0];
- def_destination(&call_pointer.destination, cranelift_value, context);
+ let cranelift_results = Vec::from(context.function_builder.inst_results(cranelift_call));
+ assert_eq!(cranelift_results.len(), call_pointer.destinations.len());
+ for (cranelift_result, destination) in cranelift_results.iter().zip(&call_pointer.destinations)
+ {
+ def_destination(destination, *cranelift_result, context);
+ }
}
fn compile_data_ptr_to_int(
diff --git a/patio-to-cranelift/src/patio/flatbuffers.rs b/patio-to-cranelift/src/patio/flatbuffers.rs
index 35226614..e35b2c8a 100644
--- a/patio-to-cranelift/src/patio/flatbuffers.rs
+++ b/patio-to-cranelift/src/patio/flatbuffers.rs
@@ -169,7 +169,7 @@ impl From<patio_generated::patio::PatioInstruction<'_>> for PatioInstruction {
let call = value.value_as_patio_call().unwrap();
Self::Call(PatioCall {
- destination: call.destination().map(Into::into),
+ destinations: call.destinations().iter().map(Into::into).collect(),
function_name: call.function_name().into(),
args: call.args().iter().map(Into::into).collect(),
})
@@ -179,7 +179,7 @@ impl From<patio_generated::patio::PatioInstruction<'_>> for PatioInstruction {
let call_pointer = value.value_as_patio_call_pointer().unwrap();
Self::CallPointer(PatioCallPointer {
- destination: call_pointer.destination().into(),
+ destinations: call_pointer.destinations().iter().map(Into::into).collect(),
function_pointer: call_pointer.function_pointer().into(),
args: call_pointer.args().iter().map(Into::into).collect(),
})
diff --git a/patio-to-cranelift/src/patio/instructions.rs b/patio-to-cranelift/src/patio/instructions.rs
index 804ee93d..bdfcc28e 100644
--- a/patio-to-cranelift/src/patio/instructions.rs
+++ b/patio-to-cranelift/src/patio/instructions.rs
@@ -40,13 +40,13 @@ pub(crate) struct PatioBoolToInt {
}
pub(crate) struct PatioCall {
- pub(crate) destination: Option<PatioLocalRef>,
+ pub(crate) destinations: Vec<PatioLocalRef>,
pub(crate) function_name: String,
pub(crate) args: Vec<PatioOperand>,
}
pub(crate) struct PatioCallPointer {
- pub(crate) destination: PatioLocalRef,
+ pub(crate) destinations: Vec<PatioLocalRef>,
pub(crate) function_pointer: PatioOperand,
pub(crate) args: Vec<PatioOperand>,
}