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>
* config/i386/xm-beos.h, config/i386/xm-isc.h,
......
......@@ -10147,14 +10147,46 @@ ix86_force_to_memory (mode, operand)
enum machine_mode mode;
rtx operand;
{
rtx result;
if (!reload_completed)
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)
{
case DImode:
{
rtx operands[2];
split_di (&operand, 1, operands, operands+1);
split_di (&operand, 1, operands, operands + 1);
emit_insn (
gen_rtx_SET (VOIDmode,
gen_rtx_MEM (SImode,
......@@ -10183,9 +10215,11 @@ ix86_force_to_memory (mode, operand)
operand));
break;
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. */
......@@ -10193,15 +10227,22 @@ void
ix86_free_from_memory (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
to pop or add instruction if registers are available. */
emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
gen_rtx_PLUS (Pmode, stack_pointer_rtx,
GEN_INT (mode == DImode
? 8
: mode == HImode && TARGET_PARTIAL_REG_STALL
? 2
: 4))));
GEN_INT (size))));
}
}
/* 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