aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-08-06 03:07:31 -0700
committerRichard Henderson <rth@gcc.gnu.org>2000-08-06 03:07:31 -0700
commit157229c314cbaa93f603a8d602a7d7301e36b59e (patch)
tree02cef3bb778936cb54cbe4ab870c9f3a115392b5 /gcc
parentd2335c24035c080c8940984e9ca8dc39615216ea (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/config/i960/i960.md6
-rw-r--r--gcc/config/pj/pj.md17
-rw-r--r--gcc/stmt.c53
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.
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 3f102cf..47431f6 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -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