Commit 157229c3 by Richard Henderson Committed by Richard Henderson

stmt.c (expand_goto): Do virtual_stack_vars_rtx replacement for HAVE_nonlocal_goto as well.

        * stmt.c (expand_goto): Do virtual_stack_vars_rtx replacement for
        HAVE_nonlocal_goto as well.
        * config/i960/i960.md (nonlocal_goto): Don't do it here.
        * config/pj/pj.md (nonlocal_goto): Likewise.

From-SVN: r35521
parent d2335c24
2000-08-06 Richard Henderson <rth@cygnus.com>
* stmt.c (expand_goto): Do virtual_stack_vars_rtx replacement for
HAVE_nonlocal_goto as well.
* config/i960/i960.md (nonlocal_goto): Don't do it here.
* config/pj/pj.md (nonlocal_goto): Likewise.
2000-08-07 Michael Hayes <mhayes@cygnus.com> 2000-08-07 Michael Hayes <mhayes@cygnus.com>
* loop.c (try_swap_copy_prop): New function. * loop.c (try_swap_copy_prop): New function.
......
...@@ -2370,14 +2370,12 @@ ...@@ -2370,14 +2370,12 @@
emit_move_insn (gen_rtx (MEM, SImode, emit_move_insn (gen_rtx (MEM, SImode,
plus_constant (hard_frame_pointer_rtx, -56)), plus_constant (hard_frame_pointer_rtx, -56)),
replace_rtx (copy_rtx (handler), virtual_stack_vars_rtx, handler);
hard_frame_pointer_rtx));
/* Next, we put stack into the saved $sp value in the frame. */ /* Next, we put stack into the saved $sp value in the frame. */
emit_move_insn (gen_rtx (MEM, SImode, emit_move_insn (gen_rtx (MEM, SImode,
plus_constant (hard_frame_pointer_rtx, -60)), plus_constant (hard_frame_pointer_rtx, -60)),
replace_rtx (copy_rtx (stack), virtual_stack_vars_rtx, stack);
hard_frame_pointer_rtx));
/* And finally, we can now just ret to get all the values saved /* And finally, we can now just ret to get all the values saved
above into all the right registers, and also, all the local above into all the right registers, and also, all the local
......
...@@ -895,24 +895,13 @@ ...@@ -895,24 +895,13 @@
(match_operand:SI 3 "" "")] (match_operand:SI 3 "" "")]
"" ""
"{ "{
rtx addr; operands[2] = force_reg (Pmode, XEXP (operands[2], 0));
rtx temp;
emit_move_insn (hard_frame_pointer_rtx, operands[0]); emit_move_insn (hard_frame_pointer_rtx, operands[0]);
temp = copy_to_reg (replace_rtx (operands[1],
virtual_stack_vars_rtx,
hard_frame_pointer_rtx));
addr = replace_rtx (copy_rtx (operands[2]),
virtual_stack_vars_rtx,
hard_frame_pointer_rtx);
emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx)); emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
emit_insn (gen_nonlocal_goto_helper (force_reg (Pmode, XEXP (addr, 0)), emit_insn (gen_nonlocal_goto_helper (operands[2], operands[1]));
temp));
emit_barrier (); emit_barrier ();
DONE; DONE;
}") }")
;; Function overhead. ;; Function overhead.
......
...@@ -798,7 +798,7 @@ expand_goto (label) ...@@ -798,7 +798,7 @@ expand_goto (label)
{ {
struct function *p = find_function_data (context); struct function *p = find_function_data (context);
rtx label_ref = gen_rtx_LABEL_REF (Pmode, label_rtx (label)); rtx label_ref = gen_rtx_LABEL_REF (Pmode, label_rtx (label));
rtx temp, handler_slot; rtx handler_slot, static_chain, save_area;
tree link; tree link;
/* Find the corresponding handler slot for this label. */ /* Find the corresponding handler slot for this label. */
...@@ -816,49 +816,40 @@ expand_goto (label) ...@@ -816,49 +816,40 @@ expand_goto (label)
case the virtual stack vars register gets instantiated differently case the virtual stack vars register gets instantiated differently
in the parent than in the child. */ in the parent than in the child. */
static_chain = copy_to_reg (lookup_static_chain (label));
/* Get addr of containing function's current nonlocal goto handler,
which will do any cleanups and then jump to the label. */
handler_slot = copy_to_reg (replace_rtx (copy_rtx (handler_slot),
virtual_stack_vars_rtx,
static_chain));
/* Get addr of containing function's nonlocal save area. */
save_area = p->x_nonlocal_goto_stack_level;
if (save_area)
save_area = replace_rtx (copy_rtx (save_area),
virtual_stack_vars_rtx, static_chain);
#if HAVE_nonlocal_goto #if HAVE_nonlocal_goto
if (HAVE_nonlocal_goto) if (HAVE_nonlocal_goto)
emit_insn (gen_nonlocal_goto (lookup_static_chain (label), emit_insn (gen_nonlocal_goto (static_chain, handler_slot,
copy_rtx (handler_slot), save_area, label_ref));
copy_rtx (p->x_nonlocal_goto_stack_level),
label_ref));
else else
#endif #endif
{ {
rtx addr;
/* Restore frame pointer for containing function. /* Restore frame pointer for containing function.
This sets the actual hard register used for the frame pointer This sets the actual hard register used for the frame pointer
to the location of the function's incoming static chain info. to the location of the function's incoming static chain info.
The non-local goto handler will then adjust it to contain the The non-local goto handler will then adjust it to contain the
proper value and reload the argument pointer, if needed. */ proper value and reload the argument pointer, if needed. */
emit_move_insn (hard_frame_pointer_rtx, lookup_static_chain (label)); emit_move_insn (hard_frame_pointer_rtx, static_chain);
emit_stack_restore (SAVE_NONLOCAL, save_area, NULL_RTX);
/* We have now loaded the frame pointer hardware register with
the address of that corresponds to the start of the virtual
stack vars. So replace virtual_stack_vars_rtx in all
addresses we use with stack_pointer_rtx. */
/* Get addr of containing function's current nonlocal goto handler,
which will do any cleanups and then jump to the label. */
addr = copy_rtx (handler_slot);
temp = copy_to_reg (replace_rtx (addr, virtual_stack_vars_rtx,
hard_frame_pointer_rtx));
/* Restore the stack pointer. Note this uses fp just restored. */
addr = p->x_nonlocal_goto_stack_level;
if (addr)
addr = replace_rtx (copy_rtx (addr),
virtual_stack_vars_rtx,
hard_frame_pointer_rtx);
emit_stack_restore (SAVE_NONLOCAL, addr, NULL_RTX);
/* USE of hard_frame_pointer_rtx added for consistency; not clear if /* USE of hard_frame_pointer_rtx added for consistency;
really needed. */ not clear if really needed. */
emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx)); emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx)); emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
emit_indirect_jump (temp); emit_indirect_jump (handler_slot);
} }
} }
else else
......
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