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: lxvx 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: lxvx 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: lxvx 0, 0, 3
55; CHECK-P9: lxvx 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: lxvx 0, 0, 3
74; CHECK-P9: lxvx 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: lxvx 0, 0, 3
89; CHECK-P9: xxswapd 34, 0
90}
91
92define <2 x double> @test11(<2 x double>* %p1, <2 x double>* %p2) {
93  %v1 = load <2 x double>, <2 x double>* %p1
94  %v2 = load <2 x double>, <2 x double>* %p2
95  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 1>
96  ret <2 x double> %v3
97
98; CHECK-LABEL: @test11
99; CHECK: lxvd2x 0, 0, 3
100; CHECK: xxspltd 34, 0, 1
101
102; CHECK-P9-LABEL: @test11
103; CHECK-P9: lxvx 0, 0, 3
104; CHECK-P9: xxspltd 34, 0, 0
105}
106
107define <2 x double> @test12(<2 x double>* %p1, <2 x double>* %p2) {
108  %v1 = load <2 x double>, <2 x double>* %p1
109  %v2 = load <2 x double>, <2 x double>* %p2
110  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 2>
111  ret <2 x double> %v3
112
113; CHECK-LABEL: @test12
114; CHECK: lxvd2x 0, 0, 3
115; CHECK: lxvd2x 1, 0, 4
116; CHECK: xxswapd 0, 0
117; CHECK: xxswapd 1, 1
118; CHECK: xxpermdi 34, 1, 0, 2
119
120; CHECK-P9-LABEL: @test12
121; CHECK-P9: lxvx 0, 0, 3
122; CHECK-P9: lxvx 1, 0, 4
123; CHECK-P9: xxpermdi 34, 1, 0, 2
124}
125
126define <2 x double> @test13(<2 x double>* %p1, <2 x double>* %p2) {
127  %v1 = load <2 x double>, <2 x double>* %p1
128  %v2 = load <2 x double>, <2 x double>* %p2
129  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 3>
130  ret <2 x double> %v3
131
132; CHECK-LABEL: @test13
133; CHECK: lxvd2x 0, 0, 3
134; CHECK: lxvd2x 1, 0, 4
135; CHECK: xxswapd 0, 0
136; CHECK: xxswapd 1, 1
137; CHECK: xxmrghd 34, 1, 0
138
139; CHECK-P9-LABEL: @test13
140; CHECK-P9: lxvx 0, 0, 3
141; CHECK-P9: lxvx 1, 0, 4
142; CHECK-P9: xxmrghd 34, 1, 0
143}
144
145define <2 x double> @test20(<2 x double>* %p1, <2 x double>* %p2) {
146  %v1 = load <2 x double>, <2 x double>* %p1
147  %v2 = load <2 x double>, <2 x double>* %p2
148  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 0>
149  ret <2 x double> %v3
150
151; CHECK-LABEL: @test20
152; CHECK: lxvd2x 0, 0, 3
153; CHECK: lxvd2x 1, 0, 4
154; CHECK: xxswapd 0, 0
155; CHECK: xxswapd 1, 1
156; CHECK: xxmrgld 34, 0, 1
157
158; CHECK-P9-LABEL: @test20
159; CHECK-P9: lxvx 0, 0, 3
160; CHECK-P9: lxvx 1, 0, 4
161; CHECK-P9: xxmrgld 34, 0, 1
162}
163
164define <2 x double> @test21(<2 x double>* %p1, <2 x double>* %p2) {
165  %v1 = load <2 x double>, <2 x double>* %p1
166  %v2 = load <2 x double>, <2 x double>* %p2
167  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 1>
168  ret <2 x double> %v3
169
170; CHECK-LABEL: @test21
171; CHECK: lxvd2x 0, 0, 3
172; CHECK: lxvd2x 1, 0, 4
173; CHECK: xxswapd 0, 0
174; CHECK: xxswapd 1, 1
175; CHECK: xxpermdi 34, 0, 1, 1
176
177; CHECK-P9-LABEL: @test21
178; CHECK-P9: lxvx 0, 0, 3
179; CHECK-P9: lxvx 1, 0, 4
180; CHECK-P9: xxpermdi 34, 0, 1, 1
181}
182
183define <2 x double> @test22(<2 x double>* %p1, <2 x double>* %p2) {
184  %v1 = load <2 x double>, <2 x double>* %p1
185  %v2 = load <2 x double>, <2 x double>* %p2
186  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 2>
187  ret <2 x double> %v3
188
189; CHECK-LABEL: @test22
190; CHECK: lxvd2x 0, 0, 4
191; CHECK: xxspltd 34, 0, 0
192
193; CHECK-P9-LABEL: @test22
194; CHECK-P9: lxvx 0, 0, 4
195; CHECK-P9: xxspltd 34, 0, 1
196}
197
198define <2 x double> @test23(<2 x double>* %p1, <2 x double>* %p2) {
199  %v1 = load <2 x double>, <2 x double>* %p1
200  %v2 = load <2 x double>, <2 x double>* %p2
201  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 3>
202  ret <2 x double> %v3
203
204; CHECK-LABEL: @test23
205; CHECK: lxvd2x 0, 0, 4
206; CHECK: xxswapd 34, 0
207
208; CHECK-P9-LABEL: @test23
209; CHECK-P9: lxvx 34, 0, 4
210}
211
212define <2 x double> @test30(<2 x double>* %p1, <2 x double>* %p2) {
213  %v1 = load <2 x double>, <2 x double>* %p1
214  %v2 = load <2 x double>, <2 x double>* %p2
215  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 0>
216  ret <2 x double> %v3
217
218; CHECK-LABEL: @test30
219; CHECK: lxvd2x 0, 0, 3
220; CHECK: lxvd2x 1, 0, 4
221; CHECK: xxswapd 0, 0
222; CHECK: xxswapd 1, 1
223; CHECK: xxpermdi 34, 0, 1, 2
224
225; CHECK-P9-LABEL: @test30
226; CHECK-P9: lxvx 0, 0, 3
227; CHECK-P9: lxvx 1, 0, 4
228; CHECK-P9: xxpermdi 34, 0, 1, 2
229}
230
231define <2 x double> @test31(<2 x double>* %p1, <2 x double>* %p2) {
232  %v1 = load <2 x double>, <2 x double>* %p1
233  %v2 = load <2 x double>, <2 x double>* %p2
234  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 1>
235  ret <2 x double> %v3
236
237; CHECK-LABEL: @test31
238; CHECK: lxvd2x 0, 0, 3
239; CHECK: lxvd2x 1, 0, 4
240; CHECK: xxswapd 0, 0
241; CHECK: xxswapd 1, 1
242; CHECK: xxmrghd 34, 0, 1
243
244; CHECK-P9-LABEL: @test31
245; CHECK-P9: lxvx 0, 0, 3
246; CHECK-P9: lxvx 1, 0, 4
247; CHECK-P9: xxmrghd 34, 0, 1
248}
249
250define <2 x double> @test32(<2 x double>* %p1, <2 x double>* %p2) {
251  %v1 = load <2 x double>, <2 x double>* %p1
252  %v2 = load <2 x double>, <2 x double>* %p2
253  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 2>
254  ret <2 x double> %v3
255
256; CHECK-LABEL: @test32
257; CHECK: lxvd2x 34, 0, 4
258
259; CHECK-P9-LABEL: @test32
260; CHECK-P9: lxvx 0, 0, 4
261; CHECK-P9: xxswapd 34, 0
262}
263
264define <2 x double> @test33(<2 x double>* %p1, <2 x double>* %p2) {
265  %v1 = load <2 x double>, <2 x double>* %p1
266  %v2 = load <2 x double>, <2 x double>* %p2
267  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 3>
268  ret <2 x double> %v3
269
270; CHECK-LABEL: @test33
271; CHECK: lxvd2x 0, 0, 4
272; CHECK: xxspltd 34, 0, 1
273
274; CHECK-P9-LABEL: @test33
275; CHECK-P9: lxvx 0, 0, 4
276; CHECK-P9: xxspltd 34, 0, 0
277}
278