+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.
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)));
}
\f
/* Assuming that X is an rtx (e.g., MEM, REG or SUBREG) for a value,
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));