Skip to content

Commit 7353da4

Browse files
committed
[AArch64] Add tests for saturated truncate
1 parent 7e67747 commit 7353da4

File tree

1 file changed

+169
-0
lines changed

1 file changed

+169
-0
lines changed

llvm/test/CodeGen/AArch64/qmovn.ll

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,117 @@ entry:
125125
ret <2 x i32> %t
126126
}
127127

128+
define <2 x i32> @vqmovni64_smaxmin_u(<2 x i64> %s0) {
129+
; CHECK-LABEL: vqmovni64_smaxmin_u:
130+
; CHECK: // %bb.0: // %entry
131+
; CHECK-NEXT: movi v1.2d, #0x000000ffffffff
132+
; CHECK-NEXT: cmgt v2.2d, v1.2d, v0.2d
133+
; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b
134+
; CHECK-NEXT: cmgt v1.2d, v0.2d, #0
135+
; CHECK-NEXT: and v0.16b, v0.16b, v1.16b
136+
; CHECK-NEXT: xtn v0.2s, v0.2d
137+
; CHECK-NEXT: ret
138+
entry:
139+
%c1 = icmp slt <2 x i64> %s0, <i64 4294967295, i64 4294967295>
140+
%s1 = select <2 x i1> %c1, <2 x i64> %s0, <2 x i64> <i64 4294967295, i64 4294967295>
141+
%c2 = icmp sgt <2 x i64> %s1, zeroinitializer
142+
%s2 = select <2 x i1> %c2, <2 x i64> %s1, <2 x i64> zeroinitializer
143+
%t = trunc <2 x i64> %s2 to <2 x i32>
144+
ret <2 x i32> %t
145+
}
146+
147+
define <2 x i32> @vqmovni64_sminmax_u(<2 x i64> %s0) {
148+
; CHECK-LABEL: vqmovni64_sminmax_u:
149+
; CHECK: // %bb.0: // %entry
150+
; CHECK-NEXT: cmgt v1.2d, v0.2d, #0
151+
; CHECK-NEXT: movi v2.2d, #0x000000ffffffff
152+
; CHECK-NEXT: and v0.16b, v0.16b, v1.16b
153+
; CHECK-NEXT: cmgt v1.2d, v2.2d, v0.2d
154+
; CHECK-NEXT: and v0.16b, v0.16b, v1.16b
155+
; CHECK-NEXT: orn v0.16b, v0.16b, v1.16b
156+
; CHECK-NEXT: xtn v0.2s, v0.2d
157+
; CHECK-NEXT: ret
158+
entry:
159+
%c1 = icmp sgt <2 x i64> %s0, zeroinitializer
160+
%s1 = select <2 x i1> %c1, <2 x i64> %s0, <2 x i64> zeroinitializer
161+
%c2 = icmp slt <2 x i64> %s1, <i64 4294967295, i64 4294967295>
162+
%s2 = select <2 x i1> %c2, <2 x i64> %s1, <2 x i64> <i64 4294967295, i64 4294967295>
163+
%t = trunc <2 x i64> %s2 to <2 x i32>
164+
ret <2 x i32> %t
165+
}
166+
167+
define <4 x i16> @vqmovni32_smaxmin_u(<4 x i32> %s0) {
168+
; CHECK-LABEL: vqmovni32_smaxmin_u:
169+
; CHECK: // %bb.0: // %entry
170+
; CHECK-NEXT: movi v1.2d, #0x00ffff0000ffff
171+
; CHECK-NEXT: smin v0.4s, v0.4s, v1.4s
172+
; CHECK-NEXT: movi v1.2d, #0000000000000000
173+
; CHECK-NEXT: smax v0.4s, v0.4s, v1.4s
174+
; CHECK-NEXT: xtn v0.4h, v0.4s
175+
; CHECK-NEXT: ret
176+
entry:
177+
%c1 = icmp slt <4 x i32> %s0, <i32 65535, i32 65535, i32 65535, i32 65535>
178+
%s1 = select <4 x i1> %c1, <4 x i32> %s0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
179+
%c2 = icmp sgt <4 x i32> %s1, zeroinitializer
180+
%s2 = select <4 x i1> %c2, <4 x i32> %s1, <4 x i32> zeroinitializer
181+
%t = trunc <4 x i32> %s2 to <4 x i16>
182+
ret <4 x i16> %t
183+
}
184+
185+
define <4 x i16> @vqmovni32_sminmax_u(<4 x i32> %s0) {
186+
; CHECK-LABEL: vqmovni32_sminmax_u:
187+
; CHECK: // %bb.0: // %entry
188+
; CHECK-NEXT: movi v1.2d, #0000000000000000
189+
; CHECK-NEXT: smax v0.4s, v0.4s, v1.4s
190+
; CHECK-NEXT: movi v1.2d, #0x00ffff0000ffff
191+
; CHECK-NEXT: smin v0.4s, v0.4s, v1.4s
192+
; CHECK-NEXT: xtn v0.4h, v0.4s
193+
; CHECK-NEXT: ret
194+
entry:
195+
%c1 = icmp sgt <4 x i32> %s0, zeroinitializer
196+
%s1 = select <4 x i1> %c1, <4 x i32> %s0, <4 x i32> zeroinitializer
197+
%c2 = icmp slt <4 x i32> %s1, <i32 65535, i32 65535, i32 65535, i32 65535>
198+
%s2 = select <4 x i1> %c2, <4 x i32> %s1, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
199+
%t = trunc <4 x i32> %s2 to <4 x i16>
200+
ret <4 x i16> %t
201+
}
202+
203+
define <8 x i8> @vqmovni16_smaxmin_u(<8 x i16> %s0) {
204+
; CHECK-LABEL: vqmovni16_smaxmin_u:
205+
; CHECK: // %bb.0: // %entry
206+
; CHECK-NEXT: movi v1.2d, #0xff00ff00ff00ff
207+
; CHECK-NEXT: movi v2.2d, #0000000000000000
208+
; CHECK-NEXT: smin v0.8h, v0.8h, v1.8h
209+
; CHECK-NEXT: smax v0.8h, v0.8h, v2.8h
210+
; CHECK-NEXT: xtn v0.8b, v0.8h
211+
; CHECK-NEXT: ret
212+
entry:
213+
%c1 = icmp slt <8 x i16> %s0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
214+
%s1 = select <8 x i1> %c1, <8 x i16> %s0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
215+
%c2 = icmp sgt <8 x i16> %s1, zeroinitializer
216+
%s2 = select <8 x i1> %c2, <8 x i16> %s1, <8 x i16> zeroinitializer
217+
%t = trunc <8 x i16> %s2 to <8 x i8>
218+
ret <8 x i8> %t
219+
}
220+
221+
define <8 x i8> @vqmovni16_sminmax_u(<8 x i16> %s0) {
222+
; CHECK-LABEL: vqmovni16_sminmax_u:
223+
; CHECK: // %bb.0: // %entry
224+
; CHECK-NEXT: movi v1.2d, #0000000000000000
225+
; CHECK-NEXT: movi v2.2d, #0xff00ff00ff00ff
226+
; CHECK-NEXT: smax v0.8h, v0.8h, v1.8h
227+
; CHECK-NEXT: smin v0.8h, v0.8h, v2.8h
228+
; CHECK-NEXT: xtn v0.8b, v0.8h
229+
; CHECK-NEXT: ret
230+
entry:
231+
%c1 = icmp sgt <8 x i16> %s0, zeroinitializer
232+
%s1 = select <8 x i1> %c1, <8 x i16> %s0, <8 x i16> zeroinitializer
233+
%c2 = icmp slt <8 x i16> %s1, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
234+
%s2 = select <8 x i1> %c2, <8 x i16> %s1, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
235+
%t = trunc <8 x i16> %s2 to <8 x i8>
236+
ret <8 x i8> %t
237+
}
238+
128239
define <2 x i32> @vqmovni64_umaxmin(<2 x i64> %s0) {
129240
; CHECK-LABEL: vqmovni64_umaxmin:
130241
; CHECK: // %bb.0: // %entry
@@ -347,3 +458,61 @@ entry:
347458
%shuffle = shufflevector <2 x i32> %x, <2 x i32> %trunc, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
348459
ret <4 x i32> %shuffle
349460
}
461+
462+
; Test the (concat_vectors (X), (trunc(smin(smax(Y, 0), 2^n))))) pattern.
463+
464+
define <16 x i8> @sminsmax_range_unsigned_i16_to_i8(<8 x i8> %x, <8 x i16> %y) {
465+
; CHECK-LABEL: sminsmax_range_unsigned_i16_to_i8:
466+
; CHECK: // %bb.0: // %entry
467+
; CHECK-NEXT: movi v2.2d, #0000000000000000
468+
; CHECK-NEXT: movi v3.2d, #0xff00ff00ff00ff
469+
; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
470+
; CHECK-NEXT: smax v1.8h, v1.8h, v2.8h
471+
; CHECK-NEXT: smin v1.8h, v1.8h, v3.8h
472+
; CHECK-NEXT: xtn2 v0.16b, v1.8h
473+
; CHECK-NEXT: ret
474+
entry:
475+
%min = call <8 x i16> @llvm.smax.v8i16(<8 x i16> %y, <8 x i16> zeroinitializer)
476+
%max = call <8 x i16> @llvm.smin.v8i16(<8 x i16> %min, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>)
477+
%trunc = trunc <8 x i16> %max to <8 x i8>
478+
%shuffle = shufflevector <8 x i8> %x, <8 x i8> %trunc, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
479+
ret <16 x i8> %shuffle
480+
}
481+
482+
define <8 x i16> @sminsmax_range_unsigned_i32_to_i16(<4 x i16> %x, <4 x i32> %y) {
483+
; CHECK-LABEL: sminsmax_range_unsigned_i32_to_i16:
484+
; CHECK: // %bb.0: // %entry
485+
; CHECK-NEXT: movi v2.2d, #0000000000000000
486+
; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
487+
; CHECK-NEXT: smax v1.4s, v1.4s, v2.4s
488+
; CHECK-NEXT: movi v2.2d, #0x00ffff0000ffff
489+
; CHECK-NEXT: smin v1.4s, v1.4s, v2.4s
490+
; CHECK-NEXT: xtn2 v0.8h, v1.4s
491+
; CHECK-NEXT: ret
492+
entry:
493+
%smax = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %y, <4 x i32> zeroinitializer)
494+
%smin = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %smax, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>)
495+
%trunc = trunc <4 x i32> %smin to <4 x i16>
496+
%shuffle = shufflevector <4 x i16> %x, <4 x i16> %trunc, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
497+
ret <8 x i16> %shuffle
498+
}
499+
500+
define <4 x i32> @sminsmax_range_unsigned_i64_to_i32(<2 x i32> %x, <2 x i64> %y) {
501+
; CHECK-LABEL: sminsmax_range_unsigned_i64_to_i32:
502+
; CHECK: // %bb.0: // %entry
503+
; CHECK-NEXT: cmgt v2.2d, v1.2d, #0
504+
; CHECK-NEXT: movi v3.2d, #0x000000ffffffff
505+
; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
506+
; CHECK-NEXT: and v1.16b, v1.16b, v2.16b
507+
; CHECK-NEXT: cmgt v2.2d, v3.2d, v1.2d
508+
; CHECK-NEXT: and v1.16b, v1.16b, v2.16b
509+
; CHECK-NEXT: orn v1.16b, v1.16b, v2.16b
510+
; CHECK-NEXT: xtn2 v0.4s, v1.2d
511+
; CHECK-NEXT: ret
512+
entry:
513+
%smax = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %y, <2 x i64> zeroinitializer)
514+
%smin = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %smax, <2 x i64> <i64 4294967295, i64 4294967295>)
515+
%trunc = trunc <2 x i64> %smin to <2 x i32>
516+
%shuffle = shufflevector <2 x i32> %x, <2 x i32> %trunc, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
517+
ret <4 x i32> %shuffle
518+
}

0 commit comments

Comments
 (0)