[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / llvm / test / CodeGen / RISCV / half-round-conv.ll
blobfd5ee8aa4fef1fc67cb0c100078836752901f2f2
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+zfh -verify-machineinstrs < %s \
3 ; RUN:   -target-abi=ilp32f | FileCheck -check-prefixes=CHECKIZFH,RV32IZFH %s
4 ; RUN: llc -mtriple=riscv64 -mattr=+zfh -verify-machineinstrs < %s \
5 ; RUN:   -target-abi=lp64f | FileCheck -check-prefixes=CHECKIZFH,RV64IZFH %s
7 define signext i8 @test_floor_si8(half %x) {
8 ; RV32IZFH-LABEL: test_floor_si8:
9 ; RV32IZFH:       # %bb.0:
10 ; RV32IZFH-NEXT:    fcvt.w.h a0, fa0, rdn
11 ; RV32IZFH-NEXT:    ret
13 ; RV64IZFH-LABEL: test_floor_si8:
14 ; RV64IZFH:       # %bb.0:
15 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rdn
16 ; RV64IZFH-NEXT:    ret
17   %a = call half @llvm.floor.f16(half %x)
18   %b = fptosi half %a to i8
19   ret i8 %b
22 define signext i16 @test_floor_si16(half %x) {
23 ; RV32IZFH-LABEL: test_floor_si16:
24 ; RV32IZFH:       # %bb.0:
25 ; RV32IZFH-NEXT:    fcvt.w.h a0, fa0, rdn
26 ; RV32IZFH-NEXT:    ret
28 ; RV64IZFH-LABEL: test_floor_si16:
29 ; RV64IZFH:       # %bb.0:
30 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rdn
31 ; RV64IZFH-NEXT:    ret
32   %a = call half @llvm.floor.f16(half %x)
33   %b = fptosi half %a to i16
34   ret i16 %b
37 define signext i32 @test_floor_si32(half %x) {
38 ; CHECKIZFH-LABEL: test_floor_si32:
39 ; CHECKIZFH:       # %bb.0:
40 ; CHECKIZFH-NEXT:    fcvt.w.h a0, fa0, rdn
41 ; CHECKIZFH-NEXT:    ret
42   %a = call half @llvm.floor.f16(half %x)
43   %b = fptosi half %a to i32
44   ret i32 %b
47 define i64 @test_floor_si64(half %x) {
48 ; RV32IZFH-LABEL: test_floor_si64:
49 ; RV32IZFH:       # %bb.0:
50 ; RV32IZFH-NEXT:    addi sp, sp, -16
51 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
52 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
53 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
54 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
55 ; RV32IZFH-NEXT:    call floorf@plt
56 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
57 ; RV32IZFH-NEXT:    call __fixhfdi@plt
58 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
59 ; RV32IZFH-NEXT:    addi sp, sp, 16
60 ; RV32IZFH-NEXT:    ret
62 ; RV64IZFH-LABEL: test_floor_si64:
63 ; RV64IZFH:       # %bb.0:
64 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rdn
65 ; RV64IZFH-NEXT:    ret
66   %a = call half @llvm.floor.f16(half %x)
67   %b = fptosi half %a to i64
68   ret i64 %b
71 define zeroext i8 @test_floor_ui8(half %x) {
72 ; RV32IZFH-LABEL: test_floor_ui8:
73 ; RV32IZFH:       # %bb.0:
74 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rdn
75 ; RV32IZFH-NEXT:    ret
77 ; RV64IZFH-LABEL: test_floor_ui8:
78 ; RV64IZFH:       # %bb.0:
79 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rdn
80 ; RV64IZFH-NEXT:    ret
81   %a = call half @llvm.floor.f16(half %x)
82   %b = fptoui half %a to i8
83   ret i8 %b
86 define zeroext i16 @test_floor_ui16(half %x) {
87 ; RV32IZFH-LABEL: test_floor_ui16:
88 ; RV32IZFH:       # %bb.0:
89 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rdn
90 ; RV32IZFH-NEXT:    ret
92 ; RV64IZFH-LABEL: test_floor_ui16:
93 ; RV64IZFH:       # %bb.0:
94 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rdn
95 ; RV64IZFH-NEXT:    ret
96   %a = call half @llvm.floor.f16(half %x)
97   %b = fptoui half %a to i16
98   ret i16 %b
101 define signext i32 @test_floor_ui32(half %x) {
102 ; CHECKIZFH-LABEL: test_floor_ui32:
103 ; CHECKIZFH:       # %bb.0:
104 ; CHECKIZFH-NEXT:    fcvt.wu.h a0, fa0, rdn
105 ; CHECKIZFH-NEXT:    ret
106   %a = call half @llvm.floor.f16(half %x)
107   %b = fptoui half %a to i32
108   ret i32 %b
111 define i64 @test_floor_ui64(half %x) {
112 ; RV32IZFH-LABEL: test_floor_ui64:
113 ; RV32IZFH:       # %bb.0:
114 ; RV32IZFH-NEXT:    addi sp, sp, -16
115 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
116 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
117 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
118 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
119 ; RV32IZFH-NEXT:    call floorf@plt
120 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
121 ; RV32IZFH-NEXT:    call __fixunshfdi@plt
122 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
123 ; RV32IZFH-NEXT:    addi sp, sp, 16
124 ; RV32IZFH-NEXT:    ret
126 ; RV64IZFH-LABEL: test_floor_ui64:
127 ; RV64IZFH:       # %bb.0:
128 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rdn
129 ; RV64IZFH-NEXT:    ret
130   %a = call half @llvm.floor.f16(half %x)
131   %b = fptoui half %a to i64
132   ret i64 %b
135 define signext i8 @test_ceil_si8(half %x) {
136 ; RV32IZFH-LABEL: test_ceil_si8:
137 ; RV32IZFH:       # %bb.0:
138 ; RV32IZFH-NEXT:    fcvt.w.h a0, fa0, rup
139 ; RV32IZFH-NEXT:    ret
141 ; RV64IZFH-LABEL: test_ceil_si8:
142 ; RV64IZFH:       # %bb.0:
143 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rup
144 ; RV64IZFH-NEXT:    ret
145   %a = call half @llvm.ceil.f16(half %x)
146   %b = fptosi half %a to i8
147   ret i8 %b
150 define signext i16 @test_ceil_si16(half %x) {
151 ; RV32IZFH-LABEL: test_ceil_si16:
152 ; RV32IZFH:       # %bb.0:
153 ; RV32IZFH-NEXT:    fcvt.w.h a0, fa0, rup
154 ; RV32IZFH-NEXT:    ret
156 ; RV64IZFH-LABEL: test_ceil_si16:
157 ; RV64IZFH:       # %bb.0:
158 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rup
159 ; RV64IZFH-NEXT:    ret
160   %a = call half @llvm.ceil.f16(half %x)
161   %b = fptosi half %a to i16
162   ret i16 %b
165 define signext i32 @test_ceil_si32(half %x) {
166 ; CHECKIZFH-LABEL: test_ceil_si32:
167 ; CHECKIZFH:       # %bb.0:
168 ; CHECKIZFH-NEXT:    fcvt.w.h a0, fa0, rup
169 ; CHECKIZFH-NEXT:    ret
170   %a = call half @llvm.ceil.f16(half %x)
171   %b = fptosi half %a to i32
172   ret i32 %b
175 define i64 @test_ceil_si64(half %x) {
176 ; RV32IZFH-LABEL: test_ceil_si64:
177 ; RV32IZFH:       # %bb.0:
178 ; RV32IZFH-NEXT:    addi sp, sp, -16
179 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
180 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
181 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
182 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
183 ; RV32IZFH-NEXT:    call ceilf@plt
184 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
185 ; RV32IZFH-NEXT:    call __fixhfdi@plt
186 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
187 ; RV32IZFH-NEXT:    addi sp, sp, 16
188 ; RV32IZFH-NEXT:    ret
190 ; RV64IZFH-LABEL: test_ceil_si64:
191 ; RV64IZFH:       # %bb.0:
192 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rup
193 ; RV64IZFH-NEXT:    ret
194   %a = call half @llvm.ceil.f16(half %x)
195   %b = fptosi half %a to i64
196   ret i64 %b
199 define zeroext i8 @test_ceil_ui8(half %x) {
200 ; RV32IZFH-LABEL: test_ceil_ui8:
201 ; RV32IZFH:       # %bb.0:
202 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rup
203 ; RV32IZFH-NEXT:    ret
205 ; RV64IZFH-LABEL: test_ceil_ui8:
206 ; RV64IZFH:       # %bb.0:
207 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rup
208 ; RV64IZFH-NEXT:    ret
209   %a = call half @llvm.ceil.f16(half %x)
210   %b = fptoui half %a to i8
211   ret i8 %b
214 define zeroext i16 @test_ceil_ui16(half %x) {
215 ; RV32IZFH-LABEL: test_ceil_ui16:
216 ; RV32IZFH:       # %bb.0:
217 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rup
218 ; RV32IZFH-NEXT:    ret
220 ; RV64IZFH-LABEL: test_ceil_ui16:
221 ; RV64IZFH:       # %bb.0:
222 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rup
223 ; RV64IZFH-NEXT:    ret
224   %a = call half @llvm.ceil.f16(half %x)
225   %b = fptoui half %a to i16
226   ret i16 %b
229 define signext i32 @test_ceil_ui32(half %x) {
230 ; CHECKIZFH-LABEL: test_ceil_ui32:
231 ; CHECKIZFH:       # %bb.0:
232 ; CHECKIZFH-NEXT:    fcvt.wu.h a0, fa0, rup
233 ; CHECKIZFH-NEXT:    ret
234   %a = call half @llvm.ceil.f16(half %x)
235   %b = fptoui half %a to i32
236   ret i32 %b
239 define i64 @test_ceil_ui64(half %x) {
240 ; RV32IZFH-LABEL: test_ceil_ui64:
241 ; RV32IZFH:       # %bb.0:
242 ; RV32IZFH-NEXT:    addi sp, sp, -16
243 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
244 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
245 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
246 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
247 ; RV32IZFH-NEXT:    call ceilf@plt
248 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
249 ; RV32IZFH-NEXT:    call __fixunshfdi@plt
250 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
251 ; RV32IZFH-NEXT:    addi sp, sp, 16
252 ; RV32IZFH-NEXT:    ret
254 ; RV64IZFH-LABEL: test_ceil_ui64:
255 ; RV64IZFH:       # %bb.0:
256 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rup
257 ; RV64IZFH-NEXT:    ret
258   %a = call half @llvm.ceil.f16(half %x)
259   %b = fptoui half %a to i64
260   ret i64 %b
263 define signext i8 @test_trunc_si8(half %x) {
264 ; RV32IZFH-LABEL: test_trunc_si8:
265 ; RV32IZFH:       # %bb.0:
266 ; RV32IZFH-NEXT:    fcvt.w.h a0, fa0, rtz
267 ; RV32IZFH-NEXT:    ret
269 ; RV64IZFH-LABEL: test_trunc_si8:
270 ; RV64IZFH:       # %bb.0:
271 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rtz
272 ; RV64IZFH-NEXT:    ret
273   %a = call half @llvm.trunc.f16(half %x)
274   %b = fptosi half %a to i8
275   ret i8 %b
278 define signext i16 @test_trunc_si16(half %x) {
279 ; RV32IZFH-LABEL: test_trunc_si16:
280 ; RV32IZFH:       # %bb.0:
281 ; RV32IZFH-NEXT:    fcvt.w.h a0, fa0, rtz
282 ; RV32IZFH-NEXT:    ret
284 ; RV64IZFH-LABEL: test_trunc_si16:
285 ; RV64IZFH:       # %bb.0:
286 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rtz
287 ; RV64IZFH-NEXT:    ret
288   %a = call half @llvm.trunc.f16(half %x)
289   %b = fptosi half %a to i16
290   ret i16 %b
293 define signext i32 @test_trunc_si32(half %x) {
294 ; CHECKIZFH-LABEL: test_trunc_si32:
295 ; CHECKIZFH:       # %bb.0:
296 ; CHECKIZFH-NEXT:    fcvt.w.h a0, fa0, rtz
297 ; CHECKIZFH-NEXT:    ret
298   %a = call half @llvm.trunc.f16(half %x)
299   %b = fptosi half %a to i32
300   ret i32 %b
303 define i64 @test_trunc_si64(half %x) {
304 ; RV32IZFH-LABEL: test_trunc_si64:
305 ; RV32IZFH:       # %bb.0:
306 ; RV32IZFH-NEXT:    addi sp, sp, -16
307 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
308 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
309 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
310 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
311 ; RV32IZFH-NEXT:    call truncf@plt
312 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
313 ; RV32IZFH-NEXT:    call __fixhfdi@plt
314 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
315 ; RV32IZFH-NEXT:    addi sp, sp, 16
316 ; RV32IZFH-NEXT:    ret
318 ; RV64IZFH-LABEL: test_trunc_si64:
319 ; RV64IZFH:       # %bb.0:
320 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rtz
321 ; RV64IZFH-NEXT:    ret
322   %a = call half @llvm.trunc.f16(half %x)
323   %b = fptosi half %a to i64
324   ret i64 %b
327 define zeroext i8 @test_trunc_ui8(half %x) {
328 ; RV32IZFH-LABEL: test_trunc_ui8:
329 ; RV32IZFH:       # %bb.0:
330 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
331 ; RV32IZFH-NEXT:    ret
333 ; RV64IZFH-LABEL: test_trunc_ui8:
334 ; RV64IZFH:       # %bb.0:
335 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
336 ; RV64IZFH-NEXT:    ret
337   %a = call half @llvm.trunc.f16(half %x)
338   %b = fptoui half %a to i8
339   ret i8 %b
342 define zeroext i16 @test_trunc_ui16(half %x) {
343 ; RV32IZFH-LABEL: test_trunc_ui16:
344 ; RV32IZFH:       # %bb.0:
345 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
346 ; RV32IZFH-NEXT:    ret
348 ; RV64IZFH-LABEL: test_trunc_ui16:
349 ; RV64IZFH:       # %bb.0:
350 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
351 ; RV64IZFH-NEXT:    ret
352   %a = call half @llvm.trunc.f16(half %x)
353   %b = fptoui half %a to i16
354   ret i16 %b
357 define signext i32 @test_trunc_ui32(half %x) {
358 ; CHECKIZFH-LABEL: test_trunc_ui32:
359 ; CHECKIZFH:       # %bb.0:
360 ; CHECKIZFH-NEXT:    fcvt.wu.h a0, fa0, rtz
361 ; CHECKIZFH-NEXT:    ret
362   %a = call half @llvm.trunc.f16(half %x)
363   %b = fptoui half %a to i32
364   ret i32 %b
367 define i64 @test_trunc_ui64(half %x) {
368 ; RV32IZFH-LABEL: test_trunc_ui64:
369 ; RV32IZFH:       # %bb.0:
370 ; RV32IZFH-NEXT:    addi sp, sp, -16
371 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
372 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
373 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
374 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
375 ; RV32IZFH-NEXT:    call truncf@plt
376 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
377 ; RV32IZFH-NEXT:    call __fixunshfdi@plt
378 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
379 ; RV32IZFH-NEXT:    addi sp, sp, 16
380 ; RV32IZFH-NEXT:    ret
382 ; RV64IZFH-LABEL: test_trunc_ui64:
383 ; RV64IZFH:       # %bb.0:
384 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rtz
385 ; RV64IZFH-NEXT:    ret
386   %a = call half @llvm.trunc.f16(half %x)
387   %b = fptoui half %a to i64
388   ret i64 %b
391 define signext i8 @test_round_si8(half %x) {
392 ; RV32IZFH-LABEL: test_round_si8:
393 ; RV32IZFH:       # %bb.0:
394 ; RV32IZFH-NEXT:    fcvt.w.h a0, fa0, rmm
395 ; RV32IZFH-NEXT:    ret
397 ; RV64IZFH-LABEL: test_round_si8:
398 ; RV64IZFH:       # %bb.0:
399 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rmm
400 ; RV64IZFH-NEXT:    ret
401   %a = call half @llvm.round.f16(half %x)
402   %b = fptosi half %a to i8
403   ret i8 %b
406 define signext i16 @test_round_si16(half %x) {
407 ; RV32IZFH-LABEL: test_round_si16:
408 ; RV32IZFH:       # %bb.0:
409 ; RV32IZFH-NEXT:    fcvt.w.h a0, fa0, rmm
410 ; RV32IZFH-NEXT:    ret
412 ; RV64IZFH-LABEL: test_round_si16:
413 ; RV64IZFH:       # %bb.0:
414 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rmm
415 ; RV64IZFH-NEXT:    ret
416   %a = call half @llvm.round.f16(half %x)
417   %b = fptosi half %a to i16
418   ret i16 %b
421 define signext i32 @test_round_si32(half %x) {
422 ; CHECKIZFH-LABEL: test_round_si32:
423 ; CHECKIZFH:       # %bb.0:
424 ; CHECKIZFH-NEXT:    fcvt.w.h a0, fa0, rmm
425 ; CHECKIZFH-NEXT:    ret
426   %a = call half @llvm.round.f16(half %x)
427   %b = fptosi half %a to i32
428   ret i32 %b
431 define i64 @test_round_si64(half %x) {
432 ; RV32IZFH-LABEL: test_round_si64:
433 ; RV32IZFH:       # %bb.0:
434 ; RV32IZFH-NEXT:    addi sp, sp, -16
435 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
436 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
437 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
438 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
439 ; RV32IZFH-NEXT:    call roundf@plt
440 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
441 ; RV32IZFH-NEXT:    call __fixhfdi@plt
442 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
443 ; RV32IZFH-NEXT:    addi sp, sp, 16
444 ; RV32IZFH-NEXT:    ret
446 ; RV64IZFH-LABEL: test_round_si64:
447 ; RV64IZFH:       # %bb.0:
448 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rmm
449 ; RV64IZFH-NEXT:    ret
450   %a = call half @llvm.round.f16(half %x)
451   %b = fptosi half %a to i64
452   ret i64 %b
455 define zeroext i8 @test_round_ui8(half %x) {
456 ; RV32IZFH-LABEL: test_round_ui8:
457 ; RV32IZFH:       # %bb.0:
458 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rmm
459 ; RV32IZFH-NEXT:    ret
461 ; RV64IZFH-LABEL: test_round_ui8:
462 ; RV64IZFH:       # %bb.0:
463 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rmm
464 ; RV64IZFH-NEXT:    ret
465   %a = call half @llvm.round.f16(half %x)
466   %b = fptoui half %a to i8
467   ret i8 %b
470 define zeroext i16 @test_round_ui16(half %x) {
471 ; RV32IZFH-LABEL: test_round_ui16:
472 ; RV32IZFH:       # %bb.0:
473 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rmm
474 ; RV32IZFH-NEXT:    ret
476 ; RV64IZFH-LABEL: test_round_ui16:
477 ; RV64IZFH:       # %bb.0:
478 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rmm
479 ; RV64IZFH-NEXT:    ret
480   %a = call half @llvm.round.f16(half %x)
481   %b = fptoui half %a to i16
482   ret i16 %b
485 define signext i32 @test_round_ui32(half %x) {
486 ; CHECKIZFH-LABEL: test_round_ui32:
487 ; CHECKIZFH:       # %bb.0:
488 ; CHECKIZFH-NEXT:    fcvt.wu.h a0, fa0, rmm
489 ; CHECKIZFH-NEXT:    ret
490   %a = call half @llvm.round.f16(half %x)
491   %b = fptoui half %a to i32
492   ret i32 %b
495 define i64 @test_round_ui64(half %x) {
496 ; RV32IZFH-LABEL: test_round_ui64:
497 ; RV32IZFH:       # %bb.0:
498 ; RV32IZFH-NEXT:    addi sp, sp, -16
499 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
500 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
501 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
502 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
503 ; RV32IZFH-NEXT:    call roundf@plt
504 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
505 ; RV32IZFH-NEXT:    call __fixunshfdi@plt
506 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
507 ; RV32IZFH-NEXT:    addi sp, sp, 16
508 ; RV32IZFH-NEXT:    ret
510 ; RV64IZFH-LABEL: test_round_ui64:
511 ; RV64IZFH:       # %bb.0:
512 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rmm
513 ; RV64IZFH-NEXT:    ret
514   %a = call half @llvm.round.f16(half %x)
515   %b = fptoui half %a to i64
516   ret i64 %b
519 define signext i8 @test_roundeven_si8(half %x) {
520 ; RV32IZFH-LABEL: test_roundeven_si8:
521 ; RV32IZFH:       # %bb.0:
522 ; RV32IZFH-NEXT:    fcvt.w.h a0, fa0, rne
523 ; RV32IZFH-NEXT:    ret
525 ; RV64IZFH-LABEL: test_roundeven_si8:
526 ; RV64IZFH:       # %bb.0:
527 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rne
528 ; RV64IZFH-NEXT:    ret
529   %a = call half @llvm.roundeven.f16(half %x)
530   %b = fptosi half %a to i8
531   ret i8 %b
534 define signext i16 @test_roundeven_si16(half %x) {
535 ; RV32IZFH-LABEL: test_roundeven_si16:
536 ; RV32IZFH:       # %bb.0:
537 ; RV32IZFH-NEXT:    fcvt.w.h a0, fa0, rne
538 ; RV32IZFH-NEXT:    ret
540 ; RV64IZFH-LABEL: test_roundeven_si16:
541 ; RV64IZFH:       # %bb.0:
542 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rne
543 ; RV64IZFH-NEXT:    ret
544   %a = call half @llvm.roundeven.f16(half %x)
545   %b = fptosi half %a to i16
546   ret i16 %b
549 define signext i32 @test_roundeven_si32(half %x) {
550 ; CHECKIZFH-LABEL: test_roundeven_si32:
551 ; CHECKIZFH:       # %bb.0:
552 ; CHECKIZFH-NEXT:    fcvt.w.h a0, fa0, rne
553 ; CHECKIZFH-NEXT:    ret
554   %a = call half @llvm.roundeven.f16(half %x)
555   %b = fptosi half %a to i32
556   ret i32 %b
559 define i64 @test_roundeven_si64(half %x) {
560 ; RV32IZFH-LABEL: test_roundeven_si64:
561 ; RV32IZFH:       # %bb.0:
562 ; RV32IZFH-NEXT:    addi sp, sp, -16
563 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
564 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
565 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
566 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
567 ; RV32IZFH-NEXT:    call roundevenf@plt
568 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
569 ; RV32IZFH-NEXT:    call __fixhfdi@plt
570 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
571 ; RV32IZFH-NEXT:    addi sp, sp, 16
572 ; RV32IZFH-NEXT:    ret
574 ; RV64IZFH-LABEL: test_roundeven_si64:
575 ; RV64IZFH:       # %bb.0:
576 ; RV64IZFH-NEXT:    fcvt.l.h a0, fa0, rne
577 ; RV64IZFH-NEXT:    ret
578   %a = call half @llvm.roundeven.f16(half %x)
579   %b = fptosi half %a to i64
580   ret i64 %b
583 define zeroext i8 @test_roundeven_ui8(half %x) {
584 ; RV32IZFH-LABEL: test_roundeven_ui8:
585 ; RV32IZFH:       # %bb.0:
586 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rne
587 ; RV32IZFH-NEXT:    ret
589 ; RV64IZFH-LABEL: test_roundeven_ui8:
590 ; RV64IZFH:       # %bb.0:
591 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rne
592 ; RV64IZFH-NEXT:    ret
593   %a = call half @llvm.roundeven.f16(half %x)
594   %b = fptoui half %a to i8
595   ret i8 %b
598 define zeroext i16 @test_roundeven_ui16(half %x) {
599 ; RV32IZFH-LABEL: test_roundeven_ui16:
600 ; RV32IZFH:       # %bb.0:
601 ; RV32IZFH-NEXT:    fcvt.wu.h a0, fa0, rne
602 ; RV32IZFH-NEXT:    ret
604 ; RV64IZFH-LABEL: test_roundeven_ui16:
605 ; RV64IZFH:       # %bb.0:
606 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rne
607 ; RV64IZFH-NEXT:    ret
608   %a = call half @llvm.roundeven.f16(half %x)
609   %b = fptoui half %a to i16
610   ret i16 %b
613 define signext i32 @test_roundeven_ui32(half %x) {
614 ; CHECKIZFH-LABEL: test_roundeven_ui32:
615 ; CHECKIZFH:       # %bb.0:
616 ; CHECKIZFH-NEXT:    fcvt.wu.h a0, fa0, rne
617 ; CHECKIZFH-NEXT:    ret
618   %a = call half @llvm.roundeven.f16(half %x)
619   %b = fptoui half %a to i32
620   ret i32 %b
623 define i64 @test_roundeven_ui64(half %x) {
624 ; RV32IZFH-LABEL: test_roundeven_ui64:
625 ; RV32IZFH:       # %bb.0:
626 ; RV32IZFH-NEXT:    addi sp, sp, -16
627 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
628 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
629 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
630 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
631 ; RV32IZFH-NEXT:    call roundevenf@plt
632 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
633 ; RV32IZFH-NEXT:    call __fixunshfdi@plt
634 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
635 ; RV32IZFH-NEXT:    addi sp, sp, 16
636 ; RV32IZFH-NEXT:    ret
638 ; RV64IZFH-LABEL: test_roundeven_ui64:
639 ; RV64IZFH:       # %bb.0:
640 ; RV64IZFH-NEXT:    fcvt.lu.h a0, fa0, rne
641 ; RV64IZFH-NEXT:    ret
642   %a = call half @llvm.roundeven.f16(half %x)
643   %b = fptoui half %a to i64
644   ret i64 %b
647 define half @test_floor_half(half %x) {
648 ; RV32IFD-LABEL: test_floor_half:
649 ; RV32IFD:       # %bb.0:
650 ; RV32IFD-NEXT:    addi sp, sp, -16
651 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
652 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
653 ; RV32IFD-NEXT:    .cfi_offset ra, -4
654 ; RV32IFD-NEXT:    call floor@plt
655 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
656 ; RV32IFD-NEXT:    addi sp, sp, 16
657 ; RV32IFD-NEXT:    ret
659 ; RV64IFD-LABEL: test_floor_half:
660 ; RV64IFD:       # %bb.0:
661 ; RV64IFD-NEXT:    addi sp, sp, -16
662 ; RV64IFD-NEXT:    .cfi_def_cfa_offset 16
663 ; RV64IFD-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
664 ; RV64IFD-NEXT:    .cfi_offset ra, -8
665 ; RV64IFD-NEXT:    call floor@plt
666 ; RV64IFD-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
667 ; RV64IFD-NEXT:    addi sp, sp, 16
668 ; RV64IFD-NEXT:    ret
669 ; RV32IZFH-LABEL: test_floor_half:
670 ; RV32IZFH:       # %bb.0:
671 ; RV32IZFH-NEXT:    addi sp, sp, -16
672 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
673 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
674 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
675 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
676 ; RV32IZFH-NEXT:    call floorf@plt
677 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
678 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
679 ; RV32IZFH-NEXT:    addi sp, sp, 16
680 ; RV32IZFH-NEXT:    ret
682 ; RV64IZFH-LABEL: test_floor_half:
683 ; RV64IZFH:       # %bb.0:
684 ; RV64IZFH-NEXT:    addi sp, sp, -16
685 ; RV64IZFH-NEXT:    .cfi_def_cfa_offset 16
686 ; RV64IZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
687 ; RV64IZFH-NEXT:    .cfi_offset ra, -8
688 ; RV64IZFH-NEXT:    fcvt.s.h fa0, fa0
689 ; RV64IZFH-NEXT:    call floorf@plt
690 ; RV64IZFH-NEXT:    fcvt.h.s fa0, fa0
691 ; RV64IZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
692 ; RV64IZFH-NEXT:    addi sp, sp, 16
693 ; RV64IZFH-NEXT:    ret
694   %a = call half @llvm.floor.f16(half %x)
695   ret half %a
698 define half @test_ceil_half(half %x) {
699 ; RV32IFD-LABEL: test_ceil_half:
700 ; RV32IFD:       # %bb.0:
701 ; RV32IFD-NEXT:    addi sp, sp, -16
702 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
703 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
704 ; RV32IFD-NEXT:    .cfi_offset ra, -4
705 ; RV32IFD-NEXT:    call ceil@plt
706 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
707 ; RV32IFD-NEXT:    addi sp, sp, 16
708 ; RV32IFD-NEXT:    ret
710 ; RV64IFD-LABEL: test_ceil_half:
711 ; RV64IFD:       # %bb.0:
712 ; RV64IFD-NEXT:    addi sp, sp, -16
713 ; RV64IFD-NEXT:    .cfi_def_cfa_offset 16
714 ; RV64IFD-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
715 ; RV64IFD-NEXT:    .cfi_offset ra, -8
716 ; RV64IFD-NEXT:    call ceil@plt
717 ; RV64IFD-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
718 ; RV64IFD-NEXT:    addi sp, sp, 16
719 ; RV64IFD-NEXT:    ret
720 ; RV32IZFH-LABEL: test_ceil_half:
721 ; RV32IZFH:       # %bb.0:
722 ; RV32IZFH-NEXT:    addi sp, sp, -16
723 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
724 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
725 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
726 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
727 ; RV32IZFH-NEXT:    call ceilf@plt
728 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
729 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
730 ; RV32IZFH-NEXT:    addi sp, sp, 16
731 ; RV32IZFH-NEXT:    ret
733 ; RV64IZFH-LABEL: test_ceil_half:
734 ; RV64IZFH:       # %bb.0:
735 ; RV64IZFH-NEXT:    addi sp, sp, -16
736 ; RV64IZFH-NEXT:    .cfi_def_cfa_offset 16
737 ; RV64IZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
738 ; RV64IZFH-NEXT:    .cfi_offset ra, -8
739 ; RV64IZFH-NEXT:    fcvt.s.h fa0, fa0
740 ; RV64IZFH-NEXT:    call ceilf@plt
741 ; RV64IZFH-NEXT:    fcvt.h.s fa0, fa0
742 ; RV64IZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
743 ; RV64IZFH-NEXT:    addi sp, sp, 16
744 ; RV64IZFH-NEXT:    ret
745   %a = call half @llvm.ceil.f16(half %x)
746   ret half %a
749 define half @test_trunc_half(half %x) {
750 ; RV32IFD-LABEL: test_trunc_half:
751 ; RV32IFD:       # %bb.0:
752 ; RV32IFD-NEXT:    addi sp, sp, -16
753 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
754 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
755 ; RV32IFD-NEXT:    .cfi_offset ra, -4
756 ; RV32IFD-NEXT:    call trunc@plt
757 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
758 ; RV32IFD-NEXT:    addi sp, sp, 16
759 ; RV32IFD-NEXT:    ret
761 ; RV64IFD-LABEL: test_trunc_half:
762 ; RV64IFD:       # %bb.0:
763 ; RV64IFD-NEXT:    addi sp, sp, -16
764 ; RV64IFD-NEXT:    .cfi_def_cfa_offset 16
765 ; RV64IFD-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
766 ; RV64IFD-NEXT:    .cfi_offset ra, -8
767 ; RV64IFD-NEXT:    call trunc@plt
768 ; RV64IFD-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
769 ; RV64IFD-NEXT:    addi sp, sp, 16
770 ; RV64IFD-NEXT:    ret
771 ; RV32IZFH-LABEL: test_trunc_half:
772 ; RV32IZFH:       # %bb.0:
773 ; RV32IZFH-NEXT:    addi sp, sp, -16
774 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
775 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
776 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
777 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
778 ; RV32IZFH-NEXT:    call truncf@plt
779 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
780 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
781 ; RV32IZFH-NEXT:    addi sp, sp, 16
782 ; RV32IZFH-NEXT:    ret
784 ; RV64IZFH-LABEL: test_trunc_half:
785 ; RV64IZFH:       # %bb.0:
786 ; RV64IZFH-NEXT:    addi sp, sp, -16
787 ; RV64IZFH-NEXT:    .cfi_def_cfa_offset 16
788 ; RV64IZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
789 ; RV64IZFH-NEXT:    .cfi_offset ra, -8
790 ; RV64IZFH-NEXT:    fcvt.s.h fa0, fa0
791 ; RV64IZFH-NEXT:    call truncf@plt
792 ; RV64IZFH-NEXT:    fcvt.h.s fa0, fa0
793 ; RV64IZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
794 ; RV64IZFH-NEXT:    addi sp, sp, 16
795 ; RV64IZFH-NEXT:    ret
796   %a = call half @llvm.trunc.f16(half %x)
797   ret half %a
800 define half @test_round_half(half %x) {
801 ; RV32IFD-LABEL: test_round_half:
802 ; RV32IFD:       # %bb.0:
803 ; RV32IFD-NEXT:    addi sp, sp, -16
804 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
805 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
806 ; RV32IFD-NEXT:    .cfi_offset ra, -4
807 ; RV32IFD-NEXT:    call round@plt
808 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
809 ; RV32IFD-NEXT:    addi sp, sp, 16
810 ; RV32IFD-NEXT:    ret
812 ; RV64IFD-LABEL: test_round_half:
813 ; RV64IFD:       # %bb.0:
814 ; RV64IFD-NEXT:    addi sp, sp, -16
815 ; RV64IFD-NEXT:    .cfi_def_cfa_offset 16
816 ; RV64IFD-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
817 ; RV64IFD-NEXT:    .cfi_offset ra, -8
818 ; RV64IFD-NEXT:    call round@plt
819 ; RV64IFD-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
820 ; RV64IFD-NEXT:    addi sp, sp, 16
821 ; RV64IFD-NEXT:    ret
822 ; RV32IZFH-LABEL: test_round_half:
823 ; RV32IZFH:       # %bb.0:
824 ; RV32IZFH-NEXT:    addi sp, sp, -16
825 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
826 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
827 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
828 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
829 ; RV32IZFH-NEXT:    call roundf@plt
830 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
831 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
832 ; RV32IZFH-NEXT:    addi sp, sp, 16
833 ; RV32IZFH-NEXT:    ret
835 ; RV64IZFH-LABEL: test_round_half:
836 ; RV64IZFH:       # %bb.0:
837 ; RV64IZFH-NEXT:    addi sp, sp, -16
838 ; RV64IZFH-NEXT:    .cfi_def_cfa_offset 16
839 ; RV64IZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
840 ; RV64IZFH-NEXT:    .cfi_offset ra, -8
841 ; RV64IZFH-NEXT:    fcvt.s.h fa0, fa0
842 ; RV64IZFH-NEXT:    call roundf@plt
843 ; RV64IZFH-NEXT:    fcvt.h.s fa0, fa0
844 ; RV64IZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
845 ; RV64IZFH-NEXT:    addi sp, sp, 16
846 ; RV64IZFH-NEXT:    ret
847   %a = call half @llvm.round.f16(half %x)
848   ret half %a
851 define half @test_roundeven_half(half %x) {
852 ; RV32IFD-LABEL: test_roundeven_half:
853 ; RV32IFD:       # %bb.0:
854 ; RV32IFD-NEXT:    addi sp, sp, -16
855 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
856 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
857 ; RV32IFD-NEXT:    .cfi_offset ra, -4
858 ; RV32IFD-NEXT:    call roundeven@plt
859 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
860 ; RV32IFD-NEXT:    addi sp, sp, 16
861 ; RV32IFD-NEXT:    ret
863 ; RV64IFD-LABEL: test_roundeven_half:
864 ; RV64IFD:       # %bb.0:
865 ; RV64IFD-NEXT:    addi sp, sp, -16
866 ; RV64IFD-NEXT:    .cfi_def_cfa_offset 16
867 ; RV64IFD-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
868 ; RV64IFD-NEXT:    .cfi_offset ra, -8
869 ; RV64IFD-NEXT:    call roundeven@plt
870 ; RV64IFD-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
871 ; RV64IFD-NEXT:    addi sp, sp, 16
872 ; RV64IFD-NEXT:    ret
873 ; RV32IZFH-LABEL: test_roundeven_half:
874 ; RV32IZFH:       # %bb.0:
875 ; RV32IZFH-NEXT:    addi sp, sp, -16
876 ; RV32IZFH-NEXT:    .cfi_def_cfa_offset 16
877 ; RV32IZFH-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
878 ; RV32IZFH-NEXT:    .cfi_offset ra, -4
879 ; RV32IZFH-NEXT:    fcvt.s.h fa0, fa0
880 ; RV32IZFH-NEXT:    call roundevenf@plt
881 ; RV32IZFH-NEXT:    fcvt.h.s fa0, fa0
882 ; RV32IZFH-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
883 ; RV32IZFH-NEXT:    addi sp, sp, 16
884 ; RV32IZFH-NEXT:    ret
886 ; RV64IZFH-LABEL: test_roundeven_half:
887 ; RV64IZFH:       # %bb.0:
888 ; RV64IZFH-NEXT:    addi sp, sp, -16
889 ; RV64IZFH-NEXT:    .cfi_def_cfa_offset 16
890 ; RV64IZFH-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
891 ; RV64IZFH-NEXT:    .cfi_offset ra, -8
892 ; RV64IZFH-NEXT:    fcvt.s.h fa0, fa0
893 ; RV64IZFH-NEXT:    call roundevenf@plt
894 ; RV64IZFH-NEXT:    fcvt.h.s fa0, fa0
895 ; RV64IZFH-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
896 ; RV64IZFH-NEXT:    addi sp, sp, 16
897 ; RV64IZFH-NEXT:    ret
898   %a = call half @llvm.roundeven.f16(half %x)
899   ret half %a
902 declare half @llvm.floor.f16(half)
903 declare half @llvm.ceil.f16(half)
904 declare half @llvm.trunc.f16(half)
905 declare half @llvm.round.f16(half)
906 declare half @llvm.roundeven.f16(half)