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