summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0317-PR-target-49133.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0317-PR-target-49133.patch')
-rw-r--r--meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0317-PR-target-49133.patch93
1 files changed, 93 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0317-PR-target-49133.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0317-PR-target-49133.patch
new file mode 100644
index 0000000000..0d77b77881
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0317-PR-target-49133.patch
@@ -0,0 +1,93 @@
1From 9aeec4c33a6e405da2d97c3c45efe2165b44cf97 Mon Sep 17 00:00:00 2001
2From: uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
3Date: Tue, 24 May 2011 18:41:31 +0000
4Subject: [PATCH] PR target/49133
5 * config/i386/sse.md (sse2_loadhpd): Remove shufpd alternative.
6
7testsuite/ChangeLog:
8
9 PR target/49133
10 * g++.dg/other/pr49133.C: New test.
11
12
13
14git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@174131 138bc75d-0d04-0410-961f-82ee72b054a4
15
16index c9866f0..7e18678 100644
17--- a/gcc/config/i386/sse.md
18+++ b/gcc/config/i386/sse.md
19@@ -4950,24 +4950,22 @@
20 ;; Avoid combining registers from different units in a single alternative,
21 ;; see comment above inline_secondary_memory_needed function in i386.c
22 (define_insn "sse2_loadhpd"
23- [(set (match_operand:V2DF 0 "nonimmediate_operand" "=x,x,x,o,o,o")
24+ [(set (match_operand:V2DF 0 "nonimmediate_operand" "=x,x,o,o,o")
25 (vec_concat:V2DF
26 (vec_select:DF
27- (match_operand:V2DF 1 "nonimmediate_operand" " 0,0,x,0,0,0")
28+ (match_operand:V2DF 1 "nonimmediate_operand" " 0,0,0,0,0")
29 (parallel [(const_int 0)]))
30- (match_operand:DF 2 "nonimmediate_operand" " m,x,0,x,*f,r")))]
31+ (match_operand:DF 2 "nonimmediate_operand" " m,x,x,*f,r")))]
32 "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
33 "@
34 movhpd\t{%2, %0|%0, %2}
35 unpcklpd\t{%2, %0|%0, %2}
36- shufpd\t{$1, %1, %0|%0, %1, 1}
37 #
38 #
39 #"
40- [(set_attr "type" "ssemov,sselog,sselog,ssemov,fmov,imov")
41- (set_attr "prefix_data16" "1,*,*,*,*,*")
42- (set_attr "length_immediate" "*,*,1,*,*,*")
43- (set_attr "mode" "V1DF,V2DF,V2DF,DF,DF,DF")])
44+ [(set_attr "type" "ssemov,sselog,ssemov,fmov,imov")
45+ (set_attr "prefix_data16" "1,*,*,*,*")
46+ (set_attr "mode" "V1DF,V2DF,DF,DF,DF")])
47
48 (define_split
49 [(set (match_operand:V2DF 0 "memory_operand" "")
50new file mode 100644
51index 0000000..a59687f
52--- /dev/null
53+++ b/gcc/testsuite/g++.dg/other/pr49133.C
54@@ -0,0 +1,36 @@
55+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
56+/* { dg-options "-O2 -msse2" } */
57+/* { dg-require-effective-target sse2_runtime } */
58+
59+#include <xmmintrin.h>
60+
61+extern "C" void abort ();
62+
63+typedef double double_a __attribute__((__may_alias__));
64+
65+struct V
66+{
67+ __m128d data;
68+};
69+
70+int
71+main()
72+{
73+ V a;
74+ __m128d b;
75+
76+ b = _mm_set_pd (1., 0.);
77+ a.data = _mm_set_pd (1., 0.);
78+ a.data = _mm_add_pd (a.data,
79+ _mm_and_pd (_mm_cmpeq_pd (a.data, _mm_set1_pd (0.)),
80+ _mm_set1_pd (2.)));
81+ reinterpret_cast<double_a *>(&a.data)[1] += 1.;
82+ b = _mm_add_pd (b, _mm_and_pd (_mm_cmpeq_pd (b, _mm_set1_pd (0.)),
83+ _mm_set1_pd (1.)));
84+ b = _mm_add_pd (b, _mm_and_pd (_mm_cmpeq_pd (b, _mm_set1_pd (1.)),
85+ _mm_set1_pd (1.)));
86+ if (_mm_movemask_pd (_mm_cmpeq_pd (a.data, b)) != 0x3)
87+ abort();
88+
89+ return 0;
90+}
91--
921.7.0.4
93