[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / fcvt-fixed.ll
blob51aad4fe25d3b8068195f1055c36d273156fec66
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-NO16,CHECK-SD-NO16
3 ; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -mattr=+fullfp16 | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-FP16,CHECK-SD-FP16
4 ; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-NO16,CHECK-GI-NO16
5 ; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -mattr=+fullfp16 -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-FP16,CHECK-GI-FP16
7 ; fptoui
9 define i32 @fcvtzs_f32_i32_7(float %flt) {
10 ; CHECK-SD-LABEL: fcvtzs_f32_i32_7:
11 ; CHECK-SD:       // %bb.0:
12 ; CHECK-SD-NEXT:    fcvtzs w0, s0, #7
13 ; CHECK-SD-NEXT:    ret
15 ; CHECK-GI-LABEL: fcvtzs_f32_i32_7:
16 ; CHECK-GI:       // %bb.0:
17 ; CHECK-GI-NEXT:    movi v1.2s, #67, lsl #24
18 ; CHECK-GI-NEXT:    fmul s0, s0, s1
19 ; CHECK-GI-NEXT:    fcvtzs w0, s0
20 ; CHECK-GI-NEXT:    ret
21   %fix = fmul float %flt, 128.0
22   %cvt = fptosi float %fix to i32
23   ret i32 %cvt
26 define i32 @fcvtzs_f32_i32_32(float %flt) {
27 ; CHECK-SD-LABEL: fcvtzs_f32_i32_32:
28 ; CHECK-SD:       // %bb.0:
29 ; CHECK-SD-NEXT:    fcvtzs w0, s0, #32
30 ; CHECK-SD-NEXT:    ret
32 ; CHECK-GI-LABEL: fcvtzs_f32_i32_32:
33 ; CHECK-GI:       // %bb.0:
34 ; CHECK-GI-NEXT:    mov w8, #1333788672 // =0x4f800000
35 ; CHECK-GI-NEXT:    fmov s1, w8
36 ; CHECK-GI-NEXT:    fmul s0, s0, s1
37 ; CHECK-GI-NEXT:    fcvtzs w0, s0
38 ; CHECK-GI-NEXT:    ret
39   %fix = fmul float %flt, 4294967296.0
40   %cvt = fptosi float %fix to i32
41   ret i32 %cvt
44 define i64 @fcvtzs_f32_i64_7(float %flt) {
45 ; CHECK-SD-LABEL: fcvtzs_f32_i64_7:
46 ; CHECK-SD:       // %bb.0:
47 ; CHECK-SD-NEXT:    fcvtzs x0, s0, #7
48 ; CHECK-SD-NEXT:    ret
50 ; CHECK-GI-LABEL: fcvtzs_f32_i64_7:
51 ; CHECK-GI:       // %bb.0:
52 ; CHECK-GI-NEXT:    movi v1.2s, #67, lsl #24
53 ; CHECK-GI-NEXT:    fmul s0, s0, s1
54 ; CHECK-GI-NEXT:    fcvtzs x0, s0
55 ; CHECK-GI-NEXT:    ret
56   %fix = fmul float %flt, 128.0
57   %cvt = fptosi float %fix to i64
58   ret i64 %cvt
61 define i64 @fcvtzs_f32_i64_64(float %flt) {
62 ; CHECK-SD-LABEL: fcvtzs_f32_i64_64:
63 ; CHECK-SD:       // %bb.0:
64 ; CHECK-SD-NEXT:    fcvtzs x0, s0, #64
65 ; CHECK-SD-NEXT:    ret
67 ; CHECK-GI-LABEL: fcvtzs_f32_i64_64:
68 ; CHECK-GI:       // %bb.0:
69 ; CHECK-GI-NEXT:    mov w8, #1602224128 // =0x5f800000
70 ; CHECK-GI-NEXT:    fmov s1, w8
71 ; CHECK-GI-NEXT:    fmul s0, s0, s1
72 ; CHECK-GI-NEXT:    fcvtzs x0, s0
73 ; CHECK-GI-NEXT:    ret
74   %fix = fmul float %flt, 18446744073709551616.0
75   %cvt = fptosi float %fix to i64
76   ret i64 %cvt
79 define i32 @fcvtzs_f64_i32_7(double %dbl) {
80 ; CHECK-SD-LABEL: fcvtzs_f64_i32_7:
81 ; CHECK-SD:       // %bb.0:
82 ; CHECK-SD-NEXT:    fcvtzs w0, d0, #7
83 ; CHECK-SD-NEXT:    ret
85 ; CHECK-GI-LABEL: fcvtzs_f64_i32_7:
86 ; CHECK-GI:       // %bb.0:
87 ; CHECK-GI-NEXT:    mov x8, #4638707616191610880 // =0x4060000000000000
88 ; CHECK-GI-NEXT:    fmov d1, x8
89 ; CHECK-GI-NEXT:    fmul d0, d0, d1
90 ; CHECK-GI-NEXT:    fcvtzs w0, d0
91 ; CHECK-GI-NEXT:    ret
92   %fix = fmul double %dbl, 128.0
93   %cvt = fptosi double %fix to i32
94   ret i32 %cvt
97 define i32 @fcvtzs_f64_i32_32(double %dbl) {
98 ; CHECK-SD-LABEL: fcvtzs_f64_i32_32:
99 ; CHECK-SD:       // %bb.0:
100 ; CHECK-SD-NEXT:    fcvtzs w0, d0, #32
101 ; CHECK-SD-NEXT:    ret
103 ; CHECK-GI-LABEL: fcvtzs_f64_i32_32:
104 ; CHECK-GI:       // %bb.0:
105 ; CHECK-GI-NEXT:    mov x8, #4751297606875873280 // =0x41f0000000000000
106 ; CHECK-GI-NEXT:    fmov d1, x8
107 ; CHECK-GI-NEXT:    fmul d0, d0, d1
108 ; CHECK-GI-NEXT:    fcvtzs w0, d0
109 ; CHECK-GI-NEXT:    ret
110   %fix = fmul double %dbl, 4294967296.0
111   %cvt = fptosi double %fix to i32
112   ret i32 %cvt
115 define i64 @fcvtzs_f64_i64_7(double %dbl) {
116 ; CHECK-SD-LABEL: fcvtzs_f64_i64_7:
117 ; CHECK-SD:       // %bb.0:
118 ; CHECK-SD-NEXT:    fcvtzs x0, d0, #7
119 ; CHECK-SD-NEXT:    ret
121 ; CHECK-GI-LABEL: fcvtzs_f64_i64_7:
122 ; CHECK-GI:       // %bb.0:
123 ; CHECK-GI-NEXT:    mov x8, #4638707616191610880 // =0x4060000000000000
124 ; CHECK-GI-NEXT:    fmov d1, x8
125 ; CHECK-GI-NEXT:    fmul d0, d0, d1
126 ; CHECK-GI-NEXT:    fcvtzs x0, d0
127 ; CHECK-GI-NEXT:    ret
128   %fix = fmul double %dbl, 128.0
129   %cvt = fptosi double %fix to i64
130   ret i64 %cvt
133 define i64 @fcvtzs_f64_i64_64(double %dbl) {
134 ; CHECK-SD-LABEL: fcvtzs_f64_i64_64:
135 ; CHECK-SD:       // %bb.0:
136 ; CHECK-SD-NEXT:    fcvtzs x0, d0, #64
137 ; CHECK-SD-NEXT:    ret
139 ; CHECK-GI-LABEL: fcvtzs_f64_i64_64:
140 ; CHECK-GI:       // %bb.0:
141 ; CHECK-GI-NEXT:    mov x8, #4895412794951729152 // =0x43f0000000000000
142 ; CHECK-GI-NEXT:    fmov d1, x8
143 ; CHECK-GI-NEXT:    fmul d0, d0, d1
144 ; CHECK-GI-NEXT:    fcvtzs x0, d0
145 ; CHECK-GI-NEXT:    ret
146   %fix = fmul double %dbl, 18446744073709551616.0
147   %cvt = fptosi double %fix to i64
148   ret i64 %cvt
151 define i32 @fcvtzs_f16_i32_7(half %flt) {
152 ; CHECK-SD-NO16-LABEL: fcvtzs_f16_i32_7:
153 ; CHECK-SD-NO16:       // %bb.0:
154 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #67, lsl #24
155 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
156 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
157 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
158 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
159 ; CHECK-SD-NO16-NEXT:    fcvtzs w0, s0
160 ; CHECK-SD-NO16-NEXT:    ret
162 ; CHECK-SD-FP16-LABEL: fcvtzs_f16_i32_7:
163 ; CHECK-SD-FP16:       // %bb.0:
164 ; CHECK-SD-FP16-NEXT:    fcvtzs w0, h0, #7
165 ; CHECK-SD-FP16-NEXT:    ret
167 ; CHECK-GI-NO16-LABEL: fcvtzs_f16_i32_7:
168 ; CHECK-GI-NO16:       // %bb.0:
169 ; CHECK-GI-NO16-NEXT:    mov w8, #22528 // =0x5800
170 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
171 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
172 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
173 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
174 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
175 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
176 ; CHECK-GI-NO16-NEXT:    fcvtzs w0, s0
177 ; CHECK-GI-NO16-NEXT:    ret
179 ; CHECK-GI-FP16-LABEL: fcvtzs_f16_i32_7:
180 ; CHECK-GI-FP16:       // %bb.0:
181 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI8_0
182 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI8_0]
183 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
184 ; CHECK-GI-FP16-NEXT:    fcvtzs w0, h0
185 ; CHECK-GI-FP16-NEXT:    ret
186   %fix = fmul half %flt, 128.0
187   %cvt = fptosi half %fix to i32
188   ret i32 %cvt
191 define i32 @fcvtzs_f16_i32_15(half %flt) {
192 ; CHECK-SD-NO16-LABEL: fcvtzs_f16_i32_15:
193 ; CHECK-SD-NO16:       // %bb.0:
194 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #71, lsl #24
195 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
196 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
197 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
198 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
199 ; CHECK-SD-NO16-NEXT:    fcvtzs w0, s0
200 ; CHECK-SD-NO16-NEXT:    ret
202 ; CHECK-SD-FP16-LABEL: fcvtzs_f16_i32_15:
203 ; CHECK-SD-FP16:       // %bb.0:
204 ; CHECK-SD-FP16-NEXT:    fcvtzs w0, h0, #15
205 ; CHECK-SD-FP16-NEXT:    ret
207 ; CHECK-GI-NO16-LABEL: fcvtzs_f16_i32_15:
208 ; CHECK-GI-NO16:       // %bb.0:
209 ; CHECK-GI-NO16-NEXT:    mov w8, #30720 // =0x7800
210 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
211 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
212 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
213 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
214 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
215 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
216 ; CHECK-GI-NO16-NEXT:    fcvtzs w0, s0
217 ; CHECK-GI-NO16-NEXT:    ret
219 ; CHECK-GI-FP16-LABEL: fcvtzs_f16_i32_15:
220 ; CHECK-GI-FP16:       // %bb.0:
221 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI9_0
222 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI9_0]
223 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
224 ; CHECK-GI-FP16-NEXT:    fcvtzs w0, h0
225 ; CHECK-GI-FP16-NEXT:    ret
226   %fix = fmul half %flt, 32768.0
227   %cvt = fptosi half %fix to i32
228   ret i32 %cvt
231 define i64 @fcvtzs_f16_i64_7(half %flt) {
232 ; CHECK-SD-NO16-LABEL: fcvtzs_f16_i64_7:
233 ; CHECK-SD-NO16:       // %bb.0:
234 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #67, lsl #24
235 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
236 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
237 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
238 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
239 ; CHECK-SD-NO16-NEXT:    fcvtzs x0, s0
240 ; CHECK-SD-NO16-NEXT:    ret
242 ; CHECK-SD-FP16-LABEL: fcvtzs_f16_i64_7:
243 ; CHECK-SD-FP16:       // %bb.0:
244 ; CHECK-SD-FP16-NEXT:    fcvtzs x0, h0, #7
245 ; CHECK-SD-FP16-NEXT:    ret
247 ; CHECK-GI-NO16-LABEL: fcvtzs_f16_i64_7:
248 ; CHECK-GI-NO16:       // %bb.0:
249 ; CHECK-GI-NO16-NEXT:    mov w8, #22528 // =0x5800
250 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
251 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
252 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
253 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
254 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
255 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
256 ; CHECK-GI-NO16-NEXT:    fcvtzs x0, s0
257 ; CHECK-GI-NO16-NEXT:    ret
259 ; CHECK-GI-FP16-LABEL: fcvtzs_f16_i64_7:
260 ; CHECK-GI-FP16:       // %bb.0:
261 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI10_0
262 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI10_0]
263 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
264 ; CHECK-GI-FP16-NEXT:    fcvtzs x0, h0
265 ; CHECK-GI-FP16-NEXT:    ret
266   %fix = fmul half %flt, 128.0
267   %cvt = fptosi half %fix to i64
268   ret i64 %cvt
271 define i64 @fcvtzs_f16_i64_15(half %flt) {
272 ; CHECK-SD-NO16-LABEL: fcvtzs_f16_i64_15:
273 ; CHECK-SD-NO16:       // %bb.0:
274 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #71, lsl #24
275 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
276 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
277 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
278 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
279 ; CHECK-SD-NO16-NEXT:    fcvtzs x0, s0
280 ; CHECK-SD-NO16-NEXT:    ret
282 ; CHECK-SD-FP16-LABEL: fcvtzs_f16_i64_15:
283 ; CHECK-SD-FP16:       // %bb.0:
284 ; CHECK-SD-FP16-NEXT:    fcvtzs x0, h0, #15
285 ; CHECK-SD-FP16-NEXT:    ret
287 ; CHECK-GI-NO16-LABEL: fcvtzs_f16_i64_15:
288 ; CHECK-GI-NO16:       // %bb.0:
289 ; CHECK-GI-NO16-NEXT:    mov w8, #30720 // =0x7800
290 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
291 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
292 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
293 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
294 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
295 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
296 ; CHECK-GI-NO16-NEXT:    fcvtzs x0, s0
297 ; CHECK-GI-NO16-NEXT:    ret
299 ; CHECK-GI-FP16-LABEL: fcvtzs_f16_i64_15:
300 ; CHECK-GI-FP16:       // %bb.0:
301 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI11_0
302 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI11_0]
303 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
304 ; CHECK-GI-FP16-NEXT:    fcvtzs x0, h0
305 ; CHECK-GI-FP16-NEXT:    ret
306   %fix = fmul half %flt, 32768.0
307   %cvt = fptosi half %fix to i64
308   ret i64 %cvt
311 ; fptoui
313 define i32 @fcvtzu_f32_i32_7(float %flt) {
314 ; CHECK-SD-LABEL: fcvtzu_f32_i32_7:
315 ; CHECK-SD:       // %bb.0:
316 ; CHECK-SD-NEXT:    fcvtzu w0, s0, #7
317 ; CHECK-SD-NEXT:    ret
319 ; CHECK-GI-LABEL: fcvtzu_f32_i32_7:
320 ; CHECK-GI:       // %bb.0:
321 ; CHECK-GI-NEXT:    movi v1.2s, #67, lsl #24
322 ; CHECK-GI-NEXT:    fmul s0, s0, s1
323 ; CHECK-GI-NEXT:    fcvtzu w0, s0
324 ; CHECK-GI-NEXT:    ret
325   %fix = fmul float %flt, 128.0
326   %cvt = fptoui float %fix to i32
327   ret i32 %cvt
330 define i32 @fcvtzu_f32_i32_32(float %flt) {
331 ; CHECK-SD-LABEL: fcvtzu_f32_i32_32:
332 ; CHECK-SD:       // %bb.0:
333 ; CHECK-SD-NEXT:    fcvtzu w0, s0, #32
334 ; CHECK-SD-NEXT:    ret
336 ; CHECK-GI-LABEL: fcvtzu_f32_i32_32:
337 ; CHECK-GI:       // %bb.0:
338 ; CHECK-GI-NEXT:    mov w8, #1333788672 // =0x4f800000
339 ; CHECK-GI-NEXT:    fmov s1, w8
340 ; CHECK-GI-NEXT:    fmul s0, s0, s1
341 ; CHECK-GI-NEXT:    fcvtzu w0, s0
342 ; CHECK-GI-NEXT:    ret
343   %fix = fmul float %flt, 4294967296.0
344   %cvt = fptoui float %fix to i32
345   ret i32 %cvt
348 define i64 @fcvtzu_f32_i64_7(float %flt) {
349 ; CHECK-SD-LABEL: fcvtzu_f32_i64_7:
350 ; CHECK-SD:       // %bb.0:
351 ; CHECK-SD-NEXT:    fcvtzu x0, s0, #7
352 ; CHECK-SD-NEXT:    ret
354 ; CHECK-GI-LABEL: fcvtzu_f32_i64_7:
355 ; CHECK-GI:       // %bb.0:
356 ; CHECK-GI-NEXT:    movi v1.2s, #67, lsl #24
357 ; CHECK-GI-NEXT:    fmul s0, s0, s1
358 ; CHECK-GI-NEXT:    fcvtzu x0, s0
359 ; CHECK-GI-NEXT:    ret
360   %fix = fmul float %flt, 128.0
361   %cvt = fptoui float %fix to i64
362   ret i64 %cvt
365 define i64 @fcvtzu_f32_i64_64(float %flt) {
366 ; CHECK-SD-LABEL: fcvtzu_f32_i64_64:
367 ; CHECK-SD:       // %bb.0:
368 ; CHECK-SD-NEXT:    fcvtzu x0, s0, #64
369 ; CHECK-SD-NEXT:    ret
371 ; CHECK-GI-LABEL: fcvtzu_f32_i64_64:
372 ; CHECK-GI:       // %bb.0:
373 ; CHECK-GI-NEXT:    mov w8, #1602224128 // =0x5f800000
374 ; CHECK-GI-NEXT:    fmov s1, w8
375 ; CHECK-GI-NEXT:    fmul s0, s0, s1
376 ; CHECK-GI-NEXT:    fcvtzu x0, s0
377 ; CHECK-GI-NEXT:    ret
378   %fix = fmul float %flt, 18446744073709551616.0
379   %cvt = fptoui float %fix to i64
380   ret i64 %cvt
383 define i32 @fcvtzu_f64_i32_7(double %dbl) {
384 ; CHECK-SD-LABEL: fcvtzu_f64_i32_7:
385 ; CHECK-SD:       // %bb.0:
386 ; CHECK-SD-NEXT:    fcvtzu w0, d0, #7
387 ; CHECK-SD-NEXT:    ret
389 ; CHECK-GI-LABEL: fcvtzu_f64_i32_7:
390 ; CHECK-GI:       // %bb.0:
391 ; CHECK-GI-NEXT:    mov x8, #4638707616191610880 // =0x4060000000000000
392 ; CHECK-GI-NEXT:    fmov d1, x8
393 ; CHECK-GI-NEXT:    fmul d0, d0, d1
394 ; CHECK-GI-NEXT:    fcvtzu w0, d0
395 ; CHECK-GI-NEXT:    ret
396   %fix = fmul double %dbl, 128.0
397   %cvt = fptoui double %fix to i32
398   ret i32 %cvt
401 define i32 @fcvtzu_f64_i32_32(double %dbl) {
402 ; CHECK-SD-LABEL: fcvtzu_f64_i32_32:
403 ; CHECK-SD:       // %bb.0:
404 ; CHECK-SD-NEXT:    fcvtzu w0, d0, #32
405 ; CHECK-SD-NEXT:    ret
407 ; CHECK-GI-LABEL: fcvtzu_f64_i32_32:
408 ; CHECK-GI:       // %bb.0:
409 ; CHECK-GI-NEXT:    mov x8, #4751297606875873280 // =0x41f0000000000000
410 ; CHECK-GI-NEXT:    fmov d1, x8
411 ; CHECK-GI-NEXT:    fmul d0, d0, d1
412 ; CHECK-GI-NEXT:    fcvtzu w0, d0
413 ; CHECK-GI-NEXT:    ret
414   %fix = fmul double %dbl, 4294967296.0
415   %cvt = fptoui double %fix to i32
416   ret i32 %cvt
419 define i64 @fcvtzu_f64_i64_7(double %dbl) {
420 ; CHECK-SD-LABEL: fcvtzu_f64_i64_7:
421 ; CHECK-SD:       // %bb.0:
422 ; CHECK-SD-NEXT:    fcvtzu x0, d0, #7
423 ; CHECK-SD-NEXT:    ret
425 ; CHECK-GI-LABEL: fcvtzu_f64_i64_7:
426 ; CHECK-GI:       // %bb.0:
427 ; CHECK-GI-NEXT:    mov x8, #4638707616191610880 // =0x4060000000000000
428 ; CHECK-GI-NEXT:    fmov d1, x8
429 ; CHECK-GI-NEXT:    fmul d0, d0, d1
430 ; CHECK-GI-NEXT:    fcvtzu x0, d0
431 ; CHECK-GI-NEXT:    ret
432   %fix = fmul double %dbl, 128.0
433   %cvt = fptoui double %fix to i64
434   ret i64 %cvt
437 define i64 @fcvtzu_f64_i64_64(double %dbl) {
438 ; CHECK-SD-LABEL: fcvtzu_f64_i64_64:
439 ; CHECK-SD:       // %bb.0:
440 ; CHECK-SD-NEXT:    fcvtzu x0, d0, #64
441 ; CHECK-SD-NEXT:    ret
443 ; CHECK-GI-LABEL: fcvtzu_f64_i64_64:
444 ; CHECK-GI:       // %bb.0:
445 ; CHECK-GI-NEXT:    mov x8, #4895412794951729152 // =0x43f0000000000000
446 ; CHECK-GI-NEXT:    fmov d1, x8
447 ; CHECK-GI-NEXT:    fmul d0, d0, d1
448 ; CHECK-GI-NEXT:    fcvtzu x0, d0
449 ; CHECK-GI-NEXT:    ret
450   %fix = fmul double %dbl, 18446744073709551616.0
451   %cvt = fptoui double %fix to i64
452   ret i64 %cvt
455 define i32 @fcvtzu_f16_i32_7(half %flt) {
456 ; CHECK-SD-NO16-LABEL: fcvtzu_f16_i32_7:
457 ; CHECK-SD-NO16:       // %bb.0:
458 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #67, lsl #24
459 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
460 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
461 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
462 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
463 ; CHECK-SD-NO16-NEXT:    fcvtzu w0, s0
464 ; CHECK-SD-NO16-NEXT:    ret
466 ; CHECK-SD-FP16-LABEL: fcvtzu_f16_i32_7:
467 ; CHECK-SD-FP16:       // %bb.0:
468 ; CHECK-SD-FP16-NEXT:    fcvtzu w0, h0, #7
469 ; CHECK-SD-FP16-NEXT:    ret
471 ; CHECK-GI-NO16-LABEL: fcvtzu_f16_i32_7:
472 ; CHECK-GI-NO16:       // %bb.0:
473 ; CHECK-GI-NO16-NEXT:    mov w8, #22528 // =0x5800
474 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
475 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
476 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
477 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
478 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
479 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
480 ; CHECK-GI-NO16-NEXT:    fcvtzu w0, s0
481 ; CHECK-GI-NO16-NEXT:    ret
483 ; CHECK-GI-FP16-LABEL: fcvtzu_f16_i32_7:
484 ; CHECK-GI-FP16:       // %bb.0:
485 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI20_0
486 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI20_0]
487 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
488 ; CHECK-GI-FP16-NEXT:    fcvtzu w0, h0
489 ; CHECK-GI-FP16-NEXT:    ret
490   %fix = fmul half %flt, 128.0
491   %cvt = fptoui half %fix to i32
492   ret i32 %cvt
495 define i32 @fcvtzu_f16_i32_15(half %flt) {
496 ; CHECK-SD-NO16-LABEL: fcvtzu_f16_i32_15:
497 ; CHECK-SD-NO16:       // %bb.0:
498 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #71, lsl #24
499 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
500 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
501 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
502 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
503 ; CHECK-SD-NO16-NEXT:    fcvtzu w0, s0
504 ; CHECK-SD-NO16-NEXT:    ret
506 ; CHECK-SD-FP16-LABEL: fcvtzu_f16_i32_15:
507 ; CHECK-SD-FP16:       // %bb.0:
508 ; CHECK-SD-FP16-NEXT:    fcvtzu w0, h0, #15
509 ; CHECK-SD-FP16-NEXT:    ret
511 ; CHECK-GI-NO16-LABEL: fcvtzu_f16_i32_15:
512 ; CHECK-GI-NO16:       // %bb.0:
513 ; CHECK-GI-NO16-NEXT:    mov w8, #30720 // =0x7800
514 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
515 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
516 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
517 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
518 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
519 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
520 ; CHECK-GI-NO16-NEXT:    fcvtzu w0, s0
521 ; CHECK-GI-NO16-NEXT:    ret
523 ; CHECK-GI-FP16-LABEL: fcvtzu_f16_i32_15:
524 ; CHECK-GI-FP16:       // %bb.0:
525 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI21_0
526 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI21_0]
527 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
528 ; CHECK-GI-FP16-NEXT:    fcvtzu w0, h0
529 ; CHECK-GI-FP16-NEXT:    ret
530   %fix = fmul half %flt, 32768.0
531   %cvt = fptoui half %fix to i32
532   ret i32 %cvt
535 define i64 @fcvtzu_f16_i64_7(half %flt) {
536 ; CHECK-SD-NO16-LABEL: fcvtzu_f16_i64_7:
537 ; CHECK-SD-NO16:       // %bb.0:
538 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #67, lsl #24
539 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
540 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
541 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
542 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
543 ; CHECK-SD-NO16-NEXT:    fcvtzu x0, s0
544 ; CHECK-SD-NO16-NEXT:    ret
546 ; CHECK-SD-FP16-LABEL: fcvtzu_f16_i64_7:
547 ; CHECK-SD-FP16:       // %bb.0:
548 ; CHECK-SD-FP16-NEXT:    fcvtzu x0, h0, #7
549 ; CHECK-SD-FP16-NEXT:    ret
551 ; CHECK-GI-NO16-LABEL: fcvtzu_f16_i64_7:
552 ; CHECK-GI-NO16:       // %bb.0:
553 ; CHECK-GI-NO16-NEXT:    mov w8, #22528 // =0x5800
554 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
555 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
556 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
557 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
558 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
559 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
560 ; CHECK-GI-NO16-NEXT:    fcvtzu x0, s0
561 ; CHECK-GI-NO16-NEXT:    ret
563 ; CHECK-GI-FP16-LABEL: fcvtzu_f16_i64_7:
564 ; CHECK-GI-FP16:       // %bb.0:
565 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI22_0
566 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI22_0]
567 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
568 ; CHECK-GI-FP16-NEXT:    fcvtzu x0, h0
569 ; CHECK-GI-FP16-NEXT:    ret
570   %fix = fmul half %flt, 128.0
571   %cvt = fptoui half %fix to i64
572   ret i64 %cvt
575 define i64 @fcvtzu_f16_i64_15(half %flt) {
576 ; CHECK-SD-NO16-LABEL: fcvtzu_f16_i64_15:
577 ; CHECK-SD-NO16:       // %bb.0:
578 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #71, lsl #24
579 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
580 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
581 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
582 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
583 ; CHECK-SD-NO16-NEXT:    fcvtzu x0, s0
584 ; CHECK-SD-NO16-NEXT:    ret
586 ; CHECK-SD-FP16-LABEL: fcvtzu_f16_i64_15:
587 ; CHECK-SD-FP16:       // %bb.0:
588 ; CHECK-SD-FP16-NEXT:    fcvtzu x0, h0, #15
589 ; CHECK-SD-FP16-NEXT:    ret
591 ; CHECK-GI-NO16-LABEL: fcvtzu_f16_i64_15:
592 ; CHECK-GI-NO16:       // %bb.0:
593 ; CHECK-GI-NO16-NEXT:    mov w8, #30720 // =0x7800
594 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
595 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
596 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
597 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
598 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
599 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
600 ; CHECK-GI-NO16-NEXT:    fcvtzu x0, s0
601 ; CHECK-GI-NO16-NEXT:    ret
603 ; CHECK-GI-FP16-LABEL: fcvtzu_f16_i64_15:
604 ; CHECK-GI-FP16:       // %bb.0:
605 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI23_0
606 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI23_0]
607 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
608 ; CHECK-GI-FP16-NEXT:    fcvtzu x0, h0
609 ; CHECK-GI-FP16-NEXT:    ret
610   %fix = fmul half %flt, 32768.0
611   %cvt = fptoui half %fix to i64
612   ret i64 %cvt
615 ; sitofp
617 define float @scvtf_f32_i32_7(i32 %int) {
618 ; CHECK-SD-LABEL: scvtf_f32_i32_7:
619 ; CHECK-SD:       // %bb.0:
620 ; CHECK-SD-NEXT:    scvtf s0, w0, #7
621 ; CHECK-SD-NEXT:    ret
623 ; CHECK-GI-LABEL: scvtf_f32_i32_7:
624 ; CHECK-GI:       // %bb.0:
625 ; CHECK-GI-NEXT:    movi v0.2s, #67, lsl #24
626 ; CHECK-GI-NEXT:    scvtf s1, w0
627 ; CHECK-GI-NEXT:    fdiv s0, s1, s0
628 ; CHECK-GI-NEXT:    ret
629   %cvt = sitofp i32 %int to float
630   %fix = fdiv float %cvt, 128.0
631   ret float %fix
634 define float @scvtf_f32_i32_32(i32 %int) {
635 ; CHECK-SD-LABEL: scvtf_f32_i32_32:
636 ; CHECK-SD:       // %bb.0:
637 ; CHECK-SD-NEXT:    scvtf s0, w0, #32
638 ; CHECK-SD-NEXT:    ret
640 ; CHECK-GI-LABEL: scvtf_f32_i32_32:
641 ; CHECK-GI:       // %bb.0:
642 ; CHECK-GI-NEXT:    scvtf s0, w0
643 ; CHECK-GI-NEXT:    mov w8, #1333788672 // =0x4f800000
644 ; CHECK-GI-NEXT:    fmov s1, w8
645 ; CHECK-GI-NEXT:    fdiv s0, s0, s1
646 ; CHECK-GI-NEXT:    ret
647   %cvt = sitofp i32 %int to float
648   %fix = fdiv float %cvt, 4294967296.0
649   ret float %fix
652 define float @scvtf_f32_i64_7(i64 %long) {
653 ; CHECK-SD-LABEL: scvtf_f32_i64_7:
654 ; CHECK-SD:       // %bb.0:
655 ; CHECK-SD-NEXT:    scvtf s0, x0, #7
656 ; CHECK-SD-NEXT:    ret
658 ; CHECK-GI-LABEL: scvtf_f32_i64_7:
659 ; CHECK-GI:       // %bb.0:
660 ; CHECK-GI-NEXT:    movi v0.2s, #67, lsl #24
661 ; CHECK-GI-NEXT:    scvtf s1, x0
662 ; CHECK-GI-NEXT:    fdiv s0, s1, s0
663 ; CHECK-GI-NEXT:    ret
664   %cvt = sitofp i64 %long to float
665   %fix = fdiv float %cvt, 128.0
666   ret float %fix
669 define float @scvtf_f32_i64_64(i64 %long) {
670 ; CHECK-SD-LABEL: scvtf_f32_i64_64:
671 ; CHECK-SD:       // %bb.0:
672 ; CHECK-SD-NEXT:    scvtf s0, x0, #64
673 ; CHECK-SD-NEXT:    ret
675 ; CHECK-GI-LABEL: scvtf_f32_i64_64:
676 ; CHECK-GI:       // %bb.0:
677 ; CHECK-GI-NEXT:    scvtf s0, x0
678 ; CHECK-GI-NEXT:    mov w8, #1602224128 // =0x5f800000
679 ; CHECK-GI-NEXT:    fmov s1, w8
680 ; CHECK-GI-NEXT:    fdiv s0, s0, s1
681 ; CHECK-GI-NEXT:    ret
682   %cvt = sitofp i64 %long to float
683   %fix = fdiv float %cvt, 18446744073709551616.0
684   ret float %fix
687 define double @scvtf_f64_i32_7(i32 %int) {
688 ; CHECK-SD-LABEL: scvtf_f64_i32_7:
689 ; CHECK-SD:       // %bb.0:
690 ; CHECK-SD-NEXT:    scvtf d0, w0, #7
691 ; CHECK-SD-NEXT:    ret
693 ; CHECK-GI-LABEL: scvtf_f64_i32_7:
694 ; CHECK-GI:       // %bb.0:
695 ; CHECK-GI-NEXT:    scvtf d0, w0
696 ; CHECK-GI-NEXT:    mov x8, #4638707616191610880 // =0x4060000000000000
697 ; CHECK-GI-NEXT:    fmov d1, x8
698 ; CHECK-GI-NEXT:    fdiv d0, d0, d1
699 ; CHECK-GI-NEXT:    ret
700   %cvt = sitofp i32 %int to double
701   %fix = fdiv double %cvt, 128.0
702   ret double %fix
705 define double @scvtf_f64_i32_32(i32 %int) {
706 ; CHECK-SD-LABEL: scvtf_f64_i32_32:
707 ; CHECK-SD:       // %bb.0:
708 ; CHECK-SD-NEXT:    scvtf d0, w0, #32
709 ; CHECK-SD-NEXT:    ret
711 ; CHECK-GI-LABEL: scvtf_f64_i32_32:
712 ; CHECK-GI:       // %bb.0:
713 ; CHECK-GI-NEXT:    scvtf d0, w0
714 ; CHECK-GI-NEXT:    mov x8, #4751297606875873280 // =0x41f0000000000000
715 ; CHECK-GI-NEXT:    fmov d1, x8
716 ; CHECK-GI-NEXT:    fdiv d0, d0, d1
717 ; CHECK-GI-NEXT:    ret
718   %cvt = sitofp i32 %int to double
719   %fix = fdiv double %cvt, 4294967296.0
720   ret double %fix
723 define double @scvtf_f64_i64_7(i64 %long) {
724 ; CHECK-SD-LABEL: scvtf_f64_i64_7:
725 ; CHECK-SD:       // %bb.0:
726 ; CHECK-SD-NEXT:    scvtf d0, x0, #7
727 ; CHECK-SD-NEXT:    ret
729 ; CHECK-GI-LABEL: scvtf_f64_i64_7:
730 ; CHECK-GI:       // %bb.0:
731 ; CHECK-GI-NEXT:    scvtf d0, x0
732 ; CHECK-GI-NEXT:    mov x8, #4638707616191610880 // =0x4060000000000000
733 ; CHECK-GI-NEXT:    fmov d1, x8
734 ; CHECK-GI-NEXT:    fdiv d0, d0, d1
735 ; CHECK-GI-NEXT:    ret
736   %cvt = sitofp i64 %long to double
737   %fix = fdiv double %cvt, 128.0
738   ret double %fix
741 define double @scvtf_f64_i64_64(i64 %long) {
742 ; CHECK-SD-LABEL: scvtf_f64_i64_64:
743 ; CHECK-SD:       // %bb.0:
744 ; CHECK-SD-NEXT:    scvtf d0, x0, #64
745 ; CHECK-SD-NEXT:    ret
747 ; CHECK-GI-LABEL: scvtf_f64_i64_64:
748 ; CHECK-GI:       // %bb.0:
749 ; CHECK-GI-NEXT:    scvtf d0, x0
750 ; CHECK-GI-NEXT:    mov x8, #4895412794951729152 // =0x43f0000000000000
751 ; CHECK-GI-NEXT:    fmov d1, x8
752 ; CHECK-GI-NEXT:    fdiv d0, d0, d1
753 ; CHECK-GI-NEXT:    ret
754   %cvt = sitofp i64 %long to double
755   %fix = fdiv double %cvt, 18446744073709551616.0
756   ret double %fix
759 define half @scvtf_f16_i32_7(i32 %int) {
760 ; CHECK-SD-NO16-LABEL: scvtf_f16_i32_7:
761 ; CHECK-SD-NO16:       // %bb.0:
762 ; CHECK-SD-NO16-NEXT:    scvtf s1, w0
763 ; CHECK-SD-NO16-NEXT:    movi v0.2s, #60, lsl #24
764 ; CHECK-SD-NO16-NEXT:    fcvt h1, s1
765 ; CHECK-SD-NO16-NEXT:    fcvt s1, h1
766 ; CHECK-SD-NO16-NEXT:    fmul s0, s1, s0
767 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
768 ; CHECK-SD-NO16-NEXT:    ret
770 ; CHECK-SD-FP16-LABEL: scvtf_f16_i32_7:
771 ; CHECK-SD-FP16:       // %bb.0:
772 ; CHECK-SD-FP16-NEXT:    scvtf h0, w0, #7
773 ; CHECK-SD-FP16-NEXT:    ret
775 ; CHECK-GI-NO16-LABEL: scvtf_f16_i32_7:
776 ; CHECK-GI-NO16:       // %bb.0:
777 ; CHECK-GI-NO16-NEXT:    scvtf s0, w0
778 ; CHECK-GI-NO16-NEXT:    mov w8, #22528 // =0x5800
779 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
780 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
781 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
782 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
783 ; CHECK-GI-NO16-NEXT:    fdiv s0, s0, s1
784 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
785 ; CHECK-GI-NO16-NEXT:    ret
787 ; CHECK-GI-FP16-LABEL: scvtf_f16_i32_7:
788 ; CHECK-GI-FP16:       // %bb.0:
789 ; CHECK-GI-FP16-NEXT:    scvtf h0, w0
790 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI32_0
791 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI32_0]
792 ; CHECK-GI-FP16-NEXT:    fdiv h0, h0, h1
793 ; CHECK-GI-FP16-NEXT:    ret
794   %cvt = sitofp i32 %int to half
795   %fix = fdiv half %cvt, 128.0
796   ret half %fix
799 define half @scvtf_f16_i32_15(i32 %int) {
800 ; CHECK-SD-NO16-LABEL: scvtf_f16_i32_15:
801 ; CHECK-SD-NO16:       // %bb.0:
802 ; CHECK-SD-NO16-NEXT:    scvtf s1, w0
803 ; CHECK-SD-NO16-NEXT:    movi v0.2s, #56, lsl #24
804 ; CHECK-SD-NO16-NEXT:    fcvt h1, s1
805 ; CHECK-SD-NO16-NEXT:    fcvt s1, h1
806 ; CHECK-SD-NO16-NEXT:    fmul s0, s1, s0
807 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
808 ; CHECK-SD-NO16-NEXT:    ret
810 ; CHECK-SD-FP16-LABEL: scvtf_f16_i32_15:
811 ; CHECK-SD-FP16:       // %bb.0:
812 ; CHECK-SD-FP16-NEXT:    scvtf h0, w0, #15
813 ; CHECK-SD-FP16-NEXT:    ret
815 ; CHECK-GI-NO16-LABEL: scvtf_f16_i32_15:
816 ; CHECK-GI-NO16:       // %bb.0:
817 ; CHECK-GI-NO16-NEXT:    scvtf s0, w0
818 ; CHECK-GI-NO16-NEXT:    mov w8, #30720 // =0x7800
819 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
820 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
821 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
822 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
823 ; CHECK-GI-NO16-NEXT:    fdiv s0, s0, s1
824 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
825 ; CHECK-GI-NO16-NEXT:    ret
827 ; CHECK-GI-FP16-LABEL: scvtf_f16_i32_15:
828 ; CHECK-GI-FP16:       // %bb.0:
829 ; CHECK-GI-FP16-NEXT:    scvtf h0, w0
830 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI33_0
831 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI33_0]
832 ; CHECK-GI-FP16-NEXT:    fdiv h0, h0, h1
833 ; CHECK-GI-FP16-NEXT:    ret
834   %cvt = sitofp i32 %int to half
835   %fix = fdiv half %cvt, 32768.0
836   ret half %fix
839 define half @scvtf_f16_i64_7(i64 %long) {
840 ; CHECK-SD-NO16-LABEL: scvtf_f16_i64_7:
841 ; CHECK-SD-NO16:       // %bb.0:
842 ; CHECK-SD-NO16-NEXT:    scvtf s1, x0
843 ; CHECK-SD-NO16-NEXT:    movi v0.2s, #60, lsl #24
844 ; CHECK-SD-NO16-NEXT:    fcvt h1, s1
845 ; CHECK-SD-NO16-NEXT:    fcvt s1, h1
846 ; CHECK-SD-NO16-NEXT:    fmul s0, s1, s0
847 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
848 ; CHECK-SD-NO16-NEXT:    ret
850 ; CHECK-SD-FP16-LABEL: scvtf_f16_i64_7:
851 ; CHECK-SD-FP16:       // %bb.0:
852 ; CHECK-SD-FP16-NEXT:    scvtf h0, x0, #7
853 ; CHECK-SD-FP16-NEXT:    ret
855 ; CHECK-GI-NO16-LABEL: scvtf_f16_i64_7:
856 ; CHECK-GI-NO16:       // %bb.0:
857 ; CHECK-GI-NO16-NEXT:    scvtf s0, x0
858 ; CHECK-GI-NO16-NEXT:    mov w8, #22528 // =0x5800
859 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
860 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
861 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
862 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
863 ; CHECK-GI-NO16-NEXT:    fdiv s0, s0, s1
864 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
865 ; CHECK-GI-NO16-NEXT:    ret
867 ; CHECK-GI-FP16-LABEL: scvtf_f16_i64_7:
868 ; CHECK-GI-FP16:       // %bb.0:
869 ; CHECK-GI-FP16-NEXT:    scvtf h0, x0
870 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI34_0
871 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI34_0]
872 ; CHECK-GI-FP16-NEXT:    fdiv h0, h0, h1
873 ; CHECK-GI-FP16-NEXT:    ret
874   %cvt = sitofp i64 %long to half
875   %fix = fdiv half %cvt, 128.0
876   ret half %fix
879 define half @scvtf_f16_i64_15(i64 %long) {
880 ; CHECK-SD-NO16-LABEL: scvtf_f16_i64_15:
881 ; CHECK-SD-NO16:       // %bb.0:
882 ; CHECK-SD-NO16-NEXT:    scvtf s1, x0
883 ; CHECK-SD-NO16-NEXT:    movi v0.2s, #56, lsl #24
884 ; CHECK-SD-NO16-NEXT:    fcvt h1, s1
885 ; CHECK-SD-NO16-NEXT:    fcvt s1, h1
886 ; CHECK-SD-NO16-NEXT:    fmul s0, s1, s0
887 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
888 ; CHECK-SD-NO16-NEXT:    ret
890 ; CHECK-SD-FP16-LABEL: scvtf_f16_i64_15:
891 ; CHECK-SD-FP16:       // %bb.0:
892 ; CHECK-SD-FP16-NEXT:    scvtf h0, x0, #15
893 ; CHECK-SD-FP16-NEXT:    ret
895 ; CHECK-GI-NO16-LABEL: scvtf_f16_i64_15:
896 ; CHECK-GI-NO16:       // %bb.0:
897 ; CHECK-GI-NO16-NEXT:    scvtf s0, x0
898 ; CHECK-GI-NO16-NEXT:    mov w8, #30720 // =0x7800
899 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
900 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
901 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
902 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
903 ; CHECK-GI-NO16-NEXT:    fdiv s0, s0, s1
904 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
905 ; CHECK-GI-NO16-NEXT:    ret
907 ; CHECK-GI-FP16-LABEL: scvtf_f16_i64_15:
908 ; CHECK-GI-FP16:       // %bb.0:
909 ; CHECK-GI-FP16-NEXT:    scvtf h0, x0
910 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI35_0
911 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI35_0]
912 ; CHECK-GI-FP16-NEXT:    fdiv h0, h0, h1
913 ; CHECK-GI-FP16-NEXT:    ret
914   %cvt = sitofp i64 %long to half
915   %fix = fdiv half %cvt, 32768.0
916   ret half %fix
919 ; uitofp
921 define float @ucvtf_f32_i32_7(i32 %int) {
922 ; CHECK-SD-LABEL: ucvtf_f32_i32_7:
923 ; CHECK-SD:       // %bb.0:
924 ; CHECK-SD-NEXT:    ucvtf s0, w0, #7
925 ; CHECK-SD-NEXT:    ret
927 ; CHECK-GI-LABEL: ucvtf_f32_i32_7:
928 ; CHECK-GI:       // %bb.0:
929 ; CHECK-GI-NEXT:    movi v0.2s, #67, lsl #24
930 ; CHECK-GI-NEXT:    ucvtf s1, w0
931 ; CHECK-GI-NEXT:    fdiv s0, s1, s0
932 ; CHECK-GI-NEXT:    ret
933   %cvt = uitofp i32 %int to float
934   %fix = fdiv float %cvt, 128.0
935   ret float %fix
938 define float @ucvtf_f32_i32_32(i32 %int) {
939 ; CHECK-SD-LABEL: ucvtf_f32_i32_32:
940 ; CHECK-SD:       // %bb.0:
941 ; CHECK-SD-NEXT:    ucvtf s0, w0, #32
942 ; CHECK-SD-NEXT:    ret
944 ; CHECK-GI-LABEL: ucvtf_f32_i32_32:
945 ; CHECK-GI:       // %bb.0:
946 ; CHECK-GI-NEXT:    ucvtf s0, w0
947 ; CHECK-GI-NEXT:    mov w8, #1333788672 // =0x4f800000
948 ; CHECK-GI-NEXT:    fmov s1, w8
949 ; CHECK-GI-NEXT:    fdiv s0, s0, s1
950 ; CHECK-GI-NEXT:    ret
951   %cvt = uitofp i32 %int to float
952   %fix = fdiv float %cvt, 4294967296.0
953   ret float %fix
956 define float @ucvtf_f32_i64_7(i64 %long) {
957 ; CHECK-SD-LABEL: ucvtf_f32_i64_7:
958 ; CHECK-SD:       // %bb.0:
959 ; CHECK-SD-NEXT:    ucvtf s0, x0, #7
960 ; CHECK-SD-NEXT:    ret
962 ; CHECK-GI-LABEL: ucvtf_f32_i64_7:
963 ; CHECK-GI:       // %bb.0:
964 ; CHECK-GI-NEXT:    movi v0.2s, #67, lsl #24
965 ; CHECK-GI-NEXT:    ucvtf s1, x0
966 ; CHECK-GI-NEXT:    fdiv s0, s1, s0
967 ; CHECK-GI-NEXT:    ret
968   %cvt = uitofp i64 %long to float
969   %fix = fdiv float %cvt, 128.0
970   ret float %fix
973 define float @ucvtf_f32_i64_64(i64 %long) {
974 ; CHECK-SD-LABEL: ucvtf_f32_i64_64:
975 ; CHECK-SD:       // %bb.0:
976 ; CHECK-SD-NEXT:    ucvtf s0, x0, #64
977 ; CHECK-SD-NEXT:    ret
979 ; CHECK-GI-LABEL: ucvtf_f32_i64_64:
980 ; CHECK-GI:       // %bb.0:
981 ; CHECK-GI-NEXT:    ucvtf s0, x0
982 ; CHECK-GI-NEXT:    mov w8, #1602224128 // =0x5f800000
983 ; CHECK-GI-NEXT:    fmov s1, w8
984 ; CHECK-GI-NEXT:    fdiv s0, s0, s1
985 ; CHECK-GI-NEXT:    ret
986   %cvt = uitofp i64 %long to float
987   %fix = fdiv float %cvt, 18446744073709551616.0
988   ret float %fix
991 define double @ucvtf_f64_i32_7(i32 %int) {
992 ; CHECK-SD-LABEL: ucvtf_f64_i32_7:
993 ; CHECK-SD:       // %bb.0:
994 ; CHECK-SD-NEXT:    ucvtf d0, w0, #7
995 ; CHECK-SD-NEXT:    ret
997 ; CHECK-GI-LABEL: ucvtf_f64_i32_7:
998 ; CHECK-GI:       // %bb.0:
999 ; CHECK-GI-NEXT:    ucvtf d0, w0
1000 ; CHECK-GI-NEXT:    mov x8, #4638707616191610880 // =0x4060000000000000
1001 ; CHECK-GI-NEXT:    fmov d1, x8
1002 ; CHECK-GI-NEXT:    fdiv d0, d0, d1
1003 ; CHECK-GI-NEXT:    ret
1004   %cvt = uitofp i32 %int to double
1005   %fix = fdiv double %cvt, 128.0
1006   ret double %fix
1009 define double @ucvtf_f64_i32_32(i32 %int) {
1010 ; CHECK-SD-LABEL: ucvtf_f64_i32_32:
1011 ; CHECK-SD:       // %bb.0:
1012 ; CHECK-SD-NEXT:    ucvtf d0, w0, #32
1013 ; CHECK-SD-NEXT:    ret
1015 ; CHECK-GI-LABEL: ucvtf_f64_i32_32:
1016 ; CHECK-GI:       // %bb.0:
1017 ; CHECK-GI-NEXT:    ucvtf d0, w0
1018 ; CHECK-GI-NEXT:    mov x8, #4751297606875873280 // =0x41f0000000000000
1019 ; CHECK-GI-NEXT:    fmov d1, x8
1020 ; CHECK-GI-NEXT:    fdiv d0, d0, d1
1021 ; CHECK-GI-NEXT:    ret
1022   %cvt = uitofp i32 %int to double
1023   %fix = fdiv double %cvt, 4294967296.0
1024   ret double %fix
1027 define double @ucvtf_f64_i64_7(i64 %long) {
1028 ; CHECK-SD-LABEL: ucvtf_f64_i64_7:
1029 ; CHECK-SD:       // %bb.0:
1030 ; CHECK-SD-NEXT:    ucvtf d0, x0, #7
1031 ; CHECK-SD-NEXT:    ret
1033 ; CHECK-GI-LABEL: ucvtf_f64_i64_7:
1034 ; CHECK-GI:       // %bb.0:
1035 ; CHECK-GI-NEXT:    ucvtf d0, x0
1036 ; CHECK-GI-NEXT:    mov x8, #4638707616191610880 // =0x4060000000000000
1037 ; CHECK-GI-NEXT:    fmov d1, x8
1038 ; CHECK-GI-NEXT:    fdiv d0, d0, d1
1039 ; CHECK-GI-NEXT:    ret
1040   %cvt = uitofp i64 %long to double
1041   %fix = fdiv double %cvt, 128.0
1042   ret double %fix
1045 define double @ucvtf_f64_i64_64(i64 %long) {
1046 ; CHECK-SD-LABEL: ucvtf_f64_i64_64:
1047 ; CHECK-SD:       // %bb.0:
1048 ; CHECK-SD-NEXT:    ucvtf d0, x0, #64
1049 ; CHECK-SD-NEXT:    ret
1051 ; CHECK-GI-LABEL: ucvtf_f64_i64_64:
1052 ; CHECK-GI:       // %bb.0:
1053 ; CHECK-GI-NEXT:    ucvtf d0, x0
1054 ; CHECK-GI-NEXT:    mov x8, #4895412794951729152 // =0x43f0000000000000
1055 ; CHECK-GI-NEXT:    fmov d1, x8
1056 ; CHECK-GI-NEXT:    fdiv d0, d0, d1
1057 ; CHECK-GI-NEXT:    ret
1058   %cvt = uitofp i64 %long to double
1059   %fix = fdiv double %cvt, 18446744073709551616.0
1060   ret double %fix
1063 define half @ucvtf_f16_i32_7(i32 %int) {
1064 ; CHECK-SD-NO16-LABEL: ucvtf_f16_i32_7:
1065 ; CHECK-SD-NO16:       // %bb.0:
1066 ; CHECK-SD-NO16-NEXT:    ucvtf s1, w0
1067 ; CHECK-SD-NO16-NEXT:    movi v0.2s, #60, lsl #24
1068 ; CHECK-SD-NO16-NEXT:    fcvt h1, s1
1069 ; CHECK-SD-NO16-NEXT:    fcvt s1, h1
1070 ; CHECK-SD-NO16-NEXT:    fmul s0, s1, s0
1071 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
1072 ; CHECK-SD-NO16-NEXT:    ret
1074 ; CHECK-SD-FP16-LABEL: ucvtf_f16_i32_7:
1075 ; CHECK-SD-FP16:       // %bb.0:
1076 ; CHECK-SD-FP16-NEXT:    ucvtf h0, w0, #7
1077 ; CHECK-SD-FP16-NEXT:    ret
1079 ; CHECK-GI-NO16-LABEL: ucvtf_f16_i32_7:
1080 ; CHECK-GI-NO16:       // %bb.0:
1081 ; CHECK-GI-NO16-NEXT:    ucvtf s0, w0
1082 ; CHECK-GI-NO16-NEXT:    mov w8, #22528 // =0x5800
1083 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
1084 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1085 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
1086 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1087 ; CHECK-GI-NO16-NEXT:    fdiv s0, s0, s1
1088 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1089 ; CHECK-GI-NO16-NEXT:    ret
1091 ; CHECK-GI-FP16-LABEL: ucvtf_f16_i32_7:
1092 ; CHECK-GI-FP16:       // %bb.0:
1093 ; CHECK-GI-FP16-NEXT:    ucvtf h0, w0
1094 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI44_0
1095 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI44_0]
1096 ; CHECK-GI-FP16-NEXT:    fdiv h0, h0, h1
1097 ; CHECK-GI-FP16-NEXT:    ret
1098   %cvt = uitofp i32 %int to half
1099   %fix = fdiv half %cvt, 128.0
1100   ret half %fix
1103 define half @ucvtf_f16_i32_15(i32 %int) {
1104 ; CHECK-SD-NO16-LABEL: ucvtf_f16_i32_15:
1105 ; CHECK-SD-NO16:       // %bb.0:
1106 ; CHECK-SD-NO16-NEXT:    ucvtf s1, w0
1107 ; CHECK-SD-NO16-NEXT:    movi v0.2s, #56, lsl #24
1108 ; CHECK-SD-NO16-NEXT:    fcvt h1, s1
1109 ; CHECK-SD-NO16-NEXT:    fcvt s1, h1
1110 ; CHECK-SD-NO16-NEXT:    fmul s0, s1, s0
1111 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
1112 ; CHECK-SD-NO16-NEXT:    ret
1114 ; CHECK-SD-FP16-LABEL: ucvtf_f16_i32_15:
1115 ; CHECK-SD-FP16:       // %bb.0:
1116 ; CHECK-SD-FP16-NEXT:    ucvtf h0, w0, #15
1117 ; CHECK-SD-FP16-NEXT:    ret
1119 ; CHECK-GI-NO16-LABEL: ucvtf_f16_i32_15:
1120 ; CHECK-GI-NO16:       // %bb.0:
1121 ; CHECK-GI-NO16-NEXT:    ucvtf s0, w0
1122 ; CHECK-GI-NO16-NEXT:    mov w8, #30720 // =0x7800
1123 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
1124 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1125 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
1126 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1127 ; CHECK-GI-NO16-NEXT:    fdiv s0, s0, s1
1128 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1129 ; CHECK-GI-NO16-NEXT:    ret
1131 ; CHECK-GI-FP16-LABEL: ucvtf_f16_i32_15:
1132 ; CHECK-GI-FP16:       // %bb.0:
1133 ; CHECK-GI-FP16-NEXT:    ucvtf h0, w0
1134 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI45_0
1135 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI45_0]
1136 ; CHECK-GI-FP16-NEXT:    fdiv h0, h0, h1
1137 ; CHECK-GI-FP16-NEXT:    ret
1138   %cvt = uitofp i32 %int to half
1139   %fix = fdiv half %cvt, 32768.0
1140   ret half %fix
1143 define half @ucvtf_f16_i64_7(i64 %long) {
1144 ; CHECK-SD-NO16-LABEL: ucvtf_f16_i64_7:
1145 ; CHECK-SD-NO16:       // %bb.0:
1146 ; CHECK-SD-NO16-NEXT:    ucvtf s1, x0
1147 ; CHECK-SD-NO16-NEXT:    movi v0.2s, #60, lsl #24
1148 ; CHECK-SD-NO16-NEXT:    fcvt h1, s1
1149 ; CHECK-SD-NO16-NEXT:    fcvt s1, h1
1150 ; CHECK-SD-NO16-NEXT:    fmul s0, s1, s0
1151 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
1152 ; CHECK-SD-NO16-NEXT:    ret
1154 ; CHECK-SD-FP16-LABEL: ucvtf_f16_i64_7:
1155 ; CHECK-SD-FP16:       // %bb.0:
1156 ; CHECK-SD-FP16-NEXT:    ucvtf h0, x0, #7
1157 ; CHECK-SD-FP16-NEXT:    ret
1159 ; CHECK-GI-NO16-LABEL: ucvtf_f16_i64_7:
1160 ; CHECK-GI-NO16:       // %bb.0:
1161 ; CHECK-GI-NO16-NEXT:    ucvtf s0, x0
1162 ; CHECK-GI-NO16-NEXT:    mov w8, #22528 // =0x5800
1163 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
1164 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1165 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
1166 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1167 ; CHECK-GI-NO16-NEXT:    fdiv s0, s0, s1
1168 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1169 ; CHECK-GI-NO16-NEXT:    ret
1171 ; CHECK-GI-FP16-LABEL: ucvtf_f16_i64_7:
1172 ; CHECK-GI-FP16:       // %bb.0:
1173 ; CHECK-GI-FP16-NEXT:    ucvtf h0, x0
1174 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI46_0
1175 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI46_0]
1176 ; CHECK-GI-FP16-NEXT:    fdiv h0, h0, h1
1177 ; CHECK-GI-FP16-NEXT:    ret
1178   %cvt = uitofp i64 %long to half
1179   %fix = fdiv half %cvt, 128.0
1180   ret half %fix
1183 define half @ucvtf_f16_i64_15(i64 %long) {
1184 ; CHECK-SD-NO16-LABEL: ucvtf_f16_i64_15:
1185 ; CHECK-SD-NO16:       // %bb.0:
1186 ; CHECK-SD-NO16-NEXT:    ucvtf s1, x0
1187 ; CHECK-SD-NO16-NEXT:    movi v0.2s, #56, lsl #24
1188 ; CHECK-SD-NO16-NEXT:    fcvt h1, s1
1189 ; CHECK-SD-NO16-NEXT:    fcvt s1, h1
1190 ; CHECK-SD-NO16-NEXT:    fmul s0, s1, s0
1191 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
1192 ; CHECK-SD-NO16-NEXT:    ret
1194 ; CHECK-SD-FP16-LABEL: ucvtf_f16_i64_15:
1195 ; CHECK-SD-FP16:       // %bb.0:
1196 ; CHECK-SD-FP16-NEXT:    ucvtf h0, x0, #15
1197 ; CHECK-SD-FP16-NEXT:    ret
1199 ; CHECK-GI-NO16-LABEL: ucvtf_f16_i64_15:
1200 ; CHECK-GI-NO16:       // %bb.0:
1201 ; CHECK-GI-NO16-NEXT:    ucvtf s0, x0
1202 ; CHECK-GI-NO16-NEXT:    mov w8, #30720 // =0x7800
1203 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
1204 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1205 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
1206 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1207 ; CHECK-GI-NO16-NEXT:    fdiv s0, s0, s1
1208 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1209 ; CHECK-GI-NO16-NEXT:    ret
1211 ; CHECK-GI-FP16-LABEL: ucvtf_f16_i64_15:
1212 ; CHECK-GI-FP16:       // %bb.0:
1213 ; CHECK-GI-FP16-NEXT:    ucvtf h0, x0
1214 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI47_0
1215 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI47_0]
1216 ; CHECK-GI-FP16-NEXT:    fdiv h0, h0, h1
1217 ; CHECK-GI-FP16-NEXT:    ret
1218   %cvt = uitofp i64 %long to half
1219   %fix = fdiv half %cvt, 32768.0
1220   ret half %fix
1224 ; fptoui.sat
1226 declare i32 @llvm.fptosi.sat.i32.f32(float)
1227 declare i64 @llvm.fptosi.sat.i64.f32(float)
1228 declare i32 @llvm.fptosi.sat.i32.f64(double)
1229 declare i64 @llvm.fptosi.sat.i64.f64(double)
1230 declare i32 @llvm.fptosi.sat.i32.f16(half)
1231 declare i64 @llvm.fptosi.sat.i64.f16(half)
1233 define i32 @fcvtzs_sat_f32_i32_7(float %flt) {
1234 ; CHECK-SD-LABEL: fcvtzs_sat_f32_i32_7:
1235 ; CHECK-SD:       // %bb.0:
1236 ; CHECK-SD-NEXT:    fcvtzs w0, s0, #7
1237 ; CHECK-SD-NEXT:    ret
1239 ; CHECK-GI-LABEL: fcvtzs_sat_f32_i32_7:
1240 ; CHECK-GI:       // %bb.0:
1241 ; CHECK-GI-NEXT:    movi v1.2s, #67, lsl #24
1242 ; CHECK-GI-NEXT:    fmul s0, s0, s1
1243 ; CHECK-GI-NEXT:    fcvtzs w0, s0
1244 ; CHECK-GI-NEXT:    ret
1245   %fix = fmul float %flt, 128.0
1246   %cvt = call i32 @llvm.fptosi.sat.i32.f32(float %fix)
1247   ret i32 %cvt
1250 define i32 @fcvtzs_sat_f32_i32_32(float %flt) {
1251 ; CHECK-SD-LABEL: fcvtzs_sat_f32_i32_32:
1252 ; CHECK-SD:       // %bb.0:
1253 ; CHECK-SD-NEXT:    fcvtzs w0, s0, #32
1254 ; CHECK-SD-NEXT:    ret
1256 ; CHECK-GI-LABEL: fcvtzs_sat_f32_i32_32:
1257 ; CHECK-GI:       // %bb.0:
1258 ; CHECK-GI-NEXT:    mov w8, #1333788672 // =0x4f800000
1259 ; CHECK-GI-NEXT:    fmov s1, w8
1260 ; CHECK-GI-NEXT:    fmul s0, s0, s1
1261 ; CHECK-GI-NEXT:    fcvtzs w0, s0
1262 ; CHECK-GI-NEXT:    ret
1263   %fix = fmul float %flt, 4294967296.0
1264   %cvt = call i32 @llvm.fptosi.sat.i32.f32(float %fix)
1265   ret i32 %cvt
1268 define i64 @fcvtzs_sat_f32_i64_64(float %flt) {
1269 ; CHECK-SD-LABEL: fcvtzs_sat_f32_i64_64:
1270 ; CHECK-SD:       // %bb.0:
1271 ; CHECK-SD-NEXT:    fcvtzs x0, s0, #64
1272 ; CHECK-SD-NEXT:    ret
1274 ; CHECK-GI-LABEL: fcvtzs_sat_f32_i64_64:
1275 ; CHECK-GI:       // %bb.0:
1276 ; CHECK-GI-NEXT:    mov w8, #1602224128 // =0x5f800000
1277 ; CHECK-GI-NEXT:    fmov s1, w8
1278 ; CHECK-GI-NEXT:    fmul s0, s0, s1
1279 ; CHECK-GI-NEXT:    fcvtzs x0, s0
1280 ; CHECK-GI-NEXT:    ret
1281   %fix = fmul float %flt, 18446744073709551616.0
1282   %cvt = call i64 @llvm.fptosi.sat.i64.f32(float %fix)
1283   ret i64 %cvt
1286 define i32 @fcvtzs_sat_f64_i32_7(double %dbl) {
1287 ; CHECK-SD-LABEL: fcvtzs_sat_f64_i32_7:
1288 ; CHECK-SD:       // %bb.0:
1289 ; CHECK-SD-NEXT:    fcvtzs w0, d0, #7
1290 ; CHECK-SD-NEXT:    ret
1292 ; CHECK-GI-LABEL: fcvtzs_sat_f64_i32_7:
1293 ; CHECK-GI:       // %bb.0:
1294 ; CHECK-GI-NEXT:    mov x8, #4638707616191610880 // =0x4060000000000000
1295 ; CHECK-GI-NEXT:    fmov d1, x8
1296 ; CHECK-GI-NEXT:    fmul d0, d0, d1
1297 ; CHECK-GI-NEXT:    fcvtzs w0, d0
1298 ; CHECK-GI-NEXT:    ret
1299   %fix = fmul double %dbl, 128.0
1300   %cvt = call i32 @llvm.fptosi.sat.i32.f64(double %fix)
1301   ret i32 %cvt
1304 define i32 @fcvtzs_sat_f64_i32_32(double %dbl) {
1305 ; CHECK-SD-LABEL: fcvtzs_sat_f64_i32_32:
1306 ; CHECK-SD:       // %bb.0:
1307 ; CHECK-SD-NEXT:    fcvtzs w0, d0, #32
1308 ; CHECK-SD-NEXT:    ret
1310 ; CHECK-GI-LABEL: fcvtzs_sat_f64_i32_32:
1311 ; CHECK-GI:       // %bb.0:
1312 ; CHECK-GI-NEXT:    mov x8, #4751297606875873280 // =0x41f0000000000000
1313 ; CHECK-GI-NEXT:    fmov d1, x8
1314 ; CHECK-GI-NEXT:    fmul d0, d0, d1
1315 ; CHECK-GI-NEXT:    fcvtzs w0, d0
1316 ; CHECK-GI-NEXT:    ret
1317   %fix = fmul double %dbl, 4294967296.0
1318   %cvt = call i32 @llvm.fptosi.sat.i32.f64(double %fix)
1319   ret i32 %cvt
1322 define i64 @fcvtzs_sat_f64_i64_7(double %dbl) {
1323 ; CHECK-SD-LABEL: fcvtzs_sat_f64_i64_7:
1324 ; CHECK-SD:       // %bb.0:
1325 ; CHECK-SD-NEXT:    fcvtzs x0, d0, #7
1326 ; CHECK-SD-NEXT:    ret
1328 ; CHECK-GI-LABEL: fcvtzs_sat_f64_i64_7:
1329 ; CHECK-GI:       // %bb.0:
1330 ; CHECK-GI-NEXT:    mov x8, #4638707616191610880 // =0x4060000000000000
1331 ; CHECK-GI-NEXT:    fmov d1, x8
1332 ; CHECK-GI-NEXT:    fmul d0, d0, d1
1333 ; CHECK-GI-NEXT:    fcvtzs x0, d0
1334 ; CHECK-GI-NEXT:    ret
1335   %fix = fmul double %dbl, 128.0
1336   %cvt = call i64 @llvm.fptosi.sat.i64.f64(double %fix)
1337   ret i64 %cvt
1340 define i64 @fcvtzs_sat_f64_i64_64(double %dbl) {
1341 ; CHECK-SD-LABEL: fcvtzs_sat_f64_i64_64:
1342 ; CHECK-SD:       // %bb.0:
1343 ; CHECK-SD-NEXT:    fcvtzs x0, d0, #64
1344 ; CHECK-SD-NEXT:    ret
1346 ; CHECK-GI-LABEL: fcvtzs_sat_f64_i64_64:
1347 ; CHECK-GI:       // %bb.0:
1348 ; CHECK-GI-NEXT:    mov x8, #4895412794951729152 // =0x43f0000000000000
1349 ; CHECK-GI-NEXT:    fmov d1, x8
1350 ; CHECK-GI-NEXT:    fmul d0, d0, d1
1351 ; CHECK-GI-NEXT:    fcvtzs x0, d0
1352 ; CHECK-GI-NEXT:    ret
1353   %fix = fmul double %dbl, 18446744073709551616.0
1354   %cvt = call i64 @llvm.fptosi.sat.i64.f64(double %fix)
1355   ret i64 %cvt
1358 define i32 @fcvtzs_sat_f16_i32_7(half %dbl) {
1359 ; CHECK-SD-NO16-LABEL: fcvtzs_sat_f16_i32_7:
1360 ; CHECK-SD-NO16:       // %bb.0:
1361 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #67, lsl #24
1362 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1363 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
1364 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
1365 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1366 ; CHECK-SD-NO16-NEXT:    fcvtzs w0, s0
1367 ; CHECK-SD-NO16-NEXT:    ret
1369 ; CHECK-SD-FP16-LABEL: fcvtzs_sat_f16_i32_7:
1370 ; CHECK-SD-FP16:       // %bb.0:
1371 ; CHECK-SD-FP16-NEXT:    fcvtzs w0, h0, #7
1372 ; CHECK-SD-FP16-NEXT:    ret
1374 ; CHECK-GI-NO16-LABEL: fcvtzs_sat_f16_i32_7:
1375 ; CHECK-GI-NO16:       // %bb.0:
1376 ; CHECK-GI-NO16-NEXT:    mov w8, #22528 // =0x5800
1377 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1378 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
1379 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
1380 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
1381 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1382 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1383 ; CHECK-GI-NO16-NEXT:    fcvtzs w0, s0
1384 ; CHECK-GI-NO16-NEXT:    ret
1386 ; CHECK-GI-FP16-LABEL: fcvtzs_sat_f16_i32_7:
1387 ; CHECK-GI-FP16:       // %bb.0:
1388 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI55_0
1389 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI55_0]
1390 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
1391 ; CHECK-GI-FP16-NEXT:    fcvtzs w0, h0
1392 ; CHECK-GI-FP16-NEXT:    ret
1393   %fix = fmul half %dbl, 128.0
1394   %cvt = call i32 @llvm.fptosi.sat.i32.f16(half %fix)
1395   ret i32 %cvt
1398 define i32 @fcvtzs_sat_f16_i32_15(half %dbl) {
1399 ; CHECK-SD-NO16-LABEL: fcvtzs_sat_f16_i32_15:
1400 ; CHECK-SD-NO16:       // %bb.0:
1401 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #71, lsl #24
1402 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1403 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
1404 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
1405 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1406 ; CHECK-SD-NO16-NEXT:    fcvtzs w0, s0
1407 ; CHECK-SD-NO16-NEXT:    ret
1409 ; CHECK-SD-FP16-LABEL: fcvtzs_sat_f16_i32_15:
1410 ; CHECK-SD-FP16:       // %bb.0:
1411 ; CHECK-SD-FP16-NEXT:    fcvtzs w0, h0, #15
1412 ; CHECK-SD-FP16-NEXT:    ret
1414 ; CHECK-GI-NO16-LABEL: fcvtzs_sat_f16_i32_15:
1415 ; CHECK-GI-NO16:       // %bb.0:
1416 ; CHECK-GI-NO16-NEXT:    mov w8, #30720 // =0x7800
1417 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1418 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
1419 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
1420 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
1421 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1422 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1423 ; CHECK-GI-NO16-NEXT:    fcvtzs w0, s0
1424 ; CHECK-GI-NO16-NEXT:    ret
1426 ; CHECK-GI-FP16-LABEL: fcvtzs_sat_f16_i32_15:
1427 ; CHECK-GI-FP16:       // %bb.0:
1428 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI56_0
1429 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI56_0]
1430 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
1431 ; CHECK-GI-FP16-NEXT:    fcvtzs w0, h0
1432 ; CHECK-GI-FP16-NEXT:    ret
1433   %fix = fmul half %dbl, 32768.0
1434   %cvt = call i32 @llvm.fptosi.sat.i32.f16(half %fix)
1435   ret i32 %cvt
1438 define i64 @fcvtzs_sat_f16_i64_7(half %dbl) {
1439 ; CHECK-SD-NO16-LABEL: fcvtzs_sat_f16_i64_7:
1440 ; CHECK-SD-NO16:       // %bb.0:
1441 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #67, lsl #24
1442 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1443 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
1444 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
1445 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1446 ; CHECK-SD-NO16-NEXT:    fcvtzs x0, s0
1447 ; CHECK-SD-NO16-NEXT:    ret
1449 ; CHECK-SD-FP16-LABEL: fcvtzs_sat_f16_i64_7:
1450 ; CHECK-SD-FP16:       // %bb.0:
1451 ; CHECK-SD-FP16-NEXT:    fcvtzs x0, h0, #7
1452 ; CHECK-SD-FP16-NEXT:    ret
1454 ; CHECK-GI-NO16-LABEL: fcvtzs_sat_f16_i64_7:
1455 ; CHECK-GI-NO16:       // %bb.0:
1456 ; CHECK-GI-NO16-NEXT:    mov w8, #22528 // =0x5800
1457 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1458 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
1459 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
1460 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
1461 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1462 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1463 ; CHECK-GI-NO16-NEXT:    fcvtzs x0, s0
1464 ; CHECK-GI-NO16-NEXT:    ret
1466 ; CHECK-GI-FP16-LABEL: fcvtzs_sat_f16_i64_7:
1467 ; CHECK-GI-FP16:       // %bb.0:
1468 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI57_0
1469 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI57_0]
1470 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
1471 ; CHECK-GI-FP16-NEXT:    fcvtzs x0, h0
1472 ; CHECK-GI-FP16-NEXT:    ret
1473   %fix = fmul half %dbl, 128.0
1474   %cvt = call i64 @llvm.fptosi.sat.i64.f16(half %fix)
1475   ret i64 %cvt
1478 define i64 @fcvtzs_sat_f16_i64_15(half %dbl) {
1479 ; CHECK-SD-NO16-LABEL: fcvtzs_sat_f16_i64_15:
1480 ; CHECK-SD-NO16:       // %bb.0:
1481 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #71, lsl #24
1482 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1483 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
1484 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
1485 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1486 ; CHECK-SD-NO16-NEXT:    fcvtzs x0, s0
1487 ; CHECK-SD-NO16-NEXT:    ret
1489 ; CHECK-SD-FP16-LABEL: fcvtzs_sat_f16_i64_15:
1490 ; CHECK-SD-FP16:       // %bb.0:
1491 ; CHECK-SD-FP16-NEXT:    fcvtzs x0, h0, #15
1492 ; CHECK-SD-FP16-NEXT:    ret
1494 ; CHECK-GI-NO16-LABEL: fcvtzs_sat_f16_i64_15:
1495 ; CHECK-GI-NO16:       // %bb.0:
1496 ; CHECK-GI-NO16-NEXT:    mov w8, #30720 // =0x7800
1497 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1498 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
1499 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
1500 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
1501 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1502 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1503 ; CHECK-GI-NO16-NEXT:    fcvtzs x0, s0
1504 ; CHECK-GI-NO16-NEXT:    ret
1506 ; CHECK-GI-FP16-LABEL: fcvtzs_sat_f16_i64_15:
1507 ; CHECK-GI-FP16:       // %bb.0:
1508 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI58_0
1509 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI58_0]
1510 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
1511 ; CHECK-GI-FP16-NEXT:    fcvtzs x0, h0
1512 ; CHECK-GI-FP16-NEXT:    ret
1513   %fix = fmul half %dbl, 32768.0
1514   %cvt = call i64 @llvm.fptosi.sat.i64.f16(half %fix)
1515   ret i64 %cvt
1518 ; fptoui
1520 declare i32 @llvm.fptoui.sat.i32.f32(float)
1521 declare i64 @llvm.fptoui.sat.i64.f32(float)
1522 declare i32 @llvm.fptoui.sat.i32.f64(double)
1523 declare i64 @llvm.fptoui.sat.i64.f64(double)
1524 declare i32 @llvm.fptoui.sat.i32.f16(half)
1525 declare i64 @llvm.fptoui.sat.i64.f16(half)
1527 define i32 @fcvtzu_sat_f32_i32_7(float %flt) {
1528 ; CHECK-SD-LABEL: fcvtzu_sat_f32_i32_7:
1529 ; CHECK-SD:       // %bb.0:
1530 ; CHECK-SD-NEXT:    fcvtzu w0, s0, #7
1531 ; CHECK-SD-NEXT:    ret
1533 ; CHECK-GI-LABEL: fcvtzu_sat_f32_i32_7:
1534 ; CHECK-GI:       // %bb.0:
1535 ; CHECK-GI-NEXT:    movi v1.2s, #67, lsl #24
1536 ; CHECK-GI-NEXT:    fmul s0, s0, s1
1537 ; CHECK-GI-NEXT:    fcvtzu w0, s0
1538 ; CHECK-GI-NEXT:    ret
1539   %fix = fmul float %flt, 128.0
1540   %cvt = call i32 @llvm.fptoui.sat.i32.f32(float %fix)
1541   ret i32 %cvt
1544 define i32 @fcvtzu_sat_f32_i32_32(float %flt) {
1545 ; CHECK-SD-LABEL: fcvtzu_sat_f32_i32_32:
1546 ; CHECK-SD:       // %bb.0:
1547 ; CHECK-SD-NEXT:    fcvtzu w0, s0, #32
1548 ; CHECK-SD-NEXT:    ret
1550 ; CHECK-GI-LABEL: fcvtzu_sat_f32_i32_32:
1551 ; CHECK-GI:       // %bb.0:
1552 ; CHECK-GI-NEXT:    mov w8, #1333788672 // =0x4f800000
1553 ; CHECK-GI-NEXT:    fmov s1, w8
1554 ; CHECK-GI-NEXT:    fmul s0, s0, s1
1555 ; CHECK-GI-NEXT:    fcvtzu w0, s0
1556 ; CHECK-GI-NEXT:    ret
1557   %fix = fmul float %flt, 4294967296.0
1558   %cvt = call i32 @llvm.fptoui.sat.i32.f32(float %fix)
1559   ret i32 %cvt
1562 define i64 @fcvtzu_sat_f32_i64_64(float %flt) {
1563 ; CHECK-SD-LABEL: fcvtzu_sat_f32_i64_64:
1564 ; CHECK-SD:       // %bb.0:
1565 ; CHECK-SD-NEXT:    fcvtzu x0, s0, #64
1566 ; CHECK-SD-NEXT:    ret
1568 ; CHECK-GI-LABEL: fcvtzu_sat_f32_i64_64:
1569 ; CHECK-GI:       // %bb.0:
1570 ; CHECK-GI-NEXT:    mov w8, #1602224128 // =0x5f800000
1571 ; CHECK-GI-NEXT:    fmov s1, w8
1572 ; CHECK-GI-NEXT:    fmul s0, s0, s1
1573 ; CHECK-GI-NEXT:    fcvtzu x0, s0
1574 ; CHECK-GI-NEXT:    ret
1575   %fix = fmul float %flt, 18446744073709551616.0
1576   %cvt = call i64 @llvm.fptoui.sat.i64.f32(float %fix)
1577   ret i64 %cvt
1580 define i32 @fcvtzu_sat_f64_i32_7(double %dbl) {
1581 ; CHECK-SD-LABEL: fcvtzu_sat_f64_i32_7:
1582 ; CHECK-SD:       // %bb.0:
1583 ; CHECK-SD-NEXT:    fcvtzu w0, d0, #7
1584 ; CHECK-SD-NEXT:    ret
1586 ; CHECK-GI-LABEL: fcvtzu_sat_f64_i32_7:
1587 ; CHECK-GI:       // %bb.0:
1588 ; CHECK-GI-NEXT:    mov x8, #4638707616191610880 // =0x4060000000000000
1589 ; CHECK-GI-NEXT:    fmov d1, x8
1590 ; CHECK-GI-NEXT:    fmul d0, d0, d1
1591 ; CHECK-GI-NEXT:    fcvtzu w0, d0
1592 ; CHECK-GI-NEXT:    ret
1593   %fix = fmul double %dbl, 128.0
1594   %cvt = call i32 @llvm.fptoui.sat.i32.f64(double %fix)
1595   ret i32 %cvt
1598 define i32 @fcvtzu_sat_f64_i32_32(double %dbl) {
1599 ; CHECK-SD-LABEL: fcvtzu_sat_f64_i32_32:
1600 ; CHECK-SD:       // %bb.0:
1601 ; CHECK-SD-NEXT:    fcvtzu w0, d0, #32
1602 ; CHECK-SD-NEXT:    ret
1604 ; CHECK-GI-LABEL: fcvtzu_sat_f64_i32_32:
1605 ; CHECK-GI:       // %bb.0:
1606 ; CHECK-GI-NEXT:    mov x8, #4751297606875873280 // =0x41f0000000000000
1607 ; CHECK-GI-NEXT:    fmov d1, x8
1608 ; CHECK-GI-NEXT:    fmul d0, d0, d1
1609 ; CHECK-GI-NEXT:    fcvtzu w0, d0
1610 ; CHECK-GI-NEXT:    ret
1611   %fix = fmul double %dbl, 4294967296.0
1612   %cvt = call i32 @llvm.fptoui.sat.i32.f64(double %fix)
1613   ret i32 %cvt
1616 define i64 @fcvtzu_sat_f64_i64_7(double %dbl) {
1617 ; CHECK-SD-LABEL: fcvtzu_sat_f64_i64_7:
1618 ; CHECK-SD:       // %bb.0:
1619 ; CHECK-SD-NEXT:    fcvtzu x0, d0, #7
1620 ; CHECK-SD-NEXT:    ret
1622 ; CHECK-GI-LABEL: fcvtzu_sat_f64_i64_7:
1623 ; CHECK-GI:       // %bb.0:
1624 ; CHECK-GI-NEXT:    mov x8, #4638707616191610880 // =0x4060000000000000
1625 ; CHECK-GI-NEXT:    fmov d1, x8
1626 ; CHECK-GI-NEXT:    fmul d0, d0, d1
1627 ; CHECK-GI-NEXT:    fcvtzu x0, d0
1628 ; CHECK-GI-NEXT:    ret
1629   %fix = fmul double %dbl, 128.0
1630   %cvt = call i64 @llvm.fptoui.sat.i64.f64(double %fix)
1631   ret i64 %cvt
1634 define i64 @fcvtzu_sat_f64_i64_64(double %dbl) {
1635 ; CHECK-SD-LABEL: fcvtzu_sat_f64_i64_64:
1636 ; CHECK-SD:       // %bb.0:
1637 ; CHECK-SD-NEXT:    fcvtzu x0, d0, #64
1638 ; CHECK-SD-NEXT:    ret
1640 ; CHECK-GI-LABEL: fcvtzu_sat_f64_i64_64:
1641 ; CHECK-GI:       // %bb.0:
1642 ; CHECK-GI-NEXT:    mov x8, #4895412794951729152 // =0x43f0000000000000
1643 ; CHECK-GI-NEXT:    fmov d1, x8
1644 ; CHECK-GI-NEXT:    fmul d0, d0, d1
1645 ; CHECK-GI-NEXT:    fcvtzu x0, d0
1646 ; CHECK-GI-NEXT:    ret
1647   %fix = fmul double %dbl, 18446744073709551616.0
1648   %cvt = call i64 @llvm.fptoui.sat.i64.f64(double %fix)
1649   ret i64 %cvt
1652 define i32 @fcvtzu_sat_f16_i32_7(half %dbl) {
1653 ; CHECK-SD-NO16-LABEL: fcvtzu_sat_f16_i32_7:
1654 ; CHECK-SD-NO16:       // %bb.0:
1655 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #67, lsl #24
1656 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1657 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
1658 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
1659 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1660 ; CHECK-SD-NO16-NEXT:    fcvtzu w0, s0
1661 ; CHECK-SD-NO16-NEXT:    ret
1663 ; CHECK-SD-FP16-LABEL: fcvtzu_sat_f16_i32_7:
1664 ; CHECK-SD-FP16:       // %bb.0:
1665 ; CHECK-SD-FP16-NEXT:    fcvtzu w0, h0, #7
1666 ; CHECK-SD-FP16-NEXT:    ret
1668 ; CHECK-GI-NO16-LABEL: fcvtzu_sat_f16_i32_7:
1669 ; CHECK-GI-NO16:       // %bb.0:
1670 ; CHECK-GI-NO16-NEXT:    mov w8, #22528 // =0x5800
1671 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1672 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
1673 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
1674 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
1675 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1676 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1677 ; CHECK-GI-NO16-NEXT:    fcvtzu w0, s0
1678 ; CHECK-GI-NO16-NEXT:    ret
1680 ; CHECK-GI-FP16-LABEL: fcvtzu_sat_f16_i32_7:
1681 ; CHECK-GI-FP16:       // %bb.0:
1682 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI66_0
1683 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI66_0]
1684 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
1685 ; CHECK-GI-FP16-NEXT:    fcvtzu w0, h0
1686 ; CHECK-GI-FP16-NEXT:    ret
1687   %fix = fmul half %dbl, 128.0
1688   %cvt = call i32 @llvm.fptoui.sat.i32.f16(half %fix)
1689   ret i32 %cvt
1692 define i32 @fcvtzu_sat_f16_i32_15(half %dbl) {
1693 ; CHECK-SD-NO16-LABEL: fcvtzu_sat_f16_i32_15:
1694 ; CHECK-SD-NO16:       // %bb.0:
1695 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #71, lsl #24
1696 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1697 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
1698 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
1699 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1700 ; CHECK-SD-NO16-NEXT:    fcvtzu w0, s0
1701 ; CHECK-SD-NO16-NEXT:    ret
1703 ; CHECK-SD-FP16-LABEL: fcvtzu_sat_f16_i32_15:
1704 ; CHECK-SD-FP16:       // %bb.0:
1705 ; CHECK-SD-FP16-NEXT:    fcvtzu w0, h0, #15
1706 ; CHECK-SD-FP16-NEXT:    ret
1708 ; CHECK-GI-NO16-LABEL: fcvtzu_sat_f16_i32_15:
1709 ; CHECK-GI-NO16:       // %bb.0:
1710 ; CHECK-GI-NO16-NEXT:    mov w8, #30720 // =0x7800
1711 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1712 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
1713 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
1714 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
1715 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1716 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1717 ; CHECK-GI-NO16-NEXT:    fcvtzu w0, s0
1718 ; CHECK-GI-NO16-NEXT:    ret
1720 ; CHECK-GI-FP16-LABEL: fcvtzu_sat_f16_i32_15:
1721 ; CHECK-GI-FP16:       // %bb.0:
1722 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI67_0
1723 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI67_0]
1724 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
1725 ; CHECK-GI-FP16-NEXT:    fcvtzu w0, h0
1726 ; CHECK-GI-FP16-NEXT:    ret
1727   %fix = fmul half %dbl, 32768.0
1728   %cvt = call i32 @llvm.fptoui.sat.i32.f16(half %fix)
1729   ret i32 %cvt
1732 define i64 @fcvtzu_sat_f16_i64_7(half %dbl) {
1733 ; CHECK-SD-NO16-LABEL: fcvtzu_sat_f16_i64_7:
1734 ; CHECK-SD-NO16:       // %bb.0:
1735 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #67, lsl #24
1736 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1737 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
1738 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
1739 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1740 ; CHECK-SD-NO16-NEXT:    fcvtzu x0, s0
1741 ; CHECK-SD-NO16-NEXT:    ret
1743 ; CHECK-SD-FP16-LABEL: fcvtzu_sat_f16_i64_7:
1744 ; CHECK-SD-FP16:       // %bb.0:
1745 ; CHECK-SD-FP16-NEXT:    fcvtzu x0, h0, #7
1746 ; CHECK-SD-FP16-NEXT:    ret
1748 ; CHECK-GI-NO16-LABEL: fcvtzu_sat_f16_i64_7:
1749 ; CHECK-GI-NO16:       // %bb.0:
1750 ; CHECK-GI-NO16-NEXT:    mov w8, #22528 // =0x5800
1751 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1752 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
1753 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
1754 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
1755 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1756 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1757 ; CHECK-GI-NO16-NEXT:    fcvtzu x0, s0
1758 ; CHECK-GI-NO16-NEXT:    ret
1760 ; CHECK-GI-FP16-LABEL: fcvtzu_sat_f16_i64_7:
1761 ; CHECK-GI-FP16:       // %bb.0:
1762 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI68_0
1763 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI68_0]
1764 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
1765 ; CHECK-GI-FP16-NEXT:    fcvtzu x0, h0
1766 ; CHECK-GI-FP16-NEXT:    ret
1767   %fix = fmul half %dbl, 128.0
1768   %cvt = call i64 @llvm.fptoui.sat.i64.f16(half %fix)
1769   ret i64 %cvt
1772 define i64 @fcvtzu_sat_f16_i64_15(half %dbl) {
1773 ; CHECK-SD-NO16-LABEL: fcvtzu_sat_f16_i64_15:
1774 ; CHECK-SD-NO16:       // %bb.0:
1775 ; CHECK-SD-NO16-NEXT:    movi v1.2s, #71, lsl #24
1776 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1777 ; CHECK-SD-NO16-NEXT:    fmul s0, s0, s1
1778 ; CHECK-SD-NO16-NEXT:    fcvt h0, s0
1779 ; CHECK-SD-NO16-NEXT:    fcvt s0, h0
1780 ; CHECK-SD-NO16-NEXT:    fcvtzu x0, s0
1781 ; CHECK-SD-NO16-NEXT:    ret
1783 ; CHECK-SD-FP16-LABEL: fcvtzu_sat_f16_i64_15:
1784 ; CHECK-SD-FP16:       // %bb.0:
1785 ; CHECK-SD-FP16-NEXT:    fcvtzu x0, h0, #15
1786 ; CHECK-SD-FP16-NEXT:    ret
1788 ; CHECK-GI-NO16-LABEL: fcvtzu_sat_f16_i64_15:
1789 ; CHECK-GI-NO16:       // %bb.0:
1790 ; CHECK-GI-NO16-NEXT:    mov w8, #30720 // =0x7800
1791 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1792 ; CHECK-GI-NO16-NEXT:    fmov s1, w8
1793 ; CHECK-GI-NO16-NEXT:    fcvt s1, h1
1794 ; CHECK-GI-NO16-NEXT:    fmul s0, s0, s1
1795 ; CHECK-GI-NO16-NEXT:    fcvt h0, s0
1796 ; CHECK-GI-NO16-NEXT:    fcvt s0, h0
1797 ; CHECK-GI-NO16-NEXT:    fcvtzu x0, s0
1798 ; CHECK-GI-NO16-NEXT:    ret
1800 ; CHECK-GI-FP16-LABEL: fcvtzu_sat_f16_i64_15:
1801 ; CHECK-GI-FP16:       // %bb.0:
1802 ; CHECK-GI-FP16-NEXT:    adrp x8, .LCPI69_0
1803 ; CHECK-GI-FP16-NEXT:    ldr h1, [x8, :lo12:.LCPI69_0]
1804 ; CHECK-GI-FP16-NEXT:    fmul h0, h0, h1
1805 ; CHECK-GI-FP16-NEXT:    fcvtzu x0, h0
1806 ; CHECK-GI-FP16-NEXT:    ret
1807   %fix = fmul half %dbl, 32768.0
1808   %cvt = call i64 @llvm.fptoui.sat.i64.f16(half %fix)
1809   ret i64 %cvt
1811 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
1812 ; CHECK: {{.*}}
1813 ; CHECK-FP16: {{.*}}
1814 ; CHECK-NO16: {{.*}}