From 401e4feab6365059d6bfdbbced6a6effb7cf69ee Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 21 Dec 2010 23:37:23 +0100 Subject: 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 --- gcc/ChangeLog | 6 ++++++ gcc/config/i386/sse.md | 4 ++-- gcc/testsuite/ChangeLog | 7 ++++++- gcc/testsuite/gcc.target/i386/pr46880.c | 28 ++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr46880.c (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bc44e7b..133b65b 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 e13308c..a942a2b 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 b03b602..ea27d4a 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 0000000..bc6d642 --- /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; +} -- cgit v1.1