* config/alpha/alpha.md (force_movdi): New insn.
* config/alpha/alpha.c (alpha_expand_prologue): Use it.
Tweek FRP marking of VMS prologue insns.
* config/alpha/vms.h (EPILOGUE_USES): New.
From-SVN: r44594
+2001-08-03 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/alpha.md (force_movdi): New insn.
+ * config/alpha/alpha.c (alpha_expand_prologue): Use it.
+ Tweek FRP marking of VMS prologue insns.
+ * config/alpha/vms.h (EPILOGUE_USES): New.
+
2001-08-02 Richard Henderson <rth@redhat.com>
* Makefile.in, mklibgcc.in: Revert mkinstalldirs change.
if (TARGET_ABI_OPEN_VMS)
{
if (!vms_is_stack_procedure)
- /* Register frame procedures fave the fp. */
- FRP (emit_move_insn (gen_rtx_REG (DImode, vms_save_fp_regno),
- hard_frame_pointer_rtx));
+ /* Register frame procedures save the fp. */
+ /* ??? Ought to have a dwarf2 save for this. */
+ emit_move_insn (gen_rtx_REG (DImode, vms_save_fp_regno),
+ hard_frame_pointer_rtx);
if (vms_base_regno != REG_PV)
- FRP (emit_move_insn (gen_rtx_REG (DImode, vms_base_regno),
- gen_rtx_REG (DImode, REG_PV)));
+ emit_insn (gen_force_movdi (gen_rtx_REG (DImode, vms_base_regno),
+ gen_rtx_REG (DImode, REG_PV)));
if (vms_unwind_regno == HARD_FRAME_POINTER_REGNUM)
FRP (emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx));
(UNSPECV_MCOUNT 8)
(UNSPECV_LDGP1 9)
(UNSPECV_LDGP2 10)
+ (UNSPECV_FORCE_MOV 11)
])
\f
;; Processor type -- this attribute must exactly match the processor_type
itoft %1,%0"
[(set_attr "type" "ilog,iadd,iadd,ldsym,ild,ist,fcpys,fld,fst,ftoi,itof")])
+;; VMS needs to set up "vms_base_regno" for unwinding. This move
+;; often appears dead to the life analysis code, at which point we
+;; abort for emitting dead prologue instructions. Force this live.
+
+(define_insn "force_movdi"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "r")]
+ UNSPECV_FORCE_MOV))]
+ ""
+ "mov %1,%0"
+ [(set_attr "type" "ilog")])
+
;; We do three major things here: handle mem->mem, put 64-bit constants in
;; memory, and construct long 32-bit constants.
#undef HARD_FRAME_POINTER_REGNUM
#define HARD_FRAME_POINTER_REGNUM 29
+/* Define registers used by the epilogue and return instruction. */
+#undef EPILOGUE_USES
+#define EPILOGUE_USES(REGNO) ((REGNO) == 26 || (REGNO) == 29)
+
#undef CAN_ELIMINATE
#define CAN_ELIMINATE(FROM, TO) \
((TO) != STACK_POINTER_REGNUM || ! alpha_using_fp ())