aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2001-05-23 15:53:54 -0700
committerRichard Henderson <rth@gcc.gnu.org>2001-05-23 15:53:54 -0700
commit9688f9ada6db1aa893b02fdaf01c4222f904c73f (patch)
tree1cc72a43dc9843e6f1821d6a933f266316a81d86
parentf8710242d38de963d4d8204af1058cef8c05472b (diff)
downloadgcc-9688f9ada6db1aa893b02fdaf01c4222f904c73f.zip
gcc-9688f9ada6db1aa893b02fdaf01c4222f904c73f.tar.gz
gcc-9688f9ada6db1aa893b02fdaf01c4222f904c73f.tar.bz2
* integrate.c (expand_inline_function): Handle CONCAT DECL_RESULT.
From-SVN: r42515
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/integrate.c25
2 files changed, 29 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 14102e1..a62306d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/integrate.c b/gcc/integrate.c
index 29acaf2..9b7a4e7 100644
--- a/gcc/integrate.c
+++ b/gcc/integrate.c
@@ -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 ();