diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0b4e5a84db9..beb0b8125f0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +Tue Dec 15 11:55:30 1998 Nick Clifton + + * 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 * cppalloc.c: Add xstrdup here. diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index c5d5060680e..701415f2c0f 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -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, diff --git a/gcc/integrate.c b/gcc/integrate.c index 4c1464cb644..943eeaff0d9 100644 --- a/gcc/integrate.c +++ b/gcc/integrate.c @@ -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));