1; RUN: llc -verify-machineinstrs -mcpu=pwr8 -mattr=+vsx \
2; RUN:   -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
3
4; RUN: llc -verify-machineinstrs -mcpu=pwr9 -mattr=-power9-vector \
5; RUN:   -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
6
7; RUN: llc -verify-machineinstrs -mcpu=pwr9 -mattr=+vsx \
8; RUN:   -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s \
9; RUN:   --check-prefix=CHECK-P9 --implicit-check-not xxswapd
10
11define <2 x double> @test00(<2 x double>* %p1, <2 x double>* %p2) {
12  %v1 = load <2 x double>, <2 x double>* %p1
13  %v2 = load <2 x double>, <2 x double>* %p2
14  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 0>
15  ret <2 x double> %v3
16
17; CHECK-LABEL: test00
18; CHECK: lxvd2x 0, 0, 3
19; CHECK: xxspltd 34, 0, 0
20
21; CHECK-P9-LABEL: test00
22; CHECK-P9: lxv 0, 0(3)
23; CHECK-P9: xxspltd 34, 0, 1
24}
25
26define <2 x double> @test01(<2 x double>* %p1, <2 x double>* %p2) {
27  %v1 = load <2 x double>, <2 x double>* %p1
28  %v2 = load <2 x double>, <2 x double>* %p2
29  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 1>
30  ret <2 x double> %v3
31
32; CHECK-LABEL: test01
33; CHECK: lxvd2x 0, 0, 3
34; CHECK: xxswapd 34, 0
35
36; CHECK-P9-LABEL: test01
37; CHECK-P9: lxv 34, 0(3)
38}
39
40define <2 x double> @test02(<2 x double>* %p1, <2 x double>* %p2) {
41  %v1 = load <2 x double>, <2 x double>* %p1
42  %v2 = load <2 x double>, <2 x double>* %p2
43  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 2>
44  ret <2 x double> %v3
45
46; CHECK-LABEL: @test02
47; CHECK: lxvd2x 0, 0, 3
48; CHECK: lxvd2x 1, 0, 4
49; CHECK: xxswapd 0, 0
50; CHECK: xxswapd 1, 1
51; CHECK: xxmrgld 34, 1, 0
52
53; CHECK-P9-LABEL: @test02
54; CHECK-P9: lxv 0, 0(3)
55; CHECK-P9: lxv 1, 0(4)
56; CHECK-P9: xxmrgld 34, 1, 0
57}
58
59define <2 x double> @test03(<2 x double>* %p1, <2 x double>* %p2) {
60  %v1 = load <2 x double>, <2 x double>* %p1
61  %v2 = load <2 x double>, <2 x double>* %p2
62  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 3>
63  ret <2 x double> %v3
64
65; CHECK-LABEL: @test03
66; CHECK: lxvd2x 0, 0, 3
67; CHECK: lxvd2x 1, 0, 4
68; CHECK: xxswapd 0, 0
69; CHECK: xxswapd 1, 1
70; CHECK: xxpermdi 34, 1, 0, 1
71
72; CHECK-P9-LABEL: @test03
73; CHECK-P9: lxv 0, 0(3)
74; CHECK-P9: lxv 1, 0(4)
75; CHECK-P9: xxpermdi 34, 1, 0, 1
76}
77
78define <2 x double> @test10(<2 x double>* %p1, <2 x double>* %p2) {
79  %v1 = load <2 x double>, <2 x double>* %p1
80  %v2 = load <2 x double>, <2 x double>* %p2
81  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 0>
82  ret <2 x double> %v3
83
84; CHECK-LABEL: @test10
85; CHECK: lxvd2x 34, 0, 3
86
87; CHECK-P9-LABEL: @test10
88; CHECK-P9: lxvd2x 34, 0, 3
89}
90
91define <2 x double> @test11(<2 x double>* %p1, <2 x double>* %p2) {
92  %v1 = load <2 x double>, <2 x double>* %p1
93  %v2 = load <2 x double>, <2 x double>* %p2
94  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 1>
95  ret <2 x double> %v3
96
97; CHECK-LABEL: @test11
98; CHECK: lxvd2x 0, 0, 3
99; CHECK: xxspltd 34, 0, 1
100
101; CHECK-P9-LABEL: @test11
102; CHECK-P9: lxv 0, 0(3)
103; CHECK-P9: xxspltd 34, 0, 0
104}
105
106define <2 x double> @test12(<2 x double>* %p1, <2 x double>* %p2) {
107  %v1 = load <2 x double>, <2 x double>* %p1
108  %v2 = load <2 x double>, <2 x double>* %p2
109  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 2>
110  ret <2 x double> %v3
111
112; CHECK-LABEL: @test12
113; CHECK: lxvd2x 0, 0, 3
114; CHECK: lxvd2x 1, 0, 4
115; CHECK: xxswapd 0, 0
116; CHECK: xxswapd 1, 1
117; CHECK: xxpermdi 34, 1, 0, 2
118
119; CHECK-P9-LABEL: @test12
120; CHECK-P9: lxv 0, 0(3)
121; CHECK-P9: lxv 1, 0(4)
122; CHECK-P9: xxpermdi 34, 1, 0, 2
123}
124
125define <2 x double> @test13(<2 x double>* %p1, <2 x double>* %p2) {
126  %v1 = load <2 x double>, <2 x double>* %p1
127  %v2 = load <2 x double>, <2 x double>* %p2
128  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 3>
129  ret <2 x double> %v3
130
131; CHECK-LABEL: @test13
132; CHECK: lxvd2x 0, 0, 3
133; CHECK: lxvd2x 1, 0, 4
134; CHECK: xxswapd 0, 0
135; CHECK: xxswapd 1, 1
136; CHECK: xxmrghd 34, 1, 0
137
138; CHECK-P9-LABEL: @test13
139; CHECK-P9: lxv 0, 0(3)
140; CHECK-P9: lxv 1, 0(4)
141; CHECK-P9: xxmrghd 34, 1, 0
142}
143
144define <2 x double> @test20(<2 x double>* %p1, <2 x double>* %p2) {
145  %v1 = load <2 x double>, <2 x double>* %p1
146  %v2 = load <2 x double>, <2 x double>* %p2
147  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 0>
148  ret <2 x double> %v3
149
150; CHECK-LABEL: @test20
151; CHECK: lxvd2x 0, 0, 3
152; CHECK: lxvd2x 1, 0, 4
153; CHECK: xxswapd 0, 0
154; CHECK: xxswapd 1, 1
155; CHECK: xxmrgld 34, 0, 1
156
157; CHECK-P9-LABEL: @test20
158; CHECK-P9: lxv 0, 0(3)
159; CHECK-P9: lxv 1, 0(4)
160; CHECK-P9: xxmrgld 34, 0, 1
161}
162
163define <2 x double> @test21(<2 x double>* %p1, <2 x double>* %p2) {
164  %v1 = load <2 x double>, <2 x double>* %p1
165  %v2 = load <2 x double>, <2 x double>* %p2
166  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 1>
167  ret <2 x double> %v3
168
169; CHECK-LABEL: @test21
170; CHECK: lxvd2x 0, 0, 3
171; CHECK: lxvd2x 1, 0, 4
172; CHECK: xxswapd 0, 0
173; CHECK: xxswapd 1, 1
174; CHECK: xxpermdi 34, 0, 1, 1
175
176; CHECK-P9-LABEL: @test21
177; CHECK-P9: lxv 0, 0(3)
178; CHECK-P9: lxv 1, 0(4)
179; CHECK-P9: xxpermdi 34, 0, 1, 1
180}
181
182define <2 x double> @test22(<2 x double>* %p1, <2 x double>* %p2) {
183  %v1 = load <2 x double>, <2 x double>* %p1
184  %v2 = load <2 x double>, <2 x double>* %p2
185  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 2>
186  ret <2 x double> %v3
187
188; CHECK-LABEL: @test22
189; CHECK: lxvd2x 0, 0, 4
190; CHECK: xxspltd 34, 0, 0
191
192; CHECK-P9-LABEL: @test22
193; CHECK-P9: lxv 0, 0(4)
194; CHECK-P9: xxspltd 34, 0, 1
195}
196
197define <2 x double> @test23(<2 x double>* %p1, <2 x double>* %p2) {
198  %v1 = load <2 x double>, <2 x double>* %p1
199  %v2 = load <2 x double>, <2 x double>* %p2
200  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 3>
201  ret <2 x double> %v3
202
203; CHECK-LABEL: @test23
204; CHECK: lxvd2x 0, 0, 4
205; CHECK: xxswapd 34, 0
206
207; CHECK-P9-LABEL: @test23
208; CHECK-P9: lxv 34, 0(4)
209}
210
211define <2 x double> @test30(<2 x double>* %p1, <2 x double>* %p2) {
212  %v1 = load <2 x double>, <2 x double>* %p1
213  %v2 = load <2 x double>, <2 x double>* %p2
214  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 0>
215  ret <2 x double> %v3
216
217; CHECK-LABEL: @test30
218; CHECK: lxvd2x 0, 0, 3
219; CHECK: lxvd2x 1, 0, 4
220; CHECK: xxswapd 0, 0
221; CHECK: xxswapd 1, 1
222; CHECK: xxpermdi 34, 0, 1, 2
223
224; CHECK-P9-LABEL: @test30
225; CHECK-P9: lxv 0, 0(3)
226; CHECK-P9: lxv 1, 0(4)
227; CHECK-P9: xxpermdi 34, 0, 1, 2
228}
229
230define <2 x double> @test31(<2 x double>* %p1, <2 x double>* %p2) {
231  %v1 = load <2 x double>, <2 x double>* %p1
232  %v2 = load <2 x double>, <2 x double>* %p2
233  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 1>
234  ret <2 x double> %v3
235
236; CHECK-LABEL: @test31
237; CHECK: lxvd2x 0, 0, 3
238; CHECK: lxvd2x 1, 0, 4
239; CHECK: xxswapd 0, 0
240; CHECK: xxswapd 1, 1
241; CHECK: xxmrghd 34, 0, 1
242
243; CHECK-P9-LABEL: @test31
244; CHECK-P9: lxv 0, 0(3)
245; CHECK-P9: lxv 1, 0(4)
246; CHECK-P9: xxmrghd 34, 0, 1
247}
248
249define <2 x double> @test32(<2 x double>* %p1, <2 x double>* %p2) {
250  %v1 = load <2 x double>, <2 x double>* %p1
251  %v2 = load <2 x double>, <2 x double>* %p2
252  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 2>
253  ret <2 x double> %v3
254
255; CHECK-LABEL: @test32
256; CHECK: lxvd2x 34, 0, 4
257
258; CHECK-P9-LABEL: @test32
259; CHECK-P9: lxvd2x 34, 0, 4
260}
261
262define <2 x double> @test33(<2 x double>* %p1, <2 x double>* %p2) {
263  %v1 = load <2 x double>, <2 x double>* %p1
264  %v2 = load <2 x double>, <2 x double>* %p2
265  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 3>
266  ret <2 x double> %v3
267
268; CHECK-LABEL: @test33
269; CHECK: lxvd2x 0, 0, 4
270; CHECK: xxspltd 34, 0, 1
271
272; CHECK-P9-LABEL: @test33
273; CHECK-P9: lxv 0, 0(4)
274; CHECK-P9: xxspltd 34, 0, 0
275}
276