diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-04-08 18:52:26 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-04-08 18:52:26 +0100 |
| commit | 634a91a27700a139d714501a27021a1db732c966 (patch) | |
| tree | afa9a38bb6f85e9293f8514bd252c255de3dbb33 /patio-to-cranelift | |
| parent | 109eb835082418d55b099301e151a7d9331135e0 (diff) | |
Allow multiple destinations in Patio calls
Diffstat (limited to 'patio-to-cranelift')
| -rw-r--r-- | patio-to-cranelift/src/codegen/mod.rs | 27 | ||||
| -rw-r--r-- | patio-to-cranelift/src/patio/flatbuffers.rs | 4 | ||||
| -rw-r--r-- | patio-to-cranelift/src/patio/instructions.rs | 4 |
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>, } |
