stmt.c (expand_goto): Do virtual_stack_vars_rtx replacement for HAVE_nonlocal_goto...
authorRichard Henderson <rth@cygnus.com>
Sun, 6 Aug 2000 10:07:31 +0000 (03:07 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sun, 6 Aug 2000 10:07:31 +0000 (03:07 -0700)
        * 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

gcc/ChangeLog
gcc/config/i960/i960.md
gcc/config/pj/pj.md
gcc/stmt.c

index c9a85a838c559891c2e5b57b7ddfe91333fee405..3dd7c3afdeecd7626c30f557ade9863d4b0d2122 100644 (file)
@@ -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.
index e42a894dffaf171ea985ea651c3ab12ff94e37e9..600865b4febae588c3fea2f53ae32ca60973afa6 100644 (file)
 
   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
index e4a6c1e4fafe10f04b6e46d106af0773a2e72dad..6ce6b351642a755c8cf8146832f016a2cc4c1680 100644 (file)
    (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;
-    }")
+   }")
 \f
 ;; Function overhead.
 
index 3f102cf28cd31f88b6bc795a97333b9ba8002441..47431f6471eb3ca6ccff6a1dfe4b81ae4b9d1803 100644 (file)
@@ -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