]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/48708 (Invalid V2DI vector set insn generated)
authorUros Bizjak <ubizjak@gmail.com>
Wed, 4 May 2011 18:25:25 +0000 (20:25 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Wed, 4 May 2011 18:25:25 +0000 (20:25 +0200)
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.

From-SVN: r173389

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr48708.c [new file with mode: 0644]

index 359ebd67d85d98595a67c1f7cea50ccb242d125f..20f684bc4e203e285a037db8af9cc4014653208a 100644 (file)
@@ -1,3 +1,12 @@
+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>:
index 31f8dc28251a738ec352c062d511c747d712ac09..ef35b3a0a8f8804cc196d5c268dc2b8a604ea64e 100644 (file)
@@ -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;
index b32d837aed52b02f045a5ff918732900e2de3c45..4a230a26cdcaed531f3f174294c12d98e9256fde 100644 (file)
@@ -1,3 +1,11 @@
+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
diff --git a/gcc/testsuite/gcc.target/i386/pr48708.c b/gcc/testsuite/gcc.target/i386/pr48708.c
new file mode 100644 (file)
index 0000000..355c2b2
--- /dev/null
@@ -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);
+}