Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / Hexagon / autohvx / fp-to-int.ll
blob66db73f5c69f636415785065958189bb1578a30f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -march=hexagon -hexagon-hvx-widen=32 < %s | FileCheck %s
4 target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"
5 target triple = "hexagon"
7 ; f16 -> s8
8 ; No widening
9 define void @f16s8_0(ptr %a0, ptr %a1) #0 {
10 ; CHECK-LABEL: f16s8_0:
11 ; CHECK:         .cfi_startproc
12 ; CHECK-NEXT:  // %bb.0:
13 ; CHECK-NEXT:    {
14 ; CHECK-NEXT:     r3:2 = combine(##32768,#1)
15 ; CHECK-NEXT:     r4 = #14
16 ; CHECK-NEXT:     v1 = vmem(r0+#0)
17 ; CHECK-NEXT:    }
18 ; CHECK-NEXT:    {
19 ; CHECK-NEXT:     v2.h = vsplat(r3)
20 ; CHECK-NEXT:     r6 = #5
21 ; CHECK-NEXT:     v3.h = vasl(v0.h,r2)
22 ; CHECK-NEXT:     v0.cur = vmem(r0+#1)
23 ; CHECK-NEXT:    }
24 ; CHECK-NEXT:    {
25 ; CHECK-NEXT:     v4.h = vsplat(r4)
26 ; CHECK-NEXT:     v8.h = vasl(v1.h,r2)
27 ; CHECK-NEXT:     v3.h = vsub(v3.h,v2.h)
28 ; CHECK-NEXT:    }
29 ; CHECK-NEXT:    {
30 ; CHECK-NEXT:     r5:4 = combine(#11,##32767)
31 ; CHECK-NEXT:     v7 = vxor(v7,v7)
32 ; CHECK-NEXT:     v8.h = vsub(v8.h,v2.h)
33 ; CHECK-NEXT:    }
34 ; CHECK-NEXT:    {
35 ; CHECK-NEXT:     r3 = #16
36 ; CHECK-NEXT:     v5.h = vasl(v1.h,r6)
37 ; CHECK-NEXT:     q1 = vcmp.gt(v7.h,v0.h)
38 ; CHECK-NEXT:    }
39 ; CHECK-NEXT:    {
40 ; CHECK-NEXT:     v6.h = vsplat(r3)
41 ; CHECK-NEXT:     v27.h = vasr(v3.h,r5)
42 ; CHECK-NEXT:     v5 = vor(v5,v2)
43 ; CHECK-NEXT:     q0 = vcmp.gt(v7.h,v1.h)
44 ; CHECK-NEXT:    }
45 ; CHECK-NEXT:    {
46 ; CHECK-NEXT:     v9.h = vsplat(r4)
47 ; CHECK-NEXT:     v8.h = vasr(v8.h,r5)
48 ; CHECK-NEXT:    }
49 ; CHECK-NEXT:    {
50 ; CHECK-NEXT:     v26.h = vasl(v0.h,r6)
51 ; CHECK-NEXT:     v0.h = vsub(v4.h,v27.h)
52 ; CHECK-NEXT:     v4.h = vsub(v4.h,v8.h)
53 ; CHECK-NEXT:     v28 = vmux(q0,v2,v9)
54 ; CHECK-NEXT:    }
55 ; CHECK-NEXT:    {
56 ; CHECK-NEXT:     v4.h = vmin(v4.h,v6.h)
57 ; CHECK-NEXT:     v1 = vor(v26,v2)
58 ; CHECK-NEXT:     v0.h = vmin(v0.h,v6.h)
59 ; CHECK-NEXT:     v2 = vmux(q1,v2,v9)
60 ; CHECK-NEXT:    }
61 ; CHECK-NEXT:    {
62 ; CHECK-NEXT:     q2 = vcmp.gt(v4.h,v7.h)
63 ; CHECK-NEXT:     q3 = vcmp.gt(v0.h,v7.h)
64 ; CHECK-NEXT:    }
65 ; CHECK-NEXT:    {
66 ; CHECK-NEXT:     v5.h = vlsr(v5.h,v4.h)
67 ; CHECK-NEXT:    }
68 ; CHECK-NEXT:    {
69 ; CHECK-NEXT:     v1.h = vlsr(v1.h,v0.h)
70 ; CHECK-NEXT:     v29.h = vsub(v7.h,v5.h)
71 ; CHECK-NEXT:    }
72 ; CHECK-NEXT:    {
73 ; CHECK-NEXT:     v30.h = vsub(v7.h,v1.h)
74 ; CHECK-NEXT:     v5 = vmux(q0,v29,v5)
75 ; CHECK-NEXT:    }
76 ; CHECK-NEXT:    {
77 ; CHECK-NEXT:     v1 = vmux(q1,v30,v1)
78 ; CHECK-NEXT:     v31 = vmux(q2,v5,v28)
79 ; CHECK-NEXT:    }
80 ; CHECK-NEXT:    {
81 ; CHECK-NEXT:     v1 = vmux(q3,v1,v2)
82 ; CHECK-NEXT:    }
83 ; CHECK-NEXT:    {
84 ; CHECK-NEXT:     v0.b = vpack(v1.h,v31.h):sat
85 ; CHECK-NEXT:     jumpr r31
86 ; CHECK-NEXT:     vmem(r1+#0) = v0.new
87 ; CHECK-NEXT:    }
88   %v0 = load <128 x half>, ptr %a0, align 128
89   %v1 = fptosi <128 x half> %v0 to <128 x i8>
90   store <128 x i8> %v1, ptr %a1, align 128
91   ret void
94 ; Widen result
95 define void @f16s8_1(ptr %a0, ptr %a1) #0 {
96 ; CHECK-LABEL: f16s8_1:
97 ; CHECK:         .cfi_startproc
98 ; CHECK-NEXT:  // %bb.0:
99 ; CHECK-NEXT:    {
100 ; CHECK-NEXT:     r7 = ##32768
101 ; CHECK-NEXT:     r3:2 = combine(#5,#1)
102 ; CHECK-NEXT:     v0 = vmem(r0+#0)
103 ; CHECK-NEXT:    }
104 ; CHECK-NEXT:    {
105 ; CHECK-NEXT:     v2.h = vsplat(r7)
106 ; CHECK-NEXT:     v3.h = vasl(v0.h,r2)
107 ; CHECK-NEXT:     r6 = #14
108 ; CHECK-NEXT:     r5 = #11
109 ; CHECK-NEXT:    }
110 ; CHECK-NEXT:    {
111 ; CHECK-NEXT:     v4.h = vsplat(r6)
112 ; CHECK-NEXT:     r4 = #16
113 ; CHECK-NEXT:     v6.h = vasl(v0.h,r3)
114 ; CHECK-NEXT:     v3.h = vsub(v3.h,v2.h)
115 ; CHECK-NEXT:    }
116 ; CHECK-NEXT:    {
117 ; CHECK-NEXT:     v5.h = vsplat(r4)
118 ; CHECK-NEXT:     r3 = #32767
119 ; CHECK-NEXT:     v29 = vor(v6,v2)
120 ; CHECK-NEXT:     v1 = vxor(v1,v1)
121 ; CHECK-NEXT:    }
122 ; CHECK-NEXT:    {
123 ; CHECK-NEXT:     v30.h = vsplat(r3)
124 ; CHECK-NEXT:     r2 = #64
125 ; CHECK-NEXT:     v3.h = vasr(v3.h,r5)
126 ; CHECK-NEXT:     q0 = vcmp.gt(v1.h,v0.h)
127 ; CHECK-NEXT:    }
128 ; CHECK-NEXT:    {
129 ; CHECK-NEXT:     q3 = vsetq(r2)
130 ; CHECK-NEXT:     v3.h = vsub(v4.h,v3.h)
131 ; CHECK-NEXT:     v2 = vmux(q0,v2,v30)
132 ; CHECK-NEXT:    }
133 ; CHECK-NEXT:    {
134 ; CHECK-NEXT:     v3.h = vmin(v3.h,v5.h)
135 ; CHECK-NEXT:    }
136 ; CHECK-NEXT:    {
137 ; CHECK-NEXT:     q2 = vcmp.gt(v3.h,v1.h)
138 ; CHECK-NEXT:    }
139 ; CHECK-NEXT:    {
140 ; CHECK-NEXT:     v4.h = vlsr(v29.h,v3.h)
141 ; CHECK-NEXT:    }
142 ; CHECK-NEXT:    {
143 ; CHECK-NEXT:     v31.h = vsub(v1.h,v4.h)
144 ; CHECK-NEXT:    }
145 ; CHECK-NEXT:    {
146 ; CHECK-NEXT:     v0 = vmux(q0,v31,v4)
147 ; CHECK-NEXT:    }
148 ; CHECK-NEXT:    {
149 ; CHECK-NEXT:     v0 = vmux(q2,v0,v2)
150 ; CHECK-NEXT:    }
151 ; CHECK-NEXT:    {
152 ; CHECK-NEXT:     v0.b = vpack(v0.h,v0.h):sat
153 ; CHECK-NEXT:    }
154 ; CHECK-NEXT:    {
155 ; CHECK-NEXT:     jumpr r31
156 ; CHECK-NEXT:     if (q3) vmem(r1+#0) = v0
157 ; CHECK-NEXT:    }
158   %v0 = load <64 x half>, ptr %a0, align 128
159   %v1 = fptosi <64 x half> %v0 to <64 x i8>
160   store <64 x i8> %v1, ptr %a1, align 128
161   ret void
164 ; f16 -> s16
165 ; No widening
166 define void @f16s16_0(ptr %a0, ptr %a1) #0 {
167 ; CHECK-LABEL: f16s16_0:
168 ; CHECK:         .cfi_startproc
169 ; CHECK-NEXT:  // %bb.0:
170 ; CHECK-NEXT:    {
171 ; CHECK-NEXT:     r7 = ##32768
172 ; CHECK-NEXT:     r3:2 = combine(#5,#1)
173 ; CHECK-NEXT:     v0 = vmem(r0+#0)
174 ; CHECK-NEXT:    }
175 ; CHECK-NEXT:    {
176 ; CHECK-NEXT:     v2.h = vsplat(r7)
177 ; CHECK-NEXT:     v3.h = vasl(v0.h,r2)
178 ; CHECK-NEXT:     r6 = #14
179 ; CHECK-NEXT:     r5 = #11
180 ; CHECK-NEXT:    }
181 ; CHECK-NEXT:    {
182 ; CHECK-NEXT:     v4.h = vsplat(r6)
183 ; CHECK-NEXT:     r4 = #16
184 ; CHECK-NEXT:     v6.h = vasl(v0.h,r3)
185 ; CHECK-NEXT:     v3.h = vsub(v3.h,v2.h)
186 ; CHECK-NEXT:    }
187 ; CHECK-NEXT:    {
188 ; CHECK-NEXT:     v5.h = vsplat(r4)
189 ; CHECK-NEXT:     r2 = #32767
190 ; CHECK-NEXT:     v29 = vor(v6,v2)
191 ; CHECK-NEXT:     v1 = vxor(v1,v1)
192 ; CHECK-NEXT:    }
193 ; CHECK-NEXT:    {
194 ; CHECK-NEXT:     v30.h = vsplat(r2)
195 ; CHECK-NEXT:     v3.h = vasr(v3.h,r5)
196 ; CHECK-NEXT:     q0 = vcmp.gt(v1.h,v0.h)
197 ; CHECK-NEXT:    }
198 ; CHECK-NEXT:    {
199 ; CHECK-NEXT:     v3.h = vsub(v4.h,v3.h)
200 ; CHECK-NEXT:     v2 = vmux(q0,v2,v30)
201 ; CHECK-NEXT:    }
202 ; CHECK-NEXT:    {
203 ; CHECK-NEXT:     v3.h = vmin(v3.h,v5.h)
204 ; CHECK-NEXT:    }
205 ; CHECK-NEXT:    {
206 ; CHECK-NEXT:     q3 = vcmp.gt(v3.h,v1.h)
207 ; CHECK-NEXT:    }
208 ; CHECK-NEXT:    {
209 ; CHECK-NEXT:     v4.h = vlsr(v29.h,v3.h)
210 ; CHECK-NEXT:    }
211 ; CHECK-NEXT:    {
212 ; CHECK-NEXT:     v31.h = vsub(v1.h,v4.h)
213 ; CHECK-NEXT:    }
214 ; CHECK-NEXT:    {
215 ; CHECK-NEXT:     v0 = vmux(q0,v31,v4)
216 ; CHECK-NEXT:    }
217 ; CHECK-NEXT:    {
218 ; CHECK-NEXT:     v0 = vmux(q3,v0,v2)
219 ; CHECK-NEXT:     jumpr r31
220 ; CHECK-NEXT:     vmem(r1+#0) = v0.new
221 ; CHECK-NEXT:    }
222   %v0 = load <64 x half>, ptr %a0, align 128
223   %v1 = fptosi <64 x half> %v0 to <64 x i16>
224   store <64 x i16> %v1, ptr %a1, align 128
225   ret void
228 ; Widen input and result
229 define void @f16s16_1(ptr %a0, ptr %a1) #0 {
230 ; CHECK-LABEL: f16s16_1:
231 ; CHECK:         .cfi_startproc
232 ; CHECK-NEXT:  // %bb.0:
233 ; CHECK-NEXT:    {
234 ; CHECK-NEXT:     r7 = ##32768
235 ; CHECK-NEXT:     r3:2 = combine(#5,#1)
236 ; CHECK-NEXT:     v0 = vmem(r0+#0)
237 ; CHECK-NEXT:    }
238 ; CHECK-NEXT:    {
239 ; CHECK-NEXT:     v2.h = vsplat(r7)
240 ; CHECK-NEXT:     v3.h = vasl(v0.h,r2)
241 ; CHECK-NEXT:     r6 = #14
242 ; CHECK-NEXT:     r5 = #11
243 ; CHECK-NEXT:    }
244 ; CHECK-NEXT:    {
245 ; CHECK-NEXT:     v4.h = vsplat(r6)
246 ; CHECK-NEXT:     r4 = #16
247 ; CHECK-NEXT:     v6.h = vasl(v0.h,r3)
248 ; CHECK-NEXT:     v3.h = vsub(v3.h,v2.h)
249 ; CHECK-NEXT:    }
250 ; CHECK-NEXT:    {
251 ; CHECK-NEXT:     v5.h = vsplat(r4)
252 ; CHECK-NEXT:     r3 = #32767
253 ; CHECK-NEXT:     v29 = vor(v6,v2)
254 ; CHECK-NEXT:     v1 = vxor(v1,v1)
255 ; CHECK-NEXT:    }
256 ; CHECK-NEXT:    {
257 ; CHECK-NEXT:     v30.h = vsplat(r3)
258 ; CHECK-NEXT:     r2 = #64
259 ; CHECK-NEXT:     v3.h = vasr(v3.h,r5)
260 ; CHECK-NEXT:     q0 = vcmp.gt(v1.h,v0.h)
261 ; CHECK-NEXT:    }
262 ; CHECK-NEXT:    {
263 ; CHECK-NEXT:     q3 = vsetq(r2)
264 ; CHECK-NEXT:     v3.h = vsub(v4.h,v3.h)
265 ; CHECK-NEXT:     v2 = vmux(q0,v2,v30)
266 ; CHECK-NEXT:    }
267 ; CHECK-NEXT:    {
268 ; CHECK-NEXT:     v3.h = vmin(v3.h,v5.h)
269 ; CHECK-NEXT:    }
270 ; CHECK-NEXT:    {
271 ; CHECK-NEXT:     q1 = vcmp.gt(v3.h,v1.h)
272 ; CHECK-NEXT:    }
273 ; CHECK-NEXT:    {
274 ; CHECK-NEXT:     v4.h = vlsr(v29.h,v3.h)
275 ; CHECK-NEXT:    }
276 ; CHECK-NEXT:    {
277 ; CHECK-NEXT:     v31.h = vsub(v1.h,v4.h)
278 ; CHECK-NEXT:    }
279 ; CHECK-NEXT:    {
280 ; CHECK-NEXT:     v0 = vmux(q0,v31,v4)
281 ; CHECK-NEXT:    }
282 ; CHECK-NEXT:    {
283 ; CHECK-NEXT:     v0 = vmux(q1,v0,v2)
284 ; CHECK-NEXT:    }
285 ; CHECK-NEXT:    {
286 ; CHECK-NEXT:     jumpr r31
287 ; CHECK-NEXT:     if (q3) vmem(r1+#0) = v0
288 ; CHECK-NEXT:    }
289   %v0 = load <32 x half>, ptr %a0, align 128
290   %v1 = fptosi <32 x half> %v0 to <32 x i16>
291   store <32 x i16> %v1, ptr %a1, align 128
292   ret void
295 ; f16 -> s32
296 ; No widening
297 define void @f16s32_0(ptr %a0, ptr %a1) #0 {
298 ; CHECK-LABEL: f16s32_0:
299 ; CHECK:         .cfi_startproc
300 ; CHECK-NEXT:  // %bb.0:
301 ; CHECK-NEXT:    {
302 ; CHECK-NEXT:     r2 = #15360
303 ; CHECK-NEXT:     r7 = #-4
304 ; CHECK-NEXT:     r6 = #1
305 ; CHECK-NEXT:     v1 = vmem(r0+#0)
306 ; CHECK-NEXT:    }
307 ; CHECK-NEXT:    {
308 ; CHECK-NEXT:     v0.h = vsplat(r2)
309 ; CHECK-NEXT:     r4 = #32
310 ; CHECK-NEXT:     r5 = #8
311 ; CHECK-NEXT:    }
312 ; CHECK-NEXT:    {
313 ; CHECK-NEXT:     v7 = vsplat(r4)
314 ; CHECK-NEXT:     r2 = ##2147483647
315 ; CHECK-NEXT:     v24 = vxor(v24,v24)
316 ; CHECK-NEXT:    }
317 ; CHECK-NEXT:    {
318 ; CHECK-NEXT:     v25 = vsplat(r2)
319 ; CHECK-NEXT:    }
320 ; CHECK-NEXT:    {
321 ; CHECK-NEXT:     v1:0.qf32 = vmpy(v1.hf,v0.hf)
322 ; CHECK-NEXT:    }
323 ; CHECK-NEXT:    {
324 ; CHECK-NEXT:     v0.sf = v0.qf32
325 ; CHECK-NEXT:    }
326 ; CHECK-NEXT:    {
327 ; CHECK-NEXT:     v1.sf = v1.qf32
328 ; CHECK-NEXT:    }
329 ; CHECK-NEXT:    {
330 ; CHECK-NEXT:     r7 = ##-2147483648
331 ; CHECK-NEXT:     v1:0 = vshuff(v1,v0,r7)
332 ; CHECK-NEXT:    }
333 ; CHECK-NEXT:    {
334 ; CHECK-NEXT:     v2 = vsplat(r7)
335 ; CHECK-NEXT:     q0 = vcmp.gt(v24.w,v1.w)
336 ; CHECK-NEXT:     q1 = vcmp.gt(v24.w,v0.w)
337 ; CHECK-NEXT:    }
338 ; CHECK-NEXT:    {
339 ; CHECK-NEXT:     v3.w = vasl(v0.w,r6)
340 ; CHECK-NEXT:     v28 = vmux(q0,v2,v25)
341 ; CHECK-NEXT:    }
342 ; CHECK-NEXT:    {
343 ; CHECK-NEXT:     r7:6 = combine(#30,#24)
344 ; CHECK-NEXT:     v4.w = vasl(v1.w,r6)
345 ; CHECK-NEXT:     v3.w = vsub(v3.w,v2.w)
346 ; CHECK-NEXT:    }
347 ; CHECK-NEXT:    {
348 ; CHECK-NEXT:     v6 = vsplat(r7)
349 ; CHECK-NEXT:     v5.w = vasl(v0.w,r5)
350 ; CHECK-NEXT:     v4.w = vsub(v4.w,v2.w)
351 ; CHECK-NEXT:    }
352 ; CHECK-NEXT:    {
353 ; CHECK-NEXT:     v3.w = vasr(v3.w,r6)
354 ; CHECK-NEXT:     v5 = vor(v5,v2)
355 ; CHECK-NEXT:    }
356 ; CHECK-NEXT:    {
357 ; CHECK-NEXT:     v4.w = vasr(v4.w,r6)
358 ; CHECK-NEXT:     v3.w = vsub(v6.w,v3.w)
359 ; CHECK-NEXT:    }
360 ; CHECK-NEXT:    {
361 ; CHECK-NEXT:     v8.w = vasl(v1.w,r5)
362 ; CHECK-NEXT:     v4.w = vsub(v6.w,v4.w)
363 ; CHECK-NEXT:     v3.w = vmin(v3.w,v7.w)
364 ; CHECK-NEXT:    }
365 ; CHECK-NEXT:    {
366 ; CHECK-NEXT:     v8 = vor(v8,v2)
367 ; CHECK-NEXT:     v4.w = vmin(v4.w,v7.w)
368 ; CHECK-NEXT:     v2 = vmux(q1,v2,v25)
369 ; CHECK-NEXT:     q3 = vcmp.gt(v3.w,v24.w)
370 ; CHECK-NEXT:    }
371 ; CHECK-NEXT:    {
372 ; CHECK-NEXT:     v26.w = vlsr(v5.w,v3.w)
373 ; CHECK-NEXT:     q2 = vcmp.gt(v4.w,v24.w)
374 ; CHECK-NEXT:    }
375 ; CHECK-NEXT:    {
376 ; CHECK-NEXT:     v27.w = vlsr(v8.w,v4.w)
377 ; CHECK-NEXT:     v29.w = vsub(v24.w,v26.w)
378 ; CHECK-NEXT:    }
379 ; CHECK-NEXT:    {
380 ; CHECK-NEXT:     v9.w = vsub(v24.w,v27.w)
381 ; CHECK-NEXT:     v1 = vmux(q1,v29,v26)
382 ; CHECK-NEXT:    }
383 ; CHECK-NEXT:    {
384 ; CHECK-NEXT:     v30 = vmux(q0,v9,v27)
385 ; CHECK-NEXT:     v31 = vmux(q3,v1,v2)
386 ; CHECK-NEXT:     vmem(r1+#0) = v31.new
387 ; CHECK-NEXT:    }
388 ; CHECK-NEXT:    {
389 ; CHECK-NEXT:     v0 = vmux(q2,v30,v28)
390 ; CHECK-NEXT:     jumpr r31
391 ; CHECK-NEXT:     vmem(r1+#1) = v0.new
392 ; CHECK-NEXT:    }
393   %v0 = load <64 x half>, ptr %a0, align 128
394   %v1 = fptosi <64 x half> %v0 to <64 x i32>
395   store <64 x i32> %v1, ptr %a1, align 128
396   ret void
399 ; Widen input
400 define void @f16s32_1(ptr %a0, ptr %a1) #0 {
401 ; CHECK-LABEL: f16s32_1:
402 ; CHECK:         .cfi_startproc
403 ; CHECK-NEXT:  // %bb.0:
404 ; CHECK-NEXT:    {
405 ; CHECK-NEXT:     r4 = #15360
406 ; CHECK-NEXT:     r7 = #-4
407 ; CHECK-NEXT:     v0 = vmem(r0+#0)
408 ; CHECK-NEXT:    }
409 ; CHECK-NEXT:    {
410 ; CHECK-NEXT:     v1.h = vsplat(r4)
411 ; CHECK-NEXT:     r2 = ##-2147483648
412 ; CHECK-NEXT:     r3 = #1
413 ; CHECK-NEXT:    }
414 ; CHECK-NEXT:    {
415 ; CHECK-NEXT:     v3 = vsplat(r2)
416 ; CHECK-NEXT:     r5:4 = combine(#8,#30)
417 ; CHECK-NEXT:     r6 = #24
418 ; CHECK-NEXT:    }
419 ; CHECK-NEXT:    {
420 ; CHECK-NEXT:     v4 = vsplat(r4)
421 ; CHECK-NEXT:     r2 = ##2147483647
422 ; CHECK-NEXT:     r4 = #32
423 ; CHECK-NEXT:    }
424 ; CHECK-NEXT:    {
425 ; CHECK-NEXT:     v1:0.qf32 = vmpy(v0.hf,v1.hf)
426 ; CHECK-NEXT:     v2 = vxor(v2,v2)
427 ; CHECK-NEXT:    }
428 ; CHECK-NEXT:    {
429 ; CHECK-NEXT:     v5 = vsplat(r4)
430 ; CHECK-NEXT:     v30 = vsplat(r2)
431 ; CHECK-NEXT:    }
432 ; CHECK-NEXT:    {
433 ; CHECK-NEXT:     v0.sf = v0.qf32
434 ; CHECK-NEXT:    }
435 ; CHECK-NEXT:    {
436 ; CHECK-NEXT:     v1.sf = v1.qf32
437 ; CHECK-NEXT:    }
438 ; CHECK-NEXT:    {
439 ; CHECK-NEXT:     v1:0 = vshuff(v1,v0,r7)
440 ; CHECK-NEXT:    }
441 ; CHECK-NEXT:    {
442 ; CHECK-NEXT:     q0 = vcmp.gt(v2.w,v0.w)
443 ; CHECK-NEXT:    }
444 ; CHECK-NEXT:    {
445 ; CHECK-NEXT:     v1.w = vasl(v0.w,r3)
446 ; CHECK-NEXT:    }
447 ; CHECK-NEXT:    {
448 ; CHECK-NEXT:     v6.w = vasl(v0.w,r5)
449 ; CHECK-NEXT:     v1.w = vsub(v1.w,v3.w)
450 ; CHECK-NEXT:    }
451 ; CHECK-NEXT:    {
452 ; CHECK-NEXT:     v29 = vor(v6,v3)
453 ; CHECK-NEXT:     v3 = vmux(q0,v3,v30)
454 ; CHECK-NEXT:    }
455 ; CHECK-NEXT:    {
456 ; CHECK-NEXT:     v1.w = vasr(v1.w,r6)
457 ; CHECK-NEXT:    }
458 ; CHECK-NEXT:    {
459 ; CHECK-NEXT:     v1.w = vsub(v4.w,v1.w)
460 ; CHECK-NEXT:    }
461 ; CHECK-NEXT:    {
462 ; CHECK-NEXT:     v1.w = vmin(v1.w,v5.w)
463 ; CHECK-NEXT:    }
464 ; CHECK-NEXT:    {
465 ; CHECK-NEXT:     q3 = vcmp.gt(v1.w,v2.w)
466 ; CHECK-NEXT:    }
467 ; CHECK-NEXT:    {
468 ; CHECK-NEXT:     v4.w = vlsr(v29.w,v1.w)
469 ; CHECK-NEXT:    }
470 ; CHECK-NEXT:    {
471 ; CHECK-NEXT:     v31.w = vsub(v2.w,v4.w)
472 ; CHECK-NEXT:    }
473 ; CHECK-NEXT:    {
474 ; CHECK-NEXT:     v0 = vmux(q0,v31,v4)
475 ; CHECK-NEXT:    }
476 ; CHECK-NEXT:    {
477 ; CHECK-NEXT:     v0 = vmux(q3,v0,v3)
478 ; CHECK-NEXT:     jumpr r31
479 ; CHECK-NEXT:     vmem(r1+#0) = v0.new
480 ; CHECK-NEXT:    }
481   %v0 = load <32 x half>, ptr %a0, align 128
482   %v1 = fptosi <32 x half> %v0 to <32 x i32>
483   store <32 x i32> %v1, ptr %a1, align 128
484   ret void
487 ; f32 -> s8
488 ; No widening
489 define void @f32s8_0(ptr %a0, ptr %a1) #0 {
490 ; CHECK-LABEL: f32s8_0:
491 ; CHECK:         .cfi_startproc
492 ; CHECK-NEXT:  // %bb.0:
493 ; CHECK-NEXT:    {
494 ; CHECK-NEXT:     r4 = ##-2147483648
495 ; CHECK-NEXT:     r3:2 = combine(#1,#8)
496 ; CHECK-NEXT:     v5 = vmem(r0+#0)
497 ; CHECK-NEXT:    }
498 ; CHECK-NEXT:    {
499 ; CHECK-NEXT:     v1 = vsplat(r4)
500 ; CHECK-NEXT:     r7 = #30
501 ; CHECK-NEXT:     r6 = #24
502 ; CHECK-NEXT:     v2 = vmem(r0+#2)
503 ; CHECK-NEXT:    }
504 ; CHECK-NEXT:    {
505 ; CHECK-NEXT:     v10 = vsplat(r7)
506 ; CHECK-NEXT:     r5 = #32
507 ; CHECK-NEXT:     v8.w = vasl(v4.w,r3)
508 ; CHECK-NEXT:     v4.cur = vmem(r0+#1)
509 ; CHECK-NEXT:    }
510 ; CHECK-NEXT:    {
511 ; CHECK-NEXT:     v7.w = vasl(v5.w,r3)
512 ; CHECK-NEXT:     v12 = vxor(v12,v12)
513 ; CHECK-NEXT:     v8.w = vsub(v8.w,v1.w)
514 ; CHECK-NEXT:     v0 = vmem(r0+#3)
515 ; CHECK-NEXT:    }
516 ; CHECK-NEXT:    {
517 ; CHECK-NEXT:     v13 = vsplat(r5)
518 ; CHECK-NEXT:     v11.w = vasl(v0.w,r3)
519 ; CHECK-NEXT:     v7.w = vsub(v7.w,v1.w)
520 ; CHECK-NEXT:     q0 = vcmp.gt(v12.w,v5.w)
521 ; CHECK-NEXT:    }
522 ; CHECK-NEXT:    {
523 ; CHECK-NEXT:     v9.w = vasl(v2.w,r3)
524 ; CHECK-NEXT:     q1 = vcmp.gt(v12.w,v4.w)
525 ; CHECK-NEXT:     v11.w = vsub(v11.w,v1.w)
526 ; CHECK-NEXT:    }
527 ; CHECK-NEXT:    {
528 ; CHECK-NEXT:     r3 = ##2147483647
529 ; CHECK-NEXT:     r7 = #64
530 ; CHECK-NEXT:     v8.w = vasr(v8.w,r6)
531 ; CHECK-NEXT:    }
532 ; CHECK-NEXT:    {
533 ; CHECK-NEXT:     v22 = vsplat(r3)
534 ; CHECK-NEXT:     v7.w = vasr(v7.w,r6)
535 ; CHECK-NEXT:     v19.w = vsub(v9.w,v1.w)
536 ; CHECK-NEXT:     v8.w = vsub(v10.w,v8.w)
537 ; CHECK-NEXT:    }
538 ; CHECK-NEXT:    {
539 ; CHECK-NEXT:     v20.w = vasl(v4.w,r2)
540 ; CHECK-NEXT:     v27 = vmux(q1,v1,v22)
541 ; CHECK-NEXT:     v25 = vmux(q0,v1,v22)
542 ; CHECK-NEXT:     v7.w = vsub(v10.w,v7.w)
543 ; CHECK-NEXT:    }
544 ; CHECK-NEXT:    {
545 ; CHECK-NEXT:     v6.w = vasl(v5.w,r2)
546 ; CHECK-NEXT:     v8.w = vmin(v8.w,v13.w)
547 ; CHECK-NEXT:     v9 = vor(v20,v1)
548 ; CHECK-NEXT:     v21.w = vmin(v7.w,v13.w)
549 ; CHECK-NEXT:    }
550 ; CHECK-NEXT:    {
551 ; CHECK-NEXT:     v5.w = vasr(v19.w,r6)
552 ; CHECK-NEXT:     q3 = vcmp.gt(v8.w,v12.w)
553 ; CHECK-NEXT:     v6 = vor(v6,v1)
554 ; CHECK-NEXT:     q2 = vcmp.gt(v21.w,v12.w)
555 ; CHECK-NEXT:    }
556 ; CHECK-NEXT:    {
557 ; CHECK-NEXT:     v11.w = vasr(v11.w,r6)
558 ; CHECK-NEXT:     v5.w = vsub(v10.w,v5.w)
559 ; CHECK-NEXT:    }
560 ; CHECK-NEXT:    {
561 ; CHECK-NEXT:     v3.w = vasl(v2.w,r2)
562 ; CHECK-NEXT:     v10.w = vsub(v10.w,v11.w)
563 ; CHECK-NEXT:     v5.w = vmin(v5.w,v13.w)
564 ; CHECK-NEXT:    }
565 ; CHECK-NEXT:    {
566 ; CHECK-NEXT:     v23.w = vasl(v0.w,r2)
567 ; CHECK-NEXT:     v3 = vor(v3,v1)
568 ; CHECK-NEXT:     v10.w = vmin(v10.w,v13.w)
569 ; CHECK-NEXT:    }
570 ; CHECK-NEXT:    {
571 ; CHECK-NEXT:     v8.w = vlsr(v9.w,v8.w)
572 ; CHECK-NEXT:     v4 = vor(v23,v1)
573 ; CHECK-NEXT:    }
574 ; CHECK-NEXT:    {
575 ; CHECK-NEXT:     v6.w = vlsr(v6.w,v21.w)
576 ; CHECK-NEXT:     v26.w = vsub(v12.w,v8.w)
577 ; CHECK-NEXT:    }
578 ; CHECK-NEXT:    {
579 ; CHECK-NEXT:     v3.w = vlsr(v3.w,v5.w)
580 ; CHECK-NEXT:     v24.w = vsub(v12.w,v6.w)
581 ; CHECK-NEXT:     v8 = vmux(q1,v26,v8)
582 ; CHECK-NEXT:    }
583 ; CHECK-NEXT:    {
584 ; CHECK-NEXT:     v4.w = vlsr(v4.w,v10.w)
585 ; CHECK-NEXT:     v6 = vmux(q0,v24,v6)
586 ; CHECK-NEXT:     q0 = vcmp.gt(v12.w,v2.w)
587 ; CHECK-NEXT:     v28.w = vsub(v12.w,v3.w)
588 ; CHECK-NEXT:    }
589 ; CHECK-NEXT:    {
590 ; CHECK-NEXT:     v2 = vmux(q3,v8,v27)
591 ; CHECK-NEXT:     v29.w = vsub(v12.w,v4.w)
592 ; CHECK-NEXT:     q3 = vcmp.gt(v12.w,v0.w)
593 ; CHECK-NEXT:     v6 = vmux(q2,v6,v25)
594 ; CHECK-NEXT:    }
595 ; CHECK-NEXT:    {
596 ; CHECK-NEXT:     v30 = vmux(q0,v1,v22)
597 ; CHECK-NEXT:     v3 = vmux(q0,v28,v3)
598 ; CHECK-NEXT:     q2 = vcmp.gt(v5.w,v12.w)
599 ; CHECK-NEXT:     v4 = vmux(q3,v29,v4)
600 ; CHECK-NEXT:    }
601 ; CHECK-NEXT:    {
602 ; CHECK-NEXT:     v2.h = vpack(v2.w,v6.w):sat
603 ; CHECK-NEXT:     v1 = vmux(q3,v1,v22)
604 ; CHECK-NEXT:     q3 = vcmp.gt(v10.w,v12.w)
605 ; CHECK-NEXT:     v0 = vmux(q2,v3,v30)
606 ; CHECK-NEXT:    }
607 ; CHECK-NEXT:    {
608 ; CHECK-NEXT:     v1 = vmux(q3,v4,v1)
609 ; CHECK-NEXT:    }
610 ; CHECK-NEXT:    {
611 ; CHECK-NEXT:     v3.h = vpack(v1.w,v0.w):sat
612 ; CHECK-NEXT:    }
613 ; CHECK-NEXT:    {
614 ; CHECK-NEXT:     v0.h = vpack(v1.w,v0.w):sat
615 ; CHECK-NEXT:    }
616 ; CHECK-NEXT:    {
617 ; CHECK-NEXT:     v31.b = vpack(v3.h,v2.h):sat
618 ; CHECK-NEXT:    }
619 ; CHECK-NEXT:    {
620 ; CHECK-NEXT:     v0.b = vpack(v3.h,v0.h):sat
621 ; CHECK-NEXT:    }
622 ; CHECK-NEXT:    {
623 ; CHECK-NEXT:     v1:0 = vshuff(v0,v31,r7)
624 ; CHECK-NEXT:     jumpr r31
625 ; CHECK-NEXT:     vmem(r1+#0) = v0.new
626 ; CHECK-NEXT:    }
627   %v0 = load <128 x float>, ptr %a0, align 128
628   %v1 = fptosi <128 x float> %v0 to <128 x i8>
629   store <128 x i8> %v1, ptr %a1, align 128
630   ret void
633 ; Widen result #1
634 define void @f32s8_1(ptr %a0, ptr %a1) #0 {
635 ; CHECK-LABEL: f32s8_1:
636 ; CHECK:         .cfi_startproc
637 ; CHECK-NEXT:  // %bb.0:
638 ; CHECK-NEXT:    {
639 ; CHECK-NEXT:     r3:2 = combine(##-2147483648,#8)
640 ; CHECK-NEXT:     r4 = #1
641 ; CHECK-NEXT:     v1 = vmem(r0+#0)
642 ; CHECK-NEXT:    }
643 ; CHECK-NEXT:    {
644 ; CHECK-NEXT:     v3 = vsplat(r3)
645 ; CHECK-NEXT:     r5 = #30
646 ; CHECK-NEXT:     v4.w = vasl(v0.w,r4)
647 ; CHECK-NEXT:     v0.cur = vmem(r0+#1)
648 ; CHECK-NEXT:    }
649 ; CHECK-NEXT:    {
650 ; CHECK-NEXT:     v5.w = vasl(v1.w,r4)
651 ; CHECK-NEXT:     v4.w = vsub(v4.w,v3.w)
652 ; CHECK-NEXT:     r6 = #24
653 ; CHECK-NEXT:     r4 = #32
654 ; CHECK-NEXT:    }
655 ; CHECK-NEXT:    {
656 ; CHECK-NEXT:     v6 = vsplat(r5)
657 ; CHECK-NEXT:     v7 = vsplat(r4)
658 ; CHECK-NEXT:     v2.w = vasl(v1.w,r2)
659 ; CHECK-NEXT:     v5.w = vsub(v5.w,v3.w)
660 ; CHECK-NEXT:    }
661 ; CHECK-NEXT:    {
662 ; CHECK-NEXT:     v4.w = vasr(v4.w,r6)
663 ; CHECK-NEXT:     v26 = vxor(v26,v26)
664 ; CHECK-NEXT:     v2 = vor(v2,v3)
665 ; CHECK-NEXT:    }
666 ; CHECK-NEXT:    {
667 ; CHECK-NEXT:     r3 = ##2147483647
668 ; CHECK-NEXT:     v5.w = vasr(v5.w,r6)
669 ; CHECK-NEXT:     q0 = vcmp.gt(v26.w,v1.w)
670 ; CHECK-NEXT:    }
671 ; CHECK-NEXT:    {
672 ; CHECK-NEXT:     v27 = vsplat(r3)
673 ; CHECK-NEXT:     v4.w = vsub(v6.w,v4.w)
674 ; CHECK-NEXT:     q2 = vcmp.gt(v26.w,v0.w)
675 ; CHECK-NEXT:     v5.w = vsub(v6.w,v5.w)
676 ; CHECK-NEXT:    }
677 ; CHECK-NEXT:    {
678 ; CHECK-NEXT:     v8.w = vasl(v0.w,r2)
679 ; CHECK-NEXT:     v4.w = vmin(v4.w,v7.w)
680 ; CHECK-NEXT:     v30 = vmux(q0,v3,v27)
681 ; CHECK-NEXT:     v5.w = vmin(v5.w,v7.w)
682 ; CHECK-NEXT:    }
683 ; CHECK-NEXT:    {
684 ; CHECK-NEXT:     v25 = vor(v8,v3)
685 ; CHECK-NEXT:     v1 = vmux(q2,v3,v27)
686 ; CHECK-NEXT:     q3 = vcmp.gt(v4.w,v26.w)
687 ; CHECK-NEXT:     q1 = vcmp.gt(v5.w,v26.w)
688 ; CHECK-NEXT:    }
689 ; CHECK-NEXT:    {
690 ; CHECK-NEXT:     r2 = #64
691 ; CHECK-NEXT:     v2.w = vlsr(v2.w,v5.w)
692 ; CHECK-NEXT:    }
693 ; CHECK-NEXT:    {
694 ; CHECK-NEXT:     v28.w = vlsr(v25.w,v4.w)
695 ; CHECK-NEXT:     v29.w = vsub(v26.w,v2.w)
696 ; CHECK-NEXT:    }
697 ; CHECK-NEXT:    {
698 ; CHECK-NEXT:     v6.w = vsub(v26.w,v28.w)
699 ; CHECK-NEXT:     v0 = vmux(q0,v29,v2)
700 ; CHECK-NEXT:    }
701 ; CHECK-NEXT:    {
702 ; CHECK-NEXT:     v31 = vmux(q2,v6,v28)
703 ; CHECK-NEXT:     v0 = vmux(q1,v0,v30)
704 ; CHECK-NEXT:    }
705 ; CHECK-NEXT:    {
706 ; CHECK-NEXT:     q3 = vsetq(r2)
707 ; CHECK-NEXT:     v1 = vmux(q3,v31,v1)
708 ; CHECK-NEXT:    }
709 ; CHECK-NEXT:    {
710 ; CHECK-NEXT:     v2.h = vpack(v1.w,v0.w):sat
711 ; CHECK-NEXT:    }
712 ; CHECK-NEXT:    {
713 ; CHECK-NEXT:     v0.h = vpack(v1.w,v0.w):sat
714 ; CHECK-NEXT:    }
715 ; CHECK-NEXT:    {
716 ; CHECK-NEXT:     v0.b = vpack(v2.h,v0.h):sat
717 ; CHECK-NEXT:    }
718 ; CHECK-NEXT:    {
719 ; CHECK-NEXT:     jumpr r31
720 ; CHECK-NEXT:     if (q3) vmem(r1+#0) = v0
721 ; CHECK-NEXT:    }
722   %v0 = load <64 x float>, ptr %a0, align 128
723   %v1 = fptosi <64 x float> %v0 to <64 x i8>
724   store <64 x i8> %v1, ptr %a1, align 128
725   ret void
728 ; Widen result #2
729 define void @f32s8_2(ptr %a0, ptr %a1) #0 {
730 ; CHECK-LABEL: f32s8_2:
731 ; CHECK:         .cfi_startproc
732 ; CHECK-NEXT:  // %bb.0:
733 ; CHECK-NEXT:    {
734 ; CHECK-NEXT:     r7 = ##-2147483648
735 ; CHECK-NEXT:     r3:2 = combine(#30,#1)
736 ; CHECK-NEXT:     v0 = vmem(r0+#0)
737 ; CHECK-NEXT:    }
738 ; CHECK-NEXT:    {
739 ; CHECK-NEXT:     v2 = vsplat(r7)
740 ; CHECK-NEXT:     r5:4 = combine(#8,#24)
741 ; CHECK-NEXT:     r6 = #32
742 ; CHECK-NEXT:     v3.w = vasl(v0.w,r2)
743 ; CHECK-NEXT:    }
744 ; CHECK-NEXT:    {
745 ; CHECK-NEXT:     v4 = vsplat(r3)
746 ; CHECK-NEXT:     v5 = vsplat(r6)
747 ; CHECK-NEXT:     v6.w = vasl(v0.w,r5)
748 ; CHECK-NEXT:     v3.w = vsub(v3.w,v2.w)
749 ; CHECK-NEXT:    }
750 ; CHECK-NEXT:    {
751 ; CHECK-NEXT:     v1 = vxor(v1,v1)
752 ; CHECK-NEXT:     v29 = vor(v6,v2)
753 ; CHECK-NEXT:    }
754 ; CHECK-NEXT:    {
755 ; CHECK-NEXT:     q3 = vsetq(r6)
756 ; CHECK-NEXT:     v3.w = vasr(v3.w,r4)
757 ; CHECK-NEXT:     q0 = vcmp.gt(v1.w,v0.w)
758 ; CHECK-NEXT:    }
759 ; CHECK-NEXT:    {
760 ; CHECK-NEXT:     r4 = ##2147483647
761 ; CHECK-NEXT:     v3.w = vsub(v4.w,v3.w)
762 ; CHECK-NEXT:    }
763 ; CHECK-NEXT:    {
764 ; CHECK-NEXT:     v30 = vsplat(r4)
765 ; CHECK-NEXT:     v3.w = vmin(v3.w,v5.w)
766 ; CHECK-NEXT:    }
767 ; CHECK-NEXT:    {
768 ; CHECK-NEXT:     v2 = vmux(q0,v2,v30)
769 ; CHECK-NEXT:     q2 = vcmp.gt(v3.w,v1.w)
770 ; CHECK-NEXT:    }
771 ; CHECK-NEXT:    {
772 ; CHECK-NEXT:     v4.w = vlsr(v29.w,v3.w)
773 ; CHECK-NEXT:    }
774 ; CHECK-NEXT:    {
775 ; CHECK-NEXT:     v31.w = vsub(v1.w,v4.w)
776 ; CHECK-NEXT:    }
777 ; CHECK-NEXT:    {
778 ; CHECK-NEXT:     v0 = vmux(q0,v31,v4)
779 ; CHECK-NEXT:    }
780 ; CHECK-NEXT:    {
781 ; CHECK-NEXT:     v0 = vmux(q2,v0,v2)
782 ; CHECK-NEXT:    }
783 ; CHECK-NEXT:    {
784 ; CHECK-NEXT:     v1.h = vpack(v1.w,v0.w):sat
785 ; CHECK-NEXT:    }
786 ; CHECK-NEXT:    {
787 ; CHECK-NEXT:     v0.h = vpack(v0.w,v0.w):sat
788 ; CHECK-NEXT:    }
789 ; CHECK-NEXT:    {
790 ; CHECK-NEXT:     v0.b = vpack(v1.h,v0.h):sat
791 ; CHECK-NEXT:    }
792 ; CHECK-NEXT:    {
793 ; CHECK-NEXT:     jumpr r31
794 ; CHECK-NEXT:     if (q3) vmem(r1+#0) = v0
795 ; CHECK-NEXT:    }
796   %v0 = load <32 x float>, ptr %a0, align 128
797   %v1 = fptosi <32 x float> %v0 to <32 x i8>
798   store <32 x i8> %v1, ptr %a1, align 128
799   ret void
802 ; f32 -> s16
803 ; No widening
804 define void @f32s16_0(ptr %a0, ptr %a1) #0 {
805 ; CHECK-LABEL: f32s16_0:
806 ; CHECK:         .cfi_startproc
807 ; CHECK-NEXT:  // %bb.0:
808 ; CHECK-NEXT:    {
809 ; CHECK-NEXT:     r3:2 = combine(##-2147483648,#1)
810 ; CHECK-NEXT:     r4 = #30
811 ; CHECK-NEXT:     v1 = vmem(r0+#0)
812 ; CHECK-NEXT:    }
813 ; CHECK-NEXT:    {
814 ; CHECK-NEXT:     v2 = vsplat(r3)
815 ; CHECK-NEXT:     r6 = #8
816 ; CHECK-NEXT:     v3.w = vasl(v0.w,r2)
817 ; CHECK-NEXT:     v0.cur = vmem(r0+#1)
818 ; CHECK-NEXT:    }
819 ; CHECK-NEXT:    {
820 ; CHECK-NEXT:     v4 = vsplat(r4)
821 ; CHECK-NEXT:     v8.w = vasl(v1.w,r2)
822 ; CHECK-NEXT:     v3.w = vsub(v3.w,v2.w)
823 ; CHECK-NEXT:    }
824 ; CHECK-NEXT:    {
825 ; CHECK-NEXT:     r5:4 = combine(#24,##2147483647)
826 ; CHECK-NEXT:     v7 = vxor(v7,v7)
827 ; CHECK-NEXT:     v8.w = vsub(v8.w,v2.w)
828 ; CHECK-NEXT:    }
829 ; CHECK-NEXT:    {
830 ; CHECK-NEXT:     r3 = #32
831 ; CHECK-NEXT:     v5.w = vasl(v1.w,r6)
832 ; CHECK-NEXT:     q1 = vcmp.gt(v7.w,v0.w)
833 ; CHECK-NEXT:    }
834 ; CHECK-NEXT:    {
835 ; CHECK-NEXT:     v6 = vsplat(r3)
836 ; CHECK-NEXT:     v27.w = vasr(v3.w,r5)
837 ; CHECK-NEXT:     v5 = vor(v5,v2)
838 ; CHECK-NEXT:     q0 = vcmp.gt(v7.w,v1.w)
839 ; CHECK-NEXT:    }
840 ; CHECK-NEXT:    {
841 ; CHECK-NEXT:     v9 = vsplat(r4)
842 ; CHECK-NEXT:     v8.w = vasr(v8.w,r5)
843 ; CHECK-NEXT:    }
844 ; CHECK-NEXT:    {
845 ; CHECK-NEXT:     v26.w = vasl(v0.w,r6)
846 ; CHECK-NEXT:     v0.w = vsub(v4.w,v27.w)
847 ; CHECK-NEXT:     v4.w = vsub(v4.w,v8.w)
848 ; CHECK-NEXT:     v28 = vmux(q0,v2,v9)
849 ; CHECK-NEXT:    }
850 ; CHECK-NEXT:    {
851 ; CHECK-NEXT:     v4.w = vmin(v4.w,v6.w)
852 ; CHECK-NEXT:     v1 = vor(v26,v2)
853 ; CHECK-NEXT:     v0.w = vmin(v0.w,v6.w)
854 ; CHECK-NEXT:     v2 = vmux(q1,v2,v9)
855 ; CHECK-NEXT:    }
856 ; CHECK-NEXT:    {
857 ; CHECK-NEXT:     q2 = vcmp.gt(v4.w,v7.w)
858 ; CHECK-NEXT:     q3 = vcmp.gt(v0.w,v7.w)
859 ; CHECK-NEXT:    }
860 ; CHECK-NEXT:    {
861 ; CHECK-NEXT:     v5.w = vlsr(v5.w,v4.w)
862 ; CHECK-NEXT:    }
863 ; CHECK-NEXT:    {
864 ; CHECK-NEXT:     v1.w = vlsr(v1.w,v0.w)
865 ; CHECK-NEXT:     v29.w = vsub(v7.w,v5.w)
866 ; CHECK-NEXT:    }
867 ; CHECK-NEXT:    {
868 ; CHECK-NEXT:     v30.w = vsub(v7.w,v1.w)
869 ; CHECK-NEXT:     v5 = vmux(q0,v29,v5)
870 ; CHECK-NEXT:    }
871 ; CHECK-NEXT:    {
872 ; CHECK-NEXT:     v1 = vmux(q1,v30,v1)
873 ; CHECK-NEXT:     v31 = vmux(q2,v5,v28)
874 ; CHECK-NEXT:    }
875 ; CHECK-NEXT:    {
876 ; CHECK-NEXT:     v1 = vmux(q3,v1,v2)
877 ; CHECK-NEXT:    }
878 ; CHECK-NEXT:    {
879 ; CHECK-NEXT:     v0.h = vpack(v1.w,v31.w):sat
880 ; CHECK-NEXT:     jumpr r31
881 ; CHECK-NEXT:     vmem(r1+#0) = v0.new
882 ; CHECK-NEXT:    }
883   %v0 = load <64 x float>, ptr %a0, align 128
884   %v1 = fptosi <64 x float> %v0 to <64 x i16>
885   store <64 x i16> %v1, ptr %a1, align 128
886   ret void
889 ; Widen result
890 define void @f32s16_1(ptr %a0, ptr %a1) #0 {
891 ; CHECK-LABEL: f32s16_1:
892 ; CHECK:         .cfi_startproc
893 ; CHECK-NEXT:  // %bb.0:
894 ; CHECK-NEXT:    {
895 ; CHECK-NEXT:     r7 = ##-2147483648
896 ; CHECK-NEXT:     r3:2 = combine(#8,#1)
897 ; CHECK-NEXT:     v0 = vmem(r0+#0)
898 ; CHECK-NEXT:    }
899 ; CHECK-NEXT:    {
900 ; CHECK-NEXT:     v2 = vsplat(r7)
901 ; CHECK-NEXT:     v3.w = vasl(v0.w,r2)
902 ; CHECK-NEXT:     r6 = #30
903 ; CHECK-NEXT:     r5 = #24
904 ; CHECK-NEXT:    }
905 ; CHECK-NEXT:    {
906 ; CHECK-NEXT:     v4 = vsplat(r6)
907 ; CHECK-NEXT:     r4 = #32
908 ; CHECK-NEXT:     v6.w = vasl(v0.w,r3)
909 ; CHECK-NEXT:     v3.w = vsub(v3.w,v2.w)
910 ; CHECK-NEXT:    }
911 ; CHECK-NEXT:    {
912 ; CHECK-NEXT:     v5 = vsplat(r4)
913 ; CHECK-NEXT:     v29 = vor(v6,v2)
914 ; CHECK-NEXT:     v1 = vxor(v1,v1)
915 ; CHECK-NEXT:    }
916 ; CHECK-NEXT:    {
917 ; CHECK-NEXT:     r3 = ##2147483647
918 ; CHECK-NEXT:     r2 = #64
919 ; CHECK-NEXT:     v3.w = vasr(v3.w,r5)
920 ; CHECK-NEXT:    }
921 ; CHECK-NEXT:    {
922 ; CHECK-NEXT:     v30 = vsplat(r3)
923 ; CHECK-NEXT:     q3 = vsetq(r2)
924 ; CHECK-NEXT:     q0 = vcmp.gt(v1.w,v0.w)
925 ; CHECK-NEXT:     v3.w = vsub(v4.w,v3.w)
926 ; CHECK-NEXT:    }
927 ; CHECK-NEXT:    {
928 ; CHECK-NEXT:     v2 = vmux(q0,v2,v30)
929 ; CHECK-NEXT:     v3.w = vmin(v3.w,v5.w)
930 ; CHECK-NEXT:    }
931 ; CHECK-NEXT:    {
932 ; CHECK-NEXT:     q2 = vcmp.gt(v3.w,v1.w)
933 ; CHECK-NEXT:    }
934 ; CHECK-NEXT:    {
935 ; CHECK-NEXT:     v4.w = vlsr(v29.w,v3.w)
936 ; CHECK-NEXT:    }
937 ; CHECK-NEXT:    {
938 ; CHECK-NEXT:     v31.w = vsub(v1.w,v4.w)
939 ; CHECK-NEXT:    }
940 ; CHECK-NEXT:    {
941 ; CHECK-NEXT:     v0 = vmux(q0,v31,v4)
942 ; CHECK-NEXT:    }
943 ; CHECK-NEXT:    {
944 ; CHECK-NEXT:     v0 = vmux(q2,v0,v2)
945 ; CHECK-NEXT:    }
946 ; CHECK-NEXT:    {
947 ; CHECK-NEXT:     v0.h = vpack(v0.w,v0.w):sat
948 ; CHECK-NEXT:    }
949 ; CHECK-NEXT:    {
950 ; CHECK-NEXT:     jumpr r31
951 ; CHECK-NEXT:     if (q3) vmem(r1+#0) = v0
952 ; CHECK-NEXT:    }
953   %v0 = load <32 x float>, ptr %a0, align 128
954   %v1 = fptosi <32 x float> %v0 to <32 x i16>
955   store <32 x i16> %v1, ptr %a1, align 128
956   ret void
959 ; f32 -> s32
960 ; No widening
961 define void @f32s32_0(ptr %a0, ptr %a1) #0 {
962 ; CHECK-LABEL: f32s32_0:
963 ; CHECK:         .cfi_startproc
964 ; CHECK-NEXT:  // %bb.0:
965 ; CHECK-NEXT:    {
966 ; CHECK-NEXT:     r7 = ##-2147483648
967 ; CHECK-NEXT:     r3:2 = combine(#8,#1)
968 ; CHECK-NEXT:     v0 = vmem(r0+#0)
969 ; CHECK-NEXT:    }
970 ; CHECK-NEXT:    {
971 ; CHECK-NEXT:     v2 = vsplat(r7)
972 ; CHECK-NEXT:     v3.w = vasl(v0.w,r2)
973 ; CHECK-NEXT:     r6 = #30
974 ; CHECK-NEXT:     r5 = #24
975 ; CHECK-NEXT:    }
976 ; CHECK-NEXT:    {
977 ; CHECK-NEXT:     v4 = vsplat(r6)
978 ; CHECK-NEXT:     r4 = #32
979 ; CHECK-NEXT:     v6.w = vasl(v0.w,r3)
980 ; CHECK-NEXT:     v3.w = vsub(v3.w,v2.w)
981 ; CHECK-NEXT:    }
982 ; CHECK-NEXT:    {
983 ; CHECK-NEXT:     v5 = vsplat(r4)
984 ; CHECK-NEXT:     v29 = vor(v6,v2)
985 ; CHECK-NEXT:     v1 = vxor(v1,v1)
986 ; CHECK-NEXT:    }
987 ; CHECK-NEXT:    {
988 ; CHECK-NEXT:     r2 = ##2147483647
989 ; CHECK-NEXT:     v3.w = vasr(v3.w,r5)
990 ; CHECK-NEXT:    }
991 ; CHECK-NEXT:    {
992 ; CHECK-NEXT:     v30 = vsplat(r2)
993 ; CHECK-NEXT:     q0 = vcmp.gt(v1.w,v0.w)
994 ; CHECK-NEXT:     v3.w = vsub(v4.w,v3.w)
995 ; CHECK-NEXT:    }
996 ; CHECK-NEXT:    {
997 ; CHECK-NEXT:     v2 = vmux(q0,v2,v30)
998 ; CHECK-NEXT:     v3.w = vmin(v3.w,v5.w)
999 ; CHECK-NEXT:    }
1000 ; CHECK-NEXT:    {
1001 ; CHECK-NEXT:     q3 = vcmp.gt(v3.w,v1.w)
1002 ; CHECK-NEXT:    }
1003 ; CHECK-NEXT:    {
1004 ; CHECK-NEXT:     v4.w = vlsr(v29.w,v3.w)
1005 ; CHECK-NEXT:    }
1006 ; CHECK-NEXT:    {
1007 ; CHECK-NEXT:     v31.w = vsub(v1.w,v4.w)
1008 ; CHECK-NEXT:    }
1009 ; CHECK-NEXT:    {
1010 ; CHECK-NEXT:     v0 = vmux(q0,v31,v4)
1011 ; CHECK-NEXT:    }
1012 ; CHECK-NEXT:    {
1013 ; CHECK-NEXT:     v0 = vmux(q3,v0,v2)
1014 ; CHECK-NEXT:     jumpr r31
1015 ; CHECK-NEXT:     vmem(r1+#0) = v0.new
1016 ; CHECK-NEXT:    }
1017   %v0 = load <32 x float>, ptr %a0, align 128
1018   %v1 = fptosi <32 x float> %v0 to <32 x i32>
1019   store <32 x i32> %v1, ptr %a1, align 128
1020   ret void
1023 ; Widen input and result
1024 define void @f32s32_1(ptr %a0, ptr %a1) #0 {
1025 ; CHECK-LABEL: f32s32_1:
1026 ; CHECK:         .cfi_startproc
1027 ; CHECK-NEXT:  // %bb.0:
1028 ; CHECK-NEXT:    {
1029 ; CHECK-NEXT:     r7 = ##-2147483648
1030 ; CHECK-NEXT:     r3:2 = combine(#8,#1)
1031 ; CHECK-NEXT:     v0 = vmem(r0+#0)
1032 ; CHECK-NEXT:    }
1033 ; CHECK-NEXT:    {
1034 ; CHECK-NEXT:     v2 = vsplat(r7)
1035 ; CHECK-NEXT:     v3.w = vasl(v0.w,r2)
1036 ; CHECK-NEXT:     r6 = #30
1037 ; CHECK-NEXT:     r5 = #24
1038 ; CHECK-NEXT:    }
1039 ; CHECK-NEXT:    {
1040 ; CHECK-NEXT:     v4 = vsplat(r6)
1041 ; CHECK-NEXT:     r4 = #32
1042 ; CHECK-NEXT:     v6.w = vasl(v0.w,r3)
1043 ; CHECK-NEXT:     v3.w = vsub(v3.w,v2.w)
1044 ; CHECK-NEXT:    }
1045 ; CHECK-NEXT:    {
1046 ; CHECK-NEXT:     v5 = vsplat(r4)
1047 ; CHECK-NEXT:     v29 = vor(v6,v2)
1048 ; CHECK-NEXT:     v1 = vxor(v1,v1)
1049 ; CHECK-NEXT:    }
1050 ; CHECK-NEXT:    {
1051 ; CHECK-NEXT:     r3 = ##2147483647
1052 ; CHECK-NEXT:     r2 = #64
1053 ; CHECK-NEXT:     v3.w = vasr(v3.w,r5)
1054 ; CHECK-NEXT:    }
1055 ; CHECK-NEXT:    {
1056 ; CHECK-NEXT:     v30 = vsplat(r3)
1057 ; CHECK-NEXT:     q3 = vsetq(r2)
1058 ; CHECK-NEXT:     q0 = vcmp.gt(v1.w,v0.w)
1059 ; CHECK-NEXT:     v3.w = vsub(v4.w,v3.w)
1060 ; CHECK-NEXT:    }
1061 ; CHECK-NEXT:    {
1062 ; CHECK-NEXT:     v2 = vmux(q0,v2,v30)
1063 ; CHECK-NEXT:     v3.w = vmin(v3.w,v5.w)
1064 ; CHECK-NEXT:    }
1065 ; CHECK-NEXT:    {
1066 ; CHECK-NEXT:     q1 = vcmp.gt(v3.w,v1.w)
1067 ; CHECK-NEXT:    }
1068 ; CHECK-NEXT:    {
1069 ; CHECK-NEXT:     v4.w = vlsr(v29.w,v3.w)
1070 ; CHECK-NEXT:    }
1071 ; CHECK-NEXT:    {
1072 ; CHECK-NEXT:     v31.w = vsub(v1.w,v4.w)
1073 ; CHECK-NEXT:    }
1074 ; CHECK-NEXT:    {
1075 ; CHECK-NEXT:     v0 = vmux(q0,v31,v4)
1076 ; CHECK-NEXT:    }
1077 ; CHECK-NEXT:    {
1078 ; CHECK-NEXT:     v0 = vmux(q1,v0,v2)
1079 ; CHECK-NEXT:    }
1080 ; CHECK-NEXT:    {
1081 ; CHECK-NEXT:     jumpr r31
1082 ; CHECK-NEXT:     if (q3) vmem(r1+#0) = v0
1083 ; CHECK-NEXT:    }
1084   %v0 = load <16 x float>, ptr %a0, align 128
1085   %v1 = fptosi <16 x float> %v0 to <16 x i32>
1086   store <16 x i32> %v1, ptr %a1, align 128
1087   ret void
1091 ; f16 -> u8
1092 ; No widening
1093 define void @f16u8_0(ptr %a0, ptr %a1) #0 {
1094 ; CHECK-LABEL: f16u8_0:
1095 ; CHECK:         .cfi_startproc
1096 ; CHECK-NEXT:  // %bb.0:
1097 ; CHECK-NEXT:    {
1098 ; CHECK-NEXT:     r3:2 = combine(##32768,#1)
1099 ; CHECK-NEXT:     r4 = #14
1100 ; CHECK-NEXT:     v0 = vmem(r0+#1)
1101 ; CHECK-NEXT:    }
1102 ; CHECK-NEXT:    {
1103 ; CHECK-NEXT:     v2.h = vsplat(r3)
1104 ; CHECK-NEXT:     r7:6 = combine(#11,#16)
1105 ; CHECK-NEXT:     v3.h = vasl(v0.h,r2)
1106 ; CHECK-NEXT:     v1 = vmem(r0+#0)
1107 ; CHECK-NEXT:    }
1108 ; CHECK-NEXT:    {
1109 ; CHECK-NEXT:     v6.h = vsplat(r4)
1110 ; CHECK-NEXT:     r5 = #5
1111 ; CHECK-NEXT:     v4.h = vasl(v1.h,r2)
1112 ; CHECK-NEXT:     v3.h = vsub(v3.h,v2.h)
1113 ; CHECK-NEXT:    }
1114 ; CHECK-NEXT:    {
1115 ; CHECK-NEXT:     v7.h = vsplat(r6)
1116 ; CHECK-NEXT:     v5.h = vasl(v1.h,r5)
1117 ; CHECK-NEXT:     v4.h = vsub(v4.h,v2.h)
1118 ; CHECK-NEXT:     v28 = vxor(v28,v28)
1119 ; CHECK-NEXT:    }
1120 ; CHECK-NEXT:    {
1121 ; CHECK-NEXT:     r2 = #32767
1122 ; CHECK-NEXT:     v3.h = vasr(v3.h,r7)
1123 ; CHECK-NEXT:     v5 = vor(v5,v2)
1124 ; CHECK-NEXT:    }
1125 ; CHECK-NEXT:    {
1126 ; CHECK-NEXT:     v29.h = vsplat(r2)
1127 ; CHECK-NEXT:     v4.h = vasr(v4.h,r7)
1128 ; CHECK-NEXT:     q2 = vcmp.gt(v28.h,v1.h)
1129 ; CHECK-NEXT:     v3.h = vsub(v6.h,v3.h)
1130 ; CHECK-NEXT:    }
1131 ; CHECK-NEXT:    {
1132 ; CHECK-NEXT:     v8.h = vasl(v0.h,r5)
1133 ; CHECK-NEXT:     q3 = vcmp.gt(v28.h,v0.h)
1134 ; CHECK-NEXT:     v4.h = vsub(v6.h,v4.h)
1135 ; CHECK-NEXT:     v3.h = vmin(v3.h,v7.h)
1136 ; CHECK-NEXT:    }
1137 ; CHECK-NEXT:    {
1138 ; CHECK-NEXT:     v4.h = vmin(v4.h,v7.h)
1139 ; CHECK-NEXT:     v2 = vor(v8,v2)
1140 ; CHECK-NEXT:     q1 = vcmp.gt(v28.h,v3.h)
1141 ; CHECK-NEXT:    }
1142 ; CHECK-NEXT:    {
1143 ; CHECK-NEXT:     q0 = vcmp.gt(v28.h,v4.h)
1144 ; CHECK-NEXT:    }
1145 ; CHECK-NEXT:    {
1146 ; CHECK-NEXT:     v5.h = vlsr(v5.h,v4.h)
1147 ; CHECK-NEXT:    }
1148 ; CHECK-NEXT:    {
1149 ; CHECK-NEXT:     v2.h = vlsr(v2.h,v3.h)
1150 ; CHECK-NEXT:     v30 = vmux(q0,v29,v5)
1151 ; CHECK-NEXT:    }
1152 ; CHECK-NEXT:    {
1153 ; CHECK-NEXT:     v31 = vmux(q1,v29,v2)
1154 ; CHECK-NEXT:     v0 = vmux(q2,v28,v30)
1155 ; CHECK-NEXT:    }
1156 ; CHECK-NEXT:    {
1157 ; CHECK-NEXT:     v1 = vmux(q3,v28,v31)
1158 ; CHECK-NEXT:    }
1159 ; CHECK-NEXT:    {
1160 ; CHECK-NEXT:     v0.ub = vpack(v1.h,v0.h):sat
1161 ; CHECK-NEXT:     jumpr r31
1162 ; CHECK-NEXT:     vmem(r1+#0) = v0.new
1163 ; CHECK-NEXT:    }
1164   %v0 = load <128 x half>, ptr %a0, align 128
1165   %v1 = fptoui <128 x half> %v0 to <128 x i8>
1166   store <128 x i8> %v1, ptr %a1, align 128
1167   ret void
1170 ; Widen result
1171 define void @f16u8_1(ptr %a0, ptr %a1) #0 {
1172 ; CHECK-LABEL: f16u8_1:
1173 ; CHECK:         .cfi_startproc
1174 ; CHECK-NEXT:  // %bb.0:
1175 ; CHECK-NEXT:    {
1176 ; CHECK-NEXT:     r7 = ##32768
1177 ; CHECK-NEXT:     r3:2 = combine(#5,#1)
1178 ; CHECK-NEXT:     v0 = vmem(r0+#0)
1179 ; CHECK-NEXT:    }
1180 ; CHECK-NEXT:    {
1181 ; CHECK-NEXT:     v2.h = vsplat(r7)
1182 ; CHECK-NEXT:     v3.h = vasl(v0.h,r2)
1183 ; CHECK-NEXT:     r6 = #14
1184 ; CHECK-NEXT:     r5 = #11
1185 ; CHECK-NEXT:    }
1186 ; CHECK-NEXT:    {
1187 ; CHECK-NEXT:     v4.h = vsplat(r6)
1188 ; CHECK-NEXT:     r4 = #16
1189 ; CHECK-NEXT:     v6.h = vasl(v0.h,r3)
1190 ; CHECK-NEXT:     v3.h = vsub(v3.h,v2.h)
1191 ; CHECK-NEXT:    }
1192 ; CHECK-NEXT:    {
1193 ; CHECK-NEXT:     v5.h = vsplat(r4)
1194 ; CHECK-NEXT:     r3 = #32767
1195 ; CHECK-NEXT:     v2 = vor(v6,v2)
1196 ; CHECK-NEXT:     v1 = vxor(v1,v1)
1197 ; CHECK-NEXT:    }
1198 ; CHECK-NEXT:    {
1199 ; CHECK-NEXT:     v30.h = vsplat(r3)
1200 ; CHECK-NEXT:     r2 = #64
1201 ; CHECK-NEXT:     v3.h = vasr(v3.h,r5)
1202 ; CHECK-NEXT:     q1 = vcmp.gt(v1.h,v0.h)
1203 ; CHECK-NEXT:    }
1204 ; CHECK-NEXT:    {
1205 ; CHECK-NEXT:     q3 = vsetq(r2)
1206 ; CHECK-NEXT:     v3.h = vsub(v4.h,v3.h)
1207 ; CHECK-NEXT:    }
1208 ; CHECK-NEXT:    {
1209 ; CHECK-NEXT:     v3.h = vmin(v3.h,v5.h)
1210 ; CHECK-NEXT:    }
1211 ; CHECK-NEXT:    {
1212 ; CHECK-NEXT:     q0 = vcmp.gt(v1.h,v3.h)
1213 ; CHECK-NEXT:    }
1214 ; CHECK-NEXT:    {
1215 ; CHECK-NEXT:     v2.h = vlsr(v2.h,v3.h)
1216 ; CHECK-NEXT:    }
1217 ; CHECK-NEXT:    {
1218 ; CHECK-NEXT:     v31 = vmux(q0,v30,v2)
1219 ; CHECK-NEXT:    }
1220 ; CHECK-NEXT:    {
1221 ; CHECK-NEXT:     v0 = vmux(q1,v1,v31)
1222 ; CHECK-NEXT:    }
1223 ; CHECK-NEXT:    {
1224 ; CHECK-NEXT:     v0.ub = vpack(v0.h,v0.h):sat
1225 ; CHECK-NEXT:    }
1226 ; CHECK-NEXT:    {
1227 ; CHECK-NEXT:     jumpr r31
1228 ; CHECK-NEXT:     if (q3) vmem(r1+#0) = v0
1229 ; CHECK-NEXT:    }
1230   %v0 = load <64 x half>, ptr %a0, align 128
1231   %v1 = fptoui <64 x half> %v0 to <64 x i8>
1232   store <64 x i8> %v1, ptr %a1, align 128
1233   ret void
1236 ; f16 -> u16
1237 ; No widening
1238 define void @f16u16_0(ptr %a0, ptr %a1) #0 {
1239 ; CHECK-LABEL: f16u16_0:
1240 ; CHECK:         .cfi_startproc
1241 ; CHECK-NEXT:  // %bb.0:
1242 ; CHECK-NEXT:    {
1243 ; CHECK-NEXT:     r7 = ##32768
1244 ; CHECK-NEXT:     r3:2 = combine(#5,#1)
1245 ; CHECK-NEXT:     v0 = vmem(r0+#0)
1246 ; CHECK-NEXT:    }
1247 ; CHECK-NEXT:    {
1248 ; CHECK-NEXT:     v2.h = vsplat(r7)
1249 ; CHECK-NEXT:     v3.h = vasl(v0.h,r2)
1250 ; CHECK-NEXT:     r6 = #14
1251 ; CHECK-NEXT:     r5 = #11
1252 ; CHECK-NEXT:    }
1253 ; CHECK-NEXT:    {
1254 ; CHECK-NEXT:     v4.h = vsplat(r6)
1255 ; CHECK-NEXT:     r4 = #16
1256 ; CHECK-NEXT:     v6.h = vasl(v0.h,r3)
1257 ; CHECK-NEXT:     v3.h = vsub(v3.h,v2.h)
1258 ; CHECK-NEXT:    }
1259 ; CHECK-NEXT:    {
1260 ; CHECK-NEXT:     v5.h = vsplat(r4)
1261 ; CHECK-NEXT:     r2 = #32767
1262 ; CHECK-NEXT:     v2 = vor(v6,v2)
1263 ; CHECK-NEXT:     v1 = vxor(v1,v1)
1264 ; CHECK-NEXT:    }
1265 ; CHECK-NEXT:    {
1266 ; CHECK-NEXT:     v30.h = vsplat(r2)
1267 ; CHECK-NEXT:     v3.h = vasr(v3.h,r5)
1268 ; CHECK-NEXT:     q1 = vcmp.gt(v1.h,v0.h)
1269 ; CHECK-NEXT:    }
1270 ; CHECK-NEXT:    {
1271 ; CHECK-NEXT:     v3.h = vsub(v4.h,v3.h)
1272 ; CHECK-NEXT:    }
1273 ; CHECK-NEXT:    {
1274 ; CHECK-NEXT:     v3.h = vmin(v3.h,v5.h)
1275 ; CHECK-NEXT:    }
1276 ; CHECK-NEXT:    {
1277 ; CHECK-NEXT:     q0 = vcmp.gt(v1.h,v3.h)
1278 ; CHECK-NEXT:    }
1279 ; CHECK-NEXT:    {
1280 ; CHECK-NEXT:     v2.h = vlsr(v2.h,v3.h)
1281 ; CHECK-NEXT:    }
1282 ; CHECK-NEXT:    {
1283 ; CHECK-NEXT:     v31 = vmux(q0,v30,v2)
1284 ; CHECK-NEXT:    }
1285 ; CHECK-NEXT:    {
1286 ; CHECK-NEXT:     v0 = vmux(q1,v1,v31)
1287 ; CHECK-NEXT:     jumpr r31
1288 ; CHECK-NEXT:     vmem(r1+#0) = v0.new
1289 ; CHECK-NEXT:    }
1290   %v0 = load <64 x half>, ptr %a0, align 128
1291   %v1 = fptoui <64 x half> %v0 to <64 x i16>
1292   store <64 x i16> %v1, ptr %a1, align 128
1293   ret void
1296 ; Widen input and result
1297 define void @f16u16_1(ptr %a0, ptr %a1) #0 {
1298 ; CHECK-LABEL: f16u16_1:
1299 ; CHECK:         .cfi_startproc
1300 ; CHECK-NEXT:  // %bb.0:
1301 ; CHECK-NEXT:    {
1302 ; CHECK-NEXT:     r7 = ##32768
1303 ; CHECK-NEXT:     r3:2 = combine(#5,#1)
1304 ; CHECK-NEXT:     v0 = vmem(r0+#0)
1305 ; CHECK-NEXT:    }
1306 ; CHECK-NEXT:    {
1307 ; CHECK-NEXT:     v2.h = vsplat(r7)
1308 ; CHECK-NEXT:     v3.h = vasl(v0.h,r2)
1309 ; CHECK-NEXT:     r6 = #14
1310 ; CHECK-NEXT:     r5 = #11
1311 ; CHECK-NEXT:    }
1312 ; CHECK-NEXT:    {
1313 ; CHECK-NEXT:     v4.h = vsplat(r6)
1314 ; CHECK-NEXT:     r4 = #16
1315 ; CHECK-NEXT:     v6.h = vasl(v0.h,r3)
1316 ; CHECK-NEXT:     v3.h = vsub(v3.h,v2.h)
1317 ; CHECK-NEXT:    }
1318 ; CHECK-NEXT:    {
1319 ; CHECK-NEXT:     v5.h = vsplat(r4)
1320 ; CHECK-NEXT:     r3 = #32767
1321 ; CHECK-NEXT:     v2 = vor(v6,v2)
1322 ; CHECK-NEXT:     v1 = vxor(v1,v1)
1323 ; CHECK-NEXT:    }
1324 ; CHECK-NEXT:    {
1325 ; CHECK-NEXT:     v30.h = vsplat(r3)
1326 ; CHECK-NEXT:     r2 = #64
1327 ; CHECK-NEXT:     v3.h = vasr(v3.h,r5)
1328 ; CHECK-NEXT:     q1 = vcmp.gt(v1.h,v0.h)
1329 ; CHECK-NEXT:    }
1330 ; CHECK-NEXT:    {
1331 ; CHECK-NEXT:     q3 = vsetq(r2)
1332 ; CHECK-NEXT:     v3.h = vsub(v4.h,v3.h)
1333 ; CHECK-NEXT:    }
1334 ; CHECK-NEXT:    {
1335 ; CHECK-NEXT:     v3.h = vmin(v3.h,v5.h)
1336 ; CHECK-NEXT:    }
1337 ; CHECK-NEXT:    {
1338 ; CHECK-NEXT:     q0 = vcmp.gt(v1.h,v3.h)
1339 ; CHECK-NEXT:    }
1340 ; CHECK-NEXT:    {
1341 ; CHECK-NEXT:     v2.h = vlsr(v2.h,v3.h)
1342 ; CHECK-NEXT:    }
1343 ; CHECK-NEXT:    {
1344 ; CHECK-NEXT:     v31 = vmux(q0,v30,v2)
1345 ; CHECK-NEXT:    }
1346 ; CHECK-NEXT:    {
1347 ; CHECK-NEXT:     v0 = vmux(q1,v1,v31)
1348 ; CHECK-NEXT:    }
1349 ; CHECK-NEXT:    {
1350 ; CHECK-NEXT:     jumpr r31
1351 ; CHECK-NEXT:     if (q3) vmem(r1+#0) = v0
1352 ; CHECK-NEXT:    }
1353   %v0 = load <32 x half>, ptr %a0, align 128
1354   %v1 = fptoui <32 x half> %v0 to <32 x i16>
1355   store <32 x i16> %v1, ptr %a1, align 128
1356   ret void
1359 ; f16 -> u32
1360 ; No widening
1361 define void @f16u32_0(ptr %a0, ptr %a1) #0 {
1362 ; CHECK-LABEL: f16u32_0:
1363 ; CHECK:         .cfi_startproc
1364 ; CHECK-NEXT:  // %bb.0:
1365 ; CHECK-NEXT:    {
1366 ; CHECK-NEXT:     r2 = #15360
1367 ; CHECK-NEXT:     r7 = #-4
1368 ; CHECK-NEXT:     v0 = vmem(r0+#0)
1369 ; CHECK-NEXT:    }
1370 ; CHECK-NEXT:    {
1371 ; CHECK-NEXT:     v1.h = vsplat(r2)
1372 ; CHECK-NEXT:     r4 = ##-2147483648
1373 ; CHECK-NEXT:     r3:2 = combine(#30,#1)
1374 ; CHECK-NEXT:    }
1375 ; CHECK-NEXT:    {
1376 ; CHECK-NEXT:     v2 = vsplat(r4)
1377 ; CHECK-NEXT:     r4 = #32
1378 ; CHECK-NEXT:     r6 = #24
1379 ; CHECK-NEXT:     r0 = #8
1380 ; CHECK-NEXT:    }
1381 ; CHECK-NEXT:    {
1382 ; CHECK-NEXT:     v6 = vsplat(r3)
1383 ; CHECK-NEXT:     v26 = vxor(v26,v26)
1384 ; CHECK-NEXT:    }
1385 ; CHECK-NEXT:    {
1386 ; CHECK-NEXT:     v1:0.qf32 = vmpy(v0.hf,v1.hf)
1387 ; CHECK-NEXT:    }
1388 ; CHECK-NEXT:    {
1389 ; CHECK-NEXT:     v7 = vsplat(r4)
1390 ; CHECK-NEXT:    }
1391 ; CHECK-NEXT:    {
1392 ; CHECK-NEXT:     v0.sf = v0.qf32
1393 ; CHECK-NEXT:    }
1394 ; CHECK-NEXT:    {
1395 ; CHECK-NEXT:     v1.sf = v1.qf32
1396 ; CHECK-NEXT:    }
1397 ; CHECK-NEXT:    {
1398 ; CHECK-NEXT:     v1:0 = vshuff(v1,v0,r7)
1399 ; CHECK-NEXT:    }
1400 ; CHECK-NEXT:    {
1401 ; CHECK-NEXT:     q1 = vcmp.gt(v26.w,v1.w)
1402 ; CHECK-NEXT:     q3 = vcmp.gt(v26.w,v0.w)
1403 ; CHECK-NEXT:    }
1404 ; CHECK-NEXT:    {
1405 ; CHECK-NEXT:     v3.w = vasl(v1.w,r2)
1406 ; CHECK-NEXT:    }
1407 ; CHECK-NEXT:    {
1408 ; CHECK-NEXT:     r2 = ##2147483647
1409 ; CHECK-NEXT:     v4.w = vasl(v0.w,r2)
1410 ; CHECK-NEXT:     v3.w = vsub(v3.w,v2.w)
1411 ; CHECK-NEXT:    }
1412 ; CHECK-NEXT:    {
1413 ; CHECK-NEXT:     v27 = vsplat(r2)
1414 ; CHECK-NEXT:     v5.w = vasl(v1.w,r0)
1415 ; CHECK-NEXT:     v4.w = vsub(v4.w,v2.w)
1416 ; CHECK-NEXT:    }
1417 ; CHECK-NEXT:    {
1418 ; CHECK-NEXT:     v3.w = vasr(v3.w,r6)
1419 ; CHECK-NEXT:     v5 = vor(v5,v2)
1420 ; CHECK-NEXT:    }
1421 ; CHECK-NEXT:    {
1422 ; CHECK-NEXT:     v4.w = vasr(v4.w,r6)
1423 ; CHECK-NEXT:     v3.w = vsub(v6.w,v3.w)
1424 ; CHECK-NEXT:    }
1425 ; CHECK-NEXT:    {
1426 ; CHECK-NEXT:     v8.w = vasl(v0.w,r0)
1427 ; CHECK-NEXT:     v4.w = vsub(v6.w,v4.w)
1428 ; CHECK-NEXT:     v3.w = vmin(v3.w,v7.w)
1429 ; CHECK-NEXT:    }
1430 ; CHECK-NEXT:    {
1431 ; CHECK-NEXT:     v4.w = vmin(v4.w,v7.w)
1432 ; CHECK-NEXT:     v2 = vor(v8,v2)
1433 ; CHECK-NEXT:     q0 = vcmp.gt(v26.w,v3.w)
1434 ; CHECK-NEXT:    }
1435 ; CHECK-NEXT:    {
1436 ; CHECK-NEXT:     v3.w = vlsr(v5.w,v3.w)
1437 ; CHECK-NEXT:     q2 = vcmp.gt(v26.w,v4.w)
1438 ; CHECK-NEXT:    }
1439 ; CHECK-NEXT:    {
1440 ; CHECK-NEXT:     v28.w = vlsr(v2.w,v4.w)
1441 ; CHECK-NEXT:     v29 = vmux(q0,v27,v3)
1442 ; CHECK-NEXT:    }
1443 ; CHECK-NEXT:    {
1444 ; CHECK-NEXT:     v30 = vmux(q2,v27,v28)
1445 ; CHECK-NEXT:     v31 = vmux(q1,v26,v29)
1446 ; CHECK-NEXT:     vmem(r1+#1) = v31.new
1447 ; CHECK-NEXT:    }
1448 ; CHECK-NEXT:    {
1449 ; CHECK-NEXT:     v0 = vmux(q3,v26,v30)
1450 ; CHECK-NEXT:     jumpr r31
1451 ; CHECK-NEXT:     vmem(r1+#0) = v0.new
1452 ; CHECK-NEXT:    }
1453   %v0 = load <64 x half>, ptr %a0, align 128
1454   %v1 = fptoui <64 x half> %v0 to <64 x i32>
1455   store <64 x i32> %v1, ptr %a1, align 128
1456   ret void
1459 ; Widen input
1460 define void @f16u32_1(ptr %a0, ptr %a1) #0 {
1461 ; CHECK-LABEL: f16u32_1:
1462 ; CHECK:         .cfi_startproc
1463 ; CHECK-NEXT:  // %bb.0:
1464 ; CHECK-NEXT:    {
1465 ; CHECK-NEXT:     r4 = #15360
1466 ; CHECK-NEXT:     r7 = #-4
1467 ; CHECK-NEXT:     v0 = vmem(r0+#0)
1468 ; CHECK-NEXT:    }
1469 ; CHECK-NEXT:    {
1470 ; CHECK-NEXT:     v1.h = vsplat(r4)
1471 ; CHECK-NEXT:     r2 = ##-2147483648
1472 ; CHECK-NEXT:     r3 = #1
1473 ; CHECK-NEXT:    }
1474 ; CHECK-NEXT:    {
1475 ; CHECK-NEXT:     v3 = vsplat(r2)
1476 ; CHECK-NEXT:     r5:4 = combine(#8,#30)
1477 ; CHECK-NEXT:     r6 = #24
1478 ; CHECK-NEXT:    }
1479 ; CHECK-NEXT:    {
1480 ; CHECK-NEXT:     v4 = vsplat(r4)
1481 ; CHECK-NEXT:     r2 = ##2147483647
1482 ; CHECK-NEXT:     r4 = #32
1483 ; CHECK-NEXT:    }
1484 ; CHECK-NEXT:    {
1485 ; CHECK-NEXT:     v1:0.qf32 = vmpy(v0.hf,v1.hf)
1486 ; CHECK-NEXT:     v2 = vxor(v2,v2)
1487 ; CHECK-NEXT:    }
1488 ; CHECK-NEXT:    {
1489 ; CHECK-NEXT:     v5 = vsplat(r4)
1490 ; CHECK-NEXT:     v30 = vsplat(r2)
1491 ; CHECK-NEXT:    }
1492 ; CHECK-NEXT:    {
1493 ; CHECK-NEXT:     v0.sf = v0.qf32
1494 ; CHECK-NEXT:    }
1495 ; CHECK-NEXT:    {
1496 ; CHECK-NEXT:     v1.sf = v1.qf32
1497 ; CHECK-NEXT:    }
1498 ; CHECK-NEXT:    {
1499 ; CHECK-NEXT:     v1:0 = vshuff(v1,v0,r7)
1500 ; CHECK-NEXT:    }
1501 ; CHECK-NEXT:    {
1502 ; CHECK-NEXT:     q1 = vcmp.gt(v2.w,v0.w)
1503 ; CHECK-NEXT:    }
1504 ; CHECK-NEXT:    {
1505 ; CHECK-NEXT:     v1.w = vasl(v0.w,r3)
1506 ; CHECK-NEXT:    }
1507 ; CHECK-NEXT:    {
1508 ; CHECK-NEXT:     v6.w = vasl(v0.w,r5)
1509 ; CHECK-NEXT:     v1.w = vsub(v1.w,v3.w)
1510 ; CHECK-NEXT:    }
1511 ; CHECK-NEXT:    {
1512 ; CHECK-NEXT:     v3 = vor(v6,v3)
1513 ; CHECK-NEXT:    }
1514 ; CHECK-NEXT:    {
1515 ; CHECK-NEXT:     v1.w = vasr(v1.w,r6)
1516 ; CHECK-NEXT:    }
1517 ; CHECK-NEXT:    {
1518 ; CHECK-NEXT:     v1.w = vsub(v4.w,v1.w)
1519 ; CHECK-NEXT:    }
1520 ; CHECK-NEXT:    {
1521 ; CHECK-NEXT:     v1.w = vmin(v1.w,v5.w)
1522 ; CHECK-NEXT:    }
1523 ; CHECK-NEXT:    {
1524 ; CHECK-NEXT:     q0 = vcmp.gt(v2.w,v1.w)
1525 ; CHECK-NEXT:    }
1526 ; CHECK-NEXT:    {
1527 ; CHECK-NEXT:     v1.w = vlsr(v3.w,v1.w)
1528 ; CHECK-NEXT:    }
1529 ; CHECK-NEXT:    {
1530 ; CHECK-NEXT:     v31 = vmux(q0,v30,v1)
1531 ; CHECK-NEXT:    }
1532 ; CHECK-NEXT:    {
1533 ; CHECK-NEXT:     v0 = vmux(q1,v2,v31)
1534 ; CHECK-NEXT:     jumpr r31
1535 ; CHECK-NEXT:     vmem(r1+#0) = v0.new
1536 ; CHECK-NEXT:    }
1537   %v0 = load <32 x half>, ptr %a0, align 128
1538   %v1 = fptoui <32 x half> %v0 to <32 x i32>
1539   store <32 x i32> %v1, ptr %a1, align 128
1540   ret void
1543 ; f32 -> u8
1544 ; No widening
1545 define void @f32u8_0(ptr %a0, ptr %a1) #0 {
1546 ; CHECK-LABEL: f32u8_0:
1547 ; CHECK:         .cfi_startproc
1548 ; CHECK-NEXT:  // %bb.0:
1549 ; CHECK-NEXT:    {
1550 ; CHECK-NEXT:     r3:2 = combine(#8,#1)
1551 ; CHECK-NEXT:     r4 = ##-2147483648
1552 ; CHECK-NEXT:     v5 = vmem(r0+#0)
1553 ; CHECK-NEXT:    }
1554 ; CHECK-NEXT:    {
1555 ; CHECK-NEXT:     v3 = vsplat(r4)
1556 ; CHECK-NEXT:     r5 = #30
1557 ; CHECK-NEXT:     r6 = #24
1558 ; CHECK-NEXT:     v2 = vmem(r0+#1)
1559 ; CHECK-NEXT:    }
1560 ; CHECK-NEXT:    {
1561 ; CHECK-NEXT:     v14 = vsplat(r5)
1562 ; CHECK-NEXT:     r4 = #32
1563 ; CHECK-NEXT:     v8.w = vasl(v5.w,r2)
1564 ; CHECK-NEXT:     v0 = vmem(r0+#3)
1565 ; CHECK-NEXT:    }
1566 ; CHECK-NEXT:    {
1567 ; CHECK-NEXT:     v9.w = vasl(v2.w,r2)
1568 ; CHECK-NEXT:     v13 = vxor(v13,v13)
1569 ; CHECK-NEXT:     v8.w = vsub(v8.w,v3.w)
1570 ; CHECK-NEXT:     v1 = vmem(r0+#2)
1571 ; CHECK-NEXT:    }
1572 ; CHECK-NEXT:    {
1573 ; CHECK-NEXT:     v20 = vsplat(r4)
1574 ; CHECK-NEXT:     v12.w = vasl(v0.w,r2)
1575 ; CHECK-NEXT:     v9.w = vsub(v9.w,v3.w)
1576 ; CHECK-NEXT:     q0 = vcmp.gt(v13.w,v5.w)
1577 ; CHECK-NEXT:    }
1578 ; CHECK-NEXT:    {
1579 ; CHECK-NEXT:     v11.w = vasl(v1.w,r2)
1580 ; CHECK-NEXT:     q3 = vcmp.gt(v13.w,v2.w)
1581 ; CHECK-NEXT:     v12.w = vsub(v12.w,v3.w)
1582 ; CHECK-NEXT:    }
1583 ; CHECK-NEXT:    {
1584 ; CHECK-NEXT:     r2 = ##2147483647
1585 ; CHECK-NEXT:     r7 = #64
1586 ; CHECK-NEXT:     v11.w = vsub(v11.w,v3.w)
1587 ; CHECK-NEXT:    }
1588 ; CHECK-NEXT:    {
1589 ; CHECK-NEXT:     v22 = vsplat(r2)
1590 ; CHECK-NEXT:     v8.w = vasr(v8.w,r6)
1591 ; CHECK-NEXT:    }
1592 ; CHECK-NEXT:    {
1593 ; CHECK-NEXT:     v9.w = vasr(v9.w,r6)
1594 ; CHECK-NEXT:     v8.w = vsub(v14.w,v8.w)
1595 ; CHECK-NEXT:    }
1596 ; CHECK-NEXT:    {
1597 ; CHECK-NEXT:     v6.w = vasl(v5.w,r3)
1598 ; CHECK-NEXT:     v9.w = vsub(v14.w,v9.w)
1599 ; CHECK-NEXT:     v8.w = vmin(v8.w,v20.w)
1600 ; CHECK-NEXT:    }
1601 ; CHECK-NEXT:    {
1602 ; CHECK-NEXT:     v7.w = vasl(v2.w,r3)
1603 ; CHECK-NEXT:     v6 = vor(v6,v3)
1604 ; CHECK-NEXT:     v9.w = vmin(v9.w,v20.w)
1605 ; CHECK-NEXT:     q1 = vcmp.gt(v13.w,v8.w)
1606 ; CHECK-NEXT:    }
1607 ; CHECK-NEXT:    {
1608 ; CHECK-NEXT:     v19.w = vasr(v11.w,r6)
1609 ; CHECK-NEXT:     v7 = vor(v7,v3)
1610 ; CHECK-NEXT:     q2 = vcmp.gt(v13.w,v9.w)
1611 ; CHECK-NEXT:    }
1612 ; CHECK-NEXT:    {
1613 ; CHECK-NEXT:     v12.w = vasr(v12.w,r6)
1614 ; CHECK-NEXT:     v5.w = vsub(v14.w,v19.w)
1615 ; CHECK-NEXT:    }
1616 ; CHECK-NEXT:    {
1617 ; CHECK-NEXT:     v4.w = vasl(v1.w,r3)
1618 ; CHECK-NEXT:     v21.w = vsub(v14.w,v12.w)
1619 ; CHECK-NEXT:     v5.w = vmin(v5.w,v20.w)
1620 ; CHECK-NEXT:    }
1621 ; CHECK-NEXT:    {
1622 ; CHECK-NEXT:     v10.w = vasl(v0.w,r3)
1623 ; CHECK-NEXT:     v4 = vor(v4,v3)
1624 ; CHECK-NEXT:    }
1625 ; CHECK-NEXT:    {
1626 ; CHECK-NEXT:     v6.w = vlsr(v6.w,v8.w)
1627 ; CHECK-NEXT:     v3 = vor(v10,v3)
1628 ; CHECK-NEXT:     v10.w = vmin(v21.w,v20.w)
1629 ; CHECK-NEXT:    }
1630 ; CHECK-NEXT:    {
1631 ; CHECK-NEXT:     v7.w = vlsr(v7.w,v9.w)
1632 ; CHECK-NEXT:     v24 = vmux(q1,v22,v6)
1633 ; CHECK-NEXT:     q1 = vcmp.gt(v13.w,v5.w)
1634 ; CHECK-NEXT:    }
1635 ; CHECK-NEXT:    {
1636 ; CHECK-NEXT:     v23.w = vlsr(v4.w,v5.w)
1637 ; CHECK-NEXT:     v25 = vmux(q2,v22,v7)
1638 ; CHECK-NEXT:     q2 = vcmp.gt(v13.w,v10.w)
1639 ; CHECK-NEXT:     v4 = vmux(q0,v13,v24)
1640 ; CHECK-NEXT:    }
1641 ; CHECK-NEXT:    {
1642 ; CHECK-NEXT:     v3.w = vlsr(v3.w,v10.w)
1643 ; CHECK-NEXT:     v26 = vmux(q3,v13,v25)
1644 ; CHECK-NEXT:     v2 = vmux(q1,v22,v23)
1645 ; CHECK-NEXT:     q1 = vcmp.gt(v13.w,v1.w)
1646 ; CHECK-NEXT:    }
1647 ; CHECK-NEXT:    {
1648 ; CHECK-NEXT:     v27 = vmux(q2,v22,v3)
1649 ; CHECK-NEXT:     q3 = vcmp.gt(v13.w,v0.w)
1650 ; CHECK-NEXT:     v28 = vmux(q1,v13,v2)
1651 ; CHECK-NEXT:    }
1652 ; CHECK-NEXT:    {
1653 ; CHECK-NEXT:     v29.uh = vpack(v26.w,v4.w):sat
1654 ; CHECK-NEXT:     v1 = vmux(q3,v13,v27)
1655 ; CHECK-NEXT:    }
1656 ; CHECK-NEXT:    {
1657 ; CHECK-NEXT:     v30.uh = vpack(v1.w,v28.w):sat
1658 ; CHECK-NEXT:    }
1659 ; CHECK-NEXT:    {
1660 ; CHECK-NEXT:     v0.uh = vpack(v1.w,v28.w):sat
1661 ; CHECK-NEXT:    }
1662 ; CHECK-NEXT:    {
1663 ; CHECK-NEXT:     v31.ub = vpack(v30.h,v29.h):sat
1664 ; CHECK-NEXT:    }
1665 ; CHECK-NEXT:    {
1666 ; CHECK-NEXT:     v0.ub = vpack(v30.h,v0.h):sat
1667 ; CHECK-NEXT:    }
1668 ; CHECK-NEXT:    {
1669 ; CHECK-NEXT:     v1:0 = vshuff(v0,v31,r7)
1670 ; CHECK-NEXT:     jumpr r31
1671 ; CHECK-NEXT:     vmem(r1+#0) = v0.new
1672 ; CHECK-NEXT:    }
1673   %v0 = load <128 x float>, ptr %a0, align 128
1674   %v1 = fptoui <128 x float> %v0 to <128 x i8>
1675   store <128 x i8> %v1, ptr %a1, align 128
1676   ret void
1679 ; Widen result #1
1680 define void @f32u8_1(ptr %a0, ptr %a1) #0 {
1681 ; CHECK-LABEL: f32u8_1:
1682 ; CHECK:         .cfi_startproc
1683 ; CHECK-NEXT:  // %bb.0:
1684 ; CHECK-NEXT:    {
1685 ; CHECK-NEXT:     r3:2 = combine(##-2147483648,#1)
1686 ; CHECK-NEXT:     r4 = #30
1687 ; CHECK-NEXT:     v0 = vmem(r0+#1)
1688 ; CHECK-NEXT:    }
1689 ; CHECK-NEXT:    {
1690 ; CHECK-NEXT:     v2 = vsplat(r3)
1691 ; CHECK-NEXT:     r7:6 = combine(#24,#32)
1692 ; CHECK-NEXT:     v3.w = vasl(v0.w,r2)
1693 ; CHECK-NEXT:     v1 = vmem(r0+#0)
1694 ; CHECK-NEXT:    }
1695 ; CHECK-NEXT:    {
1696 ; CHECK-NEXT:     v6 = vsplat(r4)
1697 ; CHECK-NEXT:     r5 = #8
1698 ; CHECK-NEXT:     v4.w = vasl(v1.w,r2)
1699 ; CHECK-NEXT:     v3.w = vsub(v3.w,v2.w)
1700 ; CHECK-NEXT:    }
1701 ; CHECK-NEXT:    {
1702 ; CHECK-NEXT:     v7 = vsplat(r6)
1703 ; CHECK-NEXT:     v5.w = vasl(v1.w,r5)
1704 ; CHECK-NEXT:     v4.w = vsub(v4.w,v2.w)
1705 ; CHECK-NEXT:     v27 = vxor(v27,v27)
1706 ; CHECK-NEXT:    }
1707 ; CHECK-NEXT:    {
1708 ; CHECK-NEXT:     r3 = ##2147483647
1709 ; CHECK-NEXT:     v3.w = vasr(v3.w,r7)
1710 ; CHECK-NEXT:     v5 = vor(v5,v2)
1711 ; CHECK-NEXT:    }
1712 ; CHECK-NEXT:    {
1713 ; CHECK-NEXT:     v28 = vsplat(r3)
1714 ; CHECK-NEXT:     v4.w = vasr(v4.w,r7)
1715 ; CHECK-NEXT:     q2 = vcmp.gt(v27.w,v1.w)
1716 ; CHECK-NEXT:     v3.w = vsub(v6.w,v3.w)
1717 ; CHECK-NEXT:    }
1718 ; CHECK-NEXT:    {
1719 ; CHECK-NEXT:     r2 = #64
1720 ; CHECK-NEXT:     v8.w = vasl(v0.w,r5)
1721 ; CHECK-NEXT:     q3 = vcmp.gt(v27.w,v0.w)
1722 ; CHECK-NEXT:     v4.w = vsub(v6.w,v4.w)
1723 ; CHECK-NEXT:    }
1724 ; CHECK-NEXT:    {
1725 ; CHECK-NEXT:     v3.w = vmin(v3.w,v7.w)
1726 ; CHECK-NEXT:     v4.w = vmin(v4.w,v7.w)
1727 ; CHECK-NEXT:     v2 = vor(v8,v2)
1728 ; CHECK-NEXT:    }
1729 ; CHECK-NEXT:    {
1730 ; CHECK-NEXT:     q1 = vcmp.gt(v27.w,v3.w)
1731 ; CHECK-NEXT:     q0 = vcmp.gt(v27.w,v4.w)
1732 ; CHECK-NEXT:    }
1733 ; CHECK-NEXT:    {
1734 ; CHECK-NEXT:     v5.w = vlsr(v5.w,v4.w)
1735 ; CHECK-NEXT:    }
1736 ; CHECK-NEXT:    {
1737 ; CHECK-NEXT:     v2.w = vlsr(v2.w,v3.w)
1738 ; CHECK-NEXT:     v29 = vmux(q0,v28,v5)
1739 ; CHECK-NEXT:    }
1740 ; CHECK-NEXT:    {
1741 ; CHECK-NEXT:     v30 = vmux(q1,v28,v2)
1742 ; CHECK-NEXT:     v0 = vmux(q2,v27,v29)
1743 ; CHECK-NEXT:    }
1744 ; CHECK-NEXT:    {
1745 ; CHECK-NEXT:     q3 = vsetq(r2)
1746 ; CHECK-NEXT:     v1 = vmux(q3,v27,v30)
1747 ; CHECK-NEXT:    }
1748 ; CHECK-NEXT:    {
1749 ; CHECK-NEXT:     v31.uh = vpack(v1.w,v0.w):sat
1750 ; CHECK-NEXT:    }
1751 ; CHECK-NEXT:    {
1752 ; CHECK-NEXT:     v0.uh = vpack(v1.w,v0.w):sat
1753 ; CHECK-NEXT:    }
1754 ; CHECK-NEXT:    {
1755 ; CHECK-NEXT:     v0.ub = vpack(v31.h,v0.h):sat
1756 ; CHECK-NEXT:    }
1757 ; CHECK-NEXT:    {
1758 ; CHECK-NEXT:     jumpr r31
1759 ; CHECK-NEXT:     if (q3) vmem(r1+#0) = v0
1760 ; CHECK-NEXT:    }
1761   %v0 = load <64 x float>, ptr %a0, align 128
1762   %v1 = fptoui <64 x float> %v0 to <64 x i8>
1763   store <64 x i8> %v1, ptr %a1, align 128
1764   ret void
1767 ; Widen result #2
1768 define void @f32u8_2(ptr %a0, ptr %a1) #0 {
1769 ; CHECK-LABEL: f32u8_2:
1770 ; CHECK:         .cfi_startproc
1771 ; CHECK-NEXT:  // %bb.0:
1772 ; CHECK-NEXT:    {
1773 ; CHECK-NEXT:     r7 = ##-2147483648
1774 ; CHECK-NEXT:     r3:2 = combine(#30,#1)
1775 ; CHECK-NEXT:     v0 = vmem(r0+#0)
1776 ; CHECK-NEXT:    }
1777 ; CHECK-NEXT:    {
1778 ; CHECK-NEXT:     v2 = vsplat(r7)
1779 ; CHECK-NEXT:     r5:4 = combine(#8,#24)
1780 ; CHECK-NEXT:     r6 = #32
1781 ; CHECK-NEXT:     v3.w = vasl(v0.w,r2)
1782 ; CHECK-NEXT:    }
1783 ; CHECK-NEXT:    {
1784 ; CHECK-NEXT:     v4 = vsplat(r3)
1785 ; CHECK-NEXT:     v5 = vsplat(r6)
1786 ; CHECK-NEXT:     v6.w = vasl(v0.w,r5)
1787 ; CHECK-NEXT:     v3.w = vsub(v3.w,v2.w)
1788 ; CHECK-NEXT:    }
1789 ; CHECK-NEXT:    {
1790 ; CHECK-NEXT:     v1 = vxor(v1,v1)
1791 ; CHECK-NEXT:     v2 = vor(v6,v2)
1792 ; CHECK-NEXT:    }
1793 ; CHECK-NEXT:    {
1794 ; CHECK-NEXT:     q3 = vsetq(r6)
1795 ; CHECK-NEXT:     v3.w = vasr(v3.w,r4)
1796 ; CHECK-NEXT:     q1 = vcmp.gt(v1.w,v0.w)
1797 ; CHECK-NEXT:    }
1798 ; CHECK-NEXT:    {
1799 ; CHECK-NEXT:     r4 = ##2147483647
1800 ; CHECK-NEXT:     v3.w = vsub(v4.w,v3.w)
1801 ; CHECK-NEXT:    }
1802 ; CHECK-NEXT:    {
1803 ; CHECK-NEXT:     v30 = vsplat(r4)
1804 ; CHECK-NEXT:     v3.w = vmin(v3.w,v5.w)
1805 ; CHECK-NEXT:    }
1806 ; CHECK-NEXT:    {
1807 ; CHECK-NEXT:     q0 = vcmp.gt(v1.w,v3.w)
1808 ; CHECK-NEXT:    }
1809 ; CHECK-NEXT:    {
1810 ; CHECK-NEXT:     v2.w = vlsr(v2.w,v3.w)
1811 ; CHECK-NEXT:    }
1812 ; CHECK-NEXT:    {
1813 ; CHECK-NEXT:     v31 = vmux(q0,v30,v2)
1814 ; CHECK-NEXT:    }
1815 ; CHECK-NEXT:    {
1816 ; CHECK-NEXT:     v0 = vmux(q1,v1,v31)
1817 ; CHECK-NEXT:    }
1818 ; CHECK-NEXT:    {
1819 ; CHECK-NEXT:     v1.uh = vpack(v1.w,v0.w):sat
1820 ; CHECK-NEXT:    }
1821 ; CHECK-NEXT:    {
1822 ; CHECK-NEXT:     v0.uh = vpack(v0.w,v0.w):sat
1823 ; CHECK-NEXT:    }
1824 ; CHECK-NEXT:    {
1825 ; CHECK-NEXT:     v0.ub = vpack(v1.h,v0.h):sat
1826 ; CHECK-NEXT:    }
1827 ; CHECK-NEXT:    {
1828 ; CHECK-NEXT:     jumpr r31
1829 ; CHECK-NEXT:     if (q3) vmem(r1+#0) = v0
1830 ; CHECK-NEXT:    }
1831   %v0 = load <32 x float>, ptr %a0, align 128
1832   %v1 = fptoui <32 x float> %v0 to <32 x i8>
1833   store <32 x i8> %v1, ptr %a1, align 128
1834   ret void
1837 ; f32 -> u16
1838 ; No widening
1839 define void @f32u16_0(ptr %a0, ptr %a1) #0 {
1840 ; CHECK-LABEL: f32u16_0:
1841 ; CHECK:         .cfi_startproc
1842 ; CHECK-NEXT:  // %bb.0:
1843 ; CHECK-NEXT:    {
1844 ; CHECK-NEXT:     r3:2 = combine(##-2147483648,#1)
1845 ; CHECK-NEXT:     r4 = #30
1846 ; CHECK-NEXT:     v0 = vmem(r0+#1)
1847 ; CHECK-NEXT:    }
1848 ; CHECK-NEXT:    {
1849 ; CHECK-NEXT:     v2 = vsplat(r3)
1850 ; CHECK-NEXT:     r7:6 = combine(#24,#32)
1851 ; CHECK-NEXT:     v3.w = vasl(v0.w,r2)
1852 ; CHECK-NEXT:     v1 = vmem(r0+#0)
1853 ; CHECK-NEXT:    }
1854 ; CHECK-NEXT:    {
1855 ; CHECK-NEXT:     v6 = vsplat(r4)
1856 ; CHECK-NEXT:     r5 = #8
1857 ; CHECK-NEXT:     v4.w = vasl(v1.w,r2)
1858 ; CHECK-NEXT:     v3.w = vsub(v3.w,v2.w)
1859 ; CHECK-NEXT:    }
1860 ; CHECK-NEXT:    {
1861 ; CHECK-NEXT:     v7 = vsplat(r6)
1862 ; CHECK-NEXT:     v5.w = vasl(v1.w,r5)
1863 ; CHECK-NEXT:     v4.w = vsub(v4.w,v2.w)
1864 ; CHECK-NEXT:     v28 = vxor(v28,v28)
1865 ; CHECK-NEXT:    }
1866 ; CHECK-NEXT:    {
1867 ; CHECK-NEXT:     r2 = ##2147483647
1868 ; CHECK-NEXT:     v3.w = vasr(v3.w,r7)
1869 ; CHECK-NEXT:     v5 = vor(v5,v2)
1870 ; CHECK-NEXT:    }
1871 ; CHECK-NEXT:    {
1872 ; CHECK-NEXT:     v29 = vsplat(r2)
1873 ; CHECK-NEXT:     v4.w = vasr(v4.w,r7)
1874 ; CHECK-NEXT:     q2 = vcmp.gt(v28.w,v1.w)
1875 ; CHECK-NEXT:     v3.w = vsub(v6.w,v3.w)
1876 ; CHECK-NEXT:    }
1877 ; CHECK-NEXT:    {
1878 ; CHECK-NEXT:     v8.w = vasl(v0.w,r5)
1879 ; CHECK-NEXT:     q3 = vcmp.gt(v28.w,v0.w)
1880 ; CHECK-NEXT:     v4.w = vsub(v6.w,v4.w)
1881 ; CHECK-NEXT:     v3.w = vmin(v3.w,v7.w)
1882 ; CHECK-NEXT:    }
1883 ; CHECK-NEXT:    {
1884 ; CHECK-NEXT:     v4.w = vmin(v4.w,v7.w)
1885 ; CHECK-NEXT:     v2 = vor(v8,v2)
1886 ; CHECK-NEXT:     q1 = vcmp.gt(v28.w,v3.w)
1887 ; CHECK-NEXT:    }
1888 ; CHECK-NEXT:    {
1889 ; CHECK-NEXT:     q0 = vcmp.gt(v28.w,v4.w)
1890 ; CHECK-NEXT:    }
1891 ; CHECK-NEXT:    {
1892 ; CHECK-NEXT:     v5.w = vlsr(v5.w,v4.w)
1893 ; CHECK-NEXT:    }
1894 ; CHECK-NEXT:    {
1895 ; CHECK-NEXT:     v2.w = vlsr(v2.w,v3.w)
1896 ; CHECK-NEXT:     v30 = vmux(q0,v29,v5)
1897 ; CHECK-NEXT:    }
1898 ; CHECK-NEXT:    {
1899 ; CHECK-NEXT:     v31 = vmux(q1,v29,v2)
1900 ; CHECK-NEXT:     v0 = vmux(q2,v28,v30)
1901 ; CHECK-NEXT:    }
1902 ; CHECK-NEXT:    {
1903 ; CHECK-NEXT:     v1 = vmux(q3,v28,v31)
1904 ; CHECK-NEXT:    }
1905 ; CHECK-NEXT:    {
1906 ; CHECK-NEXT:     v0.uh = vpack(v1.w,v0.w):sat
1907 ; CHECK-NEXT:     jumpr r31
1908 ; CHECK-NEXT:     vmem(r1+#0) = v0.new
1909 ; CHECK-NEXT:    }
1910   %v0 = load <64 x float>, ptr %a0, align 128
1911   %v1 = fptoui <64 x float> %v0 to <64 x i16>
1912   store <64 x i16> %v1, ptr %a1, align 128
1913   ret void
1916 ; Widen result
1917 define void @f32u16_1(ptr %a0, ptr %a1) #0 {
1918 ; CHECK-LABEL: f32u16_1:
1919 ; CHECK:         .cfi_startproc
1920 ; CHECK-NEXT:  // %bb.0:
1921 ; CHECK-NEXT:    {
1922 ; CHECK-NEXT:     r7 = ##-2147483648
1923 ; CHECK-NEXT:     r3:2 = combine(#8,#1)
1924 ; CHECK-NEXT:     v0 = vmem(r0+#0)
1925 ; CHECK-NEXT:    }
1926 ; CHECK-NEXT:    {
1927 ; CHECK-NEXT:     v2 = vsplat(r7)
1928 ; CHECK-NEXT:     v3.w = vasl(v0.w,r2)
1929 ; CHECK-NEXT:     r6 = #30
1930 ; CHECK-NEXT:     r5 = #24
1931 ; CHECK-NEXT:    }
1932 ; CHECK-NEXT:    {
1933 ; CHECK-NEXT:     v4 = vsplat(r6)
1934 ; CHECK-NEXT:     r4 = #32
1935 ; CHECK-NEXT:     v6.w = vasl(v0.w,r3)
1936 ; CHECK-NEXT:     v3.w = vsub(v3.w,v2.w)
1937 ; CHECK-NEXT:    }
1938 ; CHECK-NEXT:    {
1939 ; CHECK-NEXT:     v5 = vsplat(r4)
1940 ; CHECK-NEXT:     v2 = vor(v6,v2)
1941 ; CHECK-NEXT:     v1 = vxor(v1,v1)
1942 ; CHECK-NEXT:    }
1943 ; CHECK-NEXT:    {
1944 ; CHECK-NEXT:     r3 = ##2147483647
1945 ; CHECK-NEXT:     r2 = #64
1946 ; CHECK-NEXT:     v3.w = vasr(v3.w,r5)
1947 ; CHECK-NEXT:    }
1948 ; CHECK-NEXT:    {
1949 ; CHECK-NEXT:     v30 = vsplat(r3)
1950 ; CHECK-NEXT:     q3 = vsetq(r2)
1951 ; CHECK-NEXT:     q1 = vcmp.gt(v1.w,v0.w)
1952 ; CHECK-NEXT:     v3.w = vsub(v4.w,v3.w)
1953 ; CHECK-NEXT:    }
1954 ; CHECK-NEXT:    {
1955 ; CHECK-NEXT:     v3.w = vmin(v3.w,v5.w)
1956 ; CHECK-NEXT:    }
1957 ; CHECK-NEXT:    {
1958 ; CHECK-NEXT:     q0 = vcmp.gt(v1.w,v3.w)
1959 ; CHECK-NEXT:    }
1960 ; CHECK-NEXT:    {
1961 ; CHECK-NEXT:     v2.w = vlsr(v2.w,v3.w)
1962 ; CHECK-NEXT:    }
1963 ; CHECK-NEXT:    {
1964 ; CHECK-NEXT:     v31 = vmux(q0,v30,v2)
1965 ; CHECK-NEXT:    }
1966 ; CHECK-NEXT:    {
1967 ; CHECK-NEXT:     v0 = vmux(q1,v1,v31)
1968 ; CHECK-NEXT:    }
1969 ; CHECK-NEXT:    {
1970 ; CHECK-NEXT:     v0.uh = vpack(v0.w,v0.w):sat
1971 ; CHECK-NEXT:    }
1972 ; CHECK-NEXT:    {
1973 ; CHECK-NEXT:     jumpr r31
1974 ; CHECK-NEXT:     if (q3) vmem(r1+#0) = v0
1975 ; CHECK-NEXT:    }
1976   %v0 = load <32 x float>, ptr %a0, align 128
1977   %v1 = fptoui <32 x float> %v0 to <32 x i16>
1978   store <32 x i16> %v1, ptr %a1, align 128
1979   ret void
1982 ; f32 -> u32
1983 ; No widening
1984 define void @f32u32_0(ptr %a0, ptr %a1) #0 {
1985 ; CHECK-LABEL: f32u32_0:
1986 ; CHECK:         .cfi_startproc
1987 ; CHECK-NEXT:  // %bb.0:
1988 ; CHECK-NEXT:    {
1989 ; CHECK-NEXT:     r7 = ##-2147483648
1990 ; CHECK-NEXT:     r3:2 = combine(#8,#1)
1991 ; CHECK-NEXT:     v0 = vmem(r0+#0)
1992 ; CHECK-NEXT:    }
1993 ; CHECK-NEXT:    {
1994 ; CHECK-NEXT:     v2 = vsplat(r7)
1995 ; CHECK-NEXT:     v3.w = vasl(v0.w,r2)
1996 ; CHECK-NEXT:     r6 = #30
1997 ; CHECK-NEXT:     r5 = #24
1998 ; CHECK-NEXT:    }
1999 ; CHECK-NEXT:    {
2000 ; CHECK-NEXT:     v4 = vsplat(r6)
2001 ; CHECK-NEXT:     r4 = #32
2002 ; CHECK-NEXT:     v6.w = vasl(v0.w,r3)
2003 ; CHECK-NEXT:     v3.w = vsub(v3.w,v2.w)
2004 ; CHECK-NEXT:    }
2005 ; CHECK-NEXT:    {
2006 ; CHECK-NEXT:     v5 = vsplat(r4)
2007 ; CHECK-NEXT:     v2 = vor(v6,v2)
2008 ; CHECK-NEXT:     v1 = vxor(v1,v1)
2009 ; CHECK-NEXT:    }
2010 ; CHECK-NEXT:    {
2011 ; CHECK-NEXT:     r2 = ##2147483647
2012 ; CHECK-NEXT:     v3.w = vasr(v3.w,r5)
2013 ; CHECK-NEXT:    }
2014 ; CHECK-NEXT:    {
2015 ; CHECK-NEXT:     v30 = vsplat(r2)
2016 ; CHECK-NEXT:     q1 = vcmp.gt(v1.w,v0.w)
2017 ; CHECK-NEXT:     v3.w = vsub(v4.w,v3.w)
2018 ; CHECK-NEXT:    }
2019 ; CHECK-NEXT:    {
2020 ; CHECK-NEXT:     v3.w = vmin(v3.w,v5.w)
2021 ; CHECK-NEXT:    }
2022 ; CHECK-NEXT:    {
2023 ; CHECK-NEXT:     q0 = vcmp.gt(v1.w,v3.w)
2024 ; CHECK-NEXT:    }
2025 ; CHECK-NEXT:    {
2026 ; CHECK-NEXT:     v2.w = vlsr(v2.w,v3.w)
2027 ; CHECK-NEXT:    }
2028 ; CHECK-NEXT:    {
2029 ; CHECK-NEXT:     v31 = vmux(q0,v30,v2)
2030 ; CHECK-NEXT:    }
2031 ; CHECK-NEXT:    {
2032 ; CHECK-NEXT:     v0 = vmux(q1,v1,v31)
2033 ; CHECK-NEXT:     jumpr r31
2034 ; CHECK-NEXT:     vmem(r1+#0) = v0.new
2035 ; CHECK-NEXT:    }
2036   %v0 = load <32 x float>, ptr %a0, align 128
2037   %v1 = fptoui <32 x float> %v0 to <32 x i32>
2038   store <32 x i32> %v1, ptr %a1, align 128
2039   ret void
2042 ; Widen input and result
2043 define void @f32u32_1(ptr %a0, ptr %a1) #0 {
2044 ; CHECK-LABEL: f32u32_1:
2045 ; CHECK:         .cfi_startproc
2046 ; CHECK-NEXT:  // %bb.0:
2047 ; CHECK-NEXT:    {
2048 ; CHECK-NEXT:     r7 = ##-2147483648
2049 ; CHECK-NEXT:     r3:2 = combine(#8,#1)
2050 ; CHECK-NEXT:     v0 = vmem(r0+#0)
2051 ; CHECK-NEXT:    }
2052 ; CHECK-NEXT:    {
2053 ; CHECK-NEXT:     v2 = vsplat(r7)
2054 ; CHECK-NEXT:     v3.w = vasl(v0.w,r2)
2055 ; CHECK-NEXT:     r6 = #30
2056 ; CHECK-NEXT:     r5 = #24
2057 ; CHECK-NEXT:    }
2058 ; CHECK-NEXT:    {
2059 ; CHECK-NEXT:     v4 = vsplat(r6)
2060 ; CHECK-NEXT:     r4 = #32
2061 ; CHECK-NEXT:     v6.w = vasl(v0.w,r3)
2062 ; CHECK-NEXT:     v3.w = vsub(v3.w,v2.w)
2063 ; CHECK-NEXT:    }
2064 ; CHECK-NEXT:    {
2065 ; CHECK-NEXT:     v5 = vsplat(r4)
2066 ; CHECK-NEXT:     v2 = vor(v6,v2)
2067 ; CHECK-NEXT:     v1 = vxor(v1,v1)
2068 ; CHECK-NEXT:    }
2069 ; CHECK-NEXT:    {
2070 ; CHECK-NEXT:     r3 = ##2147483647
2071 ; CHECK-NEXT:     r2 = #64
2072 ; CHECK-NEXT:     v3.w = vasr(v3.w,r5)
2073 ; CHECK-NEXT:    }
2074 ; CHECK-NEXT:    {
2075 ; CHECK-NEXT:     v30 = vsplat(r3)
2076 ; CHECK-NEXT:     q3 = vsetq(r2)
2077 ; CHECK-NEXT:     q1 = vcmp.gt(v1.w,v0.w)
2078 ; CHECK-NEXT:     v3.w = vsub(v4.w,v3.w)
2079 ; CHECK-NEXT:    }
2080 ; CHECK-NEXT:    {
2081 ; CHECK-NEXT:     v3.w = vmin(v3.w,v5.w)
2082 ; CHECK-NEXT:    }
2083 ; CHECK-NEXT:    {
2084 ; CHECK-NEXT:     q0 = vcmp.gt(v1.w,v3.w)
2085 ; CHECK-NEXT:    }
2086 ; CHECK-NEXT:    {
2087 ; CHECK-NEXT:     v2.w = vlsr(v2.w,v3.w)
2088 ; CHECK-NEXT:    }
2089 ; CHECK-NEXT:    {
2090 ; CHECK-NEXT:     v31 = vmux(q0,v30,v2)
2091 ; CHECK-NEXT:    }
2092 ; CHECK-NEXT:    {
2093 ; CHECK-NEXT:     v0 = vmux(q1,v1,v31)
2094 ; CHECK-NEXT:    }
2095 ; CHECK-NEXT:    {
2096 ; CHECK-NEXT:     jumpr r31
2097 ; CHECK-NEXT:     if (q3) vmem(r1+#0) = v0
2098 ; CHECK-NEXT:    }
2099   %v0 = load <16 x float>, ptr %a0, align 128
2100   %v1 = fptoui <16 x float> %v0 to <16 x i32>
2101   store <16 x i32> %v1, ptr %a1, align 128
2102   ret void
2106 attributes #0 = { "target-features"="+v68,+hvxv68,+hvx-length128b,+hvx-qfloat" }