Skip to content

Commit 7e87c2a

Browse files
committed
[AArch64] Add some qshrn test cases. NFC
1 parent f9d3e98 commit 7e87c2a

File tree

1 file changed

+383
-0
lines changed

1 file changed

+383
-0
lines changed

llvm/test/CodeGen/AArch64/qshrn.ll

Lines changed: 383 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,383 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc %s -mtriple=aarch64 -o - | FileCheck %s
3+
4+
define <4 x i16> @NarrowAShrI32By5(<4 x i32> %x) {
5+
; CHECK-LABEL: NarrowAShrI32By5:
6+
; CHECK: // %bb.0:
7+
; CHECK-NEXT: sshr v0.4s, v0.4s, #5
8+
; CHECK-NEXT: sqxtn v0.4h, v0.4s
9+
; CHECK-NEXT: ret
10+
%s = ashr <4 x i32> %x, <i32 5, i32 5, i32 5, i32 5>
11+
%r = tail call <4 x i16> @llvm.aarch64.neon.sqxtn.v4i16(<4 x i32> %s)
12+
ret <4 x i16> %r
13+
}
14+
15+
define <4 x i16> @NarrowAShrU32By5(<4 x i32> %x) {
16+
; CHECK-LABEL: NarrowAShrU32By5:
17+
; CHECK: // %bb.0:
18+
; CHECK-NEXT: sshr v0.4s, v0.4s, #5
19+
; CHECK-NEXT: uqxtn v0.4h, v0.4s
20+
; CHECK-NEXT: ret
21+
%s = ashr <4 x i32> %x, <i32 5, i32 5, i32 5, i32 5>
22+
%r = tail call <4 x i16> @llvm.aarch64.neon.uqxtn.v4i16(<4 x i32> %s)
23+
ret <4 x i16> %r
24+
}
25+
26+
define <4 x i16> @NarrowAShrI32By5ToU16(<4 x i32> %x) {
27+
; CHECK-LABEL: NarrowAShrI32By5ToU16:
28+
; CHECK: // %bb.0:
29+
; CHECK-NEXT: sshr v0.4s, v0.4s, #5
30+
; CHECK-NEXT: sqxtun v0.4h, v0.4s
31+
; CHECK-NEXT: ret
32+
%s = ashr <4 x i32> %x, <i32 5, i32 5, i32 5, i32 5>
33+
%r = tail call <4 x i16> @llvm.aarch64.neon.sqxtun.v4i16(<4 x i32> %s)
34+
ret <4 x i16> %r
35+
}
36+
37+
define <4 x i16> @NarrowLShrI32By5(<4 x i32> %x) {
38+
; CHECK-LABEL: NarrowLShrI32By5:
39+
; CHECK: // %bb.0:
40+
; CHECK-NEXT: ushr v0.4s, v0.4s, #5
41+
; CHECK-NEXT: sqxtn v0.4h, v0.4s
42+
; CHECK-NEXT: ret
43+
%s = lshr <4 x i32> %x, <i32 5, i32 5, i32 5, i32 5>
44+
%r = tail call <4 x i16> @llvm.aarch64.neon.sqxtn.v4i16(<4 x i32> %s)
45+
ret <4 x i16> %r
46+
}
47+
48+
define <4 x i16> @NarrowLShrU32By5(<4 x i32> %x) {
49+
; CHECK-LABEL: NarrowLShrU32By5:
50+
; CHECK: // %bb.0:
51+
; CHECK-NEXT: ushr v0.4s, v0.4s, #5
52+
; CHECK-NEXT: uqxtn v0.4h, v0.4s
53+
; CHECK-NEXT: ret
54+
%s = lshr <4 x i32> %x, <i32 5, i32 5, i32 5, i32 5>
55+
%r = tail call <4 x i16> @llvm.aarch64.neon.uqxtn.v4i16(<4 x i32> %s)
56+
ret <4 x i16> %r
57+
}
58+
59+
define <4 x i16> @NarrowLShrI32By5ToU16(<4 x i32> %x) {
60+
; CHECK-LABEL: NarrowLShrI32By5ToU16:
61+
; CHECK: // %bb.0:
62+
; CHECK-NEXT: ushr v0.4s, v0.4s, #5
63+
; CHECK-NEXT: sqxtun v0.4h, v0.4s
64+
; CHECK-NEXT: ret
65+
%s = lshr <4 x i32> %x, <i32 5, i32 5, i32 5, i32 5>
66+
%r = tail call <4 x i16> @llvm.aarch64.neon.sqxtun.v4i16(<4 x i32> %s)
67+
ret <4 x i16> %r
68+
}
69+
70+
71+
define <2 x i32> @NarrowAShri64By5(<2 x i64> %x) {
72+
; CHECK-LABEL: NarrowAShri64By5:
73+
; CHECK: // %bb.0:
74+
; CHECK-NEXT: sshr v0.2d, v0.2d, #5
75+
; CHECK-NEXT: sqxtn v0.2s, v0.2d
76+
; CHECK-NEXT: ret
77+
%s = ashr <2 x i64> %x, <i64 5, i64 5>
78+
%r = tail call <2 x i32> @llvm.aarch64.neon.sqxtn.v2i32(<2 x i64> %s)
79+
ret <2 x i32> %r
80+
}
81+
82+
define <2 x i32> @NarrowAShrU64By5(<2 x i64> %x) {
83+
; CHECK-LABEL: NarrowAShrU64By5:
84+
; CHECK: // %bb.0:
85+
; CHECK-NEXT: sshr v0.2d, v0.2d, #5
86+
; CHECK-NEXT: uqxtn v0.2s, v0.2d
87+
; CHECK-NEXT: ret
88+
%s = ashr <2 x i64> %x, <i64 5, i64 5>
89+
%r = tail call <2 x i32> @llvm.aarch64.neon.uqxtn.v2i32(<2 x i64> %s)
90+
ret <2 x i32> %r
91+
}
92+
93+
define <2 x i32> @NarrowAShri64By5ToU32(<2 x i64> %x) {
94+
; CHECK-LABEL: NarrowAShri64By5ToU32:
95+
; CHECK: // %bb.0:
96+
; CHECK-NEXT: sshr v0.2d, v0.2d, #5
97+
; CHECK-NEXT: sqxtun v0.2s, v0.2d
98+
; CHECK-NEXT: ret
99+
%s = ashr <2 x i64> %x, <i64 5, i64 5>
100+
%r = tail call <2 x i32> @llvm.aarch64.neon.sqxtun.v2i32(<2 x i64> %s)
101+
ret <2 x i32> %r
102+
}
103+
104+
define <2 x i32> @NarrowLShri64By5(<2 x i64> %x) {
105+
; CHECK-LABEL: NarrowLShri64By5:
106+
; CHECK: // %bb.0:
107+
; CHECK-NEXT: ushr v0.2d, v0.2d, #5
108+
; CHECK-NEXT: sqxtn v0.2s, v0.2d
109+
; CHECK-NEXT: ret
110+
%s = lshr <2 x i64> %x, <i64 5, i64 5>
111+
%r = tail call <2 x i32> @llvm.aarch64.neon.sqxtn.v2i32(<2 x i64> %s)
112+
ret <2 x i32> %r
113+
}
114+
115+
define <2 x i32> @NarrowLShrU64By5(<2 x i64> %x) {
116+
; CHECK-LABEL: NarrowLShrU64By5:
117+
; CHECK: // %bb.0:
118+
; CHECK-NEXT: ushr v0.2d, v0.2d, #5
119+
; CHECK-NEXT: uqxtn v0.2s, v0.2d
120+
; CHECK-NEXT: ret
121+
%s = lshr <2 x i64> %x, <i64 5, i64 5>
122+
%r = tail call <2 x i32> @llvm.aarch64.neon.uqxtn.v2i32(<2 x i64> %s)
123+
ret <2 x i32> %r
124+
}
125+
126+
define <2 x i32> @NarrowLShri64By5ToU32(<2 x i64> %x) {
127+
; CHECK-LABEL: NarrowLShri64By5ToU32:
128+
; CHECK: // %bb.0:
129+
; CHECK-NEXT: ushr v0.2d, v0.2d, #5
130+
; CHECK-NEXT: sqxtun v0.2s, v0.2d
131+
; CHECK-NEXT: ret
132+
%s = lshr <2 x i64> %x, <i64 5, i64 5>
133+
%r = tail call <2 x i32> @llvm.aarch64.neon.sqxtun.v2i32(<2 x i64> %s)
134+
ret <2 x i32> %r
135+
}
136+
137+
138+
define <8 x i8> @NarrowAShri16By5(<8 x i16> %x) {
139+
; CHECK-LABEL: NarrowAShri16By5:
140+
; CHECK: // %bb.0:
141+
; CHECK-NEXT: sshr v0.8h, v0.8h, #5
142+
; CHECK-NEXT: sqxtn v0.8b, v0.8h
143+
; CHECK-NEXT: ret
144+
%s = ashr <8 x i16> %x, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
145+
%r = tail call <8 x i8> @llvm.aarch64.neon.sqxtn.v8i8(<8 x i16> %s)
146+
ret <8 x i8> %r
147+
}
148+
149+
define <8 x i8> @NarrowAShrU16By5(<8 x i16> %x) {
150+
; CHECK-LABEL: NarrowAShrU16By5:
151+
; CHECK: // %bb.0:
152+
; CHECK-NEXT: sshr v0.8h, v0.8h, #5
153+
; CHECK-NEXT: uqxtn v0.8b, v0.8h
154+
; CHECK-NEXT: ret
155+
%s = ashr <8 x i16> %x, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
156+
%r = tail call <8 x i8> @llvm.aarch64.neon.uqxtn.v8i8(<8 x i16> %s)
157+
ret <8 x i8> %r
158+
}
159+
160+
define <8 x i8> @NarrowAShri16By5ToU8(<8 x i16> %x) {
161+
; CHECK-LABEL: NarrowAShri16By5ToU8:
162+
; CHECK: // %bb.0:
163+
; CHECK-NEXT: sshr v0.8h, v0.8h, #5
164+
; CHECK-NEXT: sqxtun v0.8b, v0.8h
165+
; CHECK-NEXT: ret
166+
%s = ashr <8 x i16> %x, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
167+
%r = tail call <8 x i8> @llvm.aarch64.neon.sqxtun.v8i8(<8 x i16> %s)
168+
ret <8 x i8> %r
169+
}
170+
171+
define <8 x i8> @NarrowLShri16By5(<8 x i16> %x) {
172+
; CHECK-LABEL: NarrowLShri16By5:
173+
; CHECK: // %bb.0:
174+
; CHECK-NEXT: ushr v0.8h, v0.8h, #5
175+
; CHECK-NEXT: sqxtn v0.8b, v0.8h
176+
; CHECK-NEXT: ret
177+
%s = lshr <8 x i16> %x, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
178+
%r = tail call <8 x i8> @llvm.aarch64.neon.sqxtn.v8i8(<8 x i16> %s)
179+
ret <8 x i8> %r
180+
}
181+
182+
define <8 x i8> @NarrowLShrU16By5(<8 x i16> %x) {
183+
; CHECK-LABEL: NarrowLShrU16By5:
184+
; CHECK: // %bb.0:
185+
; CHECK-NEXT: ushr v0.8h, v0.8h, #5
186+
; CHECK-NEXT: uqxtn v0.8b, v0.8h
187+
; CHECK-NEXT: ret
188+
%s = lshr <8 x i16> %x, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
189+
%r = tail call <8 x i8> @llvm.aarch64.neon.uqxtn.v8i8(<8 x i16> %s)
190+
ret <8 x i8> %r
191+
}
192+
193+
define <8 x i8> @NarrowLShri16By5ToU8(<8 x i16> %x) {
194+
; CHECK-LABEL: NarrowLShri16By5ToU8:
195+
; CHECK: // %bb.0:
196+
; CHECK-NEXT: ushr v0.8h, v0.8h, #5
197+
; CHECK-NEXT: sqxtun v0.8b, v0.8h
198+
; CHECK-NEXT: ret
199+
%s = lshr <8 x i16> %x, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
200+
%r = tail call <8 x i8> @llvm.aarch64.neon.sqxtun.v8i8(<8 x i16> %s)
201+
ret <8 x i8> %r
202+
}
203+
204+
205+
206+
207+
208+
define <4 x i16> @NarrowAShrI32By31(<4 x i32> %x) {
209+
; CHECK-LABEL: NarrowAShrI32By31:
210+
; CHECK: // %bb.0:
211+
; CHECK-NEXT: sshr v0.4s, v0.4s, #16
212+
; CHECK-NEXT: sqxtn v0.4h, v0.4s
213+
; CHECK-NEXT: ret
214+
%s = ashr <4 x i32> %x, <i32 16, i32 16, i32 16, i32 16>
215+
%r = tail call <4 x i16> @llvm.aarch64.neon.sqxtn.v4i16(<4 x i32> %s)
216+
ret <4 x i16> %r
217+
}
218+
219+
define <4 x i16> @NarrowAShrI32By31ToU16(<4 x i32> %x) {
220+
; CHECK-LABEL: NarrowAShrI32By31ToU16:
221+
; CHECK: // %bb.0:
222+
; CHECK-NEXT: sshr v0.4s, v0.4s, #16
223+
; CHECK-NEXT: sqxtun v0.4h, v0.4s
224+
; CHECK-NEXT: ret
225+
%s = ashr <4 x i32> %x, <i32 16, i32 16, i32 16, i32 16>
226+
%r = tail call <4 x i16> @llvm.aarch64.neon.sqxtun.v4i16(<4 x i32> %s)
227+
ret <4 x i16> %r
228+
}
229+
230+
define <4 x i16> @NarrowLShrU32By31(<4 x i32> %x) {
231+
; CHECK-LABEL: NarrowLShrU32By31:
232+
; CHECK: // %bb.0:
233+
; CHECK-NEXT: ushr v0.4s, v0.4s, #16
234+
; CHECK-NEXT: uqxtn v0.4h, v0.4s
235+
; CHECK-NEXT: ret
236+
%s = lshr <4 x i32> %x, <i32 16, i32 16, i32 16, i32 16>
237+
%r = tail call <4 x i16> @llvm.aarch64.neon.uqxtn.v4i16(<4 x i32> %s)
238+
ret <4 x i16> %r
239+
}
240+
241+
242+
define <16 x i8> @signed_minmax_v8i16_to_v16i8(<16 x i16> %x) {
243+
; CHECK-LABEL: signed_minmax_v8i16_to_v16i8:
244+
; CHECK: // %bb.0: // %entry
245+
; CHECK-NEXT: sshr v0.8h, v0.8h, #5
246+
; CHECK-NEXT: sshr v1.8h, v1.8h, #5
247+
; CHECK-NEXT: sqxtn v0.8b, v0.8h
248+
; CHECK-NEXT: sqxtn2 v0.16b, v1.8h
249+
; CHECK-NEXT: ret
250+
entry:
251+
%s = ashr <16 x i16> %x, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
252+
%min = call <16 x i16> @llvm.smin.v8i16(<16 x i16> %s, <16 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>)
253+
%max = call <16 x i16> @llvm.smax.v8i16(<16 x i16> %min, <16 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>)
254+
%trunc = trunc <16 x i16> %max to <16 x i8>
255+
ret <16 x i8> %trunc
256+
}
257+
258+
define <16 x i8> @unsigned_minmax_v8i16_to_v16i8(<16 x i16> %x) {
259+
; CHECK-LABEL: unsigned_minmax_v8i16_to_v16i8:
260+
; CHECK: // %bb.0: // %entry
261+
; CHECK-NEXT: ushr v0.8h, v0.8h, #5
262+
; CHECK-NEXT: ushr v1.8h, v1.8h, #5
263+
; CHECK-NEXT: uqxtn v0.8b, v0.8h
264+
; CHECK-NEXT: uqxtn2 v0.16b, v1.8h
265+
; CHECK-NEXT: ret
266+
entry:
267+
%s = lshr <16 x i16> %x, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
268+
%min = call <16 x i16> @llvm.umin.v8i16(<16 x i16> %s, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>)
269+
%trunc = trunc <16 x i16> %min to <16 x i8>
270+
ret <16 x i8> %trunc
271+
}
272+
273+
define <16 x i8> @unsigned_signed_minmax_v8i16_to_v16i8(<16 x i16> %x) {
274+
; CHECK-LABEL: unsigned_signed_minmax_v8i16_to_v16i8:
275+
; CHECK: // %bb.0: // %entry
276+
; CHECK-NEXT: sshr v0.8h, v0.8h, #5
277+
; CHECK-NEXT: sshr v1.8h, v1.8h, #5
278+
; CHECK-NEXT: sqxtun v0.8b, v0.8h
279+
; CHECK-NEXT: sqxtun2 v0.16b, v1.8h
280+
; CHECK-NEXT: ret
281+
entry:
282+
%s = ashr <16 x i16> %x, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
283+
%max = call <16 x i16> @llvm.smax.v8i16(<16 x i16> %s, <16 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>)
284+
%min = call <16 x i16> @llvm.umin.v8i16(<16 x i16> %max, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>)
285+
%trunc = trunc <16 x i16> %min to <16 x i8>
286+
ret <16 x i8> %trunc
287+
}
288+
289+
290+
define <8 x i16> @signed_minmax_v4i32_to_v8i16(<8 x i32> %x) {
291+
; CHECK-LABEL: signed_minmax_v4i32_to_v8i16:
292+
; CHECK: // %bb.0: // %entry
293+
; CHECK-NEXT: sshr v0.4s, v0.4s, #5
294+
; CHECK-NEXT: sshr v1.4s, v1.4s, #5
295+
; CHECK-NEXT: sqxtn v0.4h, v0.4s
296+
; CHECK-NEXT: sqxtn2 v0.8h, v1.4s
297+
; CHECK-NEXT: ret
298+
entry:
299+
%s = ashr <8 x i32> %x, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
300+
%min = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %s, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>)
301+
%max = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %min, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>)
302+
%trunc = trunc <8 x i32> %max to <8 x i16>
303+
ret <8 x i16> %trunc
304+
}
305+
306+
define <8 x i16> @unsigned_minmax_v4i32_to_v8i16(<8 x i32> %x) {
307+
; CHECK-LABEL: unsigned_minmax_v4i32_to_v8i16:
308+
; CHECK: // %bb.0: // %entry
309+
; CHECK-NEXT: ushr v0.4s, v0.4s, #5
310+
; CHECK-NEXT: ushr v1.4s, v1.4s, #5
311+
; CHECK-NEXT: uqxtn v0.4h, v0.4s
312+
; CHECK-NEXT: uqxtn2 v0.8h, v1.4s
313+
; CHECK-NEXT: ret
314+
entry:
315+
%s = lshr <8 x i32> %x, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
316+
%min = call <8 x i32> @llvm.umin.v8i32(<8 x i32> %s, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>)
317+
%trunc = trunc <8 x i32> %min to <8 x i16>
318+
ret <8 x i16> %trunc
319+
}
320+
321+
define <8 x i16> @unsigned_signed_minmax_v4i32_to_v8i16(<8 x i32> %x) {
322+
; CHECK-LABEL: unsigned_signed_minmax_v4i32_to_v8i16:
323+
; CHECK: // %bb.0: // %entry
324+
; CHECK-NEXT: sshr v0.4s, v0.4s, #5
325+
; CHECK-NEXT: sshr v1.4s, v1.4s, #5
326+
; CHECK-NEXT: sqxtun v0.4h, v0.4s
327+
; CHECK-NEXT: sqxtun2 v0.8h, v1.4s
328+
; CHECK-NEXT: ret
329+
entry:
330+
%s = ashr <8 x i32> %x, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
331+
%max = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %s, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>)
332+
%min = call <8 x i32> @llvm.umin.v8i32(<8 x i32> %max, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>)
333+
%trunc = trunc <8 x i32> %min to <8 x i16>
334+
ret <8 x i16> %trunc
335+
}
336+
337+
338+
define <4 x i32> @signed_minmax_v4i64_to_v8i32(<4 x i64> %x) {
339+
; CHECK-LABEL: signed_minmax_v4i64_to_v8i32:
340+
; CHECK: // %bb.0: // %entry
341+
; CHECK-NEXT: sshr v0.2d, v0.2d, #5
342+
; CHECK-NEXT: sshr v1.2d, v1.2d, #5
343+
; CHECK-NEXT: sqxtn v0.2s, v0.2d
344+
; CHECK-NEXT: sqxtn2 v0.4s, v1.2d
345+
; CHECK-NEXT: ret
346+
entry:
347+
%s = ashr <4 x i64> %x, <i64 5, i64 5, i64 5, i64 5>
348+
%min = call <4 x i64> @llvm.smin.v8i64(<4 x i64> %s, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>)
349+
%max = call <4 x i64> @llvm.smax.v8i64(<4 x i64> %min, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>)
350+
%trunc = trunc <4 x i64> %max to <4 x i32>
351+
ret <4 x i32> %trunc
352+
}
353+
354+
define <4 x i32> @unsigned_minmax_v4i64_to_v8i32(<4 x i64> %x) {
355+
; CHECK-LABEL: unsigned_minmax_v4i64_to_v8i32:
356+
; CHECK: // %bb.0: // %entry
357+
; CHECK-NEXT: ushr v0.2d, v0.2d, #5
358+
; CHECK-NEXT: ushr v1.2d, v1.2d, #5
359+
; CHECK-NEXT: uqxtn v0.2s, v0.2d
360+
; CHECK-NEXT: uqxtn2 v0.4s, v1.2d
361+
; CHECK-NEXT: ret
362+
entry:
363+
%s = lshr <4 x i64> %x, <i64 5, i64 5, i64 5, i64 5>
364+
%min = call <4 x i64> @llvm.umin.v8i64(<4 x i64> %s, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)
365+
%trunc = trunc <4 x i64> %min to <4 x i32>
366+
ret <4 x i32> %trunc
367+
}
368+
369+
define <4 x i32> @unsigned_signed_minmax_v4i64_to_v8i32(<4 x i64> %x) {
370+
; CHECK-LABEL: unsigned_signed_minmax_v4i64_to_v8i32:
371+
; CHECK: // %bb.0: // %entry
372+
; CHECK-NEXT: sshr v0.2d, v0.2d, #5
373+
; CHECK-NEXT: sshr v1.2d, v1.2d, #5
374+
; CHECK-NEXT: sqxtun v0.2s, v0.2d
375+
; CHECK-NEXT: sqxtun2 v0.4s, v1.2d
376+
; CHECK-NEXT: ret
377+
entry:
378+
%s = ashr <4 x i64> %x, <i64 5, i64 5, i64 5, i64 5>
379+
%max = call <4 x i64> @llvm.smax.v8i64(<4 x i64> %s, <4 x i64> <i64 0, i64 0, i64 0, i64 0>)
380+
%min = call <4 x i64> @llvm.umin.v8i64(<4 x i64> %max, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)
381+
%trunc = trunc <4 x i64> %min to <4 x i32>
382+
ret <4 x i32> %trunc
383+
}

0 commit comments

Comments
 (0)