aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2011-05-04 18:25:25 +0000
committerUros Bizjak <ubizjak@gmail.com>2011-05-04 18:25:25 +0000
commit5e2b4a66c132ee7cce8de583fcb19df363f229bc (patch)
treea44cef7ee72a111fdc5e36cd131ce1366ecfcf63
parent931ae4e0fcd5ff726c2edcd4590c48ab6d220042 (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/ChangeLog9
-rw-r--r--gcc/config/i386/i386.c11
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.target/i386/pr48708.c15
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);
+}