Commit 9df748c0 by Anthony Green Committed by Anthony Green

Tweak moxie prologue and epilogue code.

From-SVN: r149163
parent b0f0c817
2009-07-01 Anthony Green <green@moxielogic.com>
* config/moxie/moxie.c (moxie_expand_prologue): Use dec
instruction when possible.
(moxie_expand_prologue): Ditto. Also, save an instruction and
some complexity by popping off of $r12 instead of $sp.
* config/moxie/moxie.md (movsi_pop): Don't assume $sp. Take two
operands.
2009-07-01 Richard Henderson <rth@redhat.com> 2009-07-01 Richard Henderson <rth@redhat.com>
PR bootstrap/40347 PR bootstrap/40347
......
...@@ -273,8 +273,18 @@ moxie_expand_prologue (void) ...@@ -273,8 +273,18 @@ moxie_expand_prologue (void)
if (cfun->machine->size_for_adjusting_sp > 0) if (cfun->machine->size_for_adjusting_sp > 0)
{ {
if (cfun->machine->size_for_adjusting_sp <= 255)
{
insn = emit_insn (gen_subsi3 (stack_pointer_rtx,
stack_pointer_rtx,
GEN_INT (cfun->machine->size_for_adjusting_sp)));
RTX_FRAME_RELATED_P (insn) = 1;
}
else
{
insn = insn =
emit_insn (gen_movsi (gen_rtx_REG (Pmode, MOXIE_R12), emit_insn (gen_movsi
(gen_rtx_REG (Pmode, MOXIE_R12),
GEN_INT (-cfun->machine->size_for_adjusting_sp))); GEN_INT (-cfun->machine->size_for_adjusting_sp)));
RTX_FRAME_RELATED_P (insn) = 1; RTX_FRAME_RELATED_P (insn) = 1;
insn = emit_insn (gen_addsi3 (stack_pointer_rtx, insn = emit_insn (gen_addsi3 (stack_pointer_rtx,
...@@ -282,6 +292,7 @@ moxie_expand_prologue (void) ...@@ -282,6 +292,7 @@ moxie_expand_prologue (void)
gen_rtx_REG (Pmode, MOXIE_R12))); gen_rtx_REG (Pmode, MOXIE_R12)));
RTX_FRAME_RELATED_P (insn) = 1; RTX_FRAME_RELATED_P (insn) = 1;
} }
}
} }
void void
...@@ -293,26 +304,25 @@ moxie_expand_epilogue (void) ...@@ -293,26 +304,25 @@ moxie_expand_epilogue (void)
if (cfun->machine->callee_saved_reg_size != 0) if (cfun->machine->callee_saved_reg_size != 0)
{ {
reg = gen_rtx_REG (Pmode, MOXIE_R12); reg = gen_rtx_REG (Pmode, MOXIE_R12);
if (cfun->machine->callee_saved_reg_size <= 255)
{
emit_move_insn (reg, hard_frame_pointer_rtx);
emit_insn (gen_subsi3
(reg, reg,
GEN_INT (cfun->machine->callee_saved_reg_size)));
}
else
{
emit_move_insn (reg, emit_move_insn (reg,
GEN_INT (-cfun->machine->callee_saved_reg_size)); GEN_INT (-cfun->machine->callee_saved_reg_size));
emit_insn (gen_addsi3 (reg, reg, hard_frame_pointer_rtx)); emit_insn (gen_addsi3 (reg, reg, hard_frame_pointer_rtx));
insn = emit_move_insn (stack_pointer_rtx, reg); }
RTX_FRAME_RELATED_P (insn) = 1;
add_reg_note (insn, REG_CFA_DEF_CFA,
plus_constant (stack_pointer_rtx,
cfun->machine->callee_saved_reg_size));
for (regno = FIRST_PSEUDO_REGISTER; regno-- > 0; ) for (regno = FIRST_PSEUDO_REGISTER; regno-- > 0; )
if (!fixed_regs[regno] && !call_used_regs[regno] if (!fixed_regs[regno] && !call_used_regs[regno]
&& df_regs_ever_live_p (regno)) && df_regs_ever_live_p (regno))
{ {
reg = gen_rtx_REG (Pmode, regno); rtx preg = gen_rtx_REG (Pmode, regno);
insn = emit_insn (gen_movsi_pop (reg)); insn = emit_insn (gen_movsi_pop (reg, preg));
RTX_FRAME_RELATED_P (insn) = 1;
add_reg_note (insn, REG_CFA_ADJUST_CFA,
gen_rtx_SET (VOIDmode, stack_pointer_rtx,
plus_constant (stack_pointer_rtx,
UNITS_PER_WORD)));
add_reg_note (insn, REG_CFA_RESTORE, reg);
} }
} }
......
...@@ -195,10 +195,10 @@ ...@@ -195,10 +195,10 @@
;; Pop a register from the stack ;; Pop a register from the stack
(define_insn "movsi_pop" (define_insn "movsi_pop"
[(set:SI (match_operand:SI 0 "register_operand" "=r") [(set:SI (match_operand:SI 1 "register_operand" "=r")
(mem:SI (post_inc:SI (reg:SI 1))))] (mem:SI (post_inc:SI (match_operand:SI 0 "register_operand" "r"))))]
"" ""
"pop $sp, %0") "pop %0, %1")
(define_expand "movsi" (define_expand "movsi"
[(set (match_operand:SI 0 "general_operand" "") [(set (match_operand:SI 0 "general_operand" "")
......
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