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,14 +273,25 @@ moxie_expand_prologue (void) ...@@ -273,14 +273,25 @@ moxie_expand_prologue (void)
if (cfun->machine->size_for_adjusting_sp > 0) if (cfun->machine->size_for_adjusting_sp > 0)
{ {
insn = if (cfun->machine->size_for_adjusting_sp <= 255)
emit_insn (gen_movsi (gen_rtx_REG (Pmode, MOXIE_R12), {
GEN_INT (-cfun->machine->size_for_adjusting_sp))); insn = emit_insn (gen_subsi3 (stack_pointer_rtx,
RTX_FRAME_RELATED_P (insn) = 1; stack_pointer_rtx,
insn = emit_insn (gen_addsi3 (stack_pointer_rtx, GEN_INT (cfun->machine->size_for_adjusting_sp)));
stack_pointer_rtx, RTX_FRAME_RELATED_P (insn) = 1;
gen_rtx_REG (Pmode, MOXIE_R12))); }
RTX_FRAME_RELATED_P (insn) = 1; else
{
insn =
emit_insn (gen_movsi
(gen_rtx_REG (Pmode, MOXIE_R12),
GEN_INT (-cfun->machine->size_for_adjusting_sp)));
RTX_FRAME_RELATED_P (insn) = 1;
insn = emit_insn (gen_addsi3 (stack_pointer_rtx,
stack_pointer_rtx,
gen_rtx_REG (Pmode, MOXIE_R12)));
RTX_FRAME_RELATED_P (insn) = 1;
}
} }
} }
...@@ -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);
emit_move_insn (reg, if (cfun->machine->callee_saved_reg_size <= 255)
GEN_INT (-cfun->machine->callee_saved_reg_size)); {
emit_insn (gen_addsi3 (reg, reg, hard_frame_pointer_rtx)); emit_move_insn (reg, hard_frame_pointer_rtx);
insn = emit_move_insn (stack_pointer_rtx, reg); emit_insn (gen_subsi3
RTX_FRAME_RELATED_P (insn) = 1; (reg, reg,
add_reg_note (insn, REG_CFA_DEF_CFA, GEN_INT (cfun->machine->callee_saved_reg_size)));
plus_constant (stack_pointer_rtx, }
cfun->machine->callee_saved_reg_size)); else
{
emit_move_insn (reg,
GEN_INT (-cfun->machine->callee_saved_reg_size));
emit_insn (gen_addsi3 (reg, reg, hard_frame_pointer_rtx));
}
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