Revert rGe6ccb57bb3f6b761f2310e97fd6ca99eff42f73e "[SLP] Add cost model for `llvm...
[llvm-project.git] / llvm / test / CodeGen / RISCV / double-round-conv.ll
blob2bf5b6c2e2d7019a74f7ffc8ae8921c5030a52a8
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \
3 ; RUN:   -target-abi=ilp32d | FileCheck -check-prefixes=CHECKIFD,RV32IFD %s
4 ; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs < %s \
5 ; RUN:   -target-abi=lp64d | FileCheck -check-prefixes=CHECKIFD,RV64IFD %s
7 define signext i8 @test_floor_si8(double %x) {
8 ; RV32IFD-LABEL: test_floor_si8:
9 ; RV32IFD:       # %bb.0:
10 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rdn
11 ; RV32IFD-NEXT:    ret
13 ; RV64IFD-LABEL: test_floor_si8:
14 ; RV64IFD:       # %bb.0:
15 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rdn
16 ; RV64IFD-NEXT:    ret
17   %a = call double @llvm.floor.f64(double %x)
18   %b = fptosi double %a to i8
19   ret i8 %b
22 define signext i16 @test_floor_si16(double %x) {
23 ; RV32IFD-LABEL: test_floor_si16:
24 ; RV32IFD:       # %bb.0:
25 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rdn
26 ; RV32IFD-NEXT:    ret
28 ; RV64IFD-LABEL: test_floor_si16:
29 ; RV64IFD:       # %bb.0:
30 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rdn
31 ; RV64IFD-NEXT:    ret
32   %a = call double @llvm.floor.f64(double %x)
33   %b = fptosi double %a to i16
34   ret i16 %b
37 define signext i32 @test_floor_si32(double %x) {
38 ; CHECKIFD-LABEL: test_floor_si32:
39 ; CHECKIFD:       # %bb.0:
40 ; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rdn
41 ; CHECKIFD-NEXT:    ret
42   %a = call double @llvm.floor.f64(double %x)
43   %b = fptosi double %a to i32
44   ret i32 %b
47 define i64 @test_floor_si64(double %x) {
48 ; RV32IFD-LABEL: test_floor_si64:
49 ; RV32IFD:       # %bb.0:
50 ; RV32IFD-NEXT:    addi sp, sp, -16
51 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
52 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
53 ; RV32IFD-NEXT:    .cfi_offset ra, -4
54 ; RV32IFD-NEXT:    call floor@plt
55 ; RV32IFD-NEXT:    call __fixdfdi@plt
56 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
57 ; RV32IFD-NEXT:    addi sp, sp, 16
58 ; RV32IFD-NEXT:    ret
60 ; RV64IFD-LABEL: test_floor_si64:
61 ; RV64IFD:       # %bb.0:
62 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rdn
63 ; RV64IFD-NEXT:    ret
64   %a = call double @llvm.floor.f64(double %x)
65   %b = fptosi double %a to i64
66   ret i64 %b
69 define zeroext i8 @test_floor_ui8(double %x) {
70 ; RV32IFD-LABEL: test_floor_ui8:
71 ; RV32IFD:       # %bb.0:
72 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rdn
73 ; RV32IFD-NEXT:    ret
75 ; RV64IFD-LABEL: test_floor_ui8:
76 ; RV64IFD:       # %bb.0:
77 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rdn
78 ; RV64IFD-NEXT:    ret
79   %a = call double @llvm.floor.f64(double %x)
80   %b = fptoui double %a to i8
81   ret i8 %b
84 define zeroext i16 @test_floor_ui16(double %x) {
85 ; RV32IFD-LABEL: test_floor_ui16:
86 ; RV32IFD:       # %bb.0:
87 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rdn
88 ; RV32IFD-NEXT:    ret
90 ; RV64IFD-LABEL: test_floor_ui16:
91 ; RV64IFD:       # %bb.0:
92 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rdn
93 ; RV64IFD-NEXT:    ret
94   %a = call double @llvm.floor.f64(double %x)
95   %b = fptoui double %a to i16
96   ret i16 %b
99 define signext i32 @test_floor_ui32(double %x) {
100 ; CHECKIFD-LABEL: test_floor_ui32:
101 ; CHECKIFD:       # %bb.0:
102 ; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rdn
103 ; CHECKIFD-NEXT:    ret
104   %a = call double @llvm.floor.f64(double %x)
105   %b = fptoui double %a to i32
106   ret i32 %b
109 define i64 @test_floor_ui64(double %x) {
110 ; RV32IFD-LABEL: test_floor_ui64:
111 ; RV32IFD:       # %bb.0:
112 ; RV32IFD-NEXT:    addi sp, sp, -16
113 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
114 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
115 ; RV32IFD-NEXT:    .cfi_offset ra, -4
116 ; RV32IFD-NEXT:    call floor@plt
117 ; RV32IFD-NEXT:    call __fixunsdfdi@plt
118 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
119 ; RV32IFD-NEXT:    addi sp, sp, 16
120 ; RV32IFD-NEXT:    ret
122 ; RV64IFD-LABEL: test_floor_ui64:
123 ; RV64IFD:       # %bb.0:
124 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rdn
125 ; RV64IFD-NEXT:    ret
126   %a = call double @llvm.floor.f64(double %x)
127   %b = fptoui double %a to i64
128   ret i64 %b
131 define signext i8 @test_ceil_si8(double %x) {
132 ; RV32IFD-LABEL: test_ceil_si8:
133 ; RV32IFD:       # %bb.0:
134 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rup
135 ; RV32IFD-NEXT:    ret
137 ; RV64IFD-LABEL: test_ceil_si8:
138 ; RV64IFD:       # %bb.0:
139 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rup
140 ; RV64IFD-NEXT:    ret
141   %a = call double @llvm.ceil.f64(double %x)
142   %b = fptosi double %a to i8
143   ret i8 %b
146 define signext i16 @test_ceil_si16(double %x) {
147 ; RV32IFD-LABEL: test_ceil_si16:
148 ; RV32IFD:       # %bb.0:
149 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rup
150 ; RV32IFD-NEXT:    ret
152 ; RV64IFD-LABEL: test_ceil_si16:
153 ; RV64IFD:       # %bb.0:
154 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rup
155 ; RV64IFD-NEXT:    ret
156   %a = call double @llvm.ceil.f64(double %x)
157   %b = fptosi double %a to i16
158   ret i16 %b
161 define signext i32 @test_ceil_si32(double %x) {
162 ; CHECKIFD-LABEL: test_ceil_si32:
163 ; CHECKIFD:       # %bb.0:
164 ; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rup
165 ; CHECKIFD-NEXT:    ret
166   %a = call double @llvm.ceil.f64(double %x)
167   %b = fptosi double %a to i32
168   ret i32 %b
171 define i64 @test_ceil_si64(double %x) {
172 ; RV32IFD-LABEL: test_ceil_si64:
173 ; RV32IFD:       # %bb.0:
174 ; RV32IFD-NEXT:    addi sp, sp, -16
175 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
176 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
177 ; RV32IFD-NEXT:    .cfi_offset ra, -4
178 ; RV32IFD-NEXT:    call ceil@plt
179 ; RV32IFD-NEXT:    call __fixdfdi@plt
180 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
181 ; RV32IFD-NEXT:    addi sp, sp, 16
182 ; RV32IFD-NEXT:    ret
184 ; RV64IFD-LABEL: test_ceil_si64:
185 ; RV64IFD:       # %bb.0:
186 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rup
187 ; RV64IFD-NEXT:    ret
188   %a = call double @llvm.ceil.f64(double %x)
189   %b = fptosi double %a to i64
190   ret i64 %b
193 define zeroext i8 @test_ceil_ui8(double %x) {
194 ; RV32IFD-LABEL: test_ceil_ui8:
195 ; RV32IFD:       # %bb.0:
196 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rup
197 ; RV32IFD-NEXT:    ret
199 ; RV64IFD-LABEL: test_ceil_ui8:
200 ; RV64IFD:       # %bb.0:
201 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rup
202 ; RV64IFD-NEXT:    ret
203   %a = call double @llvm.ceil.f64(double %x)
204   %b = fptoui double %a to i8
205   ret i8 %b
208 define zeroext i16 @test_ceil_ui16(double %x) {
209 ; RV32IFD-LABEL: test_ceil_ui16:
210 ; RV32IFD:       # %bb.0:
211 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rup
212 ; RV32IFD-NEXT:    ret
214 ; RV64IFD-LABEL: test_ceil_ui16:
215 ; RV64IFD:       # %bb.0:
216 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rup
217 ; RV64IFD-NEXT:    ret
218   %a = call double @llvm.ceil.f64(double %x)
219   %b = fptoui double %a to i16
220   ret i16 %b
223 define signext i32 @test_ceil_ui32(double %x) {
224 ; CHECKIFD-LABEL: test_ceil_ui32:
225 ; CHECKIFD:       # %bb.0:
226 ; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rup
227 ; CHECKIFD-NEXT:    ret
228   %a = call double @llvm.ceil.f64(double %x)
229   %b = fptoui double %a to i32
230   ret i32 %b
233 define i64 @test_ceil_ui64(double %x) {
234 ; RV32IFD-LABEL: test_ceil_ui64:
235 ; RV32IFD:       # %bb.0:
236 ; RV32IFD-NEXT:    addi sp, sp, -16
237 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
238 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
239 ; RV32IFD-NEXT:    .cfi_offset ra, -4
240 ; RV32IFD-NEXT:    call ceil@plt
241 ; RV32IFD-NEXT:    call __fixunsdfdi@plt
242 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
243 ; RV32IFD-NEXT:    addi sp, sp, 16
244 ; RV32IFD-NEXT:    ret
246 ; RV64IFD-LABEL: test_ceil_ui64:
247 ; RV64IFD:       # %bb.0:
248 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rup
249 ; RV64IFD-NEXT:    ret
250   %a = call double @llvm.ceil.f64(double %x)
251   %b = fptoui double %a to i64
252   ret i64 %b
255 define signext i8 @test_trunc_si8(double %x) {
256 ; RV32IFD-LABEL: test_trunc_si8:
257 ; RV32IFD:       # %bb.0:
258 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rtz
259 ; RV32IFD-NEXT:    ret
261 ; RV64IFD-LABEL: test_trunc_si8:
262 ; RV64IFD:       # %bb.0:
263 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
264 ; RV64IFD-NEXT:    ret
265   %a = call double @llvm.trunc.f64(double %x)
266   %b = fptosi double %a to i8
267   ret i8 %b
270 define signext i16 @test_trunc_si16(double %x) {
271 ; RV32IFD-LABEL: test_trunc_si16:
272 ; RV32IFD:       # %bb.0:
273 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rtz
274 ; RV32IFD-NEXT:    ret
276 ; RV64IFD-LABEL: test_trunc_si16:
277 ; RV64IFD:       # %bb.0:
278 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
279 ; RV64IFD-NEXT:    ret
280   %a = call double @llvm.trunc.f64(double %x)
281   %b = fptosi double %a to i16
282   ret i16 %b
285 define signext i32 @test_trunc_si32(double %x) {
286 ; CHECKIFD-LABEL: test_trunc_si32:
287 ; CHECKIFD:       # %bb.0:
288 ; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rtz
289 ; CHECKIFD-NEXT:    ret
290   %a = call double @llvm.trunc.f64(double %x)
291   %b = fptosi double %a to i32
292   ret i32 %b
295 define i64 @test_trunc_si64(double %x) {
296 ; RV32IFD-LABEL: test_trunc_si64:
297 ; RV32IFD:       # %bb.0:
298 ; RV32IFD-NEXT:    addi sp, sp, -16
299 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
300 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
301 ; RV32IFD-NEXT:    .cfi_offset ra, -4
302 ; RV32IFD-NEXT:    call trunc@plt
303 ; RV32IFD-NEXT:    call __fixdfdi@plt
304 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
305 ; RV32IFD-NEXT:    addi sp, sp, 16
306 ; RV32IFD-NEXT:    ret
308 ; RV64IFD-LABEL: test_trunc_si64:
309 ; RV64IFD:       # %bb.0:
310 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
311 ; RV64IFD-NEXT:    ret
312   %a = call double @llvm.trunc.f64(double %x)
313   %b = fptosi double %a to i64
314   ret i64 %b
317 define zeroext i8 @test_trunc_ui8(double %x) {
318 ; RV32IFD-LABEL: test_trunc_ui8:
319 ; RV32IFD:       # %bb.0:
320 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rtz
321 ; RV32IFD-NEXT:    ret
323 ; RV64IFD-LABEL: test_trunc_ui8:
324 ; RV64IFD:       # %bb.0:
325 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rtz
326 ; RV64IFD-NEXT:    ret
327   %a = call double @llvm.trunc.f64(double %x)
328   %b = fptoui double %a to i8
329   ret i8 %b
332 define zeroext i16 @test_trunc_ui16(double %x) {
333 ; RV32IFD-LABEL: test_trunc_ui16:
334 ; RV32IFD:       # %bb.0:
335 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rtz
336 ; RV32IFD-NEXT:    ret
338 ; RV64IFD-LABEL: test_trunc_ui16:
339 ; RV64IFD:       # %bb.0:
340 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rtz
341 ; RV64IFD-NEXT:    ret
342   %a = call double @llvm.trunc.f64(double %x)
343   %b = fptoui double %a to i16
344   ret i16 %b
347 define signext i32 @test_trunc_ui32(double %x) {
348 ; CHECKIFD-LABEL: test_trunc_ui32:
349 ; CHECKIFD:       # %bb.0:
350 ; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rtz
351 ; CHECKIFD-NEXT:    ret
352   %a = call double @llvm.trunc.f64(double %x)
353   %b = fptoui double %a to i32
354   ret i32 %b
357 define i64 @test_trunc_ui64(double %x) {
358 ; RV32IFD-LABEL: test_trunc_ui64:
359 ; RV32IFD:       # %bb.0:
360 ; RV32IFD-NEXT:    addi sp, sp, -16
361 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
362 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
363 ; RV32IFD-NEXT:    .cfi_offset ra, -4
364 ; RV32IFD-NEXT:    call trunc@plt
365 ; RV32IFD-NEXT:    call __fixunsdfdi@plt
366 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
367 ; RV32IFD-NEXT:    addi sp, sp, 16
368 ; RV32IFD-NEXT:    ret
370 ; RV64IFD-LABEL: test_trunc_ui64:
371 ; RV64IFD:       # %bb.0:
372 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rtz
373 ; RV64IFD-NEXT:    ret
374   %a = call double @llvm.trunc.f64(double %x)
375   %b = fptoui double %a to i64
376   ret i64 %b
379 define signext i8 @test_round_si8(double %x) {
380 ; RV32IFD-LABEL: test_round_si8:
381 ; RV32IFD:       # %bb.0:
382 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rmm
383 ; RV32IFD-NEXT:    ret
385 ; RV64IFD-LABEL: test_round_si8:
386 ; RV64IFD:       # %bb.0:
387 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rmm
388 ; RV64IFD-NEXT:    ret
389   %a = call double @llvm.round.f64(double %x)
390   %b = fptosi double %a to i8
391   ret i8 %b
394 define signext i16 @test_round_si16(double %x) {
395 ; RV32IFD-LABEL: test_round_si16:
396 ; RV32IFD:       # %bb.0:
397 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rmm
398 ; RV32IFD-NEXT:    ret
400 ; RV64IFD-LABEL: test_round_si16:
401 ; RV64IFD:       # %bb.0:
402 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rmm
403 ; RV64IFD-NEXT:    ret
404   %a = call double @llvm.round.f64(double %x)
405   %b = fptosi double %a to i16
406   ret i16 %b
409 define signext i32 @test_round_si32(double %x) {
410 ; CHECKIFD-LABEL: test_round_si32:
411 ; CHECKIFD:       # %bb.0:
412 ; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rmm
413 ; CHECKIFD-NEXT:    ret
414   %a = call double @llvm.round.f64(double %x)
415   %b = fptosi double %a to i32
416   ret i32 %b
419 define i64 @test_round_si64(double %x) {
420 ; RV32IFD-LABEL: test_round_si64:
421 ; RV32IFD:       # %bb.0:
422 ; RV32IFD-NEXT:    addi sp, sp, -16
423 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
424 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
425 ; RV32IFD-NEXT:    .cfi_offset ra, -4
426 ; RV32IFD-NEXT:    call round@plt
427 ; RV32IFD-NEXT:    call __fixdfdi@plt
428 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
429 ; RV32IFD-NEXT:    addi sp, sp, 16
430 ; RV32IFD-NEXT:    ret
432 ; RV64IFD-LABEL: test_round_si64:
433 ; RV64IFD:       # %bb.0:
434 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rmm
435 ; RV64IFD-NEXT:    ret
436   %a = call double @llvm.round.f64(double %x)
437   %b = fptosi double %a to i64
438   ret i64 %b
441 define zeroext i8 @test_round_ui8(double %x) {
442 ; RV32IFD-LABEL: test_round_ui8:
443 ; RV32IFD:       # %bb.0:
444 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rmm
445 ; RV32IFD-NEXT:    ret
447 ; RV64IFD-LABEL: test_round_ui8:
448 ; RV64IFD:       # %bb.0:
449 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rmm
450 ; RV64IFD-NEXT:    ret
451   %a = call double @llvm.round.f64(double %x)
452   %b = fptoui double %a to i8
453   ret i8 %b
456 define zeroext i16 @test_round_ui16(double %x) {
457 ; RV32IFD-LABEL: test_round_ui16:
458 ; RV32IFD:       # %bb.0:
459 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rmm
460 ; RV32IFD-NEXT:    ret
462 ; RV64IFD-LABEL: test_round_ui16:
463 ; RV64IFD:       # %bb.0:
464 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rmm
465 ; RV64IFD-NEXT:    ret
466   %a = call double @llvm.round.f64(double %x)
467   %b = fptoui double %a to i16
468   ret i16 %b
471 define signext i32 @test_round_ui32(double %x) {
472 ; CHECKIFD-LABEL: test_round_ui32:
473 ; CHECKIFD:       # %bb.0:
474 ; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rmm
475 ; CHECKIFD-NEXT:    ret
476   %a = call double @llvm.round.f64(double %x)
477   %b = fptoui double %a to i32
478   ret i32 %b
481 define i64 @test_round_ui64(double %x) {
482 ; RV32IFD-LABEL: test_round_ui64:
483 ; RV32IFD:       # %bb.0:
484 ; RV32IFD-NEXT:    addi sp, sp, -16
485 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
486 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
487 ; RV32IFD-NEXT:    .cfi_offset ra, -4
488 ; RV32IFD-NEXT:    call round@plt
489 ; RV32IFD-NEXT:    call __fixunsdfdi@plt
490 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
491 ; RV32IFD-NEXT:    addi sp, sp, 16
492 ; RV32IFD-NEXT:    ret
494 ; RV64IFD-LABEL: test_round_ui64:
495 ; RV64IFD:       # %bb.0:
496 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rmm
497 ; RV64IFD-NEXT:    ret
498   %a = call double @llvm.round.f64(double %x)
499   %b = fptoui double %a to i64
500   ret i64 %b
503 define signext i8 @test_roundeven_si8(double %x) {
504 ; RV32IFD-LABEL: test_roundeven_si8:
505 ; RV32IFD:       # %bb.0:
506 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rne
507 ; RV32IFD-NEXT:    ret
509 ; RV64IFD-LABEL: test_roundeven_si8:
510 ; RV64IFD:       # %bb.0:
511 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rne
512 ; RV64IFD-NEXT:    ret
513   %a = call double @llvm.roundeven.f64(double %x)
514   %b = fptosi double %a to i8
515   ret i8 %b
518 define signext i16 @test_roundeven_si16(double %x) {
519 ; RV32IFD-LABEL: test_roundeven_si16:
520 ; RV32IFD:       # %bb.0:
521 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rne
522 ; RV32IFD-NEXT:    ret
524 ; RV64IFD-LABEL: test_roundeven_si16:
525 ; RV64IFD:       # %bb.0:
526 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rne
527 ; RV64IFD-NEXT:    ret
528   %a = call double @llvm.roundeven.f64(double %x)
529   %b = fptosi double %a to i16
530   ret i16 %b
533 define signext i32 @test_roundeven_si32(double %x) {
534 ; CHECKIFD-LABEL: test_roundeven_si32:
535 ; CHECKIFD:       # %bb.0:
536 ; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rne
537 ; CHECKIFD-NEXT:    ret
538   %a = call double @llvm.roundeven.f64(double %x)
539   %b = fptosi double %a to i32
540   ret i32 %b
543 define i64 @test_roundeven_si64(double %x) {
544 ; RV32IFD-LABEL: test_roundeven_si64:
545 ; RV32IFD:       # %bb.0:
546 ; RV32IFD-NEXT:    addi sp, sp, -16
547 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
548 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
549 ; RV32IFD-NEXT:    .cfi_offset ra, -4
550 ; RV32IFD-NEXT:    call roundeven@plt
551 ; RV32IFD-NEXT:    call __fixdfdi@plt
552 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
553 ; RV32IFD-NEXT:    addi sp, sp, 16
554 ; RV32IFD-NEXT:    ret
556 ; RV64IFD-LABEL: test_roundeven_si64:
557 ; RV64IFD:       # %bb.0:
558 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rne
559 ; RV64IFD-NEXT:    ret
560   %a = call double @llvm.roundeven.f64(double %x)
561   %b = fptosi double %a to i64
562   ret i64 %b
565 define zeroext i8 @test_roundeven_ui8(double %x) {
566 ; RV32IFD-LABEL: test_roundeven_ui8:
567 ; RV32IFD:       # %bb.0:
568 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rne
569 ; RV32IFD-NEXT:    ret
571 ; RV64IFD-LABEL: test_roundeven_ui8:
572 ; RV64IFD:       # %bb.0:
573 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rne
574 ; RV64IFD-NEXT:    ret
575   %a = call double @llvm.roundeven.f64(double %x)
576   %b = fptoui double %a to i8
577   ret i8 %b
580 define zeroext i16 @test_roundeven_ui16(double %x) {
581 ; RV32IFD-LABEL: test_roundeven_ui16:
582 ; RV32IFD:       # %bb.0:
583 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rne
584 ; RV32IFD-NEXT:    ret
586 ; RV64IFD-LABEL: test_roundeven_ui16:
587 ; RV64IFD:       # %bb.0:
588 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rne
589 ; RV64IFD-NEXT:    ret
590   %a = call double @llvm.roundeven.f64(double %x)
591   %b = fptoui double %a to i16
592   ret i16 %b
595 define signext i32 @test_roundeven_ui32(double %x) {
596 ; CHECKIFD-LABEL: test_roundeven_ui32:
597 ; CHECKIFD:       # %bb.0:
598 ; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rne
599 ; CHECKIFD-NEXT:    ret
600   %a = call double @llvm.roundeven.f64(double %x)
601   %b = fptoui double %a to i32
602   ret i32 %b
605 define i64 @test_roundeven_ui64(double %x) {
606 ; RV32IFD-LABEL: test_roundeven_ui64:
607 ; RV32IFD:       # %bb.0:
608 ; RV32IFD-NEXT:    addi sp, sp, -16
609 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
610 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
611 ; RV32IFD-NEXT:    .cfi_offset ra, -4
612 ; RV32IFD-NEXT:    call roundeven@plt
613 ; RV32IFD-NEXT:    call __fixunsdfdi@plt
614 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
615 ; RV32IFD-NEXT:    addi sp, sp, 16
616 ; RV32IFD-NEXT:    ret
618 ; RV64IFD-LABEL: test_roundeven_ui64:
619 ; RV64IFD:       # %bb.0:
620 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rne
621 ; RV64IFD-NEXT:    ret
622   %a = call double @llvm.roundeven.f64(double %x)
623   %b = fptoui double %a to i64
624   ret i64 %b
627 declare double @llvm.floor.f64(double)
628 declare double @llvm.ceil.f64(double)
629 declare double @llvm.trunc.f64(double)
630 declare double @llvm.round.f64(double)
631 declare double @llvm.roundeven.f64(double)