diff options
author | Richard Henderson <rth@redhat.com> | 2001-08-03 01:23:54 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2001-08-03 01:23:54 -0700 |
commit | 54aaa4ea8d6157dd66ba01ed1d015b439d775378 (patch) | |
tree | e34b46a6d6ce98394a32472b24524db01b5f0993 /gcc | |
parent | 62dcadeb4af2ffda086f75a8bfd387f6ca8f2c24 (diff) | |
download | gcc-54aaa4ea8d6157dd66ba01ed1d015b439d775378.zip gcc-54aaa4ea8d6157dd66ba01ed1d015b439d775378.tar.gz gcc-54aaa4ea8d6157dd66ba01ed1d015b439d775378.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/alpha/alpha.c | 11 | ||||
-rw-r--r-- | gcc/config/alpha/alpha.md | 13 | ||||
-rw-r--r-- | gcc/config/alpha/vms.h | 4 |
4 files changed, 30 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3c9e19d..b20204d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index 92935e3..2456e99 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -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)); diff --git a/gcc/config/alpha/alpha.md b/gcc/config/alpha/alpha.md index b408118..3e7d4f5 100644 --- a/gcc/config/alpha/alpha.md +++ b/gcc/config/alpha/alpha.md @@ -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. diff --git a/gcc/config/alpha/vms.h b/gcc/config/alpha/vms.h index 3f8fa07..d10a19d 100644 --- a/gcc/config/alpha/vms.h +++ b/gcc/config/alpha/vms.h @@ -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 ()) |