Commit 72613dfa by Jan Hubicka Committed by Jakub Jelinek

* i386.c (ix86_emit_restore_regs_using_mov): Deal with large offsets.

From-SVN: r76416
parent 7be4d808
2003-11-30 Jan Hubicka <jh@suse.cz>
* i386.c (ix86_emit_restore_regs_using_mov): Deal with large offsets.
2004-01-23 J"orn Rennecke <joern.rennecke@superh.com> 2004-01-23 J"orn Rennecke <joern.rennecke@superh.com>
* doc/tm.texi: Insert some weasel words when LOAD_EXTEND_OP * doc/tm.texi: Insert some weasel words when LOAD_EXTEND_OP
......
...@@ -808,7 +808,7 @@ static int ix86_split_to_parts (rtx, rtx *, enum machine_mode); ...@@ -808,7 +808,7 @@ static int ix86_split_to_parts (rtx, rtx *, enum machine_mode);
static int ix86_nsaved_regs (void); static int ix86_nsaved_regs (void);
static void ix86_emit_save_regs (void); static void ix86_emit_save_regs (void);
static void ix86_emit_save_regs_using_mov (rtx, HOST_WIDE_INT); static void ix86_emit_save_regs_using_mov (rtx, HOST_WIDE_INT);
static void ix86_emit_restore_regs_using_mov (rtx, int, int); static void ix86_emit_restore_regs_using_mov (rtx, HOST_WIDE_INT, int);
static void ix86_output_function_epilogue (FILE *, HOST_WIDE_INT); static void ix86_output_function_epilogue (FILE *, HOST_WIDE_INT);
static void ix86_set_move_mem_attrs_1 (rtx, rtx, rtx, rtx, rtx); static void ix86_set_move_mem_attrs_1 (rtx, rtx, rtx, rtx, rtx);
static void ix86_sched_reorder_ppro (rtx *, rtx *); static void ix86_sched_reorder_ppro (rtx *, rtx *);
...@@ -5278,16 +5278,29 @@ ix86_expand_prologue (void) ...@@ -5278,16 +5278,29 @@ ix86_expand_prologue (void)
/* Emit code to restore saved registers using MOV insns. First register /* Emit code to restore saved registers using MOV insns. First register
is restored from POINTER + OFFSET. */ is restored from POINTER + OFFSET. */
static void static void
ix86_emit_restore_regs_using_mov (rtx pointer, int offset, int maybe_eh_return) ix86_emit_restore_regs_using_mov (rtx pointer, HOST_WIDE_INT offset,
int maybe_eh_return)
{ {
int regno; int regno;
rtx base_address = gen_rtx_MEM (Pmode, pointer);
for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
if (ix86_save_reg (regno, maybe_eh_return)) if (ix86_save_reg (regno, maybe_eh_return))
{ {
/* Ensure that adjust_address won't be forced to produce pointer
out of range allowed by x86-64 instruction set. */
if (TARGET_64BIT && offset != trunc_int_for_mode (offset, SImode))
{
rtx r11;
r11 = gen_rtx_REG (DImode, FIRST_REX_INT_REG + 3 /* R11 */);
emit_move_insn (r11, GEN_INT (offset));
emit_insn (gen_adddi3 (r11, r11, pointer));
base_address = gen_rtx_MEM (Pmode, r11);
offset = 0;
}
emit_move_insn (gen_rtx_REG (Pmode, regno), emit_move_insn (gen_rtx_REG (Pmode, regno),
adjust_address (gen_rtx_MEM (Pmode, pointer), adjust_address (base_address, Pmode, offset));
Pmode, offset));
offset += UNITS_PER_WORD; offset += UNITS_PER_WORD;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment