diff options
author | Richard Henderson <rth@cygnus.com> | 2000-08-06 03:07:31 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-08-06 03:07:31 -0700 |
commit | 157229c314cbaa93f603a8d602a7d7301e36b59e (patch) | |
tree | 02cef3bb778936cb54cbe4ab870c9f3a115392b5 /gcc | |
parent | d2335c24035c080c8940984e9ca8dc39615216ea (diff) | |
download | gcc-157229c314cbaa93f603a8d602a7d7301e36b59e.zip gcc-157229c314cbaa93f603a8d602a7d7301e36b59e.tar.gz gcc-157229c314cbaa93f603a8d602a7d7301e36b59e.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i960/i960.md | 6 | ||||
-rw-r--r-- | gcc/config/pj/pj.md | 17 | ||||
-rw-r--r-- | gcc/stmt.c | 53 |
4 files changed, 34 insertions, 49 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c9a85a8..3dd7c3a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +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> * loop.c (try_swap_copy_prop): New function. diff --git a/gcc/config/i960/i960.md b/gcc/config/i960/i960.md index e42a894..600865b 100644 --- a/gcc/config/i960/i960.md +++ b/gcc/config/i960/i960.md @@ -2370,14 +2370,12 @@ emit_move_insn (gen_rtx (MEM, SImode, plus_constant (hard_frame_pointer_rtx, -56)), - replace_rtx (copy_rtx (handler), virtual_stack_vars_rtx, - hard_frame_pointer_rtx)); + handler); /* Next, we put stack into the saved $sp value in the frame. */ emit_move_insn (gen_rtx (MEM, SImode, plus_constant (hard_frame_pointer_rtx, -60)), - replace_rtx (copy_rtx (stack), virtual_stack_vars_rtx, - hard_frame_pointer_rtx)); + stack); /* And finally, we can now just ret to get all the values saved above into all the right registers, and also, all the local diff --git a/gcc/config/pj/pj.md b/gcc/config/pj/pj.md index e4a6c1e..6ce6b35 100644 --- a/gcc/config/pj/pj.md +++ b/gcc/config/pj/pj.md @@ -895,24 +895,13 @@ (match_operand:SI 3 "" "")] "" "{ - rtx addr; - rtx temp; + operands[2] = force_reg (Pmode, XEXP (operands[2], 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_nonlocal_goto_helper (force_reg (Pmode, XEXP (addr, 0)), - temp)); + emit_insn (gen_nonlocal_goto_helper (operands[2], operands[1])); emit_barrier (); DONE; - }") + }") ;; Function overhead. @@ -798,7 +798,7 @@ expand_goto (label) { struct function *p = find_function_data (context); rtx label_ref = gen_rtx_LABEL_REF (Pmode, label_rtx (label)); - rtx temp, handler_slot; + rtx handler_slot, static_chain, save_area; tree link; /* Find the corresponding handler slot for this label. */ @@ -816,49 +816,40 @@ expand_goto (label) case the virtual stack vars register gets instantiated differently 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) - emit_insn (gen_nonlocal_goto (lookup_static_chain (label), - copy_rtx (handler_slot), - copy_rtx (p->x_nonlocal_goto_stack_level), - label_ref)); + emit_insn (gen_nonlocal_goto (static_chain, handler_slot, + save_area, label_ref)); else #endif { - rtx addr; - /* Restore frame pointer for containing function. This sets the actual hard register used for the frame pointer to the location of the function's incoming static chain info. The non-local goto handler will then adjust it to contain the proper value and reload the argument pointer, if needed. */ - emit_move_insn (hard_frame_pointer_rtx, lookup_static_chain (label)); - - /* 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); + emit_move_insn (hard_frame_pointer_rtx, static_chain); + emit_stack_restore (SAVE_NONLOCAL, save_area, NULL_RTX); - /* USE of hard_frame_pointer_rtx added for consistency; not clear if - really needed. */ + /* USE of hard_frame_pointer_rtx added for consistency; + not clear if really needed. */ emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx)); emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx)); - emit_indirect_jump (temp); + emit_indirect_jump (handler_slot); } } else |