rs6000.c: (rs6000_darwin64_function_arg): Add UNION_TYPE case.
authorStan Shebs <shebs@apple.com>
Mon, 22 Nov 2004 07:24:54 +0000 (07:24 +0000)
committerStan Shebs <shebs@gcc.gnu.org>
Mon, 22 Nov 2004 07:24:54 +0000 (07:24 +0000)
        * config/rs6000/rs6000.c: (rs6000_darwin64_function_arg): Add UNION_TYPE case.
        (function_arg): Move darwin test up, sniff mode first for efficiency, test
        for union type.

From-SVN: r91003

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 0e7656618b402a15f4038e68b6fbf9e11f700ff0..d33f468a20b3ca482baa41aee26e0830a72ce5b5 100644 (file)
@@ -1,3 +1,9 @@
+2004-11-21  Stan Shebs  <shebs@apple.com>
+
+       * config/rs6000/rs6000.c: (rs6000_darwin64_function_arg): Add UNION_TYPE case.
+       (function_arg): Move darwin test up, sniff mode first for efficiency, test
+       for union type.
+
 2004-11-21  Dale Johannesen  <dalej@apple.com>
 
        * config/darwin.h (JUMP_TABLES_IN_TEXT_SECTION):  Define.
index 2d4e6186c5c99fb104692c0742f30c950f2ded85..fd0b1413744935749532849af2f1438a2ef213b0 100644 (file)
@@ -5177,6 +5177,23 @@ rs6000_darwin64_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
          }
       break;
 
+    case UNION_TYPE:
+      tot = rs6000_arg_size (mode, type);
+      if (tot <= 0)
+       return NULL_RTX;
+      bytepos = 0;
+
+      for (j = 0; j < tot; ++j)
+       {
+         sub = gen_rtx_REG ((TARGET_64BIT ? DImode : SImode), GP_ARG_MIN_REG + cum->words++);
+         roffset = gen_rtx_CONST_INT (SImode, bytepos);
+         rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, sub, roffset);
+         if (cum->words >= GP_ARG_NUM_REG)
+           break;
+         bytepos += (TARGET_64BIT ? 8 : 4);
+       }
+      break;
+
     case ARRAY_TYPE:
       tot = int_size_in_bytes (type);
       if (tot <= 0)
@@ -5340,6 +5357,18 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
       return GEN_INT (cum->call_cookie);
     }
 
+  if (mode == BLKmode
+      && rs6000_darwin64_abi
+      && (TREE_CODE (type) == RECORD_TYPE
+         || TREE_CODE (type) == UNION_TYPE
+         || TREE_CODE (type) == ARRAY_TYPE))
+    {
+      rtx rslt = rs6000_darwin64_function_arg (cum, mode, type, named);
+      if (rslt != NULL_RTX)
+       return rslt;
+      /* Else fall through to usual handling.  */
+    }
+
   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
     if (TARGET_64BIT && ! cum->prototype)
       {
@@ -5414,12 +5443,6 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
                                          || mode == DCmode))))
     return rs6000_spe_function_arg (cum, mode, type);
 
-  else if (rs6000_darwin64_abi
-          && mode == BLKmode
-          && (TREE_CODE (type) == RECORD_TYPE
-              || TREE_CODE (type) == ARRAY_TYPE))
-    return rs6000_darwin64_function_arg (cum, mode, type, named);
-
   else if (abi == ABI_V4)
     {
       if (TARGET_HARD_FLOAT && TARGET_FPRS