Commit f3cd5375 by Jim Wilson

(output_stack_adjust): Reorganize code for readability.

If size is negative, negate and subtract it instead of adding it.

From-SVN: r13847
parent 20ec31d3
...@@ -2485,38 +2485,42 @@ output_stack_adjust (size, reg, temp) ...@@ -2485,38 +2485,42 @@ output_stack_adjust (size, reg, temp)
{ {
if (size) if (size)
{ {
rtx val = GEN_INT (size); if (CONST_OK_FOR_I (size))
rtx insn; emit_insn (gen_addsi3 (reg, reg, GEN_INT (size)));
/* Try to do it with two partial adjustments; however, we must make
if (! CONST_OK_FOR_I (size)) sure that the stack is properly aligned at all times, in case
an interrupt occurs between the two partial adjustments. */
else if (CONST_OK_FOR_I (size / 2 & -4)
&& CONST_OK_FOR_I (size - (size / 2 & -4)))
{
emit_insn (gen_addsi3 (reg, reg, GEN_INT (size / 2 & -4)));
emit_insn (gen_addsi3 (reg, reg, GEN_INT (size - (size / 2 & -4))));
}
else
{ {
/* Try to do it with two partial adjustments; however, must make rtx const_reg;
sure that the stack is properly aligned at all times, in case
an interrupt occurs between the two partial adjustments. */ /* If TEMP is invalid, we could temporarily save a general
if (CONST_OK_FOR_I (size / 2 & -4) register to MACL. However, there is currently no need
&& CONST_OK_FOR_I (size - (size / 2 & -4))) to handle this case, so just abort when we see it. */
if (temp < 0)
abort ();
const_reg = gen_rtx (REG, SImode, temp);
/* If SIZE is negative, subtract the positive value.
This sometimes allows a constant pool entry to be shared
between prologue and epilogue code. */
if (size < 0)
{ {
val = GEN_INT (size / 2 & -4); emit_insn (gen_movsi (const_reg, GEN_INT (-size)));
emit_insn (gen_addsi3 (reg, reg, val)); emit_insn (gen_subsi3 (reg, reg, const_reg));
val = GEN_INT (size - (size / 2 & -4));
} }
else else
{ {
rtx reg; emit_insn (gen_movsi (const_reg, GEN_INT (size)));
emit_insn (gen_addsi3 (reg, reg, const_reg));
/* If TEMP is invalid, we could temporarily save a general
register to MACL. However, there is currently no need
to handle this case, so just abort when we see it. */
if (temp < 0)
abort ();
reg = gen_rtx (REG, SImode, temp);
emit_insn (gen_movsi (reg, val));
val = reg;
} }
} }
insn = gen_addsi3 (reg, reg, val);
emit_insn (insn);
} }
} }
......
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