@@ -465,6 +465,125 @@ define void @exttrunc(<8 x i32> %a, <8 x i32> %b, ptr %p) {
465465 ret void
466466}
467467
468+ define void @zext (<8 x i16 > %a , <8 x i16 > %b , ptr %p ) {
469+ ; CHECK-LABEL: @zext(
470+ ; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
471+ ; CHECK-NEXT: [[AT:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
472+ ; CHECK-NEXT: [[BB:%.*]] = shufflevector <8 x i16> [[B:%.*]], <8 x i16> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
473+ ; CHECK-NEXT: [[BT:%.*]] = shufflevector <8 x i16> [[B]], <8 x i16> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
474+ ; CHECK-NEXT: [[AB1:%.*]] = zext <4 x i16> [[AB]] to <4 x i32>
475+ ; CHECK-NEXT: [[AT1:%.*]] = zext <4 x i16> [[AT]] to <4 x i32>
476+ ; CHECK-NEXT: [[BB1:%.*]] = zext <4 x i16> [[BB]] to <4 x i32>
477+ ; CHECK-NEXT: [[BT1:%.*]] = zext <4 x i16> [[BT]] to <4 x i32>
478+ ; CHECK-NEXT: [[ABB:%.*]] = add <4 x i32> [[AB1]], [[BB1]]
479+ ; CHECK-NEXT: [[ABT:%.*]] = add <4 x i32> [[AT1]], [[BT1]]
480+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i32> [[ABB]], <4 x i32> [[ABT]], <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
481+ ; CHECK-NEXT: store <8 x i32> [[R]], ptr [[P:%.*]], align 32
482+ ; CHECK-NEXT: ret void
483+ ;
484+ %ab = shufflevector <8 x i16 > %a , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 2 , i32 4 , i32 6 >
485+ %at = shufflevector <8 x i16 > %a , <8 x i16 > poison, <4 x i32 > <i32 1 , i32 3 , i32 5 , i32 7 >
486+ %bb = shufflevector <8 x i16 > %b , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 2 , i32 4 , i32 6 >
487+ %bt = shufflevector <8 x i16 > %b , <8 x i16 > poison, <4 x i32 > <i32 1 , i32 3 , i32 5 , i32 7 >
488+ %ab1 = zext <4 x i16 > %ab to <4 x i32 >
489+ %at1 = zext <4 x i16 > %at to <4 x i32 >
490+ %bb1 = zext <4 x i16 > %bb to <4 x i32 >
491+ %bt1 = zext <4 x i16 > %bt to <4 x i32 >
492+ %abb = add <4 x i32 > %ab1 , %bb1
493+ %abt = add <4 x i32 > %at1 , %bt1
494+ %r = shufflevector <4 x i32 > %abb , <4 x i32 > %abt , <8 x i32 > <i32 0 , i32 4 , i32 1 , i32 5 , i32 2 , i32 6 , i32 3 , i32 7 >
495+ store <8 x i32 > %r , ptr %p
496+ ret void
497+ }
498+
499+ define void @sext (<8 x i16 > %a , <8 x i16 > %b , ptr %p ) {
500+ ; CHECK-LABEL: @sext(
501+ ; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
502+ ; CHECK-NEXT: [[AT:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
503+ ; CHECK-NEXT: [[BB:%.*]] = shufflevector <8 x i16> [[B:%.*]], <8 x i16> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
504+ ; CHECK-NEXT: [[BT:%.*]] = shufflevector <8 x i16> [[B]], <8 x i16> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
505+ ; CHECK-NEXT: [[AB1:%.*]] = sext <4 x i16> [[AB]] to <4 x i32>
506+ ; CHECK-NEXT: [[AT1:%.*]] = sext <4 x i16> [[AT]] to <4 x i32>
507+ ; CHECK-NEXT: [[BB1:%.*]] = sext <4 x i16> [[BB]] to <4 x i32>
508+ ; CHECK-NEXT: [[BT1:%.*]] = sext <4 x i16> [[BT]] to <4 x i32>
509+ ; CHECK-NEXT: [[ABB:%.*]] = add <4 x i32> [[AB1]], [[BB1]]
510+ ; CHECK-NEXT: [[ABT:%.*]] = add <4 x i32> [[AT1]], [[BT1]]
511+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i32> [[ABB]], <4 x i32> [[ABT]], <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
512+ ; CHECK-NEXT: store <8 x i32> [[R]], ptr [[P:%.*]], align 32
513+ ; CHECK-NEXT: ret void
514+ ;
515+ %ab = shufflevector <8 x i16 > %a , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 2 , i32 4 , i32 6 >
516+ %at = shufflevector <8 x i16 > %a , <8 x i16 > poison, <4 x i32 > <i32 1 , i32 3 , i32 5 , i32 7 >
517+ %bb = shufflevector <8 x i16 > %b , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 2 , i32 4 , i32 6 >
518+ %bt = shufflevector <8 x i16 > %b , <8 x i16 > poison, <4 x i32 > <i32 1 , i32 3 , i32 5 , i32 7 >
519+ %ab1 = sext <4 x i16 > %ab to <4 x i32 >
520+ %at1 = sext <4 x i16 > %at to <4 x i32 >
521+ %bb1 = sext <4 x i16 > %bb to <4 x i32 >
522+ %bt1 = sext <4 x i16 > %bt to <4 x i32 >
523+ %abb = add <4 x i32 > %ab1 , %bb1
524+ %abt = add <4 x i32 > %at1 , %bt1
525+ %r = shufflevector <4 x i32 > %abb , <4 x i32 > %abt , <8 x i32 > <i32 0 , i32 4 , i32 1 , i32 5 , i32 2 , i32 6 , i32 3 , i32 7 >
526+ store <8 x i32 > %r , ptr %p
527+ ret void
528+ }
529+
530+ define void @szext (<8 x i32 > %a , <8 x i32 > %b , ptr %p ) {
531+ ; CHECK-LABEL: @szext(
532+ ; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
533+ ; CHECK-NEXT: [[AT:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
534+ ; CHECK-NEXT: [[AB1:%.*]] = sext <4 x i32> [[AB]] to <4 x i64>
535+ ; CHECK-NEXT: [[AT1:%.*]] = zext <4 x i32> [[AT]] to <4 x i64>
536+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i64> [[AB1]], <4 x i64> [[AT1]], <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
537+ ; CHECK-NEXT: store <8 x i64> [[R]], ptr [[P:%.*]], align 64
538+ ; CHECK-NEXT: ret void
539+ ;
540+ %ab = shufflevector <8 x i32 > %a , <8 x i32 > poison, <4 x i32 > <i32 0 , i32 2 , i32 4 , i32 6 >
541+ %at = shufflevector <8 x i32 > %a , <8 x i32 > poison, <4 x i32 > <i32 1 , i32 3 , i32 5 , i32 7 >
542+ %ab1 = sext <4 x i32 > %ab to <4 x i64 >
543+ %at1 = zext <4 x i32 > %at to <4 x i64 >
544+ %r = shufflevector <4 x i64 > %ab1 , <4 x i64 > %at1 , <8 x i32 > <i32 0 , i32 4 , i32 1 , i32 5 , i32 2 , i32 6 , i32 3 , i32 7 >
545+ store <8 x i64 > %r , ptr %p
546+ ret void
547+ }
548+
549+ define void @zext_types (<8 x i16 > %a , <8 x i32 > %b , ptr %p ) {
550+ ; CHECK-LABEL: @zext_types(
551+ ; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
552+ ; CHECK-NEXT: [[AT:%.*]] = shufflevector <8 x i32> [[B:%.*]], <8 x i32> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
553+ ; CHECK-NEXT: [[AB1:%.*]] = zext <4 x i16> [[AB]] to <4 x i64>
554+ ; CHECK-NEXT: [[AT1:%.*]] = zext <4 x i32> [[AT]] to <4 x i64>
555+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i64> [[AB1]], <4 x i64> [[AT1]], <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
556+ ; CHECK-NEXT: store <8 x i64> [[R]], ptr [[P:%.*]], align 64
557+ ; CHECK-NEXT: ret void
558+ ;
559+ %ab = shufflevector <8 x i16 > %a , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 2 , i32 4 , i32 6 >
560+ %at = shufflevector <8 x i32 > %b , <8 x i32 > poison, <4 x i32 > <i32 1 , i32 3 , i32 5 , i32 7 >
561+ %ab1 = zext <4 x i16 > %ab to <4 x i64 >
562+ %at1 = zext <4 x i32 > %at to <4 x i64 >
563+ %r = shufflevector <4 x i64 > %ab1 , <4 x i64 > %at1 , <8 x i32 > <i32 0 , i32 4 , i32 1 , i32 5 , i32 2 , i32 6 , i32 3 , i32 7 >
564+ store <8 x i64 > %r , ptr %p
565+ ret void
566+ }
567+
568+ define void @trunc (<8 x i64 > %a , <8 x i64 > %b , ptr %p ) {
569+ ; CHECK-LABEL: @trunc(
570+ ; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x i64> [[A:%.*]], <8 x i64> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
571+ ; CHECK-NEXT: [[AT:%.*]] = shufflevector <8 x i64> [[A]], <8 x i64> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
572+ ; CHECK-NEXT: [[ABB1:%.*]] = trunc <4 x i64> [[AB]] to <4 x i32>
573+ ; CHECK-NEXT: [[ABT1:%.*]] = trunc <4 x i64> [[AT]] to <4 x i32>
574+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i32> [[ABB1]], <4 x i32> [[ABT1]], <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
575+ ; CHECK-NEXT: store <8 x i32> [[R]], ptr [[P:%.*]], align 32
576+ ; CHECK-NEXT: ret void
577+ ;
578+ %ab = shufflevector <8 x i64 > %a , <8 x i64 > poison, <4 x i32 > <i32 0 , i32 2 , i32 4 , i32 6 >
579+ %at = shufflevector <8 x i64 > %a , <8 x i64 > poison, <4 x i32 > <i32 1 , i32 3 , i32 5 , i32 7 >
580+ %abb1 = trunc <4 x i64 > %ab to <4 x i32 >
581+ %abt1 = trunc <4 x i64 > %at to <4 x i32 >
582+ %r = shufflevector <4 x i32 > %abb1 , <4 x i32 > %abt1 , <8 x i32 > <i32 0 , i32 4 , i32 1 , i32 5 , i32 2 , i32 6 , i32 3 , i32 7 >
583+ store <8 x i32 > %r , ptr %p
584+ ret void
585+ }
586+
468587define <8 x i8 > @intrinsics_minmax (<8 x i8 > %a , <8 x i8 > %b ) {
469588; CHECK-LABEL: @intrinsics_minmax(
470589; CHECK-NEXT: [[TMP1:%.*]] = call <8 x i8> @llvm.smin.v8i8(<8 x i8> [[A:%.*]], <8 x i8> [[B:%.*]])
@@ -624,4 +743,26 @@ entry:
624743 ret void
625744}
626745
746+ define <4 x i8 > @singleop (<4 x i8 > %a , <4 x i8 > %b ) {
747+ ; CHECK-LABEL: @singleop(
748+ ; CHECK-NEXT: [[A1:%.*]] = shufflevector <4 x i8> [[A:%.*]], <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
749+ ; CHECK-NEXT: [[B1:%.*]] = shufflevector <4 x i8> [[B:%.*]], <4 x i8> poison, <4 x i32> zeroinitializer
750+ ; CHECK-NEXT: [[A2:%.*]] = zext <4 x i8> [[A1]] to <4 x i16>
751+ ; CHECK-NEXT: [[B2:%.*]] = zext <4 x i8> [[B1]] to <4 x i16>
752+ ; CHECK-NEXT: [[AB:%.*]] = add <4 x i16> [[A2]], [[B2]]
753+ ; CHECK-NEXT: [[T:%.*]] = trunc <4 x i16> [[AB]] to <4 x i8>
754+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i8> [[T]], <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
755+ ; CHECK-NEXT: ret <4 x i8> [[R]]
756+ ;
757+ %a1 = shufflevector <4 x i8 > %a , <4 x i8 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
758+ %b1 = shufflevector <4 x i8 > %b , <4 x i8 > poison, <4 x i32 > <i32 0 , i32 0 , i32 0 , i32 0 >
759+ %a2 = zext <4 x i8 > %a1 to <4 x i16 >
760+ %b2 = zext <4 x i8 > %b1 to <4 x i16 >
761+ %ab = add <4 x i16 > %a2 , %b2
762+ %t = trunc <4 x i16 > %ab to <4 x i8 >
763+ %r = shufflevector <4 x i8 > %t , <4 x i8 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
764+ ret <4 x i8 > %r
765+ }
766+
767+
627768declare void @use (<4 x i8 >)
0 commit comments