Merging r259798, r259835:
[oota-llvm.git] / test / CodeGen / PowerPC / vsx_shuffle_le.ll
1 ; RUN: llc -mcpu=pwr8 -mattr=+vsx -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
2
3 define <2 x double> @test00(<2 x double>* %p1, <2 x double>* %p2) {
4   %v1 = load <2 x double>, <2 x double>* %p1
5   %v2 = load <2 x double>, <2 x double>* %p2
6   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 0>
7   ret <2 x double> %v3
8
9 ; CHECK-LABEL: test00
10 ; CHECK: lxvd2x 0, 0, 3
11 ; CHECK: xxspltd 34, 0, 0
12 }
13
14 define <2 x double> @test01(<2 x double>* %p1, <2 x double>* %p2) {
15   %v1 = load <2 x double>, <2 x double>* %p1
16   %v2 = load <2 x double>, <2 x double>* %p2
17   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 1>
18   ret <2 x double> %v3
19
20 ; CHECK-LABEL: test01
21 ; CHECK: lxvd2x 0, 0, 3
22 ; CHECK: xxswapd 34, 0
23 }
24
25 define <2 x double> @test02(<2 x double>* %p1, <2 x double>* %p2) {
26   %v1 = load <2 x double>, <2 x double>* %p1
27   %v2 = load <2 x double>, <2 x double>* %p2
28   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 2>
29   ret <2 x double> %v3
30
31 ; CHECK-LABEL: @test02
32 ; CHECK: lxvd2x 0, 0, 3
33 ; CHECK: lxvd2x 1, 0, 4
34 ; CHECK: xxswapd 0, 0
35 ; CHECK: xxswapd 1, 1
36 ; CHECK: xxmrgld 34, 1, 0
37 }
38
39 define <2 x double> @test03(<2 x double>* %p1, <2 x double>* %p2) {
40   %v1 = load <2 x double>, <2 x double>* %p1
41   %v2 = load <2 x double>, <2 x double>* %p2
42   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 3>
43   ret <2 x double> %v3
44
45 ; CHECK-LABEL: @test03
46 ; CHECK: lxvd2x 0, 0, 3
47 ; CHECK: lxvd2x 1, 0, 4
48 ; CHECK: xxswapd 0, 0
49 ; CHECK: xxswapd 1, 1
50 ; CHECK: xxpermdi 34, 1, 0, 1
51 }
52
53 define <2 x double> @test10(<2 x double>* %p1, <2 x double>* %p2) {
54   %v1 = load <2 x double>, <2 x double>* %p1
55   %v2 = load <2 x double>, <2 x double>* %p2
56   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 0>
57   ret <2 x double> %v3
58
59 ; CHECK-LABEL: @test10
60 ; CHECK: lxvd2x 34, 0, 3
61 }
62
63 define <2 x double> @test11(<2 x double>* %p1, <2 x double>* %p2) {
64   %v1 = load <2 x double>, <2 x double>* %p1
65   %v2 = load <2 x double>, <2 x double>* %p2
66   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 1>
67   ret <2 x double> %v3
68
69 ; CHECK-LABEL: @test11
70 ; CHECK: lxvd2x 0, 0, 3
71 ; CHECK: xxspltd 34, 0, 1
72 }
73
74 define <2 x double> @test12(<2 x double>* %p1, <2 x double>* %p2) {
75   %v1 = load <2 x double>, <2 x double>* %p1
76   %v2 = load <2 x double>, <2 x double>* %p2
77   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 2>
78   ret <2 x double> %v3
79
80 ; CHECK-LABEL: @test12
81 ; CHECK: lxvd2x 0, 0, 3
82 ; CHECK: lxvd2x 1, 0, 4
83 ; CHECK: xxswapd 0, 0
84 ; CHECK: xxswapd 1, 1
85 ; CHECK: xxpermdi 34, 1, 0, 2
86 }
87
88 define <2 x double> @test13(<2 x double>* %p1, <2 x double>* %p2) {
89   %v1 = load <2 x double>, <2 x double>* %p1
90   %v2 = load <2 x double>, <2 x double>* %p2
91   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 3>
92   ret <2 x double> %v3
93
94 ; CHECK-LABEL: @test13
95 ; CHECK: lxvd2x 0, 0, 3
96 ; CHECK: lxvd2x 1, 0, 4
97 ; CHECK: xxswapd 0, 0
98 ; CHECK: xxswapd 1, 1
99 ; CHECK: xxmrghd 34, 1, 0
100 }
101
102 define <2 x double> @test20(<2 x double>* %p1, <2 x double>* %p2) {
103   %v1 = load <2 x double>, <2 x double>* %p1
104   %v2 = load <2 x double>, <2 x double>* %p2
105   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 0>
106   ret <2 x double> %v3
107
108 ; CHECK-LABEL: @test20
109 ; CHECK: lxvd2x 0, 0, 3
110 ; CHECK: lxvd2x 1, 0, 4
111 ; CHECK: xxswapd 0, 0
112 ; CHECK: xxswapd 1, 1
113 ; CHECK: xxmrgld 34, 0, 1
114 }
115
116 define <2 x double> @test21(<2 x double>* %p1, <2 x double>* %p2) {
117   %v1 = load <2 x double>, <2 x double>* %p1
118   %v2 = load <2 x double>, <2 x double>* %p2
119   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 1>
120   ret <2 x double> %v3
121
122 ; CHECK-LABEL: @test21
123 ; CHECK: lxvd2x 0, 0, 3
124 ; CHECK: lxvd2x 1, 0, 4
125 ; CHECK: xxswapd 0, 0
126 ; CHECK: xxswapd 1, 1
127 ; CHECK: xxpermdi 34, 0, 1, 1
128 }
129
130 define <2 x double> @test22(<2 x double>* %p1, <2 x double>* %p2) {
131   %v1 = load <2 x double>, <2 x double>* %p1
132   %v2 = load <2 x double>, <2 x double>* %p2
133   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 2>
134   ret <2 x double> %v3
135
136 ; CHECK-LABEL: @test22
137 ; CHECK: lxvd2x 0, 0, 4
138 ; CHECK: xxspltd 34, 0, 0
139 }
140
141 define <2 x double> @test23(<2 x double>* %p1, <2 x double>* %p2) {
142   %v1 = load <2 x double>, <2 x double>* %p1
143   %v2 = load <2 x double>, <2 x double>* %p2
144   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 3>
145   ret <2 x double> %v3
146
147 ; CHECK-LABEL: @test23
148 ; CHECK: lxvd2x 0, 0, 4
149 ; CHECK: xxswapd 34, 0
150 }
151
152 define <2 x double> @test30(<2 x double>* %p1, <2 x double>* %p2) {
153   %v1 = load <2 x double>, <2 x double>* %p1
154   %v2 = load <2 x double>, <2 x double>* %p2
155   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 0>
156   ret <2 x double> %v3
157
158 ; CHECK-LABEL: @test30
159 ; CHECK: lxvd2x 0, 0, 3
160 ; CHECK: lxvd2x 1, 0, 4
161 ; CHECK: xxswapd 0, 0
162 ; CHECK: xxswapd 1, 1
163 ; CHECK: xxpermdi 34, 0, 1, 2
164 }
165
166 define <2 x double> @test31(<2 x double>* %p1, <2 x double>* %p2) {
167   %v1 = load <2 x double>, <2 x double>* %p1
168   %v2 = load <2 x double>, <2 x double>* %p2
169   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 1>
170   ret <2 x double> %v3
171
172 ; CHECK-LABEL: @test31
173 ; CHECK: lxvd2x 0, 0, 3
174 ; CHECK: lxvd2x 1, 0, 4
175 ; CHECK: xxswapd 0, 0
176 ; CHECK: xxswapd 1, 1
177 ; CHECK: xxmrghd 34, 0, 1
178 }
179
180 define <2 x double> @test32(<2 x double>* %p1, <2 x double>* %p2) {
181   %v1 = load <2 x double>, <2 x double>* %p1
182   %v2 = load <2 x double>, <2 x double>* %p2
183   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 2>
184   ret <2 x double> %v3
185
186 ; CHECK-LABEL: @test32
187 ; CHECK: lxvd2x 34, 0, 4
188 }
189
190 define <2 x double> @test33(<2 x double>* %p1, <2 x double>* %p2) {
191   %v1 = load <2 x double>, <2 x double>* %p1
192   %v2 = load <2 x double>, <2 x double>* %p2
193   %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 3>
194   ret <2 x double> %v3
195
196 ; CHECK-LABEL: @test33
197 ; CHECK: lxvd2x 0, 0, 4
198 ; CHECK: xxspltd 34, 0, 1
199 }