Cope with inlining functions which return a multiword CONCAT value

From-SVN: r24328
This commit is contained in:
Nick Clifton 1998-12-15 11:56:36 +00:00 committed by Nick Clifton
parent c49445e001
commit ddc54eaa30
3 changed files with 22 additions and 2 deletions

View File

@ -1,3 +1,13 @@
Tue Dec 15 11:55:30 1998 Nick Clifton <nickc@cygnus.com>
* integrate.c (copy_rtx_and_substitute): If a SUBREG is
replaced by a CONCAT whoes components do not have the same
mode as the original SUBREG, use a new SUBREG to restore the
mode.
* emit-rtl.c (subreg_realpart_p): Cope with subregs containing
multiword complex values.
1998-12-15 Zack Weinberg <zack@rabi.phys.columbia.edu>
* cppalloc.c: Add xstrdup here.

View File

@ -942,7 +942,7 @@ subreg_realpart_p (x)
if (GET_CODE (x) != SUBREG)
abort ();
return SUBREG_WORD (x) == 0;
return SUBREG_WORD (x) * UNITS_PER_WORD < GET_MODE_UNIT_SIZE (GET_MODE (SUBREG_REG (x)));
}
/* Assuming that X is an rtx (e.g., MEM, REG or SUBREG) for a value,

View File

@ -2451,7 +2451,17 @@ copy_rtx_and_substitute (orig, map)
return gen_rtx_SUBREG (GET_MODE (orig), SUBREG_REG (copy),
SUBREG_WORD (orig) + SUBREG_WORD (copy));
else if (GET_CODE (copy) == CONCAT)
return (subreg_realpart_p (orig) ? XEXP (copy, 0) : XEXP (copy, 1));
{
rtx retval = subreg_realpart_p (orig) ? XEXP (copy, 0) : XEXP (copy, 1);
if (GET_MODE (retval) == GET_MODE (orig))
return retval;
else
return gen_rtx_SUBREG (GET_MODE (orig), retval,
(SUBREG_WORD (orig) %
(GET_MODE_UNIT_SIZE (GET_MODE (SUBREG_REG (orig)))
/ (unsigned) UNITS_PER_WORD)));
}
else
return gen_rtx_SUBREG (GET_MODE (orig), copy,
SUBREG_WORD (orig));