diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-04-05 10:32:23 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-04-05 10:32:23 +0000 |
commit | fe410b3e0f7de0376d98b922113c80f9ab4bd192 (patch) | |
tree | 2907bc726434f732f093ecd43d5f5ba62ac08265 /gcc/config/ia64 | |
parent | 941f2a0d21995a3e06f340891a639c4462850312 (diff) | |
download | gcc-fe410b3e0f7de0376d98b922113c80f9ab4bd192.tar.gz |
2008-04-05 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk r133930
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@133932 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/ia64')
-rw-r--r-- | gcc/config/ia64/constraints.md | 6 | ||||
-rw-r--r-- | gcc/config/ia64/div.md | 5 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.c | 2 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.h | 2 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.md | 15 |
5 files changed, 21 insertions, 9 deletions
diff --git a/gcc/config/ia64/constraints.md b/gcc/config/ia64/constraints.md index 0e6c232e358..0c24536c9aa 100644 --- a/gcc/config/ia64/constraints.md +++ b/gcc/config/ia64/constraints.md @@ -52,6 +52,12 @@ (and (match_code "const_int") (match_test "(unsigned HOST_WIDE_INT)ival + 0x200000 < 0x400000"))) +(define_constraint "j" + "(2**32-2**13)..(2**32-1) for addp4 instructions" + (and (match_code "const_int") + (match_test "(unsigned HOST_WIDE_INT)ival >= 0xffffe000 + && (unsigned HOST_WIDE_INT)ival <= 0xffffffff"))) + (define_constraint "K" "8 bit signed immediate for logical instructions" (and (match_code "const_int") diff --git a/gcc/config/ia64/div.md b/gcc/config/ia64/div.md index a6547a680ff..45e745963c2 100644 --- a/gcc/config/ia64/div.md +++ b/gcc/config/ia64/div.md @@ -199,8 +199,9 @@ (define_insn "recip_approx_rf" [(set (match_operand:RF 0 "fr_register_operand" "=f") - (div:RF (match_operand:RF 1 "fr_register_operand" "f") - (match_operand:RF 2 "fr_register_operand" "f"))) + (unspec:RF [(match_operand:RF 1 "fr_register_operand" "f") + (match_operand:RF 2 "fr_register_operand" "f")] + UNSPEC_FR_RECIP_APPROX_RES)) (set (match_operand:BI 3 "register_operand" "=c") (unspec:BI [(match_dup 1) (match_dup 2)] UNSPEC_FR_RECIP_APPROX)) (use (match_operand:SI 4 "const_int_operand" ""))] diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index f2d00cf3cc8..ceda8833db3 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -5898,6 +5898,7 @@ rtx_needs_barrier (rtx x, struct reg_flags flags, int pred) case UNSPEC_FR_RECIP_APPROX: case UNSPEC_SHRP: case UNSPEC_COPYSIGN: + case UNSPEC_FR_RECIP_APPROX_RES: need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 0), flags, pred); need_barrier |= rtx_needs_barrier (XVECEXP (x, 0, 1), flags, pred); break; @@ -9693,6 +9694,7 @@ ia64_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED, final_start_function (insn, file, 1); final (insn, file, 1); final_end_function (); + free_after_compilation (cfun); reload_completed = 0; epilogue_completed = 0; diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h index 5f0c28ce706..618ba24814b 100644 --- a/gcc/config/ia64/ia64.h +++ b/gcc/config/ia64/ia64.h @@ -982,7 +982,7 @@ enum reg_class #define INIT_EXPANDERS \ do { \ ia64_init_expanders (); \ - if (cfun && cfun->emit->regno_pointer_align) \ + if (rtl.emit.regno_pointer_align) \ REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) = 64; \ } while (0) diff --git a/gcc/config/ia64/ia64.md b/gcc/config/ia64/ia64.md index 52f26aa84ab..068e607c1e9 100644 --- a/gcc/config/ia64/ia64.md +++ b/gcc/config/ia64/ia64.md @@ -86,6 +86,7 @@ (UNSPEC_LDCCLR 43) (UNSPEC_CHKACLR 45) (UNSPEC_CHKS 47) + (UNSPEC_FR_RECIP_APPROX_RES 48) ]) (define_constants @@ -322,12 +323,13 @@ }) (define_insn "*movsi_internal" - [(set (match_operand:SI 0 "destination_operand" "=r,r,r,r, m, r,*f,*f, r,*d") - (match_operand:SI 1 "move_operand" "rO,J,i,m,rO,*f,rO,*f,*d,rK"))] + [(set (match_operand:SI 0 "destination_operand" "=r,r,r,r,r, m, r,*f,*f, r,*d") + (match_operand:SI 1 "move_operand" "rO,J,j,i,m,rO,*f,rO,*f,*d,rK"))] "ia64_move_ok (operands[0], operands[1])" "@ mov %0 = %r1 addl %0 = %1, r0 + addp4 %0 = %1 - 0x100000000, r0 movl %0 = %1 ld4%O1 %0 = %1%P1 st4%Q0 %0 = %r1%P0 @@ -337,7 +339,7 @@ mov %0 = %1 mov %0 = %r1" ;; frar_m, toar_m ??? why not frar_i and toar_i - [(set_attr "itanium_class" "ialu,ialu,long_i,ld,st,frfr,tofr,fmisc,frar_m,toar_m")]) + [(set_attr "itanium_class" "ialu,ialu,ialu,long_i,ld,st,frfr,tofr,fmisc,frar_m,toar_m")]) (define_expand "movdi" [(set (match_operand:DI 0 "general_operand" "") @@ -352,14 +354,15 @@ (define_insn "*movdi_internal" [(set (match_operand:DI 0 "destination_operand" - "=r,r,r,r, m, r,*f,*f,*f, Q, r,*b, r,*e, r,*d, r,*c") + "=r,r,r,r,r, m, r,*f,*f,*f, Q, r,*b, r,*e, r,*d, r,*c") (match_operand:DI 1 "move_operand" - "rO,JT,i,m,rO,*f,rO,*f, Q,*f,*b,rO,*e,rK,*d,rK,*c,rO"))] + "rO,JT,j,i,m,rO,*f,rO,*f, Q,*f,*b,rO,*e,rK,*d,rK,*c,rO"))] "ia64_move_ok (operands[0], operands[1])" { static const char * const alt[] = { "%,mov %0 = %r1", "%,addl %0 = %1, r0", + "%,addp4 %0 = %1 - 0x100000000, r0", "%,movl %0 = %1", "%,ld8%O1 %0 = %1%P1", "%,st8%Q0 %0 = %r1%P0", @@ -383,7 +386,7 @@ return alt[which_alternative]; } - [(set_attr "itanium_class" "ialu,ialu,long_i,ld,st,frfr,tofr,fmisc,fld,stf,frbr,tobr,frar_i,toar_i,frar_m,toar_m,frpr,topr")]) + [(set_attr "itanium_class" "ialu,ialu,ialu,long_i,ld,st,frfr,tofr,fmisc,fld,stf,frbr,tobr,frar_i,toar_i,frar_m,toar_m,frpr,topr")]) (define_mode_iterator MODE [BI QI HI SI DI SF DF XF TI]) (define_mode_iterator MODE_FOR_EXTEND [QI HI SI]) |