Commit ee33823f by Richard Kenner

(expand_builtin_apply_args): If STACK_REGS is defined...

(expand_builtin_apply_args): If STACK_REGS is defined, generate USE
insns before the function body, thus showing which registers are
filled with parameters.
Reverse order of saving registers, more compact code for i387.
(expand_builtin_apply): Likewise.

From-SVN: r9462
parent 9dc0f531
...@@ -8117,17 +8117,35 @@ expand_builtin_apply_args () ...@@ -8117,17 +8117,35 @@ expand_builtin_apply_args ()
if (struct_value_rtx) if (struct_value_rtx)
size += GET_MODE_SIZE (Pmode); size += GET_MODE_SIZE (Pmode);
/* Save each register used in calling a function to the block. */ /* Save each register used in calling a function to the block.
for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) Doing this in reverse order makes for much more compact code
for i386 and family. If we do this in reverse order, a simple
series of pops and stores will be generated. If we do this
in ascending order, the pops and stores will be littered with
stack swaps as well. Since the order is largely irrelevant for
all other architectures, we use the optimal order for the i386. */
for (regno = FIRST_PSEUDO_REGISTER; regno--;)
if ((mode = apply_args_mode[regno]) != VOIDmode) if ((mode = apply_args_mode[regno]) != VOIDmode)
{ {
rtx tem;
align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT; align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
if (size % align != 0) if (size % align != 0)
size = CEIL (size, align) * align; size = CEIL (size, align) * align;
tem = gen_rtx (REG, mode, INCOMING_REGNO (regno));
#ifdef STACK_REGS
/* For reg-stack.c's stack register household.
Compare with a similar piece of code in function.c. */
emit_insn (gen_rtx (USE, mode, tem));
#endif
emit_move_insn (change_address (registers, mode, emit_move_insn (change_address (registers, mode,
plus_constant (XEXP (registers, 0), plus_constant (XEXP (registers, 0),
size)), size)),
gen_rtx (REG, mode, INCOMING_REGNO (regno))); tem);
size += GET_MODE_SIZE (mode); size += GET_MODE_SIZE (mode);
} }
...@@ -8206,8 +8224,10 @@ expand_builtin_apply (function, arguments, argsize) ...@@ -8206,8 +8224,10 @@ expand_builtin_apply (function, arguments, argsize)
size += GET_MODE_SIZE (Pmode); size += GET_MODE_SIZE (Pmode);
/* Restore each of the registers previously saved. Make USE insns /* Restore each of the registers previously saved. Make USE insns
for each of these registers for use in making the call. */ for each of these registers for use in making the call.
for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) Doing this in reverse order makes for much more compact code
for i386 and family. */
for (regno = FIRST_PSEUDO_REGISTER; regno--; )
if ((mode = apply_args_mode[regno]) != VOIDmode) if ((mode = apply_args_mode[regno]) != VOIDmode)
{ {
align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT; align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
......
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