From c1b157a601ea9c1d2611d6b951ec0e46cc27ea01 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 21 Jun 2010 21:56:47 +0000 Subject: [PATCH] Properly handle psrldq when optimizing for Atom. gcc/ 2010-06-21 H.J. Lu PR target/44615 * config/i386/atom.md (atom_sseishft_2): Also check sseishft1. * config/i386/i386.md (type): Add sseishft1 * config/i386/ppro_insn (ppro_insn): Also check sseishft1. (ppro_insn_load): Likewise. (ppro_insn_store): Likewise. (ppro_insn_both): Likewise. * config/i386/sse.md (sse2_lshrv1ti3): Add atom_unit. (*vec_extractv2di_1_rex64_avx): Replace sseishft with sseishft1 for type. (*vec_extractv2di_1_avx): Likewise. (*vec_extractv2di_1_rex64): Replace sseishft with sseishft1 for type. Remove atom_unit. (*vec_extractv2di_1_sse2): Likewise. gcc/testsuite/ 2010-06-21 H.J. Lu PR target/44615 * gcc.target/i386/sse2-vec-2a.c: New. From-SVN: r161118 --- gcc/ChangeLog | 20 ++++++++++++++++++++ gcc/config/i386/atom.md | 7 ++++--- gcc/config/i386/i386.md | 2 +- gcc/config/i386/ppro.md | 8 ++++---- gcc/config/i386/sse.md | 11 +++++------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/i386/sse2-vec-2a.c | 5 +++++ 7 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/sse2-vec-2a.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 85041a1ac82..1359a3bf3b5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,23 @@ +2010-06-21 H.J. Lu + + PR target/44615 + * config/i386/atom.md (atom_sseishft_2): Also check sseishft1. + + * config/i386/i386.md (type): Add sseishft1 + + * config/i386/ppro_insn (ppro_insn): Also check sseishft1. + (ppro_insn_load): Likewise. + (ppro_insn_store): Likewise. + (ppro_insn_both): Likewise. + + * config/i386/sse.md (sse2_lshrv1ti3): Add atom_unit. + (*vec_extractv2di_1_rex64_avx): Replace sseishft with sseishft1 + for type. + (*vec_extractv2di_1_avx): Likewise. + (*vec_extractv2di_1_rex64): Replace sseishft with sseishft1 for + type. Remove atom_unit. + (*vec_extractv2di_1_sse2): Likewise. + 2010-06-21 DJ Delorie * diagnostic.h (diagnostic_classification_change_t): New. diff --git a/gcc/config/i386/atom.md b/gcc/config/i386/atom.md index a9c4c5d0576..1664269bac0 100644 --- a/gcc/config/i386/atom.md +++ b/gcc/config/i386/atom.md @@ -501,9 +501,10 @@ ;; if palignr or psrldq (define_insn_reservation "atom_sseishft_2" 1 (and (eq_attr "cpu" "atom") - (and (eq_attr "type" "sseishft") - (and (eq_attr "atom_unit" "sishuf") - (match_operand 2 "immediate_operand")))) + (ior (eq_attr "type" "sseishft1") + (and (eq_attr "type" "sseishft") + (and (eq_attr "atom_unit" "sishuf") + (match_operand 2 "immediate_operand"))))) "atom-simple-0") ;; if reg/mem op diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 777f8e77c7c..48946697ffc 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -357,7 +357,7 @@ push,pop,call,callv,leave, str,bitmanip, fmov,fop,fsgn,fmul,fdiv,fpspc,fcmov,fcmp,fxch,fistp,fisttp,frndint, - sselog,sselog1,sseiadd,sseiadd1,sseishft,sseimul, + sselog,sselog1,sseiadd,sseiadd1,sseishft,sseishft1,sseimul, sse,ssemov,sseadd,ssemul,ssecmp,ssecomi,ssecvt,ssecvt1,sseicvt,ssediv,sseins, ssemuladd,sse4arg,lwp, mmx,mmxmov,mmxadd,mmxmul,mmxcmp,mmxcvt,mmxshft" diff --git a/gcc/config/i386/ppro.md b/gcc/config/i386/ppro.md index 5e163d8296f..20f457ab192 100644 --- a/gcc/config/i386/ppro.md +++ b/gcc/config/i386/ppro.md @@ -731,7 +731,7 @@ (define_insn_reservation "ppro_insn" 1 (and (eq_attr "cpu" "pentiumpro") (and (eq_attr "memory" "none,unknown") - (eq_attr "type" "alu,alu1,negnot,incdec,icmp,test,setcc,icmov,push,pop,fxch,sseiadd,sseishft,sseimul,mmx,mmxadd,mmxcmp"))) + (eq_attr "type" "alu,alu1,negnot,incdec,icmp,test,setcc,icmov,push,pop,fxch,sseiadd,sseishft,sseishft1,sseimul,mmx,mmxadd,mmxcmp"))) "decodern,(p0|p1)") ;; read-modify and register-memory instructions have 2 or three uops, @@ -739,13 +739,13 @@ (define_insn_reservation "ppro_insn_load" 3 (and (eq_attr "cpu" "pentiumpro") (and (eq_attr "memory" "load") - (eq_attr "type" "alu,alu1,negnot,incdec,icmp,test,setcc,icmov,push,pop,fxch,sseiadd,sseishft,sseimul,mmx,mmxadd,mmxcmp"))) + (eq_attr "type" "alu,alu1,negnot,incdec,icmp,test,setcc,icmov,push,pop,fxch,sseiadd,sseishft,sseishft1,sseimul,mmx,mmxadd,mmxcmp"))) "decoder0,p2+(p0|p1)") (define_insn_reservation "ppro_insn_store" 1 (and (eq_attr "cpu" "pentiumpro") (and (eq_attr "memory" "store") - (eq_attr "type" "alu,alu1,negnot,incdec,icmp,test,setcc,icmov,push,pop,fxch,sseiadd,sseishft,sseimul,mmx,mmxadd,mmxcmp"))) + (eq_attr "type" "alu,alu1,negnot,incdec,icmp,test,setcc,icmov,push,pop,fxch,sseiadd,sseishft,sseishft1,sseimul,mmx,mmxadd,mmxcmp"))) "decoder0,(p0|p1),p4+p3") ;; read-modify-store instructions produce 4 uops so they have to be @@ -753,6 +753,6 @@ (define_insn_reservation "ppro_insn_both" 4 (and (eq_attr "cpu" "pentiumpro") (and (eq_attr "memory" "both") - (eq_attr "type" "alu,alu1,negnot,incdec,icmp,test,setcc,icmov,push,pop,fxch,sseiadd,sseishft,sseimul,mmx,mmxadd,mmxcmp"))) + (eq_attr "type" "alu,alu1,negnot,incdec,icmp,test,setcc,icmov,push,pop,fxch,sseiadd,sseishft,sseishft1,sseimul,mmx,mmxadd,mmxcmp"))) "decoder0,p2+(p0|p1),p4+p3") diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index b4046b82c41..1f8770fc37c 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -5967,6 +5967,7 @@ [(set_attr "type" "sseishft") (set_attr "prefix_data16" "1") (set_attr "length_immediate" "1") + (set_attr "atom_unit" "sishuf") (set_attr "mode" "TI")]) (define_insn "lshr3" @@ -7397,7 +7398,7 @@ vpsrldq\t{$8, %1, %0|%0, %1, 8} vmovq\t{%H1, %0|%0, %H1} vmov{q}\t{%H1, %0|%0, %H1}" - [(set_attr "type" "ssemov,sseishft,ssemov,imov") + [(set_attr "type" "ssemov,sseishft1,ssemov,imov") (set_attr "length_immediate" "*,1,*,*") (set_attr "memory" "*,none,*,*") (set_attr "prefix" "vex") @@ -7414,9 +7415,8 @@ psrldq\t{$8, %0|%0, 8} movq\t{%H1, %0|%0, %H1} mov{q}\t{%H1, %0|%0, %H1}" - [(set_attr "type" "ssemov,sseishft,ssemov,imov") + [(set_attr "type" "ssemov,sseishft1,ssemov,imov") (set_attr "length_immediate" "*,1,*,*") - (set_attr "atom_unit" "*,sishuf,*,*") (set_attr "memory" "*,none,*,*") (set_attr "mode" "V2SF,TI,TI,DI")]) @@ -7432,7 +7432,7 @@ vmovhps\t{%1, %0|%0, %1} vpsrldq\t{$8, %1, %0|%0, %1, 8} vmovq\t{%H1, %0|%0, %H1}" - [(set_attr "type" "ssemov,sseishft,ssemov") + [(set_attr "type" "ssemov,sseishft1,ssemov") (set_attr "length_immediate" "*,1,*") (set_attr "memory" "*,none,*") (set_attr "prefix" "vex") @@ -7449,9 +7449,8 @@ movhps\t{%1, %0|%0, %1} psrldq\t{$8, %0|%0, 8} movq\t{%H1, %0|%0, %H1}" - [(set_attr "type" "ssemov,sseishft,ssemov") + [(set_attr "type" "ssemov,sseishft1,ssemov") (set_attr "length_immediate" "*,1,*") - (set_attr "atom_unit" "*,sishuf,*") (set_attr "memory" "*,none,*") (set_attr "mode" "V2SF,TI,TI")]) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 77228c14ff1..f8f037289b8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-06-21 H.J. Lu + + PR target/44615 + * gcc.target/i386/sse2-vec-2a.c: New. + 2010-06-21 DJ Delorie * gcc.dg/pragma-diag-1.c: New. diff --git a/gcc/testsuite/gcc.target/i386/sse2-vec-2a.c b/gcc/testsuite/gcc.target/i386/sse2-vec-2a.c new file mode 100644 index 00000000000..f230f27d45a --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/sse2-vec-2a.c @@ -0,0 +1,5 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -msse2 -mtune=atom" } */ +/* { dg-require-effective-target sse2 } */ + +#include "sse2-vec-2.c" -- 2.30.2