+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
"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"