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
This commit is contained in:
Richard Henderson 2000-02-06 05:19:20 -08:00 committed by Richard Henderson
parent 69732dcb9c
commit 9a7372d646
3 changed files with 29 additions and 3 deletions

View File

@ -11,6 +11,10 @@
* jump.c (jump_optimize_1): Remove code to insert a return insn
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>
* simplify-rtx.c (simplify_relational_operation): Canonicalize

View File

@ -1555,15 +1555,29 @@ symbolic_reference_mentioned_p (op)
int
ix86_can_use_return_insn_p ()
{
HOST_WIDE_INT tsize;
int nregs;
#ifdef NON_SAVING_SETJMP
if (NON_SAVING_SETJMP && current_function_calls_setjmp)
return 0;
#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;
return ix86_nsaved_regs () == 0 || ! frame_pointer_needed;
/* 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;
tsize = ix86_compute_frame_size (get_frame_size (), &nregs, NULL, NULL);
return tsize == 0 && nregs == 0;
}
static char *pic_label_name;

View File

@ -7218,7 +7218,15 @@
(define_expand "return"
[(return)]
"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"
[(return)]