diff --git a/cranelift/codegen/src/isa/x86/abi.rs b/cranelift/codegen/src/isa/x86/abi.rs index c072594b61..d0308f73e8 100644 --- a/cranelift/codegen/src/isa/x86/abi.rs +++ b/cranelift/codegen/src/isa/x86/abi.rs @@ -245,24 +245,17 @@ pub fn legalize_signature( isa_flags, ); - let sig_is_multi_return = sig.is_multi_return(); - - // If this is a multi-value return and we don't have enough available return - // registers to fit all of the return values, we need to backtrack and start + // If we don't have enough available return registers + // to fit all of the return values, we need to backtrack and start // assigning locations all over again with a different strategy. In order to // do that, we need a copy of the original assigner for the returns. - let backup_rets_for_struct_return = if sig_is_multi_return { - Some(rets.clone()) - } else { - None - }; + let mut backup_rets = rets.clone(); if let Some(new_returns) = legalize_args(&sig.returns, &mut rets) { - if sig.is_multi_return() - && new_returns - .iter() - .filter(|r| r.purpose == ArgumentPurpose::Normal) - .any(|r| !r.location.is_reg()) + if new_returns + .iter() + .filter(|r| r.purpose == ArgumentPurpose::Normal) + .any(|r| !r.location.is_reg()) { // The return values couldn't all fit into available return // registers. Introduce the use of a struct-return parameter. @@ -283,8 +276,6 @@ pub fn legalize_signature( _ => unreachable!("return pointer should always get a register assignment"), } - let mut backup_rets = backup_rets_for_struct_return.unwrap(); - // We're using the first return register for the return pointer (like // sys v does). let mut ret_ptr_return = AbiParam { diff --git a/cranelift/filetests/filetests/isa/x86/windows_fastcall_x64.clif b/cranelift/filetests/filetests/isa/x86/windows_fastcall_x64.clif index 8e8d356479..cb1856ca3d 100644 --- a/cranelift/filetests/filetests/isa/x86/windows_fastcall_x64.clif +++ b/cranelift/filetests/filetests/isa/x86/windows_fastcall_x64.clif @@ -110,6 +110,13 @@ block0(v0: f32, v1: f64, v2: i64, v3: i64): ; nextln: return v1, v5 ; nextln: } +function %ret_val_i128(i64, i64) -> i128 windows_fastcall { +block0(v0: i64, v1: i64): + v2 = iconcat v0, v1 + return v2 +} +; check: function %ret_val_i128(i64 [%rdx], i64 [%r8], i64 sret [%rcx], i64 fp [%rbp]) -> i64 sret [%rax], i64 fp [%rbp] windows_fastcall { + function %internal_stack_arg_function_call(i64) -> i64 windows_fastcall { fn0 = %foo(i64, i64, i64, i64) -> i64 windows_fastcall fn1 = %foo2(i64, i64, i64, i64) -> i64 windows_fastcall