From b5870beeee4a54ffbbc0d7fa75ffe74c6804b09e Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Wed, 2 Feb 2005 21:55:32 +0000 Subject: [PATCH] rs6000.c (rs6000_spe_function_arg): Multi-reg arguments go on the stack. * config/rs6000/rs6000.c (rs6000_spe_function_arg): Multi-reg arguments go on the stack. Do not put complex doubles in odd/even pairs. From-SVN: r94617 --- gcc/config/rs6000/rs6000.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index ccf9ace34d4..4406f1b10ec 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -5170,11 +5170,14 @@ rs6000_spe_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, are passed and returned in a pair of GPRs for ABI compatibility. */ if (TARGET_E500_DOUBLE && (mode == DFmode || mode == DCmode)) { + int n_words = rs6000_arg_size (mode, type); + /* Doubles go in an odd/even register pair (r5/r6, etc). */ - gregno += (1 - gregno) & 1; + if (mode == DFmode) + gregno += (1 - gregno) & 1; - /* We do not split between registers and stack. */ - if (gregno + 1 > GP_ARG_MAX_REG) + /* Multi-reg args are not split between registers and stack. */ + if (gregno + n_words - 1 > GP_ARG_MAX_REG) return NULL_RTX; return spe_build_register_parallel (mode, gregno); -- 2.30.2