Commit 9a7372d6 by Richard Henderson Committed by Richard Henderson

i386.c (ix86_can_use_return_insn_p): Fail for large poped args and for non-empty stack frames.

        * i386.c (ix86_can_use_return_insn_p): Fail for large poped args
        and for non-empty stack frames.
        * i386.md (return): Expand to return-pop as needed.

From-SVN: r31827
parent 69732dcb
...@@ -11,6 +11,10 @@ ...@@ -11,6 +11,10 @@
* jump.c (jump_optimize_1): Remove code to insert a return insn * jump.c (jump_optimize_1): Remove code to insert a return insn
on the fallthru to the exit block. on the fallthru to the exit block.
* i386.c (ix86_can_use_return_insn_p): Fail for large poped args
and for non-empty stack frames.
* i386.md (return): Expand to return-pop as needed.
2000-02-06 Richard Henderson <rth@cygnus.com> 2000-02-06 Richard Henderson <rth@cygnus.com>
* simplify-rtx.c (simplify_relational_operation): Canonicalize * simplify-rtx.c (simplify_relational_operation): Canonicalize
......
...@@ -1555,15 +1555,29 @@ symbolic_reference_mentioned_p (op) ...@@ -1555,15 +1555,29 @@ symbolic_reference_mentioned_p (op)
int int
ix86_can_use_return_insn_p () ix86_can_use_return_insn_p ()
{ {
HOST_WIDE_INT tsize;
int nregs;
#ifdef NON_SAVING_SETJMP #ifdef NON_SAVING_SETJMP
if (NON_SAVING_SETJMP && current_function_calls_setjmp) if (NON_SAVING_SETJMP && current_function_calls_setjmp)
return 0; return 0;
#endif #endif
#ifdef FUNCTION_BLOCK_PROFILER_EXIT
if (profile_block_flag == 2)
return 0;
#endif
if (! reload_completed) if (! reload_completed || frame_pointer_needed)
return 0;
/* Don't allow more than 32 pop, since that's all we can do
with one instruction. */
if (current_function_pops_args
&& current_function_args_size >= 32768)
return 0; return 0;
return ix86_nsaved_regs () == 0 || ! frame_pointer_needed; tsize = ix86_compute_frame_size (get_frame_size (), &nregs, NULL, NULL);
return tsize == 0 && nregs == 0;
} }
static char *pic_label_name; static char *pic_label_name;
......
...@@ -7218,7 +7218,15 @@ ...@@ -7218,7 +7218,15 @@
(define_expand "return" (define_expand "return"
[(return)] [(return)]
"ix86_can_use_return_insn_p ()" "ix86_can_use_return_insn_p ()"
"") "
{
if (current_function_pops_args)
{
rtx popc = GEN_INT (current_function_pops_args);
emit_jump_insn (gen_return_pop_internal (popc));
DONE;
}
}")
(define_insn "return_internal" (define_insn "return_internal"
[(return)] [(return)]
......
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