* config/rs6000/rs6000.c (rs6000_spe_function_arg): Multi-reg
authoraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 2 Feb 2005 21:55:32 +0000 (21:55 +0000)
committeraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 2 Feb 2005 21:55:32 +0000 (21:55 +0000)
arguments go on the stack.  Do not put complex doubles in odd/even
pairs.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94617 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/config/rs6000/rs6000.c

index ccf9ace..4406f1b 100644 (file)
@@ -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);