@@ -516,3 +516,114 @@ entry:
516
516
%shuffle = shufflevector <2 x i32 > %x , <2 x i32 > %trunc , <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
517
517
ret <4 x i32 > %shuffle
518
518
}
519
+
520
+ ; Type support varification - not supported with saturated value
521
+ ; i64 -> i16
522
+ define <4 x i16 > @sminsmax_range_unsigned_i64_to_i16 (<2 x i16 > %x , <2 x i64 > %y ) {
523
+ ; CHECK-LABEL: sminsmax_range_unsigned_i64_to_i16:
524
+ ; CHECK: // %bb.0: // %entry
525
+ ; CHECK-NEXT: cmgt v2.2d, v1.2d, #0
526
+ ; CHECK-NEXT: movi v3.2d, #0x0000000000ffff
527
+ ; CHECK-NEXT: and v1.16b, v1.16b, v2.16b
528
+ ; CHECK-NEXT: cmgt v2.2d, v3.2d, v1.2d
529
+ ; CHECK-NEXT: bif v1.16b, v3.16b, v2.16b
530
+ ; CHECK-NEXT: xtn v1.2s, v1.2d
531
+ ; CHECK-NEXT: uzp1 v0.4h, v0.4h, v1.4h
532
+ ; CHECK-NEXT: ret
533
+ entry:
534
+ %smax = call <2 x i64 > @llvm.smax.v2i64 (<2 x i64 > %y , <2 x i64 > zeroinitializer )
535
+ %smin = call <2 x i64 > @llvm.smin.v2i64 (<2 x i64 > %smax , <2 x i64 > <i64 65535 , i64 65535 >)
536
+ %trunc = trunc <2 x i64 > %smin to <2 x i16 >
537
+ %shuffle = shufflevector <2 x i16 > %x , <2 x i16 > %trunc , <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
538
+ ret <4 x i16 > %shuffle
539
+ }
540
+
541
+ define <4 x i16 > @sminsmax_range_signed_i64_to_i16 (<2 x i16 > %x , <2 x i64 > %y ) {
542
+ ; CHECK-LABEL: sminsmax_range_signed_i64_to_i16:
543
+ ; CHECK: // %bb.0: // %entry
544
+ ; CHECK-NEXT: mov x8, #-32768 // =0xffffffffffff8000
545
+ ; CHECK-NEXT: dup v2.2d, x8
546
+ ; CHECK-NEXT: mov w8, #32767 // =0x7fff
547
+ ; CHECK-NEXT: cmgt v3.2d, v1.2d, v2.2d
548
+ ; CHECK-NEXT: bif v1.16b, v2.16b, v3.16b
549
+ ; CHECK-NEXT: dup v2.2d, x8
550
+ ; CHECK-NEXT: cmgt v3.2d, v2.2d, v1.2d
551
+ ; CHECK-NEXT: bif v1.16b, v2.16b, v3.16b
552
+ ; CHECK-NEXT: xtn v1.2s, v1.2d
553
+ ; CHECK-NEXT: uzp1 v0.4h, v0.4h, v1.4h
554
+ ; CHECK-NEXT: ret
555
+ entry:
556
+ %smax = call <2 x i64 > @llvm.smax.v2i64 (<2 x i64 > %y , <2 x i64 > <i64 -32768 , i64 -32768 >)
557
+ %smin = call <2 x i64 > @llvm.smin.v2i64 (<2 x i64 > %smax , <2 x i64 > <i64 32767 , i64 32767 >)
558
+ %trunc = trunc <2 x i64 > %smin to <2 x i16 >
559
+ %shuffle = shufflevector <2 x i16 > %x , <2 x i16 > %trunc , <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
560
+ ret <4 x i16 > %shuffle
561
+ }
562
+
563
+ define <4 x i16 > @umin_range_unsigned_i64_to_i16 (<2 x i16 > %x , <2 x i64 > %y ) {
564
+ ; CHECK-LABEL: umin_range_unsigned_i64_to_i16:
565
+ ; CHECK: // %bb.0: // %entry
566
+ ; CHECK-NEXT: movi v2.2d, #0x0000000000ffff
567
+ ; CHECK-NEXT: cmhi v3.2d, v2.2d, v1.2d
568
+ ; CHECK-NEXT: bif v1.16b, v2.16b, v3.16b
569
+ ; CHECK-NEXT: xtn v1.2s, v1.2d
570
+ ; CHECK-NEXT: uzp1 v0.4h, v0.4h, v1.4h
571
+ ; CHECK-NEXT: ret
572
+ entry:
573
+ %umin = call <2 x i64 > @llvm.umin.v2i64 (<2 x i64 > %y , <2 x i64 > <i64 65535 , i64 65535 >)
574
+ %trunc = trunc <2 x i64 > %umin to <2 x i16 >
575
+ %shuffle = shufflevector <2 x i16 > %x , <2 x i16 > %trunc , <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
576
+ ret <4 x i16 > %shuffle
577
+ }
578
+
579
+ ; i32 -> i8
580
+ define <8 x i8 > @sminsmax_range_unsigned_i64_to_i8 (<4 x i8 > %x , <4 x i32 > %y ) {
581
+ ; CHECK-LABEL: sminsmax_range_unsigned_i64_to_i8:
582
+ ; CHECK: // %bb.0: // %entry
583
+ ; CHECK-NEXT: movi v2.2d, #0000000000000000
584
+ ; CHECK-NEXT: smax v1.4s, v1.4s, v2.4s
585
+ ; CHECK-NEXT: movi v2.2d, #0x0000ff000000ff
586
+ ; CHECK-NEXT: smin v1.4s, v1.4s, v2.4s
587
+ ; CHECK-NEXT: xtn v1.4h, v1.4s
588
+ ; CHECK-NEXT: uzp1 v0.8b, v0.8b, v1.8b
589
+ ; CHECK-NEXT: ret
590
+ entry:
591
+ %smax = call <4 x i32 > @llvm.smax.v4i32 (<4 x i32 > %y , <4 x i32 > zeroinitializer )
592
+ %smin = call <4 x i32 > @llvm.smin.v4i32 (<4 x i32 > %smax , <4 x i32 > <i32 255 , i32 255 , i32 255 , i32 255 >)
593
+ %trunc = trunc <4 x i32 > %smin to <4 x i8 >
594
+ %shuffle = shufflevector <4 x i8 > %x , <4 x i8 > %trunc , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
595
+ ret <8 x i8 > %shuffle
596
+ }
597
+
598
+ define <8 x i8 > @sminsmax_range_signed_i32_to_i8 (<4 x i8 > %x , <4 x i32 > %y ) {
599
+ ; CHECK-LABEL: sminsmax_range_signed_i32_to_i8:
600
+ ; CHECK: // %bb.0: // %entry
601
+ ; CHECK-NEXT: mvni v2.4s, #127
602
+ ; CHECK-NEXT: smax v1.4s, v1.4s, v2.4s
603
+ ; CHECK-NEXT: movi v2.4s, #127
604
+ ; CHECK-NEXT: smin v1.4s, v1.4s, v2.4s
605
+ ; CHECK-NEXT: xtn v1.4h, v1.4s
606
+ ; CHECK-NEXT: uzp1 v0.8b, v0.8b, v1.8b
607
+ ; CHECK-NEXT: ret
608
+ entry:
609
+ %smax = call <4 x i32 > @llvm.smax.v4i32 (<4 x i32 > %y , <4 x i32 > <i32 -128 , i32 -128 , i32 -128 , i32 -128 >)
610
+ %smin = call <4 x i32 > @llvm.smin.v4i32 (<4 x i32 > %smax , <4 x i32 > <i32 127 , i32 127 , i32 127 , i32 127 >)
611
+ %trunc = trunc <4 x i32 > %smin to <4 x i8 >
612
+ %shuffle = shufflevector <4 x i8 > %x , <4 x i8 > %trunc , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
613
+ ret <8 x i8 > %shuffle
614
+ }
615
+
616
+ define <8 x i8 > @umin_range_unsigned_i32_to_i8 (<4 x i8 > %x , <4 x i32 > %y ) {
617
+ ; CHECK-LABEL: umin_range_unsigned_i32_to_i8:
618
+ ; CHECK: // %bb.0: // %entry
619
+ ; CHECK-NEXT: movi v2.2d, #0x0000ff000000ff
620
+ ; CHECK-NEXT: umin v1.4s, v1.4s, v2.4s
621
+ ; CHECK-NEXT: xtn v1.4h, v1.4s
622
+ ; CHECK-NEXT: uzp1 v0.8b, v0.8b, v1.8b
623
+ ; CHECK-NEXT: ret
624
+ entry:
625
+ %umin = call <4 x i32 > @llvm.umin.v4i32 (<4 x i32 > %y , <4 x i32 > <i32 255 , i32 255 , i32 255 , i32 255 >)
626
+ %trunc = trunc <4 x i32 > %umin to <4 x i8 >
627
+ %shuffle = shufflevector <4 x i8 > %x , <4 x i8 > %trunc , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
628
+ ret <8 x i8 > %shuffle
629
+ }
0 commit comments