OSDN Git Service

* integrate.c (expand_inline_function): Handle CONCAT DECL_RESULT.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 23 May 2001 22:53:54 +0000 (22:53 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 23 May 2001 22:53:54 +0000 (22:53 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@42515 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/integrate.c

index 14102e1..a62306d 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 29acaf2..9b7a4e7 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 ();