@@ -446,5 +446,93 @@ entry:
446
446
ret <16 x i8 > %shuffle
447
447
}
448
448
449
+ define dso_local <4 x i32 > @testSplat4Low (<8 x i8 >* nocapture readonly %ptr ) local_unnamed_addr #0 {
450
+ ; CHECK-P8-LABEL: testSplat4Low:
451
+ ; CHECK-P8: # %bb.0: # %entry
452
+ ; CHECK-P8-NEXT: ld r3, 0(r3)
453
+ ; CHECK-P8-NEXT: mtfprd f0, r3
454
+ ; CHECK-P8-NEXT: xxspltw v2, vs0, 0
455
+ ; CHECK-P8-NEXT: blr
456
+ ;
457
+ ; CHECK-P9-LABEL: testSplat4Low:
458
+ ; CHECK-P9: # %bb.0: # %entry
459
+ ; CHECK-P9-NEXT: addi r3, r3, 4
460
+ ; CHECK-P9-NEXT: lxvwsx v2, 0, r3
461
+ ; CHECK-P9-NEXT: blr
462
+ ;
463
+ ; CHECK-NOVSX-LABEL: testSplat4Low:
464
+ ; CHECK-NOVSX: # %bb.0: # %entry
465
+ ; CHECK-NOVSX-NEXT: ld r3, 0(r3)
466
+ ; CHECK-NOVSX-NEXT: addi r4, r1, -16
467
+ ; CHECK-NOVSX-NEXT: std r3, -16(r1)
468
+ ; CHECK-NOVSX-NEXT: lvx v2, 0, r4
469
+ ; CHECK-NOVSX-NEXT: vspltw v2, v2, 2
470
+ ; CHECK-NOVSX-NEXT: blr
471
+ entry:
472
+ %0 = load <8 x i8 >, <8 x i8 >* %ptr , align 8
473
+ %vecinit18 = shufflevector <8 x i8 > %0 , <8 x i8 > undef , <16 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 , i32 undef , i32 undef , i32 undef , i32 undef , i32 undef , i32 undef , i32 undef , i32 undef , i32 undef , i32 undef , i32 undef , i32 undef >
474
+ %1 = bitcast <16 x i8 > %vecinit18 to <4 x i32 >
475
+ ret <4 x i32 > %1
476
+ }
477
+
478
+ ; Function Attrs: norecurse nounwind readonly
479
+ define dso_local <4 x i32 > @testSplat4hi (<8 x i8 >* nocapture readonly %ptr ) local_unnamed_addr #0 {
480
+ ; CHECK-P8-LABEL: testSplat4hi:
481
+ ; CHECK-P8: # %bb.0: # %entry
482
+ ; CHECK-P8-NEXT: ld r3, 0(r3)
483
+ ; CHECK-P8-NEXT: mtfprd f0, r3
484
+ ; CHECK-P8-NEXT: xxspltw v2, vs0, 1
485
+ ; CHECK-P8-NEXT: blr
486
+ ;
487
+ ; CHECK-P9-LABEL: testSplat4hi:
488
+ ; CHECK-P9: # %bb.0: # %entry
489
+ ; CHECK-P9-NEXT: lxvwsx v2, 0, r3
490
+ ; CHECK-P9-NEXT: blr
491
+ ;
492
+ ; CHECK-NOVSX-LABEL: testSplat4hi:
493
+ ; CHECK-NOVSX: # %bb.0: # %entry
494
+ ; CHECK-NOVSX-NEXT: ld r3, 0(r3)
495
+ ; CHECK-NOVSX-NEXT: addi r4, r1, -16
496
+ ; CHECK-NOVSX-NEXT: std r3, -16(r1)
497
+ ; CHECK-NOVSX-NEXT: lvx v2, 0, r4
498
+ ; CHECK-NOVSX-NEXT: vspltw v2, v2, 3
499
+ ; CHECK-NOVSX-NEXT: blr
500
+ entry:
501
+ %0 = load <8 x i8 >, <8 x i8 >* %ptr , align 8
502
+ %vecinit22 = shufflevector <8 x i8 > %0 , <8 x i8 > undef , <16 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 0 , i32 1 , i32 2 , i32 3 , i32 undef , i32 undef , i32 undef , i32 undef , i32 undef , i32 undef , i32 undef , i32 undef >
503
+ %1 = bitcast <16 x i8 > %vecinit22 to <4 x i32 >
504
+ ret <4 x i32 > %1
505
+ }
506
+
507
+ ; Function Attrs: norecurse nounwind readonly
508
+ define dso_local <2 x i64 > @testSplat8 (<8 x i8 >* nocapture readonly %ptr ) local_unnamed_addr #0 {
509
+ ; CHECK-P8-LABEL: testSplat8:
510
+ ; CHECK-P8: # %bb.0: # %entry
511
+ ; CHECK-P8-NEXT: lxvdsx v2, 0, r3
512
+ ; CHECK-P8-NEXT: blr
513
+ ;
514
+ ; CHECK-P9-LABEL: testSplat8:
515
+ ; CHECK-P9: # %bb.0: # %entry
516
+ ; CHECK-P9-NEXT: lxvdsx v2, 0, r3
517
+ ; CHECK-P9-NEXT: blr
518
+ ;
519
+ ; CHECK-NOVSX-LABEL: testSplat8:
520
+ ; CHECK-NOVSX: # %bb.0: # %entry
521
+ ; CHECK-NOVSX-NEXT: ld r3, 0(r3)
522
+ ; CHECK-NOVSX-NEXT: addis r4, r2, .LCPI19_0@toc@ha
523
+ ; CHECK-NOVSX-NEXT: addi r4, r4, .LCPI19_0@toc@l
524
+ ; CHECK-NOVSX-NEXT: lvx v2, 0, r4
525
+ ; CHECK-NOVSX-NEXT: std r3, -16(r1)
526
+ ; CHECK-NOVSX-NEXT: addi r3, r1, -16
527
+ ; CHECK-NOVSX-NEXT: lvx v3, 0, r3
528
+ ; CHECK-NOVSX-NEXT: vperm v2, v3, v3, v2
529
+ ; CHECK-NOVSX-NEXT: blr
530
+ entry:
531
+ %0 = load <8 x i8 >, <8 x i8 >* %ptr , align 8
532
+ %vecinit30 = shufflevector <8 x i8 > %0 , <8 x i8 > undef , <16 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 , i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
533
+ %1 = bitcast <16 x i8 > %vecinit30 to <2 x i64 >
534
+ ret <2 x i64 > %1
535
+ }
536
+
449
537
declare double @dummy () local_unnamed_addr
450
538
attributes #0 = { nounwind }
0 commit comments