From 16c5e854d54cd2aff29aaa1f0b3819dc737157c9 Mon Sep 17 00:00:00 2001 From: Scott Mabin Date: Thu, 25 Jul 2019 16:53:02 +0100 Subject: [PATCH] Merge pull request #3 from 0ndorio/fix/register_calculation Fix argument register calculation. Co-authored-by: rnd --- src/librustc_target/abi/call/xtensa.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/librustc_target/abi/call/xtensa.rs b/src/librustc_target/abi/call/xtensa.rs index a7bde630cd6f6..3c133e5f56ef0 100644 --- a/src/librustc_target/abi/call/xtensa.rs +++ b/src/librustc_target/abi/call/xtensa.rs @@ -20,18 +20,22 @@ fn classify_arg_ty(arg: &mut ArgAbi<'_, Ty>, xlen: u64, remaining_gpr: &mut // according to the ABI. 2*XLen-aligned varargs are passed in "aligned" // register pairs, so may consume 3 registers. - let mut stack_required = false; let arg_size = arg.layout.size; - let alignment = arg.layout.details.align.abi; - + if arg_size.bits() > MAX_ARG_IN_REGS_SIZE { + arg.make_indirect(); + return; + } + let alignment = arg.layout.details.align.abi; let mut required_gpr = 1u64; // at least one per arg + if alignment.bits() == 2 * xlen { required_gpr = 2 + (*remaining_gpr % 2); } else if arg_size.bits() > xlen && arg_size.bits() <= MAX_ARG_IN_REGS_SIZE { - required_gpr = arg_size.bits() + (xlen - 1) / xlen; + required_gpr = (arg_size.bits() + (xlen - 1)) / xlen; } + let mut stack_required = false; if required_gpr > *remaining_gpr { stack_required = true; required_gpr = *remaining_gpr;