summaryrefslogtreecommitdiff
path: root/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0164-PR-target-48708.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0164-PR-target-48708.patch')
-rw-r--r--meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0164-PR-target-48708.patch63
1 files changed, 63 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0164-PR-target-48708.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0164-PR-target-48708.patch
new file mode 100644
index 000000000..4fca02301
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0164-PR-target-48708.patch
@@ -0,0 +1,63 @@
+From ad24dcb7c07f1f9d41cb6782ea14c6c1727c4cb0 Mon Sep 17 00:00:00 2001
+From: uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Thu, 21 Apr 2011 20:23:55 +0000
+Subject: [PATCH 164/200] 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:
+
+ PR target/48708
+ * gcc.target/i386/pr48708.c: New test.
+
+
+
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@172843 138bc75d-0d04-0410-961f-82ee72b054a4
+
+index a524d77..6e4bb3b 100644
+--- a/gcc/config/i386/i386.c
++++ b/gcc/config/i386/i386.c
+@@ -31213,10 +31213,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;
+new file mode 100644
+index 0000000..355c2b2
+--- /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);
++}
+--
+1.7.0.4
+