* integrate.c (expand_inline_function): Handle CONCAT DECL_RESULT.
authorRichard Henderson <rth@redhat.com>
Wed, 23 May 2001 22:53:54 +0000 (15:53 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 23 May 2001 22:53:54 +0000 (15:53 -0700)
From-SVN: r42515

gcc/ChangeLog
gcc/integrate.c

index 14102e11d027805bb3be7f82b4441e68022870bc..a62306dd0846c7b1a914583c68477d099525a0ba 100644 (file)
@@ -1,3 +1,7 @@
+2001-05-23  Richard Henderson <rth@redhat.com>
+
+       * integrate.c (expand_inline_function): Handle CONCAT DECL_RESULT.
+
 2001-05-23  Neil Booth  <neil@daikokuya.demon.co.uk>
 
        * cpp.texi: Update for handling of charconsts.
index 29acaf2939f1a781393935d16399ef2343fe2bb1..9b7a4e74d5100219910d835ff6b981b10f2336ca 100644 (file)
@@ -1083,6 +1083,31 @@ expand_inline_function (fndecl, parms, target, ignore, type,
       else
        map->reg_map[REGNO (loc)] = reg_to_map;
     }
+  else if (GET_CODE (loc) == CONCAT)
+    {
+      enum machine_mode departing_mode = TYPE_MODE (type);
+      enum machine_mode arriving_mode
+       = GET_MODE (DECL_RTL (DECL_RESULT (fndecl)));
+
+      if (departing_mode != arriving_mode)
+       abort ();
+      if (GET_CODE (XEXP (loc, 0)) != REG
+         || GET_CODE (XEXP (loc, 1)) != REG)
+       abort ();
+
+      /* Don't use MEMs as direct targets because on some machines
+        substituting a MEM for a REG makes invalid insns.
+        Let the combiner substitute the MEM if that is valid.  */
+      if (target == 0 || GET_CODE (target) != REG
+         || GET_MODE (target) != departing_mode)
+       target = gen_reg_rtx (departing_mode);
+
+      if (GET_CODE (target) != CONCAT)
+       abort ();
+
+      map->reg_map[REGNO (XEXP (loc, 0))] = XEXP (target, 0);
+      map->reg_map[REGNO (XEXP (loc, 1))] = XEXP (target, 1);
+    }
   else
     abort ();