From: Jakub Jelinek Date: Sun, 16 Jan 2011 20:25:01 +0000 (+0100) Subject: backport: re PR target/46880 (generating of shufpd is broken) X-Git-Tag: releases/gcc-4.5.3~301 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=202324fc0715753472701b82d4a7aa626f2ec3f1;p=thirdparty%2Fgcc.git backport: re PR target/46880 (generating of shufpd is broken) Backport from mainline 2010-12-21 Jakub Jelinek PR target/46880 * config/i386/sse.md (sse2_loadlpd, sse2_movsd): Fix shufpd source operand. * gcc.target/i386/pr46880.c: New test. From-SVN: r168868 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9db1eae1c77d..35c243e7a934 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,10 @@ Backport from mainline 2010-12-21 Jakub Jelinek + PR target/46880 + * config/i386/sse.md (sse2_loadlpd, sse2_movsd): Fix shufpd source + operand. + PR middle-end/45852 * expr.c (store_expr): Ignore alt_rtl if equal to target, but has side-effects. diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index a1284d13a417..3a1397e5c6d9 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -5011,7 +5011,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} # # @@ -5090,7 +5090,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 840b45323f2f..63828d0f27ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backport from mainline 2010-12-21 Jakub Jelinek + PR target/46880 + * gcc.target/i386/pr46880.c: New test. + PR middle-end/45852 * gcc.target/i386/pr45852.c: New test. 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; +}