Commit 898d374d by Jan Hubicka Committed by Jan Hubicka

i386.c (ix86_force_to_memory, [...]): Update for 64bit.

	* i386.c (ix86_force_to_memory, ix86_free_from_memory):
	Update for 64bit.

From-SVN: r41062
parent 547a559d
Tue Apr 3 19:41:21 CEST 2001 Jan Hubicka <jh@suse.cz>
* i386.c (ix86_force_to_memory, ix86_free_from_memory):
Update for 64bit.
2001-04-03 Zack Weinberg <zackw@stanford.edu> 2001-04-03 Zack Weinberg <zackw@stanford.edu>
* config/i386/xm-beos.h, config/i386/xm-isc.h, * config/i386/xm-beos.h, config/i386/xm-isc.h,
......
...@@ -10147,14 +10147,46 @@ ix86_force_to_memory (mode, operand) ...@@ -10147,14 +10147,46 @@ ix86_force_to_memory (mode, operand)
enum machine_mode mode; enum machine_mode mode;
rtx operand; rtx operand;
{ {
rtx result;
if (!reload_completed) if (!reload_completed)
abort (); abort ();
if (TARGET_64BIT && TARGET_RED_ZONE)
{
result = gen_rtx_MEM (mode,
gen_rtx_PLUS (Pmode,
stack_pointer_rtx,
GEN_INT (-RED_ZONE_SIZE)));
emit_move_insn (result, operand);
}
else if (TARGET_64BIT && !TARGET_RED_ZONE)
{
switch (mode)
{
case HImode:
case SImode:
operand = gen_lowpart (DImode, operand);
/* FALLTHRU */
case DImode:
emit_insn (
gen_rtx_SET (VOIDmode,
gen_rtx_MEM (DImode,
gen_rtx_PRE_DEC (DImode,
stack_pointer_rtx)),
operand));
break;
default:
abort ();
}
result = gen_rtx_MEM (mode, stack_pointer_rtx);
}
else
{
switch (mode) switch (mode)
{ {
case DImode: case DImode:
{ {
rtx operands[2]; rtx operands[2];
split_di (&operand, 1, operands, operands+1); split_di (&operand, 1, operands, operands + 1);
emit_insn ( emit_insn (
gen_rtx_SET (VOIDmode, gen_rtx_SET (VOIDmode,
gen_rtx_MEM (SImode, gen_rtx_MEM (SImode,
...@@ -10183,9 +10215,11 @@ ix86_force_to_memory (mode, operand) ...@@ -10183,9 +10215,11 @@ ix86_force_to_memory (mode, operand)
operand)); operand));
break; break;
default: default:
abort(); abort ();
}
result = gen_rtx_MEM (mode, stack_pointer_rtx);
} }
return gen_rtx_MEM (mode, stack_pointer_rtx); return result;
} }
/* Free operand from the memory. */ /* Free operand from the memory. */
...@@ -10193,15 +10227,22 @@ void ...@@ -10193,15 +10227,22 @@ void
ix86_free_from_memory (mode) ix86_free_from_memory (mode)
enum machine_mode mode; enum machine_mode mode;
{ {
if (!TARGET_64BIT || !TARGET_RED_ZONE)
{
int size;
if (mode == DImode || TARGET_64BIT)
size = 8;
else if (mode == HImode && TARGET_PARTIAL_REG_STALL)
size = 2;
else
size = 4;
/* Use LEA to deallocate stack space. In peephole2 it will be converted /* Use LEA to deallocate stack space. In peephole2 it will be converted
to pop or add instruction if registers are available. */ to pop or add instruction if registers are available. */
emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
gen_rtx_PLUS (Pmode, stack_pointer_rtx, gen_rtx_PLUS (Pmode, stack_pointer_rtx,
GEN_INT (mode == DImode GEN_INT (size))));
? 8 }
: mode == HImode && TARGET_PARTIAL_REG_STALL
? 2
: 4))));
} }
/* Put float CONST_DOUBLE in the constant pool instead of fp regs. /* Put float CONST_DOUBLE in the constant pool instead of fp regs.
......
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