Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/gnu/dist/toolchain/gcc/config/sparc Backport from -current a...



details:   https://anonhg.NetBSD.org/src/rev/afd2d4f36638
branches:  trunk
changeset: 526081:afd2d4f36638
user:      eeh <eeh%NetBSD.org@localhost>
date:      Wed Apr 24 22:28:36 2002 +0000

description:
Backport from -current a fix for structure passing lossage.

diffstat:

 gnu/dist/toolchain/gcc/config/sparc/sparc.c |  74 ++++++++++++++++++++--------
 1 files changed, 53 insertions(+), 21 deletions(-)

diffs (170 lines):

diff -r 8d4dce18c24d -r afd2d4f36638 gnu/dist/toolchain/gcc/config/sparc/sparc.c
--- a/gnu/dist/toolchain/gcc/config/sparc/sparc.c       Wed Apr 24 21:41:22 2002 +0000
+++ b/gnu/dist/toolchain/gcc/config/sparc/sparc.c       Wed Apr 24 22:28:36 2002 +0000
@@ -3651,20 +3651,23 @@
 {
   rtx ret;
   int slotno, named, regbase;
-  int nregs, intoffset;
+  unsigned int nregs;
+  int intoffset;
 };
 
 static void function_arg_record_value_3
-       PROTO((int, struct function_arg_record_value_parms *));
+       PROTO((HOST_WIDE_INT, struct function_arg_record_value_parms *));
 static void function_arg_record_value_2
-       PROTO((tree, int, struct function_arg_record_value_parms *));
+       PROTO((tree, HOST_WIDE_INT, struct function_arg_record_value_parms *));
+static void function_arg_record_value_1
+       PROTO((tree, HOST_WIDE_INT, struct function_arg_record_value_parms *));
 static rtx function_arg_record_value
        PROTO((tree, enum machine_mode, int, int, int));
 
 static void
 function_arg_record_value_1 (type, startbitpos, parms)
      tree type;
-     int startbitpos;
+     HOST_WIDE_INT startbitpos;
      struct function_arg_record_value_parms *parms;
 {
   tree field;
@@ -3692,16 +3695,18 @@
     {
       if (TREE_CODE (field) == FIELD_DECL)
        {
-         int bitpos = startbitpos;
+         HOST_WIDE_INT bitpos = startbitpos;
          if (DECL_FIELD_BITPOS (field))
            bitpos += TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field));
+
          /* ??? FIXME: else assume zero offset.  */
 
          if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
-           {
-             function_arg_record_value_1 (TREE_TYPE (field), bitpos, parms);
-           }
-         else if (TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
+           function_arg_record_value_1 (TREE_TYPE (field), bitpos, parms);
+         else if ((TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
+                   || (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE
+                       && (TREE_CODE (TREE_TYPE (TREE_TYPE (field)))
+                           == REAL_TYPE)))
                   && TARGET_FPU
                   && ! packed_p
                   && parms->named)
@@ -3724,6 +3729,8 @@
              /* There's no need to check this_slotno < SPARC_FP_ARG MAX.
                 If it wasn't true we wouldn't be here.  */
              parms->nregs += 1;
+             if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
+               parms->nregs += 1;
            }
          else
            {
@@ -3738,11 +3745,13 @@
 
 static void 
 function_arg_record_value_3 (bitpos, parms)
-     int bitpos;
+     HOST_WIDE_INT bitpos;
      struct function_arg_record_value_parms *parms;
 {
   enum machine_mode mode;
-  int regno, this_slotno, intslots, intoffset;
+  unsigned int regno;
+  unsigned int startbit, endbit;
+  int this_slotno, intslots, intoffset;
   rtx reg;
 
   if (parms->intoffset == -1)
@@ -3750,7 +3759,9 @@
   intoffset = parms->intoffset;
   parms->intoffset = -1;
 
-  intslots = (bitpos - intoffset + BITS_PER_WORD - 1) / BITS_PER_WORD;
+  startbit = intoffset & -BITS_PER_WORD;
+  endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
+  intslots = (endbit - startbit) / BITS_PER_WORD;
   this_slotno = parms->slotno + intoffset / BITS_PER_WORD;
 
   intslots = MIN (intslots, SPARC_INT_ARG_MAX - this_slotno);
@@ -3797,7 +3808,7 @@
 static void
 function_arg_record_value_2 (type, startbitpos, parms)
      tree type;
-     int startbitpos;
+     HOST_WIDE_INT startbitpos;
      struct function_arg_record_value_parms *parms;
 {
   tree field;
@@ -3816,7 +3827,7 @@
     {
       if (TREE_CODE (field) == FIELD_DECL)
        {
-         int bitpos = startbitpos;
+         HOST_WIDE_INT bitpos = startbitpos;
          if (DECL_FIELD_BITPOS (field))
            bitpos += TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field));
          /* ??? FIXME: else assume zero offset.  */
@@ -3825,24 +3836,45 @@
            {
              function_arg_record_value_2 (TREE_TYPE (field), bitpos, parms);
            }
-         else if (TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
+         else if ((TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
+                   || (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE
+                       && (TREE_CODE (TREE_TYPE (TREE_TYPE (field)))
+                           == REAL_TYPE)))
                   && TARGET_FPU
                   && ! packed_p
                   && parms->named)
            {
              int this_slotno = parms->slotno + bitpos / BITS_PER_WORD;
+             int regno;
+             enum machine_mode mode = DECL_MODE (field);
              rtx reg;
 
              function_arg_record_value_3 (bitpos, parms);
-
-             reg = gen_rtx_REG (DECL_MODE (field),
-                                (SPARC_FP_ARG_FIRST + this_slotno * 2
-                                 + (DECL_MODE (field) == SFmode
-                                    && (bitpos & 32) != 0)));
+             regno = SPARC_FP_ARG_FIRST + this_slotno * 2
+                     + ((mode == SFmode || mode == SCmode)
+                        && (bitpos & 32) != 0);
+             switch (mode)
+               {
+               case SCmode: mode = SFmode; break;
+               case DCmode: mode = DFmode; break;
+               case TCmode: mode = TFmode; break;
+               default: break;
+               }
+             reg = gen_rtx_REG (mode, regno);
              XVECEXP (parms->ret, 0, parms->nregs)
                = gen_rtx_EXPR_LIST (VOIDmode, reg,
                           GEN_INT (bitpos / BITS_PER_UNIT));
              parms->nregs += 1;
+             if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
+               {
+                 regno += GET_MODE_SIZE (mode) / 4;
+                 reg = gen_rtx_REG (mode, regno);
+                 XVECEXP (parms->ret, 0, parms->nregs)
+                   = gen_rtx_EXPR_LIST (VOIDmode, reg,
+                       GEN_INT ((bitpos + GET_MODE_BITSIZE (mode))
+                                / BITS_PER_UNIT));
+                 parms->nregs += 1;
+               }
            }
          else
            {
@@ -3864,7 +3896,7 @@
 {
   HOST_WIDE_INT typesize = int_size_in_bytes (type);
   struct function_arg_record_value_parms parms;
-  int nregs;
+  unsigned int nregs;
 
   parms.ret = NULL_RTX;
   parms.slotno = slotno;



Home | Main Index | Thread Index | Old Index