OSDN Git Service

* config/alpha/alpha.md (builtin_longjmp_internal): New.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 24 Jan 2001 09:00:02 +0000 (09:00 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 24 Jan 2001 09:00:02 +0000 (09:00 +0000)
        (builtin_longjmp): Use it instead of emit_indirect_jump.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@39232 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/alpha/alpha.md

index 7c1958c..4a2c49a 100644 (file)
@@ -1,3 +1,8 @@
+2001-01-24  Richard Henderson  <rth@redhat.com>
+
+       * config/alpha/alpha.md (builtin_longjmp_internal): New.
+       (builtin_longjmp): Use it instead of emit_indirect_jump.
+
 2001-01-23  John David Anglin  <dave@hiauly1.hia.nrc.ca>
 
        * bb-reorder.c (make_reorder_chain_1): Handle case where
index 23d9f5a..9961617 100644 (file)
   "lda %0,%1(%0)")
 
 (define_expand "builtin_longjmp"
-  [(unspec_volatile [(match_operand:DI 0 "register_operand" "r")] 3)]
+  [(use (match_operand:DI 0 "register_operand" "r"))]
   "! TARGET_OPEN_VMS && ! TARGET_WINDOWS_NT"
   "
 {
   /* Load the label we are jumping through into $27 so that we know
      where to look for it when we get back to setjmp's function for
      restoring the gp.  */
-  emit_indirect_jump (pv);
+  emit_jump_insn (gen_builtin_longjmp_internal (pv));
+  emit_barrier ();
   DONE;
 }")
 
+;; This is effectively a copy of indirect_jump, but constrained such
+;; that register renaming cannot foil our cunning plan with $27.
+(define_insn "builtin_longjmp_internal"
+  [(set (pc)
+       (unspec_volatile [(match_operand:DI 0 "register_operand" "c")] 3))]
+  ""
+  "jmp $31,(%0),0"
+  [(set_attr "type" "ibr")])
+
 (define_insn "*builtin_setjmp_receiver_sub_label"
   [(unspec_volatile [(label_ref (match_operand 0 "" ""))] 2)]
   "! TARGET_OPEN_VMS && ! TARGET_WINDOWS_NT && TARGET_AS_CAN_SUBTRACT_LABELS"