+Tue Dec 19 00:37:08 2000 J"orn Rennecke <amylaar@redhat.com>
+
+ * reload.c (push_reload): When using a dying register for the reload
+ register in an in-out reload, use outmode if wider than inmode.
+
2000-12-19 Joseph S. Myers <jsm28@cam.ac.uk>
* config/d30v/d30v.h (EXIT_BODY): Update comment.
{
rtx note;
int regno;
+ enum machine_mode rel_mode = inmode;
+
+ if (out && GET_MODE_SIZE (outmode) > GET_MODE_SIZE (inmode))
+ rel_mode = outmode;
for (note = REG_NOTES (this_insn); note; note = XEXP (note, 1))
if (REG_NOTE_KIND (note) == REG_DEAD
&& ! refers_to_regno_for_reload_p (regno,
(regno
+ HARD_REGNO_NREGS (regno,
- inmode)),
+ rel_mode)),
PATTERN (this_insn), inloc)
/* If this is also an output reload, IN cannot be used as
the reload register if it is set in this insn unless IN
|| ! hard_reg_set_here_p (regno,
(regno
+ HARD_REGNO_NREGS (regno,
- inmode)),
+ rel_mode)),
PATTERN (this_insn)))
/* ??? Why is this code so different from the previous?
Is there any simple coherent way to describe the two together?
== ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (in)))
+ (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))))
/* Make sure the operand fits in the reg that dies. */
- && GET_MODE_SIZE (inmode) <= GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
+ && (GET_MODE_SIZE (rel_mode)
+ <= GET_MODE_SIZE (GET_MODE (XEXP (note, 0))))
&& HARD_REGNO_MODE_OK (regno, inmode)
- && GET_MODE_SIZE (outmode) <= GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
&& HARD_REGNO_MODE_OK (regno, outmode))
{
unsigned int offs;
if (offs == nregs)
{
- rld[i].reg_rtx = gen_rtx_REG (inmode, regno);
+ rld[i].reg_rtx = gen_rtx_REG (rel_mode, regno);
break;
}
}