* 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
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 || frame_pointer_needed)
+ return 0;
- if (! reload_completed)
+ /* 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 ix86_nsaved_regs () == 0 || ! frame_pointer_needed;
+ tsize = ix86_compute_frame_size (get_frame_size (), &nregs, NULL, NULL);
+ return tsize == 0 && nregs == 0;
}
\f
static char *pic_label_name;
(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)]