diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2011-05-04 18:25:25 +0000 |
---|---|---|
committer | Uros Bizjak <ubizjak@gmail.com> | 2011-05-04 18:25:25 +0000 |
commit | 5e2b4a66c132ee7cce8de583fcb19df363f229bc (patch) | |
tree | a44cef7ee72a111fdc5e36cd131ce1366ecfcf63 | |
parent | 931ae4e0fcd5ff726c2edcd4590c48ab6d220042 (diff) |
Backport from mainline
2011-04-21 Uros Bizjak <ubizjak@gmail.com>
PR target/48708
* config/i386/i386.c (ix86_expand_vector_set) <V2DImode>: Generate
vec_extract and vec_concat for non-SSE4_1 targets.
testsuite/ChangeLog:
Backport from mainline
2011-04-21 Uros Bizjak <ubizjak@gmail.com>
PR target/48708
* gcc.target/i386/pr48708.c: New test.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-4_5-branch@173389 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr48708.c | 15 |
4 files changed, 42 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 359ebd67d85..20f684bc4e2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2011-05-04 Uros Bizjak <ubizjak@gmail.com> + Backport from mainline + 2011-04-21 Uros Bizjak <ubizjak@gmail.com> + + PR target/48708 + * config/i386/i386.c (ix86_expand_vector_set) <V2DImode>: Generate + vec_extract and vec_concat for non-SSE4_1 targets. + +2011-05-04 Uros Bizjak <ubizjak@gmail.com> + * config/i386/i386.md (*movdi_internal_rex64) <TYPE_SSEMOV>: Use %v prefix in insn mnemonic to handle TARGET_AVX. (*movdi_internal): Use "maybe_vex" instead of "vex" in "prefix" diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 31f8dc28251..ef35b3a0a8f 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 b32d837aed5..4a230a26cdc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,14 @@ 2011-05-04 Uros Bizjak <ubizjak@gmail.com> Backport from mainline + 2011-04-21 Uros Bizjak <ubizjak@gmail.com> + + PR target/48708 + * gcc.target/i386/pr48708.c: New test. + +2011-05-04 Uros Bizjak <ubizjak@gmail.com> + + Backport from mainline 2010-12-08 H.J. Lu <hongjiu.lu@intel.com> * gcc.target/i386/sse2-init-v2di-2.c: Add "-dp" and update diff --git a/gcc/testsuite/gcc.target/i386/pr48708.c b/gcc/testsuite/gcc.target/i386/pr48708.c new file mode 100644 index 00000000000..355c2b2691f --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr48708.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -msse2" } */ + +#include <emmintrin.h> + +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); +} |