From: Jakub Jelinek Date: Tue, 21 Dec 2010 22:37:23 +0000 (+0100) Subject: re PR target/46880 (generating of shufpd is broken) X-Git-Tag: releases/gcc-4.6.0~1696 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=401e4feab6365059d6bfdbbced6a6effb7cf69ee;p=thirdparty%2Fgcc.git re PR target/46880 (generating of shufpd is broken) PR target/46880 * config/i386/sse.md (sse2_loadlpd, sse2_movsd): Fix shufpd source operand. * gcc.target/i386/pr46880.c: New test. From-SVN: r168135 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bc44e7bd4745..133b65bbf0b6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-12-21 Jakub Jelinek + + PR target/46880 + * config/i386/sse.md (sse2_loadlpd, sse2_movsd): Fix shufpd source + operand. + 2010-12-21 Ira Rosen PR tree-optimization/47001 diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index e13308c0de4d..a942a2b1717c 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -4990,7 +4990,7 @@ movsd\t{%2, %0|%0, %2} movlpd\t{%2, %0|%0, %2} movsd\t{%2, %0|%0, %2} - shufpd\t{$2, %2, %0|%0, %2, 2} + shufpd\t{$2, %1, %0|%0, %1, 2} movhpd\t{%H1, %0|%0, %H1} # # @@ -5067,7 +5067,7 @@ movsd\t{%2, %0|%0, %2} movlpd\t{%2, %0|%0, %2} movlpd\t{%2, %0|%0, %2} - shufpd\t{$2, %2, %0|%0, %2, 2} + shufpd\t{$2, %1, %0|%0, %1, 2} movhps\t{%H1, %0|%0, %H1} movhps\t{%1, %H0|%H0, %1}" [(set_attr "type" "ssemov,ssemov,ssemov,sselog,ssemov,ssemov") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b03b602e12d9..ea27d4ac4f01 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,9 @@ -2010-12-21 Ira Rosen i +2010-12-21 Jakub Jelinek + + PR target/46880 + * gcc.target/i386/pr46880.c: New test. + +2010-12-21 Ira Rosen PR tree-optimization/47001 * gcc.dg/vect/pr47001.c: New. diff --git a/gcc/testsuite/gcc.target/i386/pr46880.c b/gcc/testsuite/gcc.target/i386/pr46880.c new file mode 100644 index 000000000000..bc6d642994c2 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr46880.c @@ -0,0 +1,28 @@ +/* PR target/46880 */ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-strict-aliasing -msse2" } */ +/* { dg-require-effective-target sse2_runtime } */ + +typedef double __m128d __attribute__ ((__vector_size__ (16), __may_alias__)); +typedef double (*T)[2]; + +static __attribute__ ((noinline, noclone)) __m128d +foo (__m128d c, __m128d d) +{ + T cp = (T) &c; + T dp = (T) &d; + __m128d e = { (*cp)[1], (*dp)[1] }; + return e; +} + +int +main () +{ + __m128d c = { 1.0, 2.0 }; + __m128d d = { 3.0, 4.0 }; + union { __m128d x; double d[2]; } u; + u.x = foo (c, d); + if (u.d[0] != 2.0 || u.d[1] != 4.0) + __builtin_abort (); + return 0; +}