OSDN Git Service

PR target/49133
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 24 May 2011 15:31:12 +0000 (15:31 +0000)
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 24 May 2011 15:31:12 +0000 (15:31 +0000)
* config/i386/sse.md (sse2_loadhpd): Remove shufpd alternative.

testsuite/ChangeLog:

PR target/49133
* g++.dg/other/pr49133.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@174122 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/sse.md
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/pr49133.C [new file with mode: 0644]

index 34827e3..3e4b663 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-24  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/49133
+       * config/i386/sse.md (sse2_loadhpd): Remove shufpd alternative.
+
 2011-05-24  Eric Botcazou  <ebotcazou@adacore.com>
            Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
 2011-05-24  Eric Botcazou  <ebotcazou@adacore.com>
            Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
index ddd66fd..2bffb09 100644 (file)
 ;; see comment above inline_secondary_memory_needed function in i386.c
 (define_insn "sse2_loadhpd"
   [(set (match_operand:V2DF 0 "nonimmediate_operand"
 ;; see comment above inline_secondary_memory_needed function in i386.c
 (define_insn "sse2_loadhpd"
   [(set (match_operand:V2DF 0 "nonimmediate_operand"
-         "=x,x,x,x,x,o,o ,o")
+         "=x,x,x,x,o,o ,o")
        (vec_concat:V2DF
          (vec_select:DF
            (match_operand:V2DF 1 "nonimmediate_operand"
        (vec_concat:V2DF
          (vec_select:DF
            (match_operand:V2DF 1 "nonimmediate_operand"
-         " 0,x,0,x,x,0,0 ,0")
+         " 0,x,0,x,0,0 ,0")
            (parallel [(const_int 0)]))
          (match_operand:DF 2 "nonimmediate_operand"
            (parallel [(const_int 0)]))
          (match_operand:DF 2 "nonimmediate_operand"
-         " m,m,x,x,0,x,*f,r")))]
+         " m,m,x,x,x,*f,r")))]
   "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
   "@
    movhpd\t{%2, %0|%0, %2}
    vmovhpd\t{%2, %1, %0|%0, %1, %2}
    unpcklpd\t{%2, %0|%0, %2}
    vunpcklpd\t{%2, %1, %0|%0, %1, %2}
   "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
   "@
    movhpd\t{%2, %0|%0, %2}
    vmovhpd\t{%2, %1, %0|%0, %1, %2}
    unpcklpd\t{%2, %0|%0, %2}
    vunpcklpd\t{%2, %1, %0|%0, %1, %2}
-   shufpd\t{$1, %1, %0|%0, %1, 1}
    #
    #
    #"
    #
    #
    #"
-  [(set_attr "isa" "noavx,avx,noavx,avx,noavx,base,base,base")
-   (set_attr "type" "ssemov,ssemov,sselog,sselog,sselog,ssemov,fmov,imov")
-   (set_attr "prefix_data16" "1,*,*,*,*,*,*,*")
-   (set_attr "length_immediate" "*,*,*,*,1,*,*,*")
-   (set_attr "prefix" "orig,vex,orig,vex,orig,*,*,*")
-   (set_attr "mode" "V1DF,V1DF,V2DF,V2DF,V2DF,DF,DF,DF")])
+  [(set_attr "isa" "noavx,avx,noavx,avx,base,base,base")
+   (set_attr "type" "ssemov,ssemov,sselog,sselog,ssemov,fmov,imov")
+   (set_attr "prefix_data16" "1,*,*,*,*,*,*")
+   (set_attr "prefix" "orig,vex,orig,vex,*,*,*")
+   (set_attr "mode" "V1DF,V1DF,V2DF,V2DF,DF,DF,DF")])
 
 (define_split
   [(set (match_operand:V2DF 0 "memory_operand" "")
 
 (define_split
   [(set (match_operand:V2DF 0 "memory_operand" "")
index 48fb720..bdc0f3e 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-24  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/49133
+       * g++.dg/other/pr49133.C: New test.
+
 2011-05-24  Uros Bizjak <ubizjak@gmail.com>
            Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
 2011-05-24  Uros Bizjak <ubizjak@gmail.com>
            Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
 
 2011-05-08  Ville Voutilainen  <ville.voutilainen@gmail.com>
 
 
 2011-05-08  Ville Voutilainen  <ville.voutilainen@gmail.com>
 
-        * g++.dg/inherit/virtual9.C: New.
+       * g++.dg/inherit/virtual9.C: New.
 
 2011-05-09  Dodji Seketeli  <dodji@redhat.com>
 
 
 2011-05-09  Dodji Seketeli  <dodji@redhat.com>
 
diff --git a/gcc/testsuite/g++.dg/other/pr49133.C b/gcc/testsuite/g++.dg/other/pr49133.C
new file mode 100644 (file)
index 0000000..a59687f
--- /dev/null
@@ -0,0 +1,36 @@
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -msse2" } */
+/* { dg-require-effective-target sse2_runtime } */
+
+#include <xmmintrin.h>
+
+extern "C" void abort ();
+
+typedef double double_a __attribute__((__may_alias__));
+
+struct V
+{
+  __m128d data;
+};
+
+int
+main()
+{
+  V a;
+  __m128d b;
+
+  b = _mm_set_pd (1., 0.);
+  a.data = _mm_set_pd (1., 0.);
+  a.data = _mm_add_pd (a.data,
+                      _mm_and_pd (_mm_cmpeq_pd (a.data, _mm_set1_pd (0.)),
+                                  _mm_set1_pd (2.)));
+  reinterpret_cast<double_a *>(&a.data)[1] += 1.;
+  b = _mm_add_pd (b, _mm_and_pd (_mm_cmpeq_pd (b, _mm_set1_pd (0.)),
+                                _mm_set1_pd (1.)));
+  b = _mm_add_pd (b, _mm_and_pd (_mm_cmpeq_pd (b, _mm_set1_pd (1.)),
+                                _mm_set1_pd (1.)));
+  if (_mm_movemask_pd (_mm_cmpeq_pd (a.data, b)) != 0x3)
+    abort();
+
+  return 0;
+}