diff options
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.patch | 93 |
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 @@ | |||
1 | From 9aeec4c33a6e405da2d97c3c45efe2165b44cf97 Mon Sep 17 00:00:00 2001 | ||
2 | From: uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | ||
3 | Date: Tue, 24 May 2011 18:41:31 +0000 | ||
4 | Subject: [PATCH] PR target/49133 | ||
5 | * config/i386/sse.md (sse2_loadhpd): Remove shufpd alternative. | ||
6 | |||
7 | testsuite/ChangeLog: | ||
8 | |||
9 | PR target/49133 | ||
10 | * g++.dg/other/pr49133.C: New test. | ||
11 | |||
12 | |||
13 | |||
14 | git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@174131 138bc75d-0d04-0410-961f-82ee72b054a4 | ||
15 | |||
16 | index 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" "") | ||
50 | new file mode 100644 | ||
51 | index 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 | -- | ||
92 | 1.7.0.4 | ||
93 | |||