Skip to content

Commit c560557

Browse files
committed
[AArch64] Add fail tests with unsupported types in saturated truncate
1 parent 62e3c36 commit c560557

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed

llvm/test/CodeGen/AArch64/qmovn.ll

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,3 +516,114 @@ entry:
516516
%shuffle = shufflevector <2 x i32> %x, <2 x i32> %trunc, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
517517
ret <4 x i32> %shuffle
518518
}
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

Comments
 (0)