alpha.md (builtin_longjmp_internal): New.
authorRichard Henderson <rth@redhat.com>
Wed, 24 Jan 2001 09:00:02 +0000 (01:00 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 24 Jan 2001 09:00:02 +0000 (01:00 -0800)
        * config/alpha/alpha.md (builtin_longjmp_internal): New.
        (builtin_longjmp): Use it instead of emit_indirect_jump.

From-SVN: r39232

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

index 7c1958cd33d42a470c36b58104d165ebcf6373e0..4a2c49a8354f7d184bcbe0711b3485005f5e79f9 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 23d9f5ae6ddcbf666b7b630b9e962ed3e4504fb3..9961617a3dc9cd59d3e9f82d7f95445d1b976ab5 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"