From: Uros Bizjak Date: Wed, 4 May 2011 18:25:25 +0000 (+0200) Subject: backport: re PR target/48708 (Invalid V2DI vector set insn generated) X-Git-Tag: releases/gcc-4.5.4~662 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=417fe8b1092edc0e47c4ab376aa06eb0f802ad73;p=thirdparty%2Fgcc.git backport: re PR target/48708 (Invalid V2DI vector set insn generated) Backport from mainline 2011-04-21 Uros Bizjak PR target/48708 * config/i386/i386.c (ix86_expand_vector_set) : Generate vec_extract and vec_concat for non-SSE4_1 targets. testsuite/ChangeLog: Backport from mainline 2011-04-21 Uros Bizjak PR target/48708 * gcc.target/i386/pr48708.c: New test. From-SVN: r173389 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 359ebd67d85d..20f684bc4e20 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-05-04 Uros Bizjak + + Backport from mainline + 2011-04-21 Uros Bizjak + + PR target/48708 + * config/i386/i386.c (ix86_expand_vector_set) : Generate + vec_extract and vec_concat for non-SSE4_1 targets. + 2011-05-04 Uros Bizjak * config/i386/i386.md (*movdi_internal_rex64) : diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 31f8dc28251a..ef35b3a0a8f8 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -27715,10 +27715,19 @@ ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt) break; case V2DImode: - use_vec_merge = TARGET_SSE4_1; + use_vec_merge = TARGET_SSE4_1 && TARGET_64BIT; if (use_vec_merge) break; + tmp = gen_reg_rtx (GET_MODE_INNER (mode)); + ix86_expand_vector_extract (false, tmp, target, 1 - elt); + if (elt == 0) + tmp = gen_rtx_VEC_CONCAT (mode, tmp, val); + else + tmp = gen_rtx_VEC_CONCAT (mode, val, tmp); + emit_insn (gen_rtx_SET (VOIDmode, target, tmp)); + return; + case V2DFmode: { rtx op0, op1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b32d837aed52..4a230a26cdca 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2011-05-04 Uros Bizjak + + Backport from mainline + 2011-04-21 Uros Bizjak + + PR target/48708 + * gcc.target/i386/pr48708.c: New test. + 2011-05-04 Uros Bizjak Backport from mainline diff --git a/gcc/testsuite/gcc.target/i386/pr48708.c b/gcc/testsuite/gcc.target/i386/pr48708.c new file mode 100644 index 000000000000..355c2b2691f6 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr48708.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -msse2" } */ + +#include + +typedef long long T __attribute__((may_alias)); +struct S { __m128i d; }; + +__m128i +foo (long long *x, struct S *y, __m128i *z) +{ + struct S s = *y; + ((T *) &s.d)[0] = *x; + return _mm_cmpeq_epi16 (s.d, *z); +}