alpha.md (force_movdi): New insn.

* 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
This commit is contained in:
Richard Henderson 2001-08-03 01:23:54 -07:00 committed by Richard Henderson
parent 62dcadeb4a
commit 54aaa4ea8d
4 changed files with 30 additions and 5 deletions

View File

@ -1,3 +1,10 @@
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.

View File

@ -4855,13 +4855,14 @@ alpha_expand_prologue ()
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));

View File

@ -47,6 +47,7 @@
(UNSPECV_MCOUNT 8)
(UNSPECV_LDGP1 9)
(UNSPECV_LDGP2 10)
(UNSPECV_FORCE_MOV 11)
])
;; Processor type -- this attribute must exactly match the processor_type
@ -4880,6 +4881,18 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi"
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.

View File

@ -111,6 +111,10 @@ Boston, MA 02111-1307, USA. */
#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 ())