1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr7 \
3; RUN:     -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx \
4; RUN:     -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck %s
5; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr7 \
6; RUN:     -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx \
7; RUN:     -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck \
8; RUN:     -check-prefix=CHECK-REG %s
9; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr7 \
10; RUN:     -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx -fast-isel -O0 \
11; RUN:     -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck \
12; RUN:     -check-prefix=CHECK-FISL %s
13; RUN: llc -relocation-model=static -verify-machineinstrs -mcpu=pwr8 \
14; RUN:     -mtriple=powerpc64le-unknown-linux-gnu -mattr=+vsx \
15; RUN:     -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck \
16; RUN:     -check-prefix=CHECK-LE %s
17
18define double @test1(double %a, double %b) {
19; CHECK-LABEL: test1:
20; CHECK:       # %bb.0: # %entry
21; CHECK-NEXT:    xsmuldp f1, f1, f2
22; CHECK-NEXT:    blr
23;
24; CHECK-REG-LABEL: test1:
25; CHECK-REG:       # %bb.0: # %entry
26; CHECK-REG-NEXT:    xsmuldp f1, f1, f2
27; CHECK-REG-NEXT:    blr
28;
29; CHECK-FISL-LABEL: test1:
30; CHECK-FISL:       # %bb.0: # %entry
31; CHECK-FISL-NEXT:    xsmuldp f1, f1, f2
32; CHECK-FISL-NEXT:    blr
33;
34; CHECK-LE-LABEL: test1:
35; CHECK-LE:       # %bb.0: # %entry
36; CHECK-LE-NEXT:    xsmuldp f1, f1, f2
37; CHECK-LE-NEXT:    blr
38entry:
39  %v = fmul double %a, %b
40  ret double %v
41
42
43}
44
45define double @test2(double %a, double %b) {
46; CHECK-LABEL: test2:
47; CHECK:       # %bb.0: # %entry
48; CHECK-NEXT:    xsdivdp f1, f1, f2
49; CHECK-NEXT:    blr
50;
51; CHECK-REG-LABEL: test2:
52; CHECK-REG:       # %bb.0: # %entry
53; CHECK-REG-NEXT:    xsdivdp f1, f1, f2
54; CHECK-REG-NEXT:    blr
55;
56; CHECK-FISL-LABEL: test2:
57; CHECK-FISL:       # %bb.0: # %entry
58; CHECK-FISL-NEXT:    xsdivdp f1, f1, f2
59; CHECK-FISL-NEXT:    blr
60;
61; CHECK-LE-LABEL: test2:
62; CHECK-LE:       # %bb.0: # %entry
63; CHECK-LE-NEXT:    xsdivdp f1, f1, f2
64; CHECK-LE-NEXT:    blr
65entry:
66  %v = fdiv double %a, %b
67  ret double %v
68
69
70}
71
72define double @test3(double %a, double %b) {
73; CHECK-LABEL: test3:
74; CHECK:       # %bb.0: # %entry
75; CHECK-NEXT:    xsadddp f1, f1, f2
76; CHECK-NEXT:    blr
77;
78; CHECK-REG-LABEL: test3:
79; CHECK-REG:       # %bb.0: # %entry
80; CHECK-REG-NEXT:    xsadddp f1, f1, f2
81; CHECK-REG-NEXT:    blr
82;
83; CHECK-FISL-LABEL: test3:
84; CHECK-FISL:       # %bb.0: # %entry
85; CHECK-FISL-NEXT:    xsadddp f1, f1, f2
86; CHECK-FISL-NEXT:    blr
87;
88; CHECK-LE-LABEL: test3:
89; CHECK-LE:       # %bb.0: # %entry
90; CHECK-LE-NEXT:    xsadddp f1, f1, f2
91; CHECK-LE-NEXT:    blr
92entry:
93  %v = fadd double %a, %b
94  ret double %v
95
96
97}
98
99define <2 x double> @test4(<2 x double> %a, <2 x double> %b) {
100; CHECK-LABEL: test4:
101; CHECK:       # %bb.0: # %entry
102; CHECK-NEXT:    xvadddp v2, v2, v3
103; CHECK-NEXT:    blr
104;
105; CHECK-REG-LABEL: test4:
106; CHECK-REG:       # %bb.0: # %entry
107; CHECK-REG-NEXT:    xvadddp v2, v2, v3
108; CHECK-REG-NEXT:    blr
109;
110; CHECK-FISL-LABEL: test4:
111; CHECK-FISL:       # %bb.0: # %entry
112; CHECK-FISL-NEXT:    xvadddp v2, v2, v3
113; CHECK-FISL-NEXT:    blr
114;
115; CHECK-LE-LABEL: test4:
116; CHECK-LE:       # %bb.0: # %entry
117; CHECK-LE-NEXT:    xvadddp v2, v2, v3
118; CHECK-LE-NEXT:    blr
119entry:
120  %v = fadd <2 x double> %a, %b
121  ret <2 x double> %v
122
123
124}
125
126define <4 x i32> @test5(<4 x i32> %a, <4 x i32> %b) {
127; CHECK-LABEL: test5:
128; CHECK:       # %bb.0: # %entry
129; CHECK-NEXT:    xxlxor v2, v2, v3
130; CHECK-NEXT:    blr
131;
132; CHECK-REG-LABEL: test5:
133; CHECK-REG:       # %bb.0: # %entry
134; CHECK-REG-NEXT:    xxlxor v2, v2, v3
135; CHECK-REG-NEXT:    blr
136;
137; CHECK-FISL-LABEL: test5:
138; CHECK-FISL:       # %bb.0: # %entry
139; CHECK-FISL-NEXT:    xxlxor v2, v2, v3
140; CHECK-FISL-NEXT:    blr
141;
142; CHECK-LE-LABEL: test5:
143; CHECK-LE:       # %bb.0: # %entry
144; CHECK-LE-NEXT:    xxlxor v2, v2, v3
145; CHECK-LE-NEXT:    blr
146entry:
147  %v = xor <4 x i32> %a, %b
148  ret <4 x i32> %v
149
150
151
152}
153
154define <8 x i16> @test6(<8 x i16> %a, <8 x i16> %b) {
155; CHECK-LABEL: test6:
156; CHECK:       # %bb.0: # %entry
157; CHECK-NEXT:    xxlxor v2, v2, v3
158; CHECK-NEXT:    blr
159;
160; CHECK-REG-LABEL: test6:
161; CHECK-REG:       # %bb.0: # %entry
162; CHECK-REG-NEXT:    xxlxor v2, v2, v3
163; CHECK-REG-NEXT:    blr
164;
165; CHECK-FISL-LABEL: test6:
166; CHECK-FISL:       # %bb.0: # %entry
167; CHECK-FISL-NEXT:    xxlxor v2, v2, v3
168; CHECK-FISL-NEXT:    blr
169;
170; CHECK-LE-LABEL: test6:
171; CHECK-LE:       # %bb.0: # %entry
172; CHECK-LE-NEXT:    xxlxor v2, v2, v3
173; CHECK-LE-NEXT:    blr
174entry:
175  %v = xor <8 x i16> %a, %b
176  ret <8 x i16> %v
177
178
179
180}
181
182define <16 x i8> @test7(<16 x i8> %a, <16 x i8> %b) {
183; CHECK-LABEL: test7:
184; CHECK:       # %bb.0: # %entry
185; CHECK-NEXT:    xxlxor v2, v2, v3
186; CHECK-NEXT:    blr
187;
188; CHECK-REG-LABEL: test7:
189; CHECK-REG:       # %bb.0: # %entry
190; CHECK-REG-NEXT:    xxlxor v2, v2, v3
191; CHECK-REG-NEXT:    blr
192;
193; CHECK-FISL-LABEL: test7:
194; CHECK-FISL:       # %bb.0: # %entry
195; CHECK-FISL-NEXT:    xxlxor v2, v2, v3
196; CHECK-FISL-NEXT:    blr
197;
198; CHECK-LE-LABEL: test7:
199; CHECK-LE:       # %bb.0: # %entry
200; CHECK-LE-NEXT:    xxlxor v2, v2, v3
201; CHECK-LE-NEXT:    blr
202entry:
203  %v = xor <16 x i8> %a, %b
204  ret <16 x i8> %v
205
206
207
208}
209
210define <4 x i32> @test8(<4 x i32> %a, <4 x i32> %b) {
211; CHECK-LABEL: test8:
212; CHECK:       # %bb.0: # %entry
213; CHECK-NEXT:    xxlor v2, v2, v3
214; CHECK-NEXT:    blr
215;
216; CHECK-REG-LABEL: test8:
217; CHECK-REG:       # %bb.0: # %entry
218; CHECK-REG-NEXT:    xxlor v2, v2, v3
219; CHECK-REG-NEXT:    blr
220;
221; CHECK-FISL-LABEL: test8:
222; CHECK-FISL:       # %bb.0: # %entry
223; CHECK-FISL-NEXT:    xxlor v2, v2, v3
224; CHECK-FISL-NEXT:    blr
225;
226; CHECK-LE-LABEL: test8:
227; CHECK-LE:       # %bb.0: # %entry
228; CHECK-LE-NEXT:    xxlor v2, v2, v3
229; CHECK-LE-NEXT:    blr
230entry:
231  %v = or <4 x i32> %a, %b
232  ret <4 x i32> %v
233
234
235
236}
237
238define <8 x i16> @test9(<8 x i16> %a, <8 x i16> %b) {
239; CHECK-LABEL: test9:
240; CHECK:       # %bb.0: # %entry
241; CHECK-NEXT:    xxlor v2, v2, v3
242; CHECK-NEXT:    blr
243;
244; CHECK-REG-LABEL: test9:
245; CHECK-REG:       # %bb.0: # %entry
246; CHECK-REG-NEXT:    xxlor v2, v2, v3
247; CHECK-REG-NEXT:    blr
248;
249; CHECK-FISL-LABEL: test9:
250; CHECK-FISL:       # %bb.0: # %entry
251; CHECK-FISL-NEXT:    xxlor v2, v2, v3
252; CHECK-FISL-NEXT:    blr
253;
254; CHECK-LE-LABEL: test9:
255; CHECK-LE:       # %bb.0: # %entry
256; CHECK-LE-NEXT:    xxlor v2, v2, v3
257; CHECK-LE-NEXT:    blr
258entry:
259  %v = or <8 x i16> %a, %b
260  ret <8 x i16> %v
261
262
263
264}
265
266define <16 x i8> @test10(<16 x i8> %a, <16 x i8> %b) {
267; CHECK-LABEL: test10:
268; CHECK:       # %bb.0: # %entry
269; CHECK-NEXT:    xxlor v2, v2, v3
270; CHECK-NEXT:    blr
271;
272; CHECK-REG-LABEL: test10:
273; CHECK-REG:       # %bb.0: # %entry
274; CHECK-REG-NEXT:    xxlor v2, v2, v3
275; CHECK-REG-NEXT:    blr
276;
277; CHECK-FISL-LABEL: test10:
278; CHECK-FISL:       # %bb.0: # %entry
279; CHECK-FISL-NEXT:    xxlor v2, v2, v3
280; CHECK-FISL-NEXT:    blr
281;
282; CHECK-LE-LABEL: test10:
283; CHECK-LE:       # %bb.0: # %entry
284; CHECK-LE-NEXT:    xxlor v2, v2, v3
285; CHECK-LE-NEXT:    blr
286entry:
287  %v = or <16 x i8> %a, %b
288  ret <16 x i8> %v
289
290
291
292}
293
294define <4 x i32> @test11(<4 x i32> %a, <4 x i32> %b) {
295; CHECK-LABEL: test11:
296; CHECK:       # %bb.0: # %entry
297; CHECK-NEXT:    xxland v2, v2, v3
298; CHECK-NEXT:    blr
299;
300; CHECK-REG-LABEL: test11:
301; CHECK-REG:       # %bb.0: # %entry
302; CHECK-REG-NEXT:    xxland v2, v2, v3
303; CHECK-REG-NEXT:    blr
304;
305; CHECK-FISL-LABEL: test11:
306; CHECK-FISL:       # %bb.0: # %entry
307; CHECK-FISL-NEXT:    xxland v2, v2, v3
308; CHECK-FISL-NEXT:    blr
309;
310; CHECK-LE-LABEL: test11:
311; CHECK-LE:       # %bb.0: # %entry
312; CHECK-LE-NEXT:    xxland v2, v2, v3
313; CHECK-LE-NEXT:    blr
314entry:
315  %v = and <4 x i32> %a, %b
316  ret <4 x i32> %v
317
318
319
320}
321
322define <8 x i16> @test12(<8 x i16> %a, <8 x i16> %b) {
323; CHECK-LABEL: test12:
324; CHECK:       # %bb.0: # %entry
325; CHECK-NEXT:    xxland v2, v2, v3
326; CHECK-NEXT:    blr
327;
328; CHECK-REG-LABEL: test12:
329; CHECK-REG:       # %bb.0: # %entry
330; CHECK-REG-NEXT:    xxland v2, v2, v3
331; CHECK-REG-NEXT:    blr
332;
333; CHECK-FISL-LABEL: test12:
334; CHECK-FISL:       # %bb.0: # %entry
335; CHECK-FISL-NEXT:    xxland v2, v2, v3
336; CHECK-FISL-NEXT:    blr
337;
338; CHECK-LE-LABEL: test12:
339; CHECK-LE:       # %bb.0: # %entry
340; CHECK-LE-NEXT:    xxland v2, v2, v3
341; CHECK-LE-NEXT:    blr
342entry:
343  %v = and <8 x i16> %a, %b
344  ret <8 x i16> %v
345
346
347
348}
349
350define <16 x i8> @test13(<16 x i8> %a, <16 x i8> %b) {
351; CHECK-LABEL: test13:
352; CHECK:       # %bb.0: # %entry
353; CHECK-NEXT:    xxland v2, v2, v3
354; CHECK-NEXT:    blr
355;
356; CHECK-REG-LABEL: test13:
357; CHECK-REG:       # %bb.0: # %entry
358; CHECK-REG-NEXT:    xxland v2, v2, v3
359; CHECK-REG-NEXT:    blr
360;
361; CHECK-FISL-LABEL: test13:
362; CHECK-FISL:       # %bb.0: # %entry
363; CHECK-FISL-NEXT:    xxland v2, v2, v3
364; CHECK-FISL-NEXT:    blr
365;
366; CHECK-LE-LABEL: test13:
367; CHECK-LE:       # %bb.0: # %entry
368; CHECK-LE-NEXT:    xxland v2, v2, v3
369; CHECK-LE-NEXT:    blr
370entry:
371  %v = and <16 x i8> %a, %b
372  ret <16 x i8> %v
373
374
375
376}
377
378define <4 x i32> @test14(<4 x i32> %a, <4 x i32> %b) {
379; CHECK-LABEL: test14:
380; CHECK:       # %bb.0: # %entry
381; CHECK-NEXT:    xxlnor v2, v2, v3
382; CHECK-NEXT:    blr
383;
384; CHECK-REG-LABEL: test14:
385; CHECK-REG:       # %bb.0: # %entry
386; CHECK-REG-NEXT:    xxlnor v2, v2, v3
387; CHECK-REG-NEXT:    blr
388;
389; CHECK-FISL-LABEL: test14:
390; CHECK-FISL:       # %bb.0: # %entry
391; CHECK-FISL-NEXT:    xxlor vs0, v2, v3
392; CHECK-FISL-NEXT:    xxlnor v2, v2, v3
393; CHECK-FISL-NEXT:    blr
394;
395; CHECK-LE-LABEL: test14:
396; CHECK-LE:       # %bb.0: # %entry
397; CHECK-LE-NEXT:    xxlnor v2, v2, v3
398; CHECK-LE-NEXT:    blr
399entry:
400  %v = or <4 x i32> %a, %b
401  %w = xor <4 x i32> %v, <i32 -1, i32 -1, i32 -1, i32 -1>
402  ret <4 x i32> %w
403
404
405
406}
407
408define <8 x i16> @test15(<8 x i16> %a, <8 x i16> %b) {
409; CHECK-LABEL: test15:
410; CHECK:       # %bb.0: # %entry
411; CHECK-NEXT:    xxlnor v2, v2, v3
412; CHECK-NEXT:    blr
413;
414; CHECK-REG-LABEL: test15:
415; CHECK-REG:       # %bb.0: # %entry
416; CHECK-REG-NEXT:    xxlnor v2, v2, v3
417; CHECK-REG-NEXT:    blr
418;
419; CHECK-FISL-LABEL: test15:
420; CHECK-FISL:       # %bb.0: # %entry
421; CHECK-FISL-NEXT:    xxlor v4, v2, v3
422; CHECK-FISL-NEXT:    xxlnor v2, v2, v3
423; CHECK-FISL-NEXT:    blr
424;
425; CHECK-LE-LABEL: test15:
426; CHECK-LE:       # %bb.0: # %entry
427; CHECK-LE-NEXT:    xxlnor v2, v2, v3
428; CHECK-LE-NEXT:    blr
429entry:
430  %v = or <8 x i16> %a, %b
431  %w = xor <8 x i16> %v, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
432  ret <8 x i16> %w
433
434
435
436}
437
438define <16 x i8> @test16(<16 x i8> %a, <16 x i8> %b) {
439; CHECK-LABEL: test16:
440; CHECK:       # %bb.0: # %entry
441; CHECK-NEXT:    xxlnor v2, v2, v3
442; CHECK-NEXT:    blr
443;
444; CHECK-REG-LABEL: test16:
445; CHECK-REG:       # %bb.0: # %entry
446; CHECK-REG-NEXT:    xxlnor v2, v2, v3
447; CHECK-REG-NEXT:    blr
448;
449; CHECK-FISL-LABEL: test16:
450; CHECK-FISL:       # %bb.0: # %entry
451; CHECK-FISL-NEXT:    xxlor v4, v2, v3
452; CHECK-FISL-NEXT:    xxlnor v2, v2, v3
453; CHECK-FISL-NEXT:    blr
454;
455; CHECK-LE-LABEL: test16:
456; CHECK-LE:       # %bb.0: # %entry
457; CHECK-LE-NEXT:    xxlnor v2, v2, v3
458; CHECK-LE-NEXT:    blr
459entry:
460  %v = or <16 x i8> %a, %b
461  %w = xor <16 x i8> %v, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
462  ret <16 x i8> %w
463
464
465
466}
467
468define <4 x i32> @test17(<4 x i32> %a, <4 x i32> %b) {
469; CHECK-LABEL: test17:
470; CHECK:       # %bb.0: # %entry
471; CHECK-NEXT:    xxlandc v2, v2, v3
472; CHECK-NEXT:    blr
473;
474; CHECK-REG-LABEL: test17:
475; CHECK-REG:       # %bb.0: # %entry
476; CHECK-REG-NEXT:    xxlandc v2, v2, v3
477; CHECK-REG-NEXT:    blr
478;
479; CHECK-FISL-LABEL: test17:
480; CHECK-FISL:       # %bb.0: # %entry
481; CHECK-FISL-NEXT:    xxlnor vs0, v3, v3
482; CHECK-FISL-NEXT:    xxland v2, v2, vs0
483; CHECK-FISL-NEXT:    blr
484;
485; CHECK-LE-LABEL: test17:
486; CHECK-LE:       # %bb.0: # %entry
487; CHECK-LE-NEXT:    xxlandc v2, v2, v3
488; CHECK-LE-NEXT:    blr
489entry:
490  %w = xor <4 x i32> %b, <i32 -1, i32 -1, i32 -1, i32 -1>
491  %v = and <4 x i32> %a, %w
492  ret <4 x i32> %v
493
494
495
496}
497
498define <8 x i16> @test18(<8 x i16> %a, <8 x i16> %b) {
499; CHECK-LABEL: test18:
500; CHECK:       # %bb.0: # %entry
501; CHECK-NEXT:    xxlandc v2, v2, v3
502; CHECK-NEXT:    blr
503;
504; CHECK-REG-LABEL: test18:
505; CHECK-REG:       # %bb.0: # %entry
506; CHECK-REG-NEXT:    xxlandc v2, v2, v3
507; CHECK-REG-NEXT:    blr
508;
509; CHECK-FISL-LABEL: test18:
510; CHECK-FISL:       # %bb.0: # %entry
511; CHECK-FISL-NEXT:    xxlnor v4, v3, v3
512; CHECK-FISL-NEXT:    xxlandc v2, v2, v3
513; CHECK-FISL-NEXT:    blr
514;
515; CHECK-LE-LABEL: test18:
516; CHECK-LE:       # %bb.0: # %entry
517; CHECK-LE-NEXT:    xxlandc v2, v2, v3
518; CHECK-LE-NEXT:    blr
519entry:
520  %w = xor <8 x i16> %b, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
521  %v = and <8 x i16> %a, %w
522  ret <8 x i16> %v
523
524
525
526}
527
528define <16 x i8> @test19(<16 x i8> %a, <16 x i8> %b) {
529; CHECK-LABEL: test19:
530; CHECK:       # %bb.0: # %entry
531; CHECK-NEXT:    xxlandc v2, v2, v3
532; CHECK-NEXT:    blr
533;
534; CHECK-REG-LABEL: test19:
535; CHECK-REG:       # %bb.0: # %entry
536; CHECK-REG-NEXT:    xxlandc v2, v2, v3
537; CHECK-REG-NEXT:    blr
538;
539; CHECK-FISL-LABEL: test19:
540; CHECK-FISL:       # %bb.0: # %entry
541; CHECK-FISL-NEXT:    xxlnor v4, v3, v3
542; CHECK-FISL-NEXT:    xxlandc v2, v2, v3
543; CHECK-FISL-NEXT:    blr
544;
545; CHECK-LE-LABEL: test19:
546; CHECK-LE:       # %bb.0: # %entry
547; CHECK-LE-NEXT:    xxlandc v2, v2, v3
548; CHECK-LE-NEXT:    blr
549entry:
550  %w = xor <16 x i8> %b, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
551  %v = and <16 x i8> %a, %w
552  ret <16 x i8> %v
553
554
555
556}
557
558define <4 x i32> @test20(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) {
559; CHECK-LABEL: test20:
560; CHECK:       # %bb.0: # %entry
561; CHECK-NEXT:    vcmpequw v4, v4, v5
562; CHECK-NEXT:    xxsel v2, v3, v2, v4
563; CHECK-NEXT:    blr
564;
565; CHECK-REG-LABEL: test20:
566; CHECK-REG:       # %bb.0: # %entry
567; CHECK-REG-NEXT:    vcmpequw v4, v4, v5
568; CHECK-REG-NEXT:    xxsel v2, v3, v2, v4
569; CHECK-REG-NEXT:    blr
570;
571; CHECK-FISL-LABEL: test20:
572; CHECK-FISL:       # %bb.0: # %entry
573; CHECK-FISL-NEXT:    vcmpequw v4, v4, v5
574; CHECK-FISL-NEXT:    xxsel v2, v3, v2, v4
575; CHECK-FISL-NEXT:    blr
576;
577; CHECK-LE-LABEL: test20:
578; CHECK-LE:       # %bb.0: # %entry
579; CHECK-LE-NEXT:    vcmpequw v4, v4, v5
580; CHECK-LE-NEXT:    xxsel v2, v3, v2, v4
581; CHECK-LE-NEXT:    blr
582entry:
583  %m = icmp eq <4 x i32> %c, %d
584  %v = select <4 x i1> %m, <4 x i32> %a, <4 x i32> %b
585  ret <4 x i32> %v
586
587
588
589}
590
591define <4 x float> @test21(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x float> %d) {
592; CHECK-LABEL: test21:
593; CHECK:       # %bb.0: # %entry
594; CHECK-NEXT:    xvcmpeqsp vs0, v4, v5
595; CHECK-NEXT:    xxsel v2, v3, v2, vs0
596; CHECK-NEXT:    blr
597;
598; CHECK-REG-LABEL: test21:
599; CHECK-REG:       # %bb.0: # %entry
600; CHECK-REG-NEXT:    xvcmpeqsp vs0, v4, v5
601; CHECK-REG-NEXT:    xxsel v2, v3, v2, vs0
602; CHECK-REG-NEXT:    blr
603;
604; CHECK-FISL-LABEL: test21:
605; CHECK-FISL:       # %bb.0: # %entry
606; CHECK-FISL-NEXT:    xvcmpeqsp vs0, v4, v5
607; CHECK-FISL-NEXT:    xxsel v2, v3, v2, vs0
608; CHECK-FISL-NEXT:    blr
609;
610; CHECK-LE-LABEL: test21:
611; CHECK-LE:       # %bb.0: # %entry
612; CHECK-LE-NEXT:    xvcmpeqsp vs0, v4, v5
613; CHECK-LE-NEXT:    xxsel v2, v3, v2, vs0
614; CHECK-LE-NEXT:    blr
615entry:
616  %m = fcmp oeq <4 x float> %c, %d
617  %v = select <4 x i1> %m, <4 x float> %a, <4 x float> %b
618  ret <4 x float> %v
619
620
621
622}
623
624define <4 x float> @test22(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x float> %d) {
625; CHECK-LABEL: test22:
626; CHECK:       # %bb.0: # %entry
627; CHECK-NEXT:    xvcmpgtsp vs0, v5, v4
628; CHECK-NEXT:    xvcmpgtsp vs1, v4, v5
629; CHECK-NEXT:    xxlor vs0, vs1, vs0
630; CHECK-NEXT:    xxsel v2, v2, v3, vs0
631; CHECK-NEXT:    blr
632;
633; CHECK-REG-LABEL: test22:
634; CHECK-REG:       # %bb.0: # %entry
635; CHECK-REG-NEXT:    xvcmpgtsp vs0, v5, v4
636; CHECK-REG-NEXT:    xvcmpgtsp vs1, v4, v5
637; CHECK-REG-NEXT:    xxlor vs0, vs1, vs0
638; CHECK-REG-NEXT:    xxsel v2, v2, v3, vs0
639; CHECK-REG-NEXT:    blr
640;
641; CHECK-FISL-LABEL: test22:
642; CHECK-FISL:       # %bb.0: # %entry
643; CHECK-FISL-NEXT:    xvcmpgtsp vs1, v5, v4
644; CHECK-FISL-NEXT:    xvcmpgtsp vs0, v4, v5
645; CHECK-FISL-NEXT:    xxlor vs0, vs0, vs1
646; CHECK-FISL-NEXT:    xxsel v2, v2, v3, vs0
647; CHECK-FISL-NEXT:    blr
648;
649; CHECK-LE-LABEL: test22:
650; CHECK-LE:       # %bb.0: # %entry
651; CHECK-LE-NEXT:    xvcmpgtsp vs0, v5, v4
652; CHECK-LE-NEXT:    xvcmpgtsp vs1, v4, v5
653; CHECK-LE-NEXT:    xxlor vs0, vs1, vs0
654; CHECK-LE-NEXT:    xxsel v2, v2, v3, vs0
655; CHECK-LE-NEXT:    blr
656entry:
657  %m = fcmp ueq <4 x float> %c, %d
658  %v = select <4 x i1> %m, <4 x float> %a, <4 x float> %b
659  ret <4 x float> %v
660
661
662
663}
664
665define <8 x i16> @test23(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c, <8 x i16> %d) {
666; CHECK-LABEL: test23:
667; CHECK:       # %bb.0: # %entry
668; CHECK-NEXT:    vcmpequh v4, v4, v5
669; CHECK-NEXT:    xxsel v2, v3, v2, v4
670; CHECK-NEXT:    blr
671;
672; CHECK-REG-LABEL: test23:
673; CHECK-REG:       # %bb.0: # %entry
674; CHECK-REG-NEXT:    vcmpequh v4, v4, v5
675; CHECK-REG-NEXT:    xxsel v2, v3, v2, v4
676; CHECK-REG-NEXT:    blr
677;
678; CHECK-FISL-LABEL: test23:
679; CHECK-FISL:       # %bb.0: # %entry
680; CHECK-FISL-NEXT:    vcmpequh v4, v4, v5
681; CHECK-FISL-NEXT:    xxlor vs0, v4, v4
682; CHECK-FISL-NEXT:    xxsel v2, v3, v2, vs0
683; CHECK-FISL-NEXT:    blr
684;
685; CHECK-LE-LABEL: test23:
686; CHECK-LE:       # %bb.0: # %entry
687; CHECK-LE-NEXT:    vcmpequh v4, v4, v5
688; CHECK-LE-NEXT:    xxsel v2, v3, v2, v4
689; CHECK-LE-NEXT:    blr
690entry:
691  %m = icmp eq <8 x i16> %c, %d
692  %v = select <8 x i1> %m, <8 x i16> %a, <8 x i16> %b
693  ret <8 x i16> %v
694
695
696
697}
698
699define <16 x i8> @test24(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, <16 x i8> %d) {
700; CHECK-LABEL: test24:
701; CHECK:       # %bb.0: # %entry
702; CHECK-NEXT:    vcmpequb v4, v4, v5
703; CHECK-NEXT:    xxsel v2, v3, v2, v4
704; CHECK-NEXT:    blr
705;
706; CHECK-REG-LABEL: test24:
707; CHECK-REG:       # %bb.0: # %entry
708; CHECK-REG-NEXT:    vcmpequb v4, v4, v5
709; CHECK-REG-NEXT:    xxsel v2, v3, v2, v4
710; CHECK-REG-NEXT:    blr
711;
712; CHECK-FISL-LABEL: test24:
713; CHECK-FISL:       # %bb.0: # %entry
714; CHECK-FISL-NEXT:    vcmpequb v4, v4, v5
715; CHECK-FISL-NEXT:    xxlor vs0, v4, v4
716; CHECK-FISL-NEXT:    xxsel v2, v3, v2, vs0
717; CHECK-FISL-NEXT:    blr
718;
719; CHECK-LE-LABEL: test24:
720; CHECK-LE:       # %bb.0: # %entry
721; CHECK-LE-NEXT:    vcmpequb v4, v4, v5
722; CHECK-LE-NEXT:    xxsel v2, v3, v2, v4
723; CHECK-LE-NEXT:    blr
724entry:
725  %m = icmp eq <16 x i8> %c, %d
726  %v = select <16 x i1> %m, <16 x i8> %a, <16 x i8> %b
727  ret <16 x i8> %v
728
729
730
731}
732
733define <2 x double> @test25(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x double> %d) {
734; CHECK-LABEL: test25:
735; CHECK:       # %bb.0: # %entry
736; CHECK-NEXT:    xvcmpeqdp vs0, v4, v5
737; CHECK-NEXT:    xxsel v2, v3, v2, vs0
738; CHECK-NEXT:    blr
739;
740; CHECK-REG-LABEL: test25:
741; CHECK-REG:       # %bb.0: # %entry
742; CHECK-REG-NEXT:    xvcmpeqdp vs0, v4, v5
743; CHECK-REG-NEXT:    xxsel v2, v3, v2, vs0
744; CHECK-REG-NEXT:    blr
745;
746; CHECK-FISL-LABEL: test25:
747; CHECK-FISL:       # %bb.0: # %entry
748; CHECK-FISL-NEXT:    xvcmpeqdp vs0, v4, v5
749; CHECK-FISL-NEXT:    xxsel v2, v3, v2, vs0
750; CHECK-FISL-NEXT:    blr
751;
752; CHECK-LE-LABEL: test25:
753; CHECK-LE:       # %bb.0: # %entry
754; CHECK-LE-NEXT:    xvcmpeqdp v4, v4, v5
755; CHECK-LE-NEXT:    xxsel v2, v3, v2, v4
756; CHECK-LE-NEXT:    blr
757entry:
758  %m = fcmp oeq <2 x double> %c, %d
759  %v = select <2 x i1> %m, <2 x double> %a, <2 x double> %b
760  ret <2 x double> %v
761
762
763}
764
765define <2 x i64> @test26(<2 x i64> %a, <2 x i64> %b) {
766; CHECK-LABEL: test26:
767; CHECK:       # %bb.0:
768; CHECK-NEXT:    addi r3, r1, -32
769; CHECK-NEXT:    addi r4, r1, -48
770; CHECK-NEXT:    stxvd2x v3, 0, r3
771; CHECK-NEXT:    stxvd2x v2, 0, r4
772; CHECK-NEXT:    ld r3, -24(r1)
773; CHECK-NEXT:    ld r4, -40(r1)
774; CHECK-NEXT:    add r3, r4, r3
775; CHECK-NEXT:    ld r4, -48(r1)
776; CHECK-NEXT:    std r3, -8(r1)
777; CHECK-NEXT:    ld r3, -32(r1)
778; CHECK-NEXT:    add r3, r4, r3
779; CHECK-NEXT:    std r3, -16(r1)
780; CHECK-NEXT:    addi r3, r1, -16
781; CHECK-NEXT:    lxvd2x v2, 0, r3
782; CHECK-NEXT:    blr
783;
784; CHECK-REG-LABEL: test26:
785; CHECK-REG:       # %bb.0:
786; CHECK-REG-NEXT:    addi r3, r1, -32
787; CHECK-REG-NEXT:    addi r4, r1, -48
788; CHECK-REG-NEXT:    stxvd2x v3, 0, r3
789; CHECK-REG-NEXT:    stxvd2x v2, 0, r4
790; CHECK-REG-NEXT:    ld r3, -24(r1)
791; CHECK-REG-NEXT:    ld r4, -40(r1)
792; CHECK-REG-NEXT:    add r3, r4, r3
793; CHECK-REG-NEXT:    ld r4, -48(r1)
794; CHECK-REG-NEXT:    std r3, -8(r1)
795; CHECK-REG-NEXT:    ld r3, -32(r1)
796; CHECK-REG-NEXT:    add r3, r4, r3
797; CHECK-REG-NEXT:    std r3, -16(r1)
798; CHECK-REG-NEXT:    addi r3, r1, -16
799; CHECK-REG-NEXT:    lxvd2x v2, 0, r3
800; CHECK-REG-NEXT:    blr
801;
802; CHECK-FISL-LABEL: test26:
803; CHECK-FISL:       # %bb.0:
804; CHECK-FISL-NEXT:    addi r3, r1, -32
805; CHECK-FISL-NEXT:    stxvd2x v3, 0, r3
806; CHECK-FISL-NEXT:    addi r3, r1, -48
807; CHECK-FISL-NEXT:    stxvd2x v2, 0, r3
808; CHECK-FISL-NEXT:    ld r4, -24(r1)
809; CHECK-FISL-NEXT:    ld r3, -40(r1)
810; CHECK-FISL-NEXT:    add r3, r3, r4
811; CHECK-FISL-NEXT:    std r3, -8(r1)
812; CHECK-FISL-NEXT:    ld r4, -32(r1)
813; CHECK-FISL-NEXT:    ld r3, -48(r1)
814; CHECK-FISL-NEXT:    add r3, r3, r4
815; CHECK-FISL-NEXT:    std r3, -16(r1)
816; CHECK-FISL-NEXT:    addi r3, r1, -16
817; CHECK-FISL-NEXT:    lxvd2x v2, 0, r3
818; CHECK-FISL-NEXT:    blr
819;
820; CHECK-LE-LABEL: test26:
821; CHECK-LE:       # %bb.0:
822; CHECK-LE-NEXT:    vaddudm v2, v2, v3
823; CHECK-LE-NEXT:    blr
824  %v = add <2 x i64> %a, %b
825  ret <2 x i64> %v
826
827
828; Make sure we use only two stores (one for each operand).
829
830; FIXME: The code quality here is not good; just make sure we do something for now.
831
832}
833
834define <2 x i64> @test27(<2 x i64> %a, <2 x i64> %b) {
835; CHECK-LABEL: test27:
836; CHECK:       # %bb.0:
837; CHECK-NEXT:    xxland v2, v2, v3
838; CHECK-NEXT:    blr
839;
840; CHECK-REG-LABEL: test27:
841; CHECK-REG:       # %bb.0:
842; CHECK-REG-NEXT:    xxland v2, v2, v3
843; CHECK-REG-NEXT:    blr
844;
845; CHECK-FISL-LABEL: test27:
846; CHECK-FISL:       # %bb.0:
847; CHECK-FISL-NEXT:    xxland v2, v2, v3
848; CHECK-FISL-NEXT:    blr
849;
850; CHECK-LE-LABEL: test27:
851; CHECK-LE:       # %bb.0:
852; CHECK-LE-NEXT:    xxland v2, v2, v3
853; CHECK-LE-NEXT:    blr
854  %v = and <2 x i64> %a, %b
855  ret <2 x i64> %v
856
857
858}
859
860define <2 x double> @test28(<2 x double>* %a) {
861; CHECK-LABEL: test28:
862; CHECK:       # %bb.0:
863; CHECK-NEXT:    lxvd2x v2, 0, r3
864; CHECK-NEXT:    blr
865;
866; CHECK-REG-LABEL: test28:
867; CHECK-REG:       # %bb.0:
868; CHECK-REG-NEXT:    lxvd2x v2, 0, r3
869; CHECK-REG-NEXT:    blr
870;
871; CHECK-FISL-LABEL: test28:
872; CHECK-FISL:       # %bb.0:
873; CHECK-FISL-NEXT:    lxvd2x v2, 0, r3
874; CHECK-FISL-NEXT:    blr
875;
876; CHECK-LE-LABEL: test28:
877; CHECK-LE:       # %bb.0:
878; CHECK-LE-NEXT:    lxvd2x vs0, 0, r3
879; CHECK-LE-NEXT:    xxswapd v2, vs0
880; CHECK-LE-NEXT:    blr
881  %v = load <2 x double>, <2 x double>* %a, align 16
882  ret <2 x double> %v
883
884
885}
886
887define void @test29(<2 x double>* %a, <2 x double> %b) {
888; CHECK-LABEL: test29:
889; CHECK:       # %bb.0:
890; CHECK-NEXT:    stxvd2x v2, 0, r3
891; CHECK-NEXT:    blr
892;
893; CHECK-REG-LABEL: test29:
894; CHECK-REG:       # %bb.0:
895; CHECK-REG-NEXT:    stxvd2x v2, 0, r3
896; CHECK-REG-NEXT:    blr
897;
898; CHECK-FISL-LABEL: test29:
899; CHECK-FISL:       # %bb.0:
900; CHECK-FISL-NEXT:    stxvd2x v2, 0, r3
901; CHECK-FISL-NEXT:    blr
902;
903; CHECK-LE-LABEL: test29:
904; CHECK-LE:       # %bb.0:
905; CHECK-LE-NEXT:    xxswapd vs0, v2
906; CHECK-LE-NEXT:    stxvd2x vs0, 0, r3
907; CHECK-LE-NEXT:    blr
908  store <2 x double> %b, <2 x double>* %a, align 16
909  ret void
910
911
912}
913
914define <2 x double> @test28u(<2 x double>* %a) {
915; CHECK-LABEL: test28u:
916; CHECK:       # %bb.0:
917; CHECK-NEXT:    lxvd2x v2, 0, r3
918; CHECK-NEXT:    blr
919;
920; CHECK-REG-LABEL: test28u:
921; CHECK-REG:       # %bb.0:
922; CHECK-REG-NEXT:    lxvd2x v2, 0, r3
923; CHECK-REG-NEXT:    blr
924;
925; CHECK-FISL-LABEL: test28u:
926; CHECK-FISL:       # %bb.0:
927; CHECK-FISL-NEXT:    lxvd2x v2, 0, r3
928; CHECK-FISL-NEXT:    blr
929;
930; CHECK-LE-LABEL: test28u:
931; CHECK-LE:       # %bb.0:
932; CHECK-LE-NEXT:    lxvd2x vs0, 0, r3
933; CHECK-LE-NEXT:    xxswapd v2, vs0
934; CHECK-LE-NEXT:    blr
935  %v = load <2 x double>, <2 x double>* %a, align 8
936  ret <2 x double> %v
937
938
939}
940
941define void @test29u(<2 x double>* %a, <2 x double> %b) {
942; CHECK-LABEL: test29u:
943; CHECK:       # %bb.0:
944; CHECK-NEXT:    stxvd2x v2, 0, r3
945; CHECK-NEXT:    blr
946;
947; CHECK-REG-LABEL: test29u:
948; CHECK-REG:       # %bb.0:
949; CHECK-REG-NEXT:    stxvd2x v2, 0, r3
950; CHECK-REG-NEXT:    blr
951;
952; CHECK-FISL-LABEL: test29u:
953; CHECK-FISL:       # %bb.0:
954; CHECK-FISL-NEXT:    stxvd2x v2, 0, r3
955; CHECK-FISL-NEXT:    blr
956;
957; CHECK-LE-LABEL: test29u:
958; CHECK-LE:       # %bb.0:
959; CHECK-LE-NEXT:    xxswapd vs0, v2
960; CHECK-LE-NEXT:    stxvd2x vs0, 0, r3
961; CHECK-LE-NEXT:    blr
962  store <2 x double> %b, <2 x double>* %a, align 8
963  ret void
964
965
966}
967
968define <2 x i64> @test30(<2 x i64>* %a) {
969; CHECK-LABEL: test30:
970; CHECK:       # %bb.0:
971; CHECK-NEXT:    lxvd2x v2, 0, r3
972; CHECK-NEXT:    blr
973;
974; CHECK-REG-LABEL: test30:
975; CHECK-REG:       # %bb.0:
976; CHECK-REG-NEXT:    lxvd2x v2, 0, r3
977; CHECK-REG-NEXT:    blr
978;
979; CHECK-FISL-LABEL: test30:
980; CHECK-FISL:       # %bb.0:
981; CHECK-FISL-NEXT:    lxvd2x v2, 0, r3
982; CHECK-FISL-NEXT:    blr
983;
984; CHECK-LE-LABEL: test30:
985; CHECK-LE:       # %bb.0:
986; CHECK-LE-NEXT:    lxvd2x vs0, 0, r3
987; CHECK-LE-NEXT:    xxswapd v2, vs0
988; CHECK-LE-NEXT:    blr
989  %v = load <2 x i64>, <2 x i64>* %a, align 16
990  ret <2 x i64> %v
991
992
993
994}
995
996define void @test31(<2 x i64>* %a, <2 x i64> %b) {
997; CHECK-LABEL: test31:
998; CHECK:       # %bb.0:
999; CHECK-NEXT:    stxvd2x v2, 0, r3
1000; CHECK-NEXT:    blr
1001;
1002; CHECK-REG-LABEL: test31:
1003; CHECK-REG:       # %bb.0:
1004; CHECK-REG-NEXT:    stxvd2x v2, 0, r3
1005; CHECK-REG-NEXT:    blr
1006;
1007; CHECK-FISL-LABEL: test31:
1008; CHECK-FISL:       # %bb.0:
1009; CHECK-FISL-NEXT:    stxvd2x v2, 0, r3
1010; CHECK-FISL-NEXT:    blr
1011;
1012; CHECK-LE-LABEL: test31:
1013; CHECK-LE:       # %bb.0:
1014; CHECK-LE-NEXT:    xxswapd vs0, v2
1015; CHECK-LE-NEXT:    stxvd2x vs0, 0, r3
1016; CHECK-LE-NEXT:    blr
1017  store <2 x i64> %b, <2 x i64>* %a, align 16
1018  ret void
1019
1020
1021}
1022
1023define <4 x float> @test32(<4 x float>* %a) {
1024; CHECK-LABEL: test32:
1025; CHECK:       # %bb.0:
1026; CHECK-NEXT:    lxvw4x v2, 0, r3
1027; CHECK-NEXT:    blr
1028;
1029; CHECK-REG-LABEL: test32:
1030; CHECK-REG:       # %bb.0:
1031; CHECK-REG-NEXT:    lxvw4x v2, 0, r3
1032; CHECK-REG-NEXT:    blr
1033;
1034; CHECK-FISL-LABEL: test32:
1035; CHECK-FISL:       # %bb.0:
1036; CHECK-FISL-NEXT:    lxvw4x v2, 0, r3
1037; CHECK-FISL-NEXT:    blr
1038;
1039; CHECK-LE-LABEL: test32:
1040; CHECK-LE:       # %bb.0:
1041; CHECK-LE-NEXT:    lvx v2, 0, r3
1042; CHECK-LE-NEXT:    blr
1043  %v = load <4 x float>, <4 x float>* %a, align 16
1044  ret <4 x float> %v
1045
1046
1047
1048}
1049
1050define void @test33(<4 x float>* %a, <4 x float> %b) {
1051; CHECK-LABEL: test33:
1052; CHECK:       # %bb.0:
1053; CHECK-NEXT:    stxvw4x v2, 0, r3
1054; CHECK-NEXT:    blr
1055;
1056; CHECK-REG-LABEL: test33:
1057; CHECK-REG:       # %bb.0:
1058; CHECK-REG-NEXT:    stxvw4x v2, 0, r3
1059; CHECK-REG-NEXT:    blr
1060;
1061; CHECK-FISL-LABEL: test33:
1062; CHECK-FISL:       # %bb.0:
1063; CHECK-FISL-NEXT:    stxvw4x v2, 0, r3
1064; CHECK-FISL-NEXT:    blr
1065;
1066; CHECK-LE-LABEL: test33:
1067; CHECK-LE:       # %bb.0:
1068; CHECK-LE-NEXT:    stvx v2, 0, r3
1069; CHECK-LE-NEXT:    blr
1070  store <4 x float> %b, <4 x float>* %a, align 16
1071  ret void
1072
1073
1074
1075}
1076
1077define <4 x float> @test32u(<4 x float>* %a) {
1078; CHECK-LABEL: test32u:
1079; CHECK:       # %bb.0:
1080; CHECK-NEXT:    li r4, 15
1081; CHECK-NEXT:    lvsl v3, 0, r3
1082; CHECK-NEXT:    lvx v2, r3, r4
1083; CHECK-NEXT:    lvx v4, 0, r3
1084; CHECK-NEXT:    vperm v2, v4, v2, v3
1085; CHECK-NEXT:    blr
1086;
1087; CHECK-REG-LABEL: test32u:
1088; CHECK-REG:       # %bb.0:
1089; CHECK-REG-NEXT:    li r4, 15
1090; CHECK-REG-NEXT:    lvsl v3, 0, r3
1091; CHECK-REG-NEXT:    lvx v2, r3, r4
1092; CHECK-REG-NEXT:    lvx v4, 0, r3
1093; CHECK-REG-NEXT:    vperm v2, v4, v2, v3
1094; CHECK-REG-NEXT:    blr
1095;
1096; CHECK-FISL-LABEL: test32u:
1097; CHECK-FISL:       # %bb.0:
1098; CHECK-FISL-NEXT:    li r4, 15
1099; CHECK-FISL-NEXT:    lvx v3, r3, r4
1100; CHECK-FISL-NEXT:    lvsl v4, 0, r3
1101; CHECK-FISL-NEXT:    lvx v2, 0, r3
1102; CHECK-FISL-NEXT:    vperm v2, v2, v3, v4
1103; CHECK-FISL-NEXT:    blr
1104;
1105; CHECK-LE-LABEL: test32u:
1106; CHECK-LE:       # %bb.0:
1107; CHECK-LE-NEXT:    lxvd2x vs0, 0, r3
1108; CHECK-LE-NEXT:    xxswapd v2, vs0
1109; CHECK-LE-NEXT:    blr
1110  %v = load <4 x float>, <4 x float>* %a, align 8
1111  ret <4 x float> %v
1112
1113
1114}
1115
1116define void @test33u(<4 x float>* %a, <4 x float> %b) {
1117; CHECK-LABEL: test33u:
1118; CHECK:       # %bb.0:
1119; CHECK-NEXT:    stxvw4x v2, 0, r3
1120; CHECK-NEXT:    blr
1121;
1122; CHECK-REG-LABEL: test33u:
1123; CHECK-REG:       # %bb.0:
1124; CHECK-REG-NEXT:    stxvw4x v2, 0, r3
1125; CHECK-REG-NEXT:    blr
1126;
1127; CHECK-FISL-LABEL: test33u:
1128; CHECK-FISL:       # %bb.0:
1129; CHECK-FISL-NEXT:    stxvw4x v2, 0, r3
1130; CHECK-FISL-NEXT:    blr
1131;
1132; CHECK-LE-LABEL: test33u:
1133; CHECK-LE:       # %bb.0:
1134; CHECK-LE-NEXT:    xxswapd vs0, v2
1135; CHECK-LE-NEXT:    stxvd2x vs0, 0, r3
1136; CHECK-LE-NEXT:    blr
1137  store <4 x float> %b, <4 x float>* %a, align 8
1138  ret void
1139
1140
1141
1142}
1143
1144define <4 x i32> @test34(<4 x i32>* %a) {
1145; CHECK-LABEL: test34:
1146; CHECK:       # %bb.0:
1147; CHECK-NEXT:    lxvw4x v2, 0, r3
1148; CHECK-NEXT:    blr
1149;
1150; CHECK-REG-LABEL: test34:
1151; CHECK-REG:       # %bb.0:
1152; CHECK-REG-NEXT:    lxvw4x v2, 0, r3
1153; CHECK-REG-NEXT:    blr
1154;
1155; CHECK-FISL-LABEL: test34:
1156; CHECK-FISL:       # %bb.0:
1157; CHECK-FISL-NEXT:    lxvw4x v2, 0, r3
1158; CHECK-FISL-NEXT:    blr
1159;
1160; CHECK-LE-LABEL: test34:
1161; CHECK-LE:       # %bb.0:
1162; CHECK-LE-NEXT:    lvx v2, 0, r3
1163; CHECK-LE-NEXT:    blr
1164  %v = load <4 x i32>, <4 x i32>* %a, align 16
1165  ret <4 x i32> %v
1166
1167
1168
1169}
1170
1171define void @test35(<4 x i32>* %a, <4 x i32> %b) {
1172; CHECK-LABEL: test35:
1173; CHECK:       # %bb.0:
1174; CHECK-NEXT:    stxvw4x v2, 0, r3
1175; CHECK-NEXT:    blr
1176;
1177; CHECK-REG-LABEL: test35:
1178; CHECK-REG:       # %bb.0:
1179; CHECK-REG-NEXT:    stxvw4x v2, 0, r3
1180; CHECK-REG-NEXT:    blr
1181;
1182; CHECK-FISL-LABEL: test35:
1183; CHECK-FISL:       # %bb.0:
1184; CHECK-FISL-NEXT:    stxvw4x v2, 0, r3
1185; CHECK-FISL-NEXT:    blr
1186;
1187; CHECK-LE-LABEL: test35:
1188; CHECK-LE:       # %bb.0:
1189; CHECK-LE-NEXT:    stvx v2, 0, r3
1190; CHECK-LE-NEXT:    blr
1191  store <4 x i32> %b, <4 x i32>* %a, align 16
1192  ret void
1193
1194
1195
1196}
1197
1198define <2 x double> @test40(<2 x i64> %a) {
1199; CHECK-LABEL: test40:
1200; CHECK:       # %bb.0:
1201; CHECK-NEXT:    xvcvuxddp v2, v2
1202; CHECK-NEXT:    blr
1203;
1204; CHECK-REG-LABEL: test40:
1205; CHECK-REG:       # %bb.0:
1206; CHECK-REG-NEXT:    xvcvuxddp v2, v2
1207; CHECK-REG-NEXT:    blr
1208;
1209; CHECK-FISL-LABEL: test40:
1210; CHECK-FISL:       # %bb.0:
1211; CHECK-FISL-NEXT:    xvcvuxddp v2, v2
1212; CHECK-FISL-NEXT:    blr
1213;
1214; CHECK-LE-LABEL: test40:
1215; CHECK-LE:       # %bb.0:
1216; CHECK-LE-NEXT:    xvcvuxddp v2, v2
1217; CHECK-LE-NEXT:    blr
1218  %v = uitofp <2 x i64> %a to <2 x double>
1219  ret <2 x double> %v
1220
1221
1222}
1223
1224define <2 x double> @test41(<2 x i64> %a) {
1225; CHECK-LABEL: test41:
1226; CHECK:       # %bb.0:
1227; CHECK-NEXT:    xvcvsxddp v2, v2
1228; CHECK-NEXT:    blr
1229;
1230; CHECK-REG-LABEL: test41:
1231; CHECK-REG:       # %bb.0:
1232; CHECK-REG-NEXT:    xvcvsxddp v2, v2
1233; CHECK-REG-NEXT:    blr
1234;
1235; CHECK-FISL-LABEL: test41:
1236; CHECK-FISL:       # %bb.0:
1237; CHECK-FISL-NEXT:    xvcvsxddp v2, v2
1238; CHECK-FISL-NEXT:    blr
1239;
1240; CHECK-LE-LABEL: test41:
1241; CHECK-LE:       # %bb.0:
1242; CHECK-LE-NEXT:    xvcvsxddp v2, v2
1243; CHECK-LE-NEXT:    blr
1244  %v = sitofp <2 x i64> %a to <2 x double>
1245  ret <2 x double> %v
1246
1247
1248}
1249
1250define <2 x i64> @test42(<2 x double> %a) {
1251; CHECK-LABEL: test42:
1252; CHECK:       # %bb.0:
1253; CHECK-NEXT:    xvcvdpuxds v2, v2
1254; CHECK-NEXT:    blr
1255;
1256; CHECK-REG-LABEL: test42:
1257; CHECK-REG:       # %bb.0:
1258; CHECK-REG-NEXT:    xvcvdpuxds v2, v2
1259; CHECK-REG-NEXT:    blr
1260;
1261; CHECK-FISL-LABEL: test42:
1262; CHECK-FISL:       # %bb.0:
1263; CHECK-FISL-NEXT:    xvcvdpuxds v2, v2
1264; CHECK-FISL-NEXT:    blr
1265;
1266; CHECK-LE-LABEL: test42:
1267; CHECK-LE:       # %bb.0:
1268; CHECK-LE-NEXT:    xvcvdpuxds v2, v2
1269; CHECK-LE-NEXT:    blr
1270  %v = fptoui <2 x double> %a to <2 x i64>
1271  ret <2 x i64> %v
1272
1273
1274}
1275
1276define <2 x i64> @test43(<2 x double> %a) {
1277; CHECK-LABEL: test43:
1278; CHECK:       # %bb.0:
1279; CHECK-NEXT:    xvcvdpsxds v2, v2
1280; CHECK-NEXT:    blr
1281;
1282; CHECK-REG-LABEL: test43:
1283; CHECK-REG:       # %bb.0:
1284; CHECK-REG-NEXT:    xvcvdpsxds v2, v2
1285; CHECK-REG-NEXT:    blr
1286;
1287; CHECK-FISL-LABEL: test43:
1288; CHECK-FISL:       # %bb.0:
1289; CHECK-FISL-NEXT:    xvcvdpsxds v2, v2
1290; CHECK-FISL-NEXT:    blr
1291;
1292; CHECK-LE-LABEL: test43:
1293; CHECK-LE:       # %bb.0:
1294; CHECK-LE-NEXT:    xvcvdpsxds v2, v2
1295; CHECK-LE-NEXT:    blr
1296  %v = fptosi <2 x double> %a to <2 x i64>
1297  ret <2 x i64> %v
1298
1299
1300}
1301
1302define <2 x float> @test44(<2 x i64> %a) {
1303; CHECK-LABEL: test44:
1304; CHECK:       # %bb.0:
1305; CHECK-NEXT:    addi r3, r1, -16
1306; CHECK-NEXT:    addi r4, r1, -64
1307; CHECK-NEXT:    stxvd2x v2, 0, r3
1308; CHECK-NEXT:    ld r3, -8(r1)
1309; CHECK-NEXT:    std r3, -24(r1)
1310; CHECK-NEXT:    ld r3, -16(r1)
1311; CHECK-NEXT:    lfd f0, -24(r1)
1312; CHECK-NEXT:    std r3, -32(r1)
1313; CHECK-NEXT:    addi r3, r1, -48
1314; CHECK-NEXT:    fcfidus f0, f0
1315; CHECK-NEXT:    stfs f0, -48(r1)
1316; CHECK-NEXT:    lfd f0, -32(r1)
1317; CHECK-NEXT:    fcfidus f0, f0
1318; CHECK-NEXT:    stfs f0, -64(r1)
1319; CHECK-NEXT:    lxvw4x v2, 0, r3
1320; CHECK-NEXT:    lxvw4x v3, 0, r4
1321; CHECK-NEXT:    vmrghw v2, v3, v2
1322; CHECK-NEXT:    blr
1323;
1324; CHECK-REG-LABEL: test44:
1325; CHECK-REG:       # %bb.0:
1326; CHECK-REG-NEXT:    addi r3, r1, -16
1327; CHECK-REG-NEXT:    addi r4, r1, -64
1328; CHECK-REG-NEXT:    stxvd2x v2, 0, r3
1329; CHECK-REG-NEXT:    ld r3, -8(r1)
1330; CHECK-REG-NEXT:    std r3, -24(r1)
1331; CHECK-REG-NEXT:    ld r3, -16(r1)
1332; CHECK-REG-NEXT:    lfd f0, -24(r1)
1333; CHECK-REG-NEXT:    std r3, -32(r1)
1334; CHECK-REG-NEXT:    addi r3, r1, -48
1335; CHECK-REG-NEXT:    fcfidus f0, f0
1336; CHECK-REG-NEXT:    stfs f0, -48(r1)
1337; CHECK-REG-NEXT:    lfd f0, -32(r1)
1338; CHECK-REG-NEXT:    fcfidus f0, f0
1339; CHECK-REG-NEXT:    stfs f0, -64(r1)
1340; CHECK-REG-NEXT:    lxvw4x v2, 0, r3
1341; CHECK-REG-NEXT:    lxvw4x v3, 0, r4
1342; CHECK-REG-NEXT:    vmrghw v2, v3, v2
1343; CHECK-REG-NEXT:    blr
1344;
1345; CHECK-FISL-LABEL: test44:
1346; CHECK-FISL:       # %bb.0:
1347; CHECK-FISL-NEXT:    addi r3, r1, -16
1348; CHECK-FISL-NEXT:    stxvd2x v2, 0, r3
1349; CHECK-FISL-NEXT:    ld r3, -8(r1)
1350; CHECK-FISL-NEXT:    std r3, -24(r1)
1351; CHECK-FISL-NEXT:    ld r3, -16(r1)
1352; CHECK-FISL-NEXT:    std r3, -32(r1)
1353; CHECK-FISL-NEXT:    lfd f0, -24(r1)
1354; CHECK-FISL-NEXT:    fcfidus f0, f0
1355; CHECK-FISL-NEXT:    stfs f0, -48(r1)
1356; CHECK-FISL-NEXT:    lfd f0, -32(r1)
1357; CHECK-FISL-NEXT:    fcfidus f0, f0
1358; CHECK-FISL-NEXT:    stfs f0, -64(r1)
1359; CHECK-FISL-NEXT:    addi r3, r1, -48
1360; CHECK-FISL-NEXT:    lxvw4x v3, 0, r3
1361; CHECK-FISL-NEXT:    addi r3, r1, -64
1362; CHECK-FISL-NEXT:    lxvw4x v2, 0, r3
1363; CHECK-FISL-NEXT:    vmrghw v2, v2, v3
1364; CHECK-FISL-NEXT:    blr
1365;
1366; CHECK-LE-LABEL: test44:
1367; CHECK-LE:       # %bb.0:
1368; CHECK-LE-NEXT:    xxswapd vs0, v2
1369; CHECK-LE-NEXT:    xscvuxdsp f1, v2
1370; CHECK-LE-NEXT:    xscvuxdsp f0, f0
1371; CHECK-LE-NEXT:    xscvdpspn v3, f1
1372; CHECK-LE-NEXT:    xscvdpspn v2, f0
1373; CHECK-LE-NEXT:    vmrghw v2, v3, v2
1374; CHECK-LE-NEXT:    blr
1375  %v = uitofp <2 x i64> %a to <2 x float>
1376  ret <2 x float> %v
1377
1378; FIXME: The code quality here looks pretty bad.
1379}
1380
1381define <2 x float> @test45(<2 x i64> %a) {
1382; CHECK-LABEL: test45:
1383; CHECK:       # %bb.0:
1384; CHECK-NEXT:    addi r3, r1, -16
1385; CHECK-NEXT:    addi r4, r1, -64
1386; CHECK-NEXT:    stxvd2x v2, 0, r3
1387; CHECK-NEXT:    ld r3, -8(r1)
1388; CHECK-NEXT:    std r3, -24(r1)
1389; CHECK-NEXT:    ld r3, -16(r1)
1390; CHECK-NEXT:    lfd f0, -24(r1)
1391; CHECK-NEXT:    std r3, -32(r1)
1392; CHECK-NEXT:    addi r3, r1, -48
1393; CHECK-NEXT:    fcfids f0, f0
1394; CHECK-NEXT:    stfs f0, -48(r1)
1395; CHECK-NEXT:    lfd f0, -32(r1)
1396; CHECK-NEXT:    fcfids f0, f0
1397; CHECK-NEXT:    stfs f0, -64(r1)
1398; CHECK-NEXT:    lxvw4x v2, 0, r3
1399; CHECK-NEXT:    lxvw4x v3, 0, r4
1400; CHECK-NEXT:    vmrghw v2, v3, v2
1401; CHECK-NEXT:    blr
1402;
1403; CHECK-REG-LABEL: test45:
1404; CHECK-REG:       # %bb.0:
1405; CHECK-REG-NEXT:    addi r3, r1, -16
1406; CHECK-REG-NEXT:    addi r4, r1, -64
1407; CHECK-REG-NEXT:    stxvd2x v2, 0, r3
1408; CHECK-REG-NEXT:    ld r3, -8(r1)
1409; CHECK-REG-NEXT:    std r3, -24(r1)
1410; CHECK-REG-NEXT:    ld r3, -16(r1)
1411; CHECK-REG-NEXT:    lfd f0, -24(r1)
1412; CHECK-REG-NEXT:    std r3, -32(r1)
1413; CHECK-REG-NEXT:    addi r3, r1, -48
1414; CHECK-REG-NEXT:    fcfids f0, f0
1415; CHECK-REG-NEXT:    stfs f0, -48(r1)
1416; CHECK-REG-NEXT:    lfd f0, -32(r1)
1417; CHECK-REG-NEXT:    fcfids f0, f0
1418; CHECK-REG-NEXT:    stfs f0, -64(r1)
1419; CHECK-REG-NEXT:    lxvw4x v2, 0, r3
1420; CHECK-REG-NEXT:    lxvw4x v3, 0, r4
1421; CHECK-REG-NEXT:    vmrghw v2, v3, v2
1422; CHECK-REG-NEXT:    blr
1423;
1424; CHECK-FISL-LABEL: test45:
1425; CHECK-FISL:       # %bb.0:
1426; CHECK-FISL-NEXT:    addi r3, r1, -16
1427; CHECK-FISL-NEXT:    stxvd2x v2, 0, r3
1428; CHECK-FISL-NEXT:    ld r3, -8(r1)
1429; CHECK-FISL-NEXT:    std r3, -24(r1)
1430; CHECK-FISL-NEXT:    ld r3, -16(r1)
1431; CHECK-FISL-NEXT:    std r3, -32(r1)
1432; CHECK-FISL-NEXT:    lfd f0, -24(r1)
1433; CHECK-FISL-NEXT:    fcfids f0, f0
1434; CHECK-FISL-NEXT:    stfs f0, -48(r1)
1435; CHECK-FISL-NEXT:    lfd f0, -32(r1)
1436; CHECK-FISL-NEXT:    fcfids f0, f0
1437; CHECK-FISL-NEXT:    stfs f0, -64(r1)
1438; CHECK-FISL-NEXT:    addi r3, r1, -48
1439; CHECK-FISL-NEXT:    lxvw4x v3, 0, r3
1440; CHECK-FISL-NEXT:    addi r3, r1, -64
1441; CHECK-FISL-NEXT:    lxvw4x v2, 0, r3
1442; CHECK-FISL-NEXT:    vmrghw v2, v2, v3
1443; CHECK-FISL-NEXT:    blr
1444;
1445; CHECK-LE-LABEL: test45:
1446; CHECK-LE:       # %bb.0:
1447; CHECK-LE-NEXT:    xxswapd vs0, v2
1448; CHECK-LE-NEXT:    xscvsxdsp f1, v2
1449; CHECK-LE-NEXT:    xscvsxdsp f0, f0
1450; CHECK-LE-NEXT:    xscvdpspn v3, f1
1451; CHECK-LE-NEXT:    xscvdpspn v2, f0
1452; CHECK-LE-NEXT:    vmrghw v2, v3, v2
1453; CHECK-LE-NEXT:    blr
1454  %v = sitofp <2 x i64> %a to <2 x float>
1455  ret <2 x float> %v
1456
1457; FIXME: The code quality here looks pretty bad.
1458}
1459
1460define <2 x i64> @test46(<2 x float> %a) {
1461; CHECK-LABEL: test46:
1462; CHECK:       # %bb.0:
1463; CHECK-NEXT:    addi r3, r1, -48
1464; CHECK-NEXT:    stxvw4x v2, 0, r3
1465; CHECK-NEXT:    lfs f0, -44(r1)
1466; CHECK-NEXT:    xscvdpuxds f0, f0
1467; CHECK-NEXT:    stfd f0, -32(r1)
1468; CHECK-NEXT:    lfs f0, -48(r1)
1469; CHECK-NEXT:    ld r3, -32(r1)
1470; CHECK-NEXT:    xscvdpuxds f0, f0
1471; CHECK-NEXT:    std r3, -8(r1)
1472; CHECK-NEXT:    stfd f0, -24(r1)
1473; CHECK-NEXT:    ld r3, -24(r1)
1474; CHECK-NEXT:    std r3, -16(r1)
1475; CHECK-NEXT:    addi r3, r1, -16
1476; CHECK-NEXT:    lxvd2x v2, 0, r3
1477; CHECK-NEXT:    blr
1478;
1479; CHECK-REG-LABEL: test46:
1480; CHECK-REG:       # %bb.0:
1481; CHECK-REG-NEXT:    addi r3, r1, -48
1482; CHECK-REG-NEXT:    stxvw4x v2, 0, r3
1483; CHECK-REG-NEXT:    lfs f0, -44(r1)
1484; CHECK-REG-NEXT:    xscvdpuxds f0, f0
1485; CHECK-REG-NEXT:    stfd f0, -32(r1)
1486; CHECK-REG-NEXT:    lfs f0, -48(r1)
1487; CHECK-REG-NEXT:    ld r3, -32(r1)
1488; CHECK-REG-NEXT:    xscvdpuxds f0, f0
1489; CHECK-REG-NEXT:    std r3, -8(r1)
1490; CHECK-REG-NEXT:    stfd f0, -24(r1)
1491; CHECK-REG-NEXT:    ld r3, -24(r1)
1492; CHECK-REG-NEXT:    std r3, -16(r1)
1493; CHECK-REG-NEXT:    addi r3, r1, -16
1494; CHECK-REG-NEXT:    lxvd2x v2, 0, r3
1495; CHECK-REG-NEXT:    blr
1496;
1497; CHECK-FISL-LABEL: test46:
1498; CHECK-FISL:       # %bb.0:
1499; CHECK-FISL-NEXT:    addi r3, r1, -48
1500; CHECK-FISL-NEXT:    stxvw4x v2, 0, r3
1501; CHECK-FISL-NEXT:    lfs f0, -44(r1)
1502; CHECK-FISL-NEXT:    xscvdpuxds f0, f0
1503; CHECK-FISL-NEXT:    stfd f0, -32(r1)
1504; CHECK-FISL-NEXT:    lfs f0, -48(r1)
1505; CHECK-FISL-NEXT:    xscvdpuxds f0, f0
1506; CHECK-FISL-NEXT:    stfd f0, -24(r1)
1507; CHECK-FISL-NEXT:    ld r3, -32(r1)
1508; CHECK-FISL-NEXT:    std r3, -8(r1)
1509; CHECK-FISL-NEXT:    ld r3, -24(r1)
1510; CHECK-FISL-NEXT:    std r3, -16(r1)
1511; CHECK-FISL-NEXT:    addi r3, r1, -16
1512; CHECK-FISL-NEXT:    lxvd2x v2, 0, r3
1513; CHECK-FISL-NEXT:    blr
1514;
1515; CHECK-LE-LABEL: test46:
1516; CHECK-LE:       # %bb.0:
1517; CHECK-LE-NEXT:    xxmrglw vs0, v2, v2
1518; CHECK-LE-NEXT:    xvcvspdp vs0, vs0
1519; CHECK-LE-NEXT:    xvcvdpuxds v2, vs0
1520; CHECK-LE-NEXT:    blr
1521  %v = fptoui <2 x float> %a to <2 x i64>
1522  ret <2 x i64> %v
1523
1524; FIXME: The code quality here looks pretty bad.
1525}
1526
1527define <2 x i64> @test47(<2 x float> %a) {
1528; CHECK-LABEL: test47:
1529; CHECK:       # %bb.0:
1530; CHECK-NEXT:    addi r3, r1, -48
1531; CHECK-NEXT:    stxvw4x v2, 0, r3
1532; CHECK-NEXT:    lfs f0, -44(r1)
1533; CHECK-NEXT:    xscvdpsxds f0, f0
1534; CHECK-NEXT:    stfd f0, -32(r1)
1535; CHECK-NEXT:    lfs f0, -48(r1)
1536; CHECK-NEXT:    ld r3, -32(r1)
1537; CHECK-NEXT:    xscvdpsxds f0, f0
1538; CHECK-NEXT:    std r3, -8(r1)
1539; CHECK-NEXT:    stfd f0, -24(r1)
1540; CHECK-NEXT:    ld r3, -24(r1)
1541; CHECK-NEXT:    std r3, -16(r1)
1542; CHECK-NEXT:    addi r3, r1, -16
1543; CHECK-NEXT:    lxvd2x v2, 0, r3
1544; CHECK-NEXT:    blr
1545;
1546; CHECK-REG-LABEL: test47:
1547; CHECK-REG:       # %bb.0:
1548; CHECK-REG-NEXT:    addi r3, r1, -48
1549; CHECK-REG-NEXT:    stxvw4x v2, 0, r3
1550; CHECK-REG-NEXT:    lfs f0, -44(r1)
1551; CHECK-REG-NEXT:    xscvdpsxds f0, f0
1552; CHECK-REG-NEXT:    stfd f0, -32(r1)
1553; CHECK-REG-NEXT:    lfs f0, -48(r1)
1554; CHECK-REG-NEXT:    ld r3, -32(r1)
1555; CHECK-REG-NEXT:    xscvdpsxds f0, f0
1556; CHECK-REG-NEXT:    std r3, -8(r1)
1557; CHECK-REG-NEXT:    stfd f0, -24(r1)
1558; CHECK-REG-NEXT:    ld r3, -24(r1)
1559; CHECK-REG-NEXT:    std r3, -16(r1)
1560; CHECK-REG-NEXT:    addi r3, r1, -16
1561; CHECK-REG-NEXT:    lxvd2x v2, 0, r3
1562; CHECK-REG-NEXT:    blr
1563;
1564; CHECK-FISL-LABEL: test47:
1565; CHECK-FISL:       # %bb.0:
1566; CHECK-FISL-NEXT:    addi r3, r1, -48
1567; CHECK-FISL-NEXT:    stxvw4x v2, 0, r3
1568; CHECK-FISL-NEXT:    lfs f0, -44(r1)
1569; CHECK-FISL-NEXT:    xscvdpsxds f0, f0
1570; CHECK-FISL-NEXT:    stfd f0, -32(r1)
1571; CHECK-FISL-NEXT:    lfs f0, -48(r1)
1572; CHECK-FISL-NEXT:    xscvdpsxds f0, f0
1573; CHECK-FISL-NEXT:    stfd f0, -24(r1)
1574; CHECK-FISL-NEXT:    ld r3, -32(r1)
1575; CHECK-FISL-NEXT:    std r3, -8(r1)
1576; CHECK-FISL-NEXT:    ld r3, -24(r1)
1577; CHECK-FISL-NEXT:    std r3, -16(r1)
1578; CHECK-FISL-NEXT:    addi r3, r1, -16
1579; CHECK-FISL-NEXT:    lxvd2x v2, 0, r3
1580; CHECK-FISL-NEXT:    blr
1581;
1582; CHECK-LE-LABEL: test47:
1583; CHECK-LE:       # %bb.0:
1584; CHECK-LE-NEXT:    xxmrglw vs0, v2, v2
1585; CHECK-LE-NEXT:    xvcvspdp vs0, vs0
1586; CHECK-LE-NEXT:    xvcvdpsxds v2, vs0
1587; CHECK-LE-NEXT:    blr
1588  %v = fptosi <2 x float> %a to <2 x i64>
1589  ret <2 x i64> %v
1590
1591; FIXME: The code quality here looks pretty bad.
1592}
1593
1594define <2 x double> @test50(double* %a) {
1595; CHECK-LABEL: test50:
1596; CHECK:       # %bb.0:
1597; CHECK-NEXT:    lxvdsx v2, 0, r3
1598; CHECK-NEXT:    blr
1599;
1600; CHECK-REG-LABEL: test50:
1601; CHECK-REG:       # %bb.0:
1602; CHECK-REG-NEXT:    lxvdsx v2, 0, r3
1603; CHECK-REG-NEXT:    blr
1604;
1605; CHECK-FISL-LABEL: test50:
1606; CHECK-FISL:       # %bb.0:
1607; CHECK-FISL-NEXT:    lxvdsx v2, 0, r3
1608; CHECK-FISL-NEXT:    blr
1609;
1610; CHECK-LE-LABEL: test50:
1611; CHECK-LE:       # %bb.0:
1612; CHECK-LE-NEXT:    lxvdsx v2, 0, r3
1613; CHECK-LE-NEXT:    blr
1614  %v = load double, double* %a, align 8
1615  %w = insertelement <2 x double> undef, double %v, i32 0
1616  %x = insertelement <2 x double> %w, double %v, i32 1
1617  ret <2 x double> %x
1618
1619
1620}
1621
1622define <2 x double> @test51(<2 x double> %a, <2 x double> %b) {
1623; CHECK-LABEL: test51:
1624; CHECK:       # %bb.0:
1625; CHECK-NEXT:    xxspltd v2, v2, 0
1626; CHECK-NEXT:    blr
1627;
1628; CHECK-REG-LABEL: test51:
1629; CHECK-REG:       # %bb.0:
1630; CHECK-REG-NEXT:    xxspltd v2, v2, 0
1631; CHECK-REG-NEXT:    blr
1632;
1633; CHECK-FISL-LABEL: test51:
1634; CHECK-FISL:       # %bb.0:
1635; CHECK-FISL-NEXT:    xxspltd v2, v2, 0
1636; CHECK-FISL-NEXT:    blr
1637;
1638; CHECK-LE-LABEL: test51:
1639; CHECK-LE:       # %bb.0:
1640; CHECK-LE-NEXT:    xxspltd v2, v2, 1
1641; CHECK-LE-NEXT:    blr
1642  %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 0>
1643  ret <2 x double> %v
1644
1645
1646}
1647
1648define <2 x double> @test52(<2 x double> %a, <2 x double> %b) {
1649; CHECK-LABEL: test52:
1650; CHECK:       # %bb.0:
1651; CHECK-NEXT:    xxmrghd v2, v2, v3
1652; CHECK-NEXT:    blr
1653;
1654; CHECK-REG-LABEL: test52:
1655; CHECK-REG:       # %bb.0:
1656; CHECK-REG-NEXT:    xxmrghd v2, v2, v3
1657; CHECK-REG-NEXT:    blr
1658;
1659; CHECK-FISL-LABEL: test52:
1660; CHECK-FISL:       # %bb.0:
1661; CHECK-FISL-NEXT:    xxmrghd v2, v2, v3
1662; CHECK-FISL-NEXT:    blr
1663;
1664; CHECK-LE-LABEL: test52:
1665; CHECK-LE:       # %bb.0:
1666; CHECK-LE-NEXT:    xxmrgld v2, v3, v2
1667; CHECK-LE-NEXT:    blr
1668  %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 2>
1669  ret <2 x double> %v
1670
1671
1672}
1673
1674define <2 x double> @test53(<2 x double> %a, <2 x double> %b) {
1675; CHECK-LABEL: test53:
1676; CHECK:       # %bb.0:
1677; CHECK-NEXT:    xxmrghd v2, v3, v2
1678; CHECK-NEXT:    blr
1679;
1680; CHECK-REG-LABEL: test53:
1681; CHECK-REG:       # %bb.0:
1682; CHECK-REG-NEXT:    xxmrghd v2, v3, v2
1683; CHECK-REG-NEXT:    blr
1684;
1685; CHECK-FISL-LABEL: test53:
1686; CHECK-FISL:       # %bb.0:
1687; CHECK-FISL-NEXT:    xxmrghd v2, v3, v2
1688; CHECK-FISL-NEXT:    blr
1689;
1690; CHECK-LE-LABEL: test53:
1691; CHECK-LE:       # %bb.0:
1692; CHECK-LE-NEXT:    xxmrgld v2, v2, v3
1693; CHECK-LE-NEXT:    blr
1694  %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 0>
1695  ret <2 x double> %v
1696
1697
1698}
1699
1700define <2 x double> @test54(<2 x double> %a, <2 x double> %b) {
1701; CHECK-LABEL: test54:
1702; CHECK:       # %bb.0:
1703; CHECK-NEXT:    xxpermdi v2, v2, v3, 2
1704; CHECK-NEXT:    blr
1705;
1706; CHECK-REG-LABEL: test54:
1707; CHECK-REG:       # %bb.0:
1708; CHECK-REG-NEXT:    xxpermdi v2, v2, v3, 2
1709; CHECK-REG-NEXT:    blr
1710;
1711; CHECK-FISL-LABEL: test54:
1712; CHECK-FISL:       # %bb.0:
1713; CHECK-FISL-NEXT:    xxpermdi v2, v2, v3, 2
1714; CHECK-FISL-NEXT:    blr
1715;
1716; CHECK-LE-LABEL: test54:
1717; CHECK-LE:       # %bb.0:
1718; CHECK-LE-NEXT:    xxpermdi v2, v3, v2, 2
1719; CHECK-LE-NEXT:    blr
1720  %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 2>
1721  ret <2 x double> %v
1722
1723
1724}
1725
1726define <2 x double> @test55(<2 x double> %a, <2 x double> %b) {
1727; CHECK-LABEL: test55:
1728; CHECK:       # %bb.0:
1729; CHECK-NEXT:    xxmrgld v2, v2, v3
1730; CHECK-NEXT:    blr
1731;
1732; CHECK-REG-LABEL: test55:
1733; CHECK-REG:       # %bb.0:
1734; CHECK-REG-NEXT:    xxmrgld v2, v2, v3
1735; CHECK-REG-NEXT:    blr
1736;
1737; CHECK-FISL-LABEL: test55:
1738; CHECK-FISL:       # %bb.0:
1739; CHECK-FISL-NEXT:    xxmrgld v2, v2, v3
1740; CHECK-FISL-NEXT:    blr
1741;
1742; CHECK-LE-LABEL: test55:
1743; CHECK-LE:       # %bb.0:
1744; CHECK-LE-NEXT:    xxmrghd v2, v3, v2
1745; CHECK-LE-NEXT:    blr
1746  %v = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 3>
1747  ret <2 x double> %v
1748
1749
1750}
1751
1752define <2 x i64> @test56(<2 x i64> %a, <2 x i64> %b) {
1753; CHECK-LABEL: test56:
1754; CHECK:       # %bb.0:
1755; CHECK-NEXT:    xxmrgld v2, v2, v3
1756; CHECK-NEXT:    blr
1757;
1758; CHECK-REG-LABEL: test56:
1759; CHECK-REG:       # %bb.0:
1760; CHECK-REG-NEXT:    xxmrgld v2, v2, v3
1761; CHECK-REG-NEXT:    blr
1762;
1763; CHECK-FISL-LABEL: test56:
1764; CHECK-FISL:       # %bb.0:
1765; CHECK-FISL-NEXT:    xxmrgld v2, v2, v3
1766; CHECK-FISL-NEXT:    blr
1767;
1768; CHECK-LE-LABEL: test56:
1769; CHECK-LE:       # %bb.0:
1770; CHECK-LE-NEXT:    xxmrghd v2, v3, v2
1771; CHECK-LE-NEXT:    blr
1772  %v = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
1773  ret <2 x i64> %v
1774
1775
1776}
1777
1778define <2 x i64> @test60(<2 x i64> %a, <2 x i64> %b) {
1779; CHECK-LABEL: test60:
1780; CHECK:       # %bb.0:
1781; CHECK-NEXT:    addi r3, r1, -32
1782; CHECK-NEXT:    addi r4, r1, -48
1783; CHECK-NEXT:    stxvd2x v3, 0, r3
1784; CHECK-NEXT:    stxvd2x v2, 0, r4
1785; CHECK-NEXT:    lwz r3, -20(r1)
1786; CHECK-NEXT:    ld r4, -40(r1)
1787; CHECK-NEXT:    sld r3, r4, r3
1788; CHECK-NEXT:    ld r4, -48(r1)
1789; CHECK-NEXT:    std r3, -8(r1)
1790; CHECK-NEXT:    lwz r3, -28(r1)
1791; CHECK-NEXT:    sld r3, r4, r3
1792; CHECK-NEXT:    std r3, -16(r1)
1793; CHECK-NEXT:    addi r3, r1, -16
1794; CHECK-NEXT:    lxvd2x v2, 0, r3
1795; CHECK-NEXT:    blr
1796;
1797; CHECK-REG-LABEL: test60:
1798; CHECK-REG:       # %bb.0:
1799; CHECK-REG-NEXT:    addi r3, r1, -32
1800; CHECK-REG-NEXT:    addi r4, r1, -48
1801; CHECK-REG-NEXT:    stxvd2x v3, 0, r3
1802; CHECK-REG-NEXT:    stxvd2x v2, 0, r4
1803; CHECK-REG-NEXT:    lwz r3, -20(r1)
1804; CHECK-REG-NEXT:    ld r4, -40(r1)
1805; CHECK-REG-NEXT:    sld r3, r4, r3
1806; CHECK-REG-NEXT:    ld r4, -48(r1)
1807; CHECK-REG-NEXT:    std r3, -8(r1)
1808; CHECK-REG-NEXT:    lwz r3, -28(r1)
1809; CHECK-REG-NEXT:    sld r3, r4, r3
1810; CHECK-REG-NEXT:    std r3, -16(r1)
1811; CHECK-REG-NEXT:    addi r3, r1, -16
1812; CHECK-REG-NEXT:    lxvd2x v2, 0, r3
1813; CHECK-REG-NEXT:    blr
1814;
1815; CHECK-FISL-LABEL: test60:
1816; CHECK-FISL:       # %bb.0:
1817; CHECK-FISL-NEXT:    addi r3, r1, -32
1818; CHECK-FISL-NEXT:    stxvd2x v3, 0, r3
1819; CHECK-FISL-NEXT:    addi r3, r1, -48
1820; CHECK-FISL-NEXT:    stxvd2x v2, 0, r3
1821; CHECK-FISL-NEXT:    lwz r4, -20(r1)
1822; CHECK-FISL-NEXT:    ld r3, -40(r1)
1823; CHECK-FISL-NEXT:    sld r3, r3, r4
1824; CHECK-FISL-NEXT:    std r3, -8(r1)
1825; CHECK-FISL-NEXT:    lwz r4, -28(r1)
1826; CHECK-FISL-NEXT:    ld r3, -48(r1)
1827; CHECK-FISL-NEXT:    sld r3, r3, r4
1828; CHECK-FISL-NEXT:    std r3, -16(r1)
1829; CHECK-FISL-NEXT:    addi r3, r1, -16
1830; CHECK-FISL-NEXT:    lxvd2x v2, 0, r3
1831; CHECK-FISL-NEXT:    blr
1832;
1833; CHECK-LE-LABEL: test60:
1834; CHECK-LE:       # %bb.0:
1835; CHECK-LE-NEXT:    vsld v2, v2, v3
1836; CHECK-LE-NEXT:    blr
1837  %v = shl <2 x i64> %a, %b
1838  ret <2 x i64> %v
1839
1840; This should scalarize, and the current code quality is not good.
1841}
1842
1843define <2 x i64> @test61(<2 x i64> %a, <2 x i64> %b) {
1844; CHECK-LABEL: test61:
1845; CHECK:       # %bb.0:
1846; CHECK-NEXT:    addi r3, r1, -32
1847; CHECK-NEXT:    addi r4, r1, -48
1848; CHECK-NEXT:    stxvd2x v3, 0, r3
1849; CHECK-NEXT:    stxvd2x v2, 0, r4
1850; CHECK-NEXT:    lwz r3, -20(r1)
1851; CHECK-NEXT:    ld r4, -40(r1)
1852; CHECK-NEXT:    srd r3, r4, r3
1853; CHECK-NEXT:    ld r4, -48(r1)
1854; CHECK-NEXT:    std r3, -8(r1)
1855; CHECK-NEXT:    lwz r3, -28(r1)
1856; CHECK-NEXT:    srd r3, r4, r3
1857; CHECK-NEXT:    std r3, -16(r1)
1858; CHECK-NEXT:    addi r3, r1, -16
1859; CHECK-NEXT:    lxvd2x v2, 0, r3
1860; CHECK-NEXT:    blr
1861;
1862; CHECK-REG-LABEL: test61:
1863; CHECK-REG:       # %bb.0:
1864; CHECK-REG-NEXT:    addi r3, r1, -32
1865; CHECK-REG-NEXT:    addi r4, r1, -48
1866; CHECK-REG-NEXT:    stxvd2x v3, 0, r3
1867; CHECK-REG-NEXT:    stxvd2x v2, 0, r4
1868; CHECK-REG-NEXT:    lwz r3, -20(r1)
1869; CHECK-REG-NEXT:    ld r4, -40(r1)
1870; CHECK-REG-NEXT:    srd r3, r4, r3
1871; CHECK-REG-NEXT:    ld r4, -48(r1)
1872; CHECK-REG-NEXT:    std r3, -8(r1)
1873; CHECK-REG-NEXT:    lwz r3, -28(r1)
1874; CHECK-REG-NEXT:    srd r3, r4, r3
1875; CHECK-REG-NEXT:    std r3, -16(r1)
1876; CHECK-REG-NEXT:    addi r3, r1, -16
1877; CHECK-REG-NEXT:    lxvd2x v2, 0, r3
1878; CHECK-REG-NEXT:    blr
1879;
1880; CHECK-FISL-LABEL: test61:
1881; CHECK-FISL:       # %bb.0:
1882; CHECK-FISL-NEXT:    addi r3, r1, -32
1883; CHECK-FISL-NEXT:    stxvd2x v3, 0, r3
1884; CHECK-FISL-NEXT:    addi r3, r1, -48
1885; CHECK-FISL-NEXT:    stxvd2x v2, 0, r3
1886; CHECK-FISL-NEXT:    lwz r4, -20(r1)
1887; CHECK-FISL-NEXT:    ld r3, -40(r1)
1888; CHECK-FISL-NEXT:    srd r3, r3, r4
1889; CHECK-FISL-NEXT:    std r3, -8(r1)
1890; CHECK-FISL-NEXT:    lwz r4, -28(r1)
1891; CHECK-FISL-NEXT:    ld r3, -48(r1)
1892; CHECK-FISL-NEXT:    srd r3, r3, r4
1893; CHECK-FISL-NEXT:    std r3, -16(r1)
1894; CHECK-FISL-NEXT:    addi r3, r1, -16
1895; CHECK-FISL-NEXT:    lxvd2x v2, 0, r3
1896; CHECK-FISL-NEXT:    blr
1897;
1898; CHECK-LE-LABEL: test61:
1899; CHECK-LE:       # %bb.0:
1900; CHECK-LE-NEXT:    vsrd v2, v2, v3
1901; CHECK-LE-NEXT:    blr
1902  %v = lshr <2 x i64> %a, %b
1903  ret <2 x i64> %v
1904
1905; This should scalarize, and the current code quality is not good.
1906}
1907
1908define <2 x i64> @test62(<2 x i64> %a, <2 x i64> %b) {
1909; CHECK-LABEL: test62:
1910; CHECK:       # %bb.0:
1911; CHECK-NEXT:    addi r3, r1, -32
1912; CHECK-NEXT:    addi r4, r1, -48
1913; CHECK-NEXT:    stxvd2x v3, 0, r3
1914; CHECK-NEXT:    stxvd2x v2, 0, r4
1915; CHECK-NEXT:    lwz r3, -20(r1)
1916; CHECK-NEXT:    ld r4, -40(r1)
1917; CHECK-NEXT:    srad r3, r4, r3
1918; CHECK-NEXT:    ld r4, -48(r1)
1919; CHECK-NEXT:    std r3, -8(r1)
1920; CHECK-NEXT:    lwz r3, -28(r1)
1921; CHECK-NEXT:    srad r3, r4, r3
1922; CHECK-NEXT:    std r3, -16(r1)
1923; CHECK-NEXT:    addi r3, r1, -16
1924; CHECK-NEXT:    lxvd2x v2, 0, r3
1925; CHECK-NEXT:    blr
1926;
1927; CHECK-REG-LABEL: test62:
1928; CHECK-REG:       # %bb.0:
1929; CHECK-REG-NEXT:    addi r3, r1, -32
1930; CHECK-REG-NEXT:    addi r4, r1, -48
1931; CHECK-REG-NEXT:    stxvd2x v3, 0, r3
1932; CHECK-REG-NEXT:    stxvd2x v2, 0, r4
1933; CHECK-REG-NEXT:    lwz r3, -20(r1)
1934; CHECK-REG-NEXT:    ld r4, -40(r1)
1935; CHECK-REG-NEXT:    srad r3, r4, r3
1936; CHECK-REG-NEXT:    ld r4, -48(r1)
1937; CHECK-REG-NEXT:    std r3, -8(r1)
1938; CHECK-REG-NEXT:    lwz r3, -28(r1)
1939; CHECK-REG-NEXT:    srad r3, r4, r3
1940; CHECK-REG-NEXT:    std r3, -16(r1)
1941; CHECK-REG-NEXT:    addi r3, r1, -16
1942; CHECK-REG-NEXT:    lxvd2x v2, 0, r3
1943; CHECK-REG-NEXT:    blr
1944;
1945; CHECK-FISL-LABEL: test62:
1946; CHECK-FISL:       # %bb.0:
1947; CHECK-FISL-NEXT:    addi r3, r1, -32
1948; CHECK-FISL-NEXT:    stxvd2x v3, 0, r3
1949; CHECK-FISL-NEXT:    addi r3, r1, -48
1950; CHECK-FISL-NEXT:    stxvd2x v2, 0, r3
1951; CHECK-FISL-NEXT:    lwz r4, -20(r1)
1952; CHECK-FISL-NEXT:    ld r3, -40(r1)
1953; CHECK-FISL-NEXT:    srad r3, r3, r4
1954; CHECK-FISL-NEXT:    std r3, -8(r1)
1955; CHECK-FISL-NEXT:    lwz r4, -28(r1)
1956; CHECK-FISL-NEXT:    ld r3, -48(r1)
1957; CHECK-FISL-NEXT:    srad r3, r3, r4
1958; CHECK-FISL-NEXT:    std r3, -16(r1)
1959; CHECK-FISL-NEXT:    addi r3, r1, -16
1960; CHECK-FISL-NEXT:    lxvd2x v2, 0, r3
1961; CHECK-FISL-NEXT:    blr
1962;
1963; CHECK-LE-LABEL: test62:
1964; CHECK-LE:       # %bb.0:
1965; CHECK-LE-NEXT:    vsrad v2, v2, v3
1966; CHECK-LE-NEXT:    blr
1967  %v = ashr <2 x i64> %a, %b
1968  ret <2 x i64> %v
1969
1970; This should scalarize, and the current code quality is not good.
1971}
1972
1973define double @test63(<2 x double> %a) {
1974; CHECK-LABEL: test63:
1975; CHECK:       # %bb.0:
1976; CHECK-NEXT:    xxlor f1, v2, v2
1977; CHECK-NEXT:    blr
1978;
1979; CHECK-REG-LABEL: test63:
1980; CHECK-REG:       # %bb.0:
1981; CHECK-REG-NEXT:    xxlor f1, v2, v2
1982; CHECK-REG-NEXT:    blr
1983;
1984; CHECK-FISL-LABEL: test63:
1985; CHECK-FISL:       # %bb.0:
1986; CHECK-FISL-NEXT:    xxlor f1, v2, v2
1987; CHECK-FISL-NEXT:    blr
1988;
1989; CHECK-LE-LABEL: test63:
1990; CHECK-LE:       # %bb.0:
1991; CHECK-LE-NEXT:    xxswapd vs1, v2
1992; CHECK-LE-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
1993; CHECK-LE-NEXT:    blr
1994  %v = extractelement <2 x double> %a, i32 0
1995  ret double %v
1996
1997
1998
1999}
2000
2001define double @test64(<2 x double> %a) {
2002; CHECK-LABEL: test64:
2003; CHECK:       # %bb.0:
2004; CHECK-NEXT:    xxswapd vs1, v2
2005; CHECK-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2006; CHECK-NEXT:    blr
2007;
2008; CHECK-REG-LABEL: test64:
2009; CHECK-REG:       # %bb.0:
2010; CHECK-REG-NEXT:    xxswapd vs1, v2
2011; CHECK-REG-NEXT:    # kill: def $f1 killed $f1 killed $vsl1
2012; CHECK-REG-NEXT:    blr
2013;
2014; CHECK-FISL-LABEL: test64:
2015; CHECK-FISL:       # %bb.0:
2016; CHECK-FISL-NEXT:    xxswapd vs0, v2
2017; CHECK-FISL-NEXT:    fmr f1, f0
2018; CHECK-FISL-NEXT:    blr
2019;
2020; CHECK-LE-LABEL: test64:
2021; CHECK-LE:       # %bb.0:
2022; CHECK-LE-NEXT:    xxlor f1, v2, v2
2023; CHECK-LE-NEXT:    blr
2024  %v = extractelement <2 x double> %a, i32 1
2025  ret double %v
2026
2027
2028
2029}
2030
2031define <2 x i1> @test65(<2 x i64> %a, <2 x i64> %b) {
2032; CHECK-LABEL: test65:
2033; CHECK:       # %bb.0:
2034; CHECK-NEXT:    vcmpequw v2, v2, v3
2035; CHECK-NEXT:    blr
2036;
2037; CHECK-REG-LABEL: test65:
2038; CHECK-REG:       # %bb.0:
2039; CHECK-REG-NEXT:    vcmpequw v2, v2, v3
2040; CHECK-REG-NEXT:    blr
2041;
2042; CHECK-FISL-LABEL: test65:
2043; CHECK-FISL:       # %bb.0:
2044; CHECK-FISL-NEXT:    vcmpequw v2, v2, v3
2045; CHECK-FISL-NEXT:    blr
2046;
2047; CHECK-LE-LABEL: test65:
2048; CHECK-LE:       # %bb.0:
2049; CHECK-LE-NEXT:    vcmpequd v2, v2, v3
2050; CHECK-LE-NEXT:    blr
2051  %w = icmp eq <2 x i64> %a, %b
2052  ret <2 x i1> %w
2053
2054
2055
2056}
2057
2058define <2 x i1> @test66(<2 x i64> %a, <2 x i64> %b) {
2059; CHECK-LABEL: test66:
2060; CHECK:       # %bb.0:
2061; CHECK-NEXT:    vcmpequw v2, v2, v3
2062; CHECK-NEXT:    xxlnor v2, v2, v2
2063; CHECK-NEXT:    blr
2064;
2065; CHECK-REG-LABEL: test66:
2066; CHECK-REG:       # %bb.0:
2067; CHECK-REG-NEXT:    vcmpequw v2, v2, v3
2068; CHECK-REG-NEXT:    xxlnor v2, v2, v2
2069; CHECK-REG-NEXT:    blr
2070;
2071; CHECK-FISL-LABEL: test66:
2072; CHECK-FISL:       # %bb.0:
2073; CHECK-FISL-NEXT:    vcmpequw v2, v2, v3
2074; CHECK-FISL-NEXT:    xxlnor v2, v2, v2
2075; CHECK-FISL-NEXT:    blr
2076;
2077; CHECK-LE-LABEL: test66:
2078; CHECK-LE:       # %bb.0:
2079; CHECK-LE-NEXT:    vcmpequd v2, v2, v3
2080; CHECK-LE-NEXT:    xxlnor v2, v2, v2
2081; CHECK-LE-NEXT:    blr
2082  %w = icmp ne <2 x i64> %a, %b
2083  ret <2 x i1> %w
2084
2085
2086
2087}
2088
2089define <2 x i1> @test67(<2 x i64> %a, <2 x i64> %b) {
2090; CHECK-LABEL: test67:
2091; CHECK:       # %bb.0:
2092; CHECK-NEXT:    addi r3, r1, -32
2093; CHECK-NEXT:    addi r4, r1, -48
2094; CHECK-NEXT:    stxvd2x v3, 0, r3
2095; CHECK-NEXT:    stxvd2x v2, 0, r4
2096; CHECK-NEXT:    ld r3, -24(r1)
2097; CHECK-NEXT:    ld r4, -40(r1)
2098; CHECK-NEXT:    ld r6, -48(r1)
2099; CHECK-NEXT:    cmpld r4, r3
2100; CHECK-NEXT:    li r3, 0
2101; CHECK-NEXT:    li r4, -1
2102; CHECK-NEXT:    isellt r5, r4, r3
2103; CHECK-NEXT:    std r5, -8(r1)
2104; CHECK-NEXT:    ld r5, -32(r1)
2105; CHECK-NEXT:    cmpld r6, r5
2106; CHECK-NEXT:    isellt r3, r4, r3
2107; CHECK-NEXT:    std r3, -16(r1)
2108; CHECK-NEXT:    addi r3, r1, -16
2109; CHECK-NEXT:    lxvd2x v2, 0, r3
2110; CHECK-NEXT:    blr
2111;
2112; CHECK-REG-LABEL: test67:
2113; CHECK-REG:       # %bb.0:
2114; CHECK-REG-NEXT:    addi r3, r1, -32
2115; CHECK-REG-NEXT:    addi r4, r1, -48
2116; CHECK-REG-NEXT:    stxvd2x v3, 0, r3
2117; CHECK-REG-NEXT:    stxvd2x v2, 0, r4
2118; CHECK-REG-NEXT:    ld r3, -24(r1)
2119; CHECK-REG-NEXT:    ld r4, -40(r1)
2120; CHECK-REG-NEXT:    ld r6, -48(r1)
2121; CHECK-REG-NEXT:    cmpld r4, r3
2122; CHECK-REG-NEXT:    li r3, 0
2123; CHECK-REG-NEXT:    li r4, -1
2124; CHECK-REG-NEXT:    isellt r5, r4, r3
2125; CHECK-REG-NEXT:    std r5, -8(r1)
2126; CHECK-REG-NEXT:    ld r5, -32(r1)
2127; CHECK-REG-NEXT:    cmpld r6, r5
2128; CHECK-REG-NEXT:    isellt r3, r4, r3
2129; CHECK-REG-NEXT:    std r3, -16(r1)
2130; CHECK-REG-NEXT:    addi r3, r1, -16
2131; CHECK-REG-NEXT:    lxvd2x v2, 0, r3
2132; CHECK-REG-NEXT:    blr
2133;
2134; CHECK-FISL-LABEL: test67:
2135; CHECK-FISL:       # %bb.0:
2136; CHECK-FISL-NEXT:    addi r3, r1, -32
2137; CHECK-FISL-NEXT:    stxvd2x v3, 0, r3
2138; CHECK-FISL-NEXT:    addi r3, r1, -48
2139; CHECK-FISL-NEXT:    stxvd2x v2, 0, r3
2140; CHECK-FISL-NEXT:    ld r4, -24(r1)
2141; CHECK-FISL-NEXT:    ld r3, -40(r1)
2142; CHECK-FISL-NEXT:    cmpld r3, r4
2143; CHECK-FISL-NEXT:    li r4, 0
2144; CHECK-FISL-NEXT:    li r3, -1
2145; CHECK-FISL-NEXT:    isellt r5, r3, r4
2146; CHECK-FISL-NEXT:    std r5, -8(r1)
2147; CHECK-FISL-NEXT:    ld r6, -32(r1)
2148; CHECK-FISL-NEXT:    ld r5, -48(r1)
2149; CHECK-FISL-NEXT:    cmpld r5, r6
2150; CHECK-FISL-NEXT:    isellt r3, r3, r4
2151; CHECK-FISL-NEXT:    std r3, -16(r1)
2152; CHECK-FISL-NEXT:    addi r3, r1, -16
2153; CHECK-FISL-NEXT:    lxvd2x v2, 0, r3
2154; CHECK-FISL-NEXT:    blr
2155;
2156; CHECK-LE-LABEL: test67:
2157; CHECK-LE:       # %bb.0:
2158; CHECK-LE-NEXT:    vcmpgtud v2, v3, v2
2159; CHECK-LE-NEXT:    blr
2160  %w = icmp ult <2 x i64> %a, %b
2161  ret <2 x i1> %w
2162
2163; This should scalarize, and the current code quality is not good.
2164
2165}
2166
2167define <2 x double> @test68(<2 x i32> %a) {
2168; CHECK-LABEL: test68:
2169; CHECK:       # %bb.0:
2170; CHECK-NEXT:    xxmrghw vs0, v2, v2
2171; CHECK-NEXT:    xvcvsxwdp v2, vs0
2172; CHECK-NEXT:    blr
2173;
2174; CHECK-REG-LABEL: test68:
2175; CHECK-REG:       # %bb.0:
2176; CHECK-REG-NEXT:    xxmrghw vs0, v2, v2
2177; CHECK-REG-NEXT:    xvcvsxwdp v2, vs0
2178; CHECK-REG-NEXT:    blr
2179;
2180; CHECK-FISL-LABEL: test68:
2181; CHECK-FISL:       # %bb.0:
2182; CHECK-FISL-NEXT:    xxmrghw vs0, v2, v2
2183; CHECK-FISL-NEXT:    xvcvsxwdp v2, vs0
2184; CHECK-FISL-NEXT:    blr
2185;
2186; CHECK-LE-LABEL: test68:
2187; CHECK-LE:       # %bb.0:
2188; CHECK-LE-NEXT:    xxmrglw v2, v2, v2
2189; CHECK-LE-NEXT:    xvcvsxwdp v2, v2
2190; CHECK-LE-NEXT:    blr
2191  %w = sitofp <2 x i32> %a to <2 x double>
2192  ret <2 x double> %w
2193
2194
2195}
2196
2197; This gets scalarized so the code isn't great
2198define <2 x double> @test69(<2 x i16> %a) {
2199; CHECK-LABEL: test69:
2200; CHECK:       # %bb.0:
2201; CHECK-NEXT:    addis r3, r2, .LCPI63_0@toc@ha
2202; CHECK-NEXT:    addi r3, r3, .LCPI63_0@toc@l
2203; CHECK-NEXT:    lxvw4x v3, 0, r3
2204; CHECK-NEXT:    addi r3, r1, -32
2205; CHECK-NEXT:    vperm v2, v2, v2, v3
2206; CHECK-NEXT:    stxvd2x v2, 0, r3
2207; CHECK-NEXT:    lha r3, -18(r1)
2208; CHECK-NEXT:    std r3, -8(r1)
2209; CHECK-NEXT:    lha r3, -26(r1)
2210; CHECK-NEXT:    std r3, -16(r1)
2211; CHECK-NEXT:    addi r3, r1, -16
2212; CHECK-NEXT:    lxvd2x v2, 0, r3
2213; CHECK-NEXT:    xvcvsxddp v2, v2
2214; CHECK-NEXT:    blr
2215;
2216; CHECK-REG-LABEL: test69:
2217; CHECK-REG:       # %bb.0:
2218; CHECK-REG-NEXT:    addis r3, r2, .LCPI63_0@toc@ha
2219; CHECK-REG-NEXT:    addi r3, r3, .LCPI63_0@toc@l
2220; CHECK-REG-NEXT:    lxvw4x v3, 0, r3
2221; CHECK-REG-NEXT:    addi r3, r1, -32
2222; CHECK-REG-NEXT:    vperm v2, v2, v2, v3
2223; CHECK-REG-NEXT:    stxvd2x v2, 0, r3
2224; CHECK-REG-NEXT:    lha r3, -18(r1)
2225; CHECK-REG-NEXT:    std r3, -8(r1)
2226; CHECK-REG-NEXT:    lha r3, -26(r1)
2227; CHECK-REG-NEXT:    std r3, -16(r1)
2228; CHECK-REG-NEXT:    addi r3, r1, -16
2229; CHECK-REG-NEXT:    lxvd2x v2, 0, r3
2230; CHECK-REG-NEXT:    xvcvsxddp v2, v2
2231; CHECK-REG-NEXT:    blr
2232;
2233; CHECK-FISL-LABEL: test69:
2234; CHECK-FISL:       # %bb.0:
2235; CHECK-FISL-NEXT:    addis r3, r2, .LCPI63_0@toc@ha
2236; CHECK-FISL-NEXT:    addi r3, r3, .LCPI63_0@toc@l
2237; CHECK-FISL-NEXT:    lxvw4x v3, 0, r3
2238; CHECK-FISL-NEXT:    vperm v2, v2, v2, v3
2239; CHECK-FISL-NEXT:    xxlor vs0, v2, v2
2240; CHECK-FISL-NEXT:    addi r3, r1, -32
2241; CHECK-FISL-NEXT:    stxvd2x vs0, 0, r3
2242; CHECK-FISL-NEXT:    lha r3, -18(r1)
2243; CHECK-FISL-NEXT:    std r3, -8(r1)
2244; CHECK-FISL-NEXT:    lha r3, -26(r1)
2245; CHECK-FISL-NEXT:    std r3, -16(r1)
2246; CHECK-FISL-NEXT:    addi r3, r1, -16
2247; CHECK-FISL-NEXT:    lxvd2x v2, 0, r3
2248; CHECK-FISL-NEXT:    xvcvsxddp v2, v2
2249; CHECK-FISL-NEXT:    blr
2250;
2251; CHECK-LE-LABEL: test69:
2252; CHECK-LE:       # %bb.0:
2253; CHECK-LE-NEXT:    addis r3, r2, .LCPI63_0@toc@ha
2254; CHECK-LE-NEXT:    addi r3, r3, .LCPI63_0@toc@l
2255; CHECK-LE-NEXT:    lvx v3, 0, r3
2256; CHECK-LE-NEXT:    addis r3, r2, .LCPI63_1@toc@ha
2257; CHECK-LE-NEXT:    addi r3, r3, .LCPI63_1@toc@l
2258; CHECK-LE-NEXT:    lxvd2x vs0, 0, r3
2259; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
2260; CHECK-LE-NEXT:    xxswapd v3, vs0
2261; CHECK-LE-NEXT:    vsld v2, v2, v3
2262; CHECK-LE-NEXT:    vsrad v2, v2, v3
2263; CHECK-LE-NEXT:    xvcvsxddp v2, v2
2264; CHECK-LE-NEXT:    blr
2265  %w = sitofp <2 x i16> %a to <2 x double>
2266  ret <2 x double> %w
2267
2268
2269}
2270
2271; This gets scalarized so the code isn't great
2272define <2 x double> @test70(<2 x i8> %a) {
2273; CHECK-LABEL: test70:
2274; CHECK:       # %bb.0:
2275; CHECK-NEXT:    addis r3, r2, .LCPI64_0@toc@ha
2276; CHECK-NEXT:    addi r3, r3, .LCPI64_0@toc@l
2277; CHECK-NEXT:    lxvw4x v3, 0, r3
2278; CHECK-NEXT:    addi r3, r1, -32
2279; CHECK-NEXT:    vperm v2, v2, v2, v3
2280; CHECK-NEXT:    stxvd2x v2, 0, r3
2281; CHECK-NEXT:    ld r3, -24(r1)
2282; CHECK-NEXT:    extsb r3, r3
2283; CHECK-NEXT:    std r3, -8(r1)
2284; CHECK-NEXT:    ld r3, -32(r1)
2285; CHECK-NEXT:    extsb r3, r3
2286; CHECK-NEXT:    std r3, -16(r1)
2287; CHECK-NEXT:    addi r3, r1, -16
2288; CHECK-NEXT:    lxvd2x v2, 0, r3
2289; CHECK-NEXT:    xvcvsxddp v2, v2
2290; CHECK-NEXT:    blr
2291;
2292; CHECK-REG-LABEL: test70:
2293; CHECK-REG:       # %bb.0:
2294; CHECK-REG-NEXT:    addis r3, r2, .LCPI64_0@toc@ha
2295; CHECK-REG-NEXT:    addi r3, r3, .LCPI64_0@toc@l
2296; CHECK-REG-NEXT:    lxvw4x v3, 0, r3
2297; CHECK-REG-NEXT:    addi r3, r1, -32
2298; CHECK-REG-NEXT:    vperm v2, v2, v2, v3
2299; CHECK-REG-NEXT:    stxvd2x v2, 0, r3
2300; CHECK-REG-NEXT:    ld r3, -24(r1)
2301; CHECK-REG-NEXT:    extsb r3, r3
2302; CHECK-REG-NEXT:    std r3, -8(r1)
2303; CHECK-REG-NEXT:    ld r3, -32(r1)
2304; CHECK-REG-NEXT:    extsb r3, r3
2305; CHECK-REG-NEXT:    std r3, -16(r1)
2306; CHECK-REG-NEXT:    addi r3, r1, -16
2307; CHECK-REG-NEXT:    lxvd2x v2, 0, r3
2308; CHECK-REG-NEXT:    xvcvsxddp v2, v2
2309; CHECK-REG-NEXT:    blr
2310;
2311; CHECK-FISL-LABEL: test70:
2312; CHECK-FISL:       # %bb.0:
2313; CHECK-FISL-NEXT:    addis r3, r2, .LCPI64_0@toc@ha
2314; CHECK-FISL-NEXT:    addi r3, r3, .LCPI64_0@toc@l
2315; CHECK-FISL-NEXT:    lxvw4x v3, 0, r3
2316; CHECK-FISL-NEXT:    vperm v2, v2, v2, v3
2317; CHECK-FISL-NEXT:    xxlor vs0, v2, v2
2318; CHECK-FISL-NEXT:    addi r3, r1, -32
2319; CHECK-FISL-NEXT:    stxvd2x vs0, 0, r3
2320; CHECK-FISL-NEXT:    ld r3, -24(r1)
2321; CHECK-FISL-NEXT:    extsb r3, r3
2322; CHECK-FISL-NEXT:    std r3, -8(r1)
2323; CHECK-FISL-NEXT:    ld r3, -32(r1)
2324; CHECK-FISL-NEXT:    extsb r3, r3
2325; CHECK-FISL-NEXT:    std r3, -16(r1)
2326; CHECK-FISL-NEXT:    addi r3, r1, -16
2327; CHECK-FISL-NEXT:    lxvd2x v2, 0, r3
2328; CHECK-FISL-NEXT:    xvcvsxddp v2, v2
2329; CHECK-FISL-NEXT:    blr
2330;
2331; CHECK-LE-LABEL: test70:
2332; CHECK-LE:       # %bb.0:
2333; CHECK-LE-NEXT:    addis r3, r2, .LCPI64_0@toc@ha
2334; CHECK-LE-NEXT:    addi r3, r3, .LCPI64_0@toc@l
2335; CHECK-LE-NEXT:    lvx v3, 0, r3
2336; CHECK-LE-NEXT:    addis r3, r2, .LCPI64_1@toc@ha
2337; CHECK-LE-NEXT:    addi r3, r3, .LCPI64_1@toc@l
2338; CHECK-LE-NEXT:    lxvd2x vs0, 0, r3
2339; CHECK-LE-NEXT:    vperm v2, v2, v2, v3
2340; CHECK-LE-NEXT:    xxswapd v3, vs0
2341; CHECK-LE-NEXT:    vsld v2, v2, v3
2342; CHECK-LE-NEXT:    vsrad v2, v2, v3
2343; CHECK-LE-NEXT:    xvcvsxddp v2, v2
2344; CHECK-LE-NEXT:    blr
2345  %w = sitofp <2 x i8> %a to <2 x double>
2346  ret <2 x double> %w
2347
2348
2349}
2350
2351; This gets scalarized so the code isn't great
2352define <2 x i32> @test80(i32 %v) {
2353; CHECK-LABEL: test80:
2354; CHECK:       # %bb.0:
2355; CHECK-NEXT:    addi r4, r1, -16
2356; CHECK-NEXT:    stw r3, -16(r1)
2357; CHECK-NEXT:    addis r3, r2, .LCPI65_0@toc@ha
2358; CHECK-NEXT:    lxvw4x vs0, 0, r4
2359; CHECK-NEXT:    addi r3, r3, .LCPI65_0@toc@l
2360; CHECK-NEXT:    lxvw4x v3, 0, r3
2361; CHECK-NEXT:    xxspltw v2, vs0, 0
2362; CHECK-NEXT:    vadduwm v2, v2, v3
2363; CHECK-NEXT:    blr
2364;
2365; CHECK-REG-LABEL: test80:
2366; CHECK-REG:       # %bb.0:
2367; CHECK-REG-NEXT:    addi r4, r1, -16
2368; CHECK-REG-NEXT:    stw r3, -16(r1)
2369; CHECK-REG-NEXT:    addis r3, r2, .LCPI65_0@toc@ha
2370; CHECK-REG-NEXT:    lxvw4x vs0, 0, r4
2371; CHECK-REG-NEXT:    addi r3, r3, .LCPI65_0@toc@l
2372; CHECK-REG-NEXT:    lxvw4x v3, 0, r3
2373; CHECK-REG-NEXT:    xxspltw v2, vs0, 0
2374; CHECK-REG-NEXT:    vadduwm v2, v2, v3
2375; CHECK-REG-NEXT:    blr
2376;
2377; CHECK-FISL-LABEL: test80:
2378; CHECK-FISL:       # %bb.0:
2379; CHECK-FISL-NEXT:    # kill: def $r3 killed $r3 killed $x3
2380; CHECK-FISL-NEXT:    stw r3, -16(r1)
2381; CHECK-FISL-NEXT:    addi r3, r1, -16
2382; CHECK-FISL-NEXT:    lxvw4x vs0, 0, r3
2383; CHECK-FISL-NEXT:    xxspltw v2, vs0, 0
2384; CHECK-FISL-NEXT:    addis r3, r2, .LCPI65_0@toc@ha
2385; CHECK-FISL-NEXT:    addi r3, r3, .LCPI65_0@toc@l
2386; CHECK-FISL-NEXT:    lxvw4x v3, 0, r3
2387; CHECK-FISL-NEXT:    vadduwm v2, v2, v3
2388; CHECK-FISL-NEXT:    blr
2389;
2390; CHECK-LE-LABEL: test80:
2391; CHECK-LE:       # %bb.0:
2392; CHECK-LE-NEXT:    mtfprwz f0, r3
2393; CHECK-LE-NEXT:    addis r4, r2, .LCPI65_0@toc@ha
2394; CHECK-LE-NEXT:    addi r3, r4, .LCPI65_0@toc@l
2395; CHECK-LE-NEXT:    xxspltw v2, vs0, 1
2396; CHECK-LE-NEXT:    lvx v3, 0, r3
2397; CHECK-LE-NEXT:    vadduwm v2, v2, v3
2398; CHECK-LE-NEXT:    blr
2399  %b1 = insertelement <2 x i32> undef, i32 %v, i32 0
2400  %b2 = shufflevector <2 x i32> %b1, <2 x i32> undef, <2 x i32> zeroinitializer
2401  %i = add <2 x i32> %b2, <i32 2, i32 3>
2402  ret <2 x i32> %i
2403
2404
2405
2406}
2407
2408define <2 x double> @test81(<4 x float> %b) {
2409; CHECK-LABEL: test81:
2410; CHECK:       # %bb.0:
2411; CHECK-NEXT:    blr
2412;
2413; CHECK-REG-LABEL: test81:
2414; CHECK-REG:       # %bb.0:
2415; CHECK-REG-NEXT:    blr
2416;
2417; CHECK-FISL-LABEL: test81:
2418; CHECK-FISL:       # %bb.0:
2419; CHECK-FISL-NEXT:    blr
2420;
2421; CHECK-LE-LABEL: test81:
2422; CHECK-LE:       # %bb.0:
2423; CHECK-LE-NEXT:    blr
2424  %w = bitcast <4 x float> %b to <2 x double>
2425  ret <2 x double> %w
2426
2427
2428}
2429
2430define double @test82(double %a, double %b, double %c, double %d) {
2431; CHECK-LABEL: test82:
2432; CHECK:       # %bb.0: # %entry
2433; CHECK-NEXT:    xscmpudp cr0, f3, f4
2434; CHECK-NEXT:    beqlr cr0
2435; CHECK-NEXT:  # %bb.1: # %entry
2436; CHECK-NEXT:    fmr f1, f2
2437; CHECK-NEXT:    blr
2438;
2439; CHECK-REG-LABEL: test82:
2440; CHECK-REG:       # %bb.0: # %entry
2441; CHECK-REG-NEXT:    xscmpudp cr0, f3, f4
2442; CHECK-REG-NEXT:    beqlr cr0
2443; CHECK-REG-NEXT:  # %bb.1: # %entry
2444; CHECK-REG-NEXT:    fmr f1, f2
2445; CHECK-REG-NEXT:    blr
2446;
2447; CHECK-FISL-LABEL: test82:
2448; CHECK-FISL:       # %bb.0: # %entry
2449; CHECK-FISL-NEXT:    stfd f2, -16(r1) # 8-byte Folded Spill
2450; CHECK-FISL-NEXT:    fmr f2, f1
2451; CHECK-FISL-NEXT:    xscmpudp cr0, f3, f4
2452; CHECK-FISL-NEXT:    stfd f2, -8(r1) # 8-byte Folded Spill
2453; CHECK-FISL-NEXT:    beq cr0, .LBB67_2
2454; CHECK-FISL-NEXT:  # %bb.1: # %entry
2455; CHECK-FISL-NEXT:    lfd f0, -16(r1) # 8-byte Folded Reload
2456; CHECK-FISL-NEXT:    stfd f0, -8(r1) # 8-byte Folded Spill
2457; CHECK-FISL-NEXT:  .LBB67_2: # %entry
2458; CHECK-FISL-NEXT:    lfd f1, -8(r1) # 8-byte Folded Reload
2459; CHECK-FISL-NEXT:    blr
2460;
2461; CHECK-LE-LABEL: test82:
2462; CHECK-LE:       # %bb.0: # %entry
2463; CHECK-LE-NEXT:    xscmpudp cr0, f3, f4
2464; CHECK-LE-NEXT:    beqlr cr0
2465; CHECK-LE-NEXT:  # %bb.1: # %entry
2466; CHECK-LE-NEXT:    fmr f1, f2
2467; CHECK-LE-NEXT:    blr
2468entry:
2469  %m = fcmp oeq double %c, %d
2470  %v = select i1 %m, double %a, double %b
2471  ret double %v
2472
2473
2474
2475}
2476