Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / double-round-conv.ll
blob094a4105de71c347b8b8b960ac1cac4cd6f52be0
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
6 ; RUN: llc -mtriple=riscv32 -mattr=+zdinx -verify-machineinstrs < %s \
7 ; RUN:   -target-abi=ilp32 | FileCheck -check-prefixes=RV32IZFINXZDINX %s
8 ; RUN: llc -mtriple=riscv64 -mattr=+zdinx -verify-machineinstrs < %s \
9 ; RUN:   -target-abi=lp64 | FileCheck -check-prefixes=RV64IZFINXZDINX %s
11 define signext i8 @test_floor_si8(double %x) {
12 ; RV32IFD-LABEL: test_floor_si8:
13 ; RV32IFD:       # %bb.0:
14 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rdn
15 ; RV32IFD-NEXT:    ret
17 ; RV64IFD-LABEL: test_floor_si8:
18 ; RV64IFD:       # %bb.0:
19 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rdn
20 ; RV64IFD-NEXT:    ret
22 ; RV32IZFINXZDINX-LABEL: test_floor_si8:
23 ; RV32IZFINXZDINX:       # %bb.0:
24 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
25 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
26 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
27 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
28 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
29 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
30 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rdn
31 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
32 ; RV32IZFINXZDINX-NEXT:    ret
34 ; RV64IZFINXZDINX-LABEL: test_floor_si8:
35 ; RV64IZFINXZDINX:       # %bb.0:
36 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rdn
37 ; RV64IZFINXZDINX-NEXT:    ret
38   %a = call double @llvm.floor.f64(double %x)
39   %b = fptosi double %a to i8
40   ret i8 %b
43 define signext i16 @test_floor_si16(double %x) {
44 ; RV32IFD-LABEL: test_floor_si16:
45 ; RV32IFD:       # %bb.0:
46 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rdn
47 ; RV32IFD-NEXT:    ret
49 ; RV64IFD-LABEL: test_floor_si16:
50 ; RV64IFD:       # %bb.0:
51 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rdn
52 ; RV64IFD-NEXT:    ret
54 ; RV32IZFINXZDINX-LABEL: test_floor_si16:
55 ; RV32IZFINXZDINX:       # %bb.0:
56 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
57 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
58 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
59 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
60 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
61 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
62 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rdn
63 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
64 ; RV32IZFINXZDINX-NEXT:    ret
66 ; RV64IZFINXZDINX-LABEL: test_floor_si16:
67 ; RV64IZFINXZDINX:       # %bb.0:
68 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rdn
69 ; RV64IZFINXZDINX-NEXT:    ret
70   %a = call double @llvm.floor.f64(double %x)
71   %b = fptosi double %a to i16
72   ret i16 %b
75 define signext i32 @test_floor_si32(double %x) {
76 ; CHECKIFD-LABEL: test_floor_si32:
77 ; CHECKIFD:       # %bb.0:
78 ; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rdn
79 ; CHECKIFD-NEXT:    ret
81 ; RV32IZFINXZDINX-LABEL: test_floor_si32:
82 ; RV32IZFINXZDINX:       # %bb.0:
83 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
84 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
85 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
86 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
87 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
88 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
89 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rdn
90 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
91 ; RV32IZFINXZDINX-NEXT:    ret
93 ; RV64IZFINXZDINX-LABEL: test_floor_si32:
94 ; RV64IZFINXZDINX:       # %bb.0:
95 ; RV64IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rdn
96 ; RV64IZFINXZDINX-NEXT:    ret
97   %a = call double @llvm.floor.f64(double %x)
98   %b = fptosi double %a to i32
99   ret i32 %b
102 define i64 @test_floor_si64(double %x) {
103 ; RV32IFD-LABEL: test_floor_si64:
104 ; RV32IFD:       # %bb.0:
105 ; RV32IFD-NEXT:    addi sp, sp, -16
106 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
107 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
108 ; RV32IFD-NEXT:    .cfi_offset ra, -4
109 ; RV32IFD-NEXT:    call floor
110 ; RV32IFD-NEXT:    call __fixdfdi
111 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
112 ; RV32IFD-NEXT:    addi sp, sp, 16
113 ; RV32IFD-NEXT:    ret
115 ; RV64IFD-LABEL: test_floor_si64:
116 ; RV64IFD:       # %bb.0:
117 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rdn
118 ; RV64IFD-NEXT:    ret
120 ; RV32IZFINXZDINX-LABEL: test_floor_si64:
121 ; RV32IZFINXZDINX:       # %bb.0:
122 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
123 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
124 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
125 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
126 ; RV32IZFINXZDINX-NEXT:    call floor
127 ; RV32IZFINXZDINX-NEXT:    call __fixdfdi
128 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
129 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
130 ; RV32IZFINXZDINX-NEXT:    ret
132 ; RV64IZFINXZDINX-LABEL: test_floor_si64:
133 ; RV64IZFINXZDINX:       # %bb.0:
134 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rdn
135 ; RV64IZFINXZDINX-NEXT:    ret
136   %a = call double @llvm.floor.f64(double %x)
137   %b = fptosi double %a to i64
138   ret i64 %b
141 define zeroext i8 @test_floor_ui8(double %x) {
142 ; RV32IFD-LABEL: test_floor_ui8:
143 ; RV32IFD:       # %bb.0:
144 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rdn
145 ; RV32IFD-NEXT:    ret
147 ; RV64IFD-LABEL: test_floor_ui8:
148 ; RV64IFD:       # %bb.0:
149 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rdn
150 ; RV64IFD-NEXT:    ret
152 ; RV32IZFINXZDINX-LABEL: test_floor_ui8:
153 ; RV32IZFINXZDINX:       # %bb.0:
154 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
155 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
156 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
157 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
158 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
159 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
160 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rdn
161 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
162 ; RV32IZFINXZDINX-NEXT:    ret
164 ; RV64IZFINXZDINX-LABEL: test_floor_ui8:
165 ; RV64IZFINXZDINX:       # %bb.0:
166 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rdn
167 ; RV64IZFINXZDINX-NEXT:    ret
168   %a = call double @llvm.floor.f64(double %x)
169   %b = fptoui double %a to i8
170   ret i8 %b
173 define zeroext i16 @test_floor_ui16(double %x) {
174 ; RV32IFD-LABEL: test_floor_ui16:
175 ; RV32IFD:       # %bb.0:
176 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rdn
177 ; RV32IFD-NEXT:    ret
179 ; RV64IFD-LABEL: test_floor_ui16:
180 ; RV64IFD:       # %bb.0:
181 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rdn
182 ; RV64IFD-NEXT:    ret
184 ; RV32IZFINXZDINX-LABEL: test_floor_ui16:
185 ; RV32IZFINXZDINX:       # %bb.0:
186 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
187 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
188 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
189 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
190 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
191 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
192 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rdn
193 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
194 ; RV32IZFINXZDINX-NEXT:    ret
196 ; RV64IZFINXZDINX-LABEL: test_floor_ui16:
197 ; RV64IZFINXZDINX:       # %bb.0:
198 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rdn
199 ; RV64IZFINXZDINX-NEXT:    ret
200   %a = call double @llvm.floor.f64(double %x)
201   %b = fptoui double %a to i16
202   ret i16 %b
205 define signext i32 @test_floor_ui32(double %x) {
206 ; CHECKIFD-LABEL: test_floor_ui32:
207 ; CHECKIFD:       # %bb.0:
208 ; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rdn
209 ; CHECKIFD-NEXT:    ret
211 ; RV32IZFINXZDINX-LABEL: test_floor_ui32:
212 ; RV32IZFINXZDINX:       # %bb.0:
213 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
214 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
215 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
216 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
217 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
218 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
219 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rdn
220 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
221 ; RV32IZFINXZDINX-NEXT:    ret
223 ; RV64IZFINXZDINX-LABEL: test_floor_ui32:
224 ; RV64IZFINXZDINX:       # %bb.0:
225 ; RV64IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rdn
226 ; RV64IZFINXZDINX-NEXT:    ret
227   %a = call double @llvm.floor.f64(double %x)
228   %b = fptoui double %a to i32
229   ret i32 %b
232 define i64 @test_floor_ui64(double %x) {
233 ; RV32IFD-LABEL: test_floor_ui64:
234 ; RV32IFD:       # %bb.0:
235 ; RV32IFD-NEXT:    addi sp, sp, -16
236 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
237 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
238 ; RV32IFD-NEXT:    .cfi_offset ra, -4
239 ; RV32IFD-NEXT:    call floor
240 ; RV32IFD-NEXT:    call __fixunsdfdi
241 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
242 ; RV32IFD-NEXT:    addi sp, sp, 16
243 ; RV32IFD-NEXT:    ret
245 ; RV64IFD-LABEL: test_floor_ui64:
246 ; RV64IFD:       # %bb.0:
247 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rdn
248 ; RV64IFD-NEXT:    ret
250 ; RV32IZFINXZDINX-LABEL: test_floor_ui64:
251 ; RV32IZFINXZDINX:       # %bb.0:
252 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
253 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
254 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
255 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
256 ; RV32IZFINXZDINX-NEXT:    call floor
257 ; RV32IZFINXZDINX-NEXT:    call __fixunsdfdi
258 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
259 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
260 ; RV32IZFINXZDINX-NEXT:    ret
262 ; RV64IZFINXZDINX-LABEL: test_floor_ui64:
263 ; RV64IZFINXZDINX:       # %bb.0:
264 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rdn
265 ; RV64IZFINXZDINX-NEXT:    ret
266   %a = call double @llvm.floor.f64(double %x)
267   %b = fptoui double %a to i64
268   ret i64 %b
271 define signext i8 @test_ceil_si8(double %x) {
272 ; RV32IFD-LABEL: test_ceil_si8:
273 ; RV32IFD:       # %bb.0:
274 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rup
275 ; RV32IFD-NEXT:    ret
277 ; RV64IFD-LABEL: test_ceil_si8:
278 ; RV64IFD:       # %bb.0:
279 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rup
280 ; RV64IFD-NEXT:    ret
282 ; RV32IZFINXZDINX-LABEL: test_ceil_si8:
283 ; RV32IZFINXZDINX:       # %bb.0:
284 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
285 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
286 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
287 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
288 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
289 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
290 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rup
291 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
292 ; RV32IZFINXZDINX-NEXT:    ret
294 ; RV64IZFINXZDINX-LABEL: test_ceil_si8:
295 ; RV64IZFINXZDINX:       # %bb.0:
296 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rup
297 ; RV64IZFINXZDINX-NEXT:    ret
298   %a = call double @llvm.ceil.f64(double %x)
299   %b = fptosi double %a to i8
300   ret i8 %b
303 define signext i16 @test_ceil_si16(double %x) {
304 ; RV32IFD-LABEL: test_ceil_si16:
305 ; RV32IFD:       # %bb.0:
306 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rup
307 ; RV32IFD-NEXT:    ret
309 ; RV64IFD-LABEL: test_ceil_si16:
310 ; RV64IFD:       # %bb.0:
311 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rup
312 ; RV64IFD-NEXT:    ret
314 ; RV32IZFINXZDINX-LABEL: test_ceil_si16:
315 ; RV32IZFINXZDINX:       # %bb.0:
316 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
317 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
318 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
319 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
320 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
321 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
322 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rup
323 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
324 ; RV32IZFINXZDINX-NEXT:    ret
326 ; RV64IZFINXZDINX-LABEL: test_ceil_si16:
327 ; RV64IZFINXZDINX:       # %bb.0:
328 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rup
329 ; RV64IZFINXZDINX-NEXT:    ret
330   %a = call double @llvm.ceil.f64(double %x)
331   %b = fptosi double %a to i16
332   ret i16 %b
335 define signext i32 @test_ceil_si32(double %x) {
336 ; CHECKIFD-LABEL: test_ceil_si32:
337 ; CHECKIFD:       # %bb.0:
338 ; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rup
339 ; CHECKIFD-NEXT:    ret
341 ; RV32IZFINXZDINX-LABEL: test_ceil_si32:
342 ; RV32IZFINXZDINX:       # %bb.0:
343 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
344 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
345 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
346 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
347 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
348 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
349 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rup
350 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
351 ; RV32IZFINXZDINX-NEXT:    ret
353 ; RV64IZFINXZDINX-LABEL: test_ceil_si32:
354 ; RV64IZFINXZDINX:       # %bb.0:
355 ; RV64IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rup
356 ; RV64IZFINXZDINX-NEXT:    ret
357   %a = call double @llvm.ceil.f64(double %x)
358   %b = fptosi double %a to i32
359   ret i32 %b
362 define i64 @test_ceil_si64(double %x) {
363 ; RV32IFD-LABEL: test_ceil_si64:
364 ; RV32IFD:       # %bb.0:
365 ; RV32IFD-NEXT:    addi sp, sp, -16
366 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
367 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
368 ; RV32IFD-NEXT:    .cfi_offset ra, -4
369 ; RV32IFD-NEXT:    call ceil
370 ; RV32IFD-NEXT:    call __fixdfdi
371 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
372 ; RV32IFD-NEXT:    addi sp, sp, 16
373 ; RV32IFD-NEXT:    ret
375 ; RV64IFD-LABEL: test_ceil_si64:
376 ; RV64IFD:       # %bb.0:
377 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rup
378 ; RV64IFD-NEXT:    ret
380 ; RV32IZFINXZDINX-LABEL: test_ceil_si64:
381 ; RV32IZFINXZDINX:       # %bb.0:
382 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
383 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
384 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
385 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
386 ; RV32IZFINXZDINX-NEXT:    call ceil
387 ; RV32IZFINXZDINX-NEXT:    call __fixdfdi
388 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
389 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
390 ; RV32IZFINXZDINX-NEXT:    ret
392 ; RV64IZFINXZDINX-LABEL: test_ceil_si64:
393 ; RV64IZFINXZDINX:       # %bb.0:
394 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rup
395 ; RV64IZFINXZDINX-NEXT:    ret
396   %a = call double @llvm.ceil.f64(double %x)
397   %b = fptosi double %a to i64
398   ret i64 %b
401 define zeroext i8 @test_ceil_ui8(double %x) {
402 ; RV32IFD-LABEL: test_ceil_ui8:
403 ; RV32IFD:       # %bb.0:
404 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rup
405 ; RV32IFD-NEXT:    ret
407 ; RV64IFD-LABEL: test_ceil_ui8:
408 ; RV64IFD:       # %bb.0:
409 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rup
410 ; RV64IFD-NEXT:    ret
412 ; RV32IZFINXZDINX-LABEL: test_ceil_ui8:
413 ; RV32IZFINXZDINX:       # %bb.0:
414 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
415 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
416 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
417 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
418 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
419 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
420 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rup
421 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
422 ; RV32IZFINXZDINX-NEXT:    ret
424 ; RV64IZFINXZDINX-LABEL: test_ceil_ui8:
425 ; RV64IZFINXZDINX:       # %bb.0:
426 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rup
427 ; RV64IZFINXZDINX-NEXT:    ret
428   %a = call double @llvm.ceil.f64(double %x)
429   %b = fptoui double %a to i8
430   ret i8 %b
433 define zeroext i16 @test_ceil_ui16(double %x) {
434 ; RV32IFD-LABEL: test_ceil_ui16:
435 ; RV32IFD:       # %bb.0:
436 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rup
437 ; RV32IFD-NEXT:    ret
439 ; RV64IFD-LABEL: test_ceil_ui16:
440 ; RV64IFD:       # %bb.0:
441 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rup
442 ; RV64IFD-NEXT:    ret
444 ; RV32IZFINXZDINX-LABEL: test_ceil_ui16:
445 ; RV32IZFINXZDINX:       # %bb.0:
446 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
447 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
448 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
449 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
450 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
451 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
452 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rup
453 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
454 ; RV32IZFINXZDINX-NEXT:    ret
456 ; RV64IZFINXZDINX-LABEL: test_ceil_ui16:
457 ; RV64IZFINXZDINX:       # %bb.0:
458 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rup
459 ; RV64IZFINXZDINX-NEXT:    ret
460   %a = call double @llvm.ceil.f64(double %x)
461   %b = fptoui double %a to i16
462   ret i16 %b
465 define signext i32 @test_ceil_ui32(double %x) {
466 ; CHECKIFD-LABEL: test_ceil_ui32:
467 ; CHECKIFD:       # %bb.0:
468 ; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rup
469 ; CHECKIFD-NEXT:    ret
471 ; RV32IZFINXZDINX-LABEL: test_ceil_ui32:
472 ; RV32IZFINXZDINX:       # %bb.0:
473 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
474 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
475 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
476 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
477 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
478 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
479 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rup
480 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
481 ; RV32IZFINXZDINX-NEXT:    ret
483 ; RV64IZFINXZDINX-LABEL: test_ceil_ui32:
484 ; RV64IZFINXZDINX:       # %bb.0:
485 ; RV64IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rup
486 ; RV64IZFINXZDINX-NEXT:    ret
487   %a = call double @llvm.ceil.f64(double %x)
488   %b = fptoui double %a to i32
489   ret i32 %b
492 define i64 @test_ceil_ui64(double %x) {
493 ; RV32IFD-LABEL: test_ceil_ui64:
494 ; RV32IFD:       # %bb.0:
495 ; RV32IFD-NEXT:    addi sp, sp, -16
496 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
497 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
498 ; RV32IFD-NEXT:    .cfi_offset ra, -4
499 ; RV32IFD-NEXT:    call ceil
500 ; RV32IFD-NEXT:    call __fixunsdfdi
501 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
502 ; RV32IFD-NEXT:    addi sp, sp, 16
503 ; RV32IFD-NEXT:    ret
505 ; RV64IFD-LABEL: test_ceil_ui64:
506 ; RV64IFD:       # %bb.0:
507 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rup
508 ; RV64IFD-NEXT:    ret
510 ; RV32IZFINXZDINX-LABEL: test_ceil_ui64:
511 ; RV32IZFINXZDINX:       # %bb.0:
512 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
513 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
514 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
515 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
516 ; RV32IZFINXZDINX-NEXT:    call ceil
517 ; RV32IZFINXZDINX-NEXT:    call __fixunsdfdi
518 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
519 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
520 ; RV32IZFINXZDINX-NEXT:    ret
522 ; RV64IZFINXZDINX-LABEL: test_ceil_ui64:
523 ; RV64IZFINXZDINX:       # %bb.0:
524 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rup
525 ; RV64IZFINXZDINX-NEXT:    ret
526   %a = call double @llvm.ceil.f64(double %x)
527   %b = fptoui double %a to i64
528   ret i64 %b
531 define signext i8 @test_trunc_si8(double %x) {
532 ; RV32IFD-LABEL: test_trunc_si8:
533 ; RV32IFD:       # %bb.0:
534 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rtz
535 ; RV32IFD-NEXT:    ret
537 ; RV64IFD-LABEL: test_trunc_si8:
538 ; RV64IFD:       # %bb.0:
539 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
540 ; RV64IFD-NEXT:    ret
542 ; RV32IZFINXZDINX-LABEL: test_trunc_si8:
543 ; RV32IZFINXZDINX:       # %bb.0:
544 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
545 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
546 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
547 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
548 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
549 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
550 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rtz
551 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
552 ; RV32IZFINXZDINX-NEXT:    ret
554 ; RV64IZFINXZDINX-LABEL: test_trunc_si8:
555 ; RV64IZFINXZDINX:       # %bb.0:
556 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rtz
557 ; RV64IZFINXZDINX-NEXT:    ret
558   %a = call double @llvm.trunc.f64(double %x)
559   %b = fptosi double %a to i8
560   ret i8 %b
563 define signext i16 @test_trunc_si16(double %x) {
564 ; RV32IFD-LABEL: test_trunc_si16:
565 ; RV32IFD:       # %bb.0:
566 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rtz
567 ; RV32IFD-NEXT:    ret
569 ; RV64IFD-LABEL: test_trunc_si16:
570 ; RV64IFD:       # %bb.0:
571 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
572 ; RV64IFD-NEXT:    ret
574 ; RV32IZFINXZDINX-LABEL: test_trunc_si16:
575 ; RV32IZFINXZDINX:       # %bb.0:
576 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
577 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
578 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
579 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
580 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
581 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
582 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rtz
583 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
584 ; RV32IZFINXZDINX-NEXT:    ret
586 ; RV64IZFINXZDINX-LABEL: test_trunc_si16:
587 ; RV64IZFINXZDINX:       # %bb.0:
588 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rtz
589 ; RV64IZFINXZDINX-NEXT:    ret
590   %a = call double @llvm.trunc.f64(double %x)
591   %b = fptosi double %a to i16
592   ret i16 %b
595 define signext i32 @test_trunc_si32(double %x) {
596 ; CHECKIFD-LABEL: test_trunc_si32:
597 ; CHECKIFD:       # %bb.0:
598 ; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rtz
599 ; CHECKIFD-NEXT:    ret
601 ; RV32IZFINXZDINX-LABEL: test_trunc_si32:
602 ; RV32IZFINXZDINX:       # %bb.0:
603 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
604 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
605 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
606 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
607 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
608 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
609 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rtz
610 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
611 ; RV32IZFINXZDINX-NEXT:    ret
613 ; RV64IZFINXZDINX-LABEL: test_trunc_si32:
614 ; RV64IZFINXZDINX:       # %bb.0:
615 ; RV64IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rtz
616 ; RV64IZFINXZDINX-NEXT:    ret
617   %a = call double @llvm.trunc.f64(double %x)
618   %b = fptosi double %a to i32
619   ret i32 %b
622 define i64 @test_trunc_si64(double %x) {
623 ; RV32IFD-LABEL: test_trunc_si64:
624 ; RV32IFD:       # %bb.0:
625 ; RV32IFD-NEXT:    addi sp, sp, -16
626 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
627 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
628 ; RV32IFD-NEXT:    .cfi_offset ra, -4
629 ; RV32IFD-NEXT:    call trunc
630 ; RV32IFD-NEXT:    call __fixdfdi
631 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
632 ; RV32IFD-NEXT:    addi sp, sp, 16
633 ; RV32IFD-NEXT:    ret
635 ; RV64IFD-LABEL: test_trunc_si64:
636 ; RV64IFD:       # %bb.0:
637 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
638 ; RV64IFD-NEXT:    ret
640 ; RV32IZFINXZDINX-LABEL: test_trunc_si64:
641 ; RV32IZFINXZDINX:       # %bb.0:
642 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
643 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
644 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
645 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
646 ; RV32IZFINXZDINX-NEXT:    call trunc
647 ; RV32IZFINXZDINX-NEXT:    call __fixdfdi
648 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
649 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
650 ; RV32IZFINXZDINX-NEXT:    ret
652 ; RV64IZFINXZDINX-LABEL: test_trunc_si64:
653 ; RV64IZFINXZDINX:       # %bb.0:
654 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rtz
655 ; RV64IZFINXZDINX-NEXT:    ret
656   %a = call double @llvm.trunc.f64(double %x)
657   %b = fptosi double %a to i64
658   ret i64 %b
661 define zeroext i8 @test_trunc_ui8(double %x) {
662 ; RV32IFD-LABEL: test_trunc_ui8:
663 ; RV32IFD:       # %bb.0:
664 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rtz
665 ; RV32IFD-NEXT:    ret
667 ; RV64IFD-LABEL: test_trunc_ui8:
668 ; RV64IFD:       # %bb.0:
669 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rtz
670 ; RV64IFD-NEXT:    ret
672 ; RV32IZFINXZDINX-LABEL: test_trunc_ui8:
673 ; RV32IZFINXZDINX:       # %bb.0:
674 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
675 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
676 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
677 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
678 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
679 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
680 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rtz
681 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
682 ; RV32IZFINXZDINX-NEXT:    ret
684 ; RV64IZFINXZDINX-LABEL: test_trunc_ui8:
685 ; RV64IZFINXZDINX:       # %bb.0:
686 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rtz
687 ; RV64IZFINXZDINX-NEXT:    ret
688   %a = call double @llvm.trunc.f64(double %x)
689   %b = fptoui double %a to i8
690   ret i8 %b
693 define zeroext i16 @test_trunc_ui16(double %x) {
694 ; RV32IFD-LABEL: test_trunc_ui16:
695 ; RV32IFD:       # %bb.0:
696 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rtz
697 ; RV32IFD-NEXT:    ret
699 ; RV64IFD-LABEL: test_trunc_ui16:
700 ; RV64IFD:       # %bb.0:
701 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rtz
702 ; RV64IFD-NEXT:    ret
704 ; RV32IZFINXZDINX-LABEL: test_trunc_ui16:
705 ; RV32IZFINXZDINX:       # %bb.0:
706 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
707 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
708 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
709 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
710 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
711 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
712 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rtz
713 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
714 ; RV32IZFINXZDINX-NEXT:    ret
716 ; RV64IZFINXZDINX-LABEL: test_trunc_ui16:
717 ; RV64IZFINXZDINX:       # %bb.0:
718 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rtz
719 ; RV64IZFINXZDINX-NEXT:    ret
720   %a = call double @llvm.trunc.f64(double %x)
721   %b = fptoui double %a to i16
722   ret i16 %b
725 define signext i32 @test_trunc_ui32(double %x) {
726 ; CHECKIFD-LABEL: test_trunc_ui32:
727 ; CHECKIFD:       # %bb.0:
728 ; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rtz
729 ; CHECKIFD-NEXT:    ret
731 ; RV32IZFINXZDINX-LABEL: test_trunc_ui32:
732 ; RV32IZFINXZDINX:       # %bb.0:
733 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
734 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
735 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
736 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
737 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
738 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
739 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rtz
740 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
741 ; RV32IZFINXZDINX-NEXT:    ret
743 ; RV64IZFINXZDINX-LABEL: test_trunc_ui32:
744 ; RV64IZFINXZDINX:       # %bb.0:
745 ; RV64IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rtz
746 ; RV64IZFINXZDINX-NEXT:    ret
747   %a = call double @llvm.trunc.f64(double %x)
748   %b = fptoui double %a to i32
749   ret i32 %b
752 define i64 @test_trunc_ui64(double %x) {
753 ; RV32IFD-LABEL: test_trunc_ui64:
754 ; RV32IFD:       # %bb.0:
755 ; RV32IFD-NEXT:    addi sp, sp, -16
756 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
757 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
758 ; RV32IFD-NEXT:    .cfi_offset ra, -4
759 ; RV32IFD-NEXT:    call trunc
760 ; RV32IFD-NEXT:    call __fixunsdfdi
761 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
762 ; RV32IFD-NEXT:    addi sp, sp, 16
763 ; RV32IFD-NEXT:    ret
765 ; RV64IFD-LABEL: test_trunc_ui64:
766 ; RV64IFD:       # %bb.0:
767 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rtz
768 ; RV64IFD-NEXT:    ret
770 ; RV32IZFINXZDINX-LABEL: test_trunc_ui64:
771 ; RV32IZFINXZDINX:       # %bb.0:
772 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
773 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
774 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
775 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
776 ; RV32IZFINXZDINX-NEXT:    call trunc
777 ; RV32IZFINXZDINX-NEXT:    call __fixunsdfdi
778 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
779 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
780 ; RV32IZFINXZDINX-NEXT:    ret
782 ; RV64IZFINXZDINX-LABEL: test_trunc_ui64:
783 ; RV64IZFINXZDINX:       # %bb.0:
784 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rtz
785 ; RV64IZFINXZDINX-NEXT:    ret
786   %a = call double @llvm.trunc.f64(double %x)
787   %b = fptoui double %a to i64
788   ret i64 %b
791 define signext i8 @test_round_si8(double %x) {
792 ; RV32IFD-LABEL: test_round_si8:
793 ; RV32IFD:       # %bb.0:
794 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rmm
795 ; RV32IFD-NEXT:    ret
797 ; RV64IFD-LABEL: test_round_si8:
798 ; RV64IFD:       # %bb.0:
799 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rmm
800 ; RV64IFD-NEXT:    ret
802 ; RV32IZFINXZDINX-LABEL: test_round_si8:
803 ; RV32IZFINXZDINX:       # %bb.0:
804 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
805 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
806 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
807 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
808 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
809 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
810 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rmm
811 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
812 ; RV32IZFINXZDINX-NEXT:    ret
814 ; RV64IZFINXZDINX-LABEL: test_round_si8:
815 ; RV64IZFINXZDINX:       # %bb.0:
816 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rmm
817 ; RV64IZFINXZDINX-NEXT:    ret
818   %a = call double @llvm.round.f64(double %x)
819   %b = fptosi double %a to i8
820   ret i8 %b
823 define signext i16 @test_round_si16(double %x) {
824 ; RV32IFD-LABEL: test_round_si16:
825 ; RV32IFD:       # %bb.0:
826 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rmm
827 ; RV32IFD-NEXT:    ret
829 ; RV64IFD-LABEL: test_round_si16:
830 ; RV64IFD:       # %bb.0:
831 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rmm
832 ; RV64IFD-NEXT:    ret
834 ; RV32IZFINXZDINX-LABEL: test_round_si16:
835 ; RV32IZFINXZDINX:       # %bb.0:
836 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
837 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
838 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
839 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
840 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
841 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
842 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rmm
843 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
844 ; RV32IZFINXZDINX-NEXT:    ret
846 ; RV64IZFINXZDINX-LABEL: test_round_si16:
847 ; RV64IZFINXZDINX:       # %bb.0:
848 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rmm
849 ; RV64IZFINXZDINX-NEXT:    ret
850   %a = call double @llvm.round.f64(double %x)
851   %b = fptosi double %a to i16
852   ret i16 %b
855 define signext i32 @test_round_si32(double %x) {
856 ; CHECKIFD-LABEL: test_round_si32:
857 ; CHECKIFD:       # %bb.0:
858 ; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rmm
859 ; CHECKIFD-NEXT:    ret
861 ; RV32IZFINXZDINX-LABEL: test_round_si32:
862 ; RV32IZFINXZDINX:       # %bb.0:
863 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
864 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
865 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
866 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
867 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
868 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
869 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rmm
870 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
871 ; RV32IZFINXZDINX-NEXT:    ret
873 ; RV64IZFINXZDINX-LABEL: test_round_si32:
874 ; RV64IZFINXZDINX:       # %bb.0:
875 ; RV64IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rmm
876 ; RV64IZFINXZDINX-NEXT:    ret
877   %a = call double @llvm.round.f64(double %x)
878   %b = fptosi double %a to i32
879   ret i32 %b
882 define i64 @test_round_si64(double %x) {
883 ; RV32IFD-LABEL: test_round_si64:
884 ; RV32IFD:       # %bb.0:
885 ; RV32IFD-NEXT:    addi sp, sp, -16
886 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
887 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
888 ; RV32IFD-NEXT:    .cfi_offset ra, -4
889 ; RV32IFD-NEXT:    call round
890 ; RV32IFD-NEXT:    call __fixdfdi
891 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
892 ; RV32IFD-NEXT:    addi sp, sp, 16
893 ; RV32IFD-NEXT:    ret
895 ; RV64IFD-LABEL: test_round_si64:
896 ; RV64IFD:       # %bb.0:
897 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rmm
898 ; RV64IFD-NEXT:    ret
900 ; RV32IZFINXZDINX-LABEL: test_round_si64:
901 ; RV32IZFINXZDINX:       # %bb.0:
902 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
903 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
904 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
905 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
906 ; RV32IZFINXZDINX-NEXT:    call round
907 ; RV32IZFINXZDINX-NEXT:    call __fixdfdi
908 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
909 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
910 ; RV32IZFINXZDINX-NEXT:    ret
912 ; RV64IZFINXZDINX-LABEL: test_round_si64:
913 ; RV64IZFINXZDINX:       # %bb.0:
914 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rmm
915 ; RV64IZFINXZDINX-NEXT:    ret
916   %a = call double @llvm.round.f64(double %x)
917   %b = fptosi double %a to i64
918   ret i64 %b
921 define zeroext i8 @test_round_ui8(double %x) {
922 ; RV32IFD-LABEL: test_round_ui8:
923 ; RV32IFD:       # %bb.0:
924 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rmm
925 ; RV32IFD-NEXT:    ret
927 ; RV64IFD-LABEL: test_round_ui8:
928 ; RV64IFD:       # %bb.0:
929 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rmm
930 ; RV64IFD-NEXT:    ret
932 ; RV32IZFINXZDINX-LABEL: test_round_ui8:
933 ; RV32IZFINXZDINX:       # %bb.0:
934 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
935 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
936 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
937 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
938 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
939 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
940 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rmm
941 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
942 ; RV32IZFINXZDINX-NEXT:    ret
944 ; RV64IZFINXZDINX-LABEL: test_round_ui8:
945 ; RV64IZFINXZDINX:       # %bb.0:
946 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rmm
947 ; RV64IZFINXZDINX-NEXT:    ret
948   %a = call double @llvm.round.f64(double %x)
949   %b = fptoui double %a to i8
950   ret i8 %b
953 define zeroext i16 @test_round_ui16(double %x) {
954 ; RV32IFD-LABEL: test_round_ui16:
955 ; RV32IFD:       # %bb.0:
956 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rmm
957 ; RV32IFD-NEXT:    ret
959 ; RV64IFD-LABEL: test_round_ui16:
960 ; RV64IFD:       # %bb.0:
961 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rmm
962 ; RV64IFD-NEXT:    ret
964 ; RV32IZFINXZDINX-LABEL: test_round_ui16:
965 ; RV32IZFINXZDINX:       # %bb.0:
966 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
967 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
968 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
969 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
970 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
971 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
972 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rmm
973 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
974 ; RV32IZFINXZDINX-NEXT:    ret
976 ; RV64IZFINXZDINX-LABEL: test_round_ui16:
977 ; RV64IZFINXZDINX:       # %bb.0:
978 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rmm
979 ; RV64IZFINXZDINX-NEXT:    ret
980   %a = call double @llvm.round.f64(double %x)
981   %b = fptoui double %a to i16
982   ret i16 %b
985 define signext i32 @test_round_ui32(double %x) {
986 ; CHECKIFD-LABEL: test_round_ui32:
987 ; CHECKIFD:       # %bb.0:
988 ; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rmm
989 ; CHECKIFD-NEXT:    ret
991 ; RV32IZFINXZDINX-LABEL: test_round_ui32:
992 ; RV32IZFINXZDINX:       # %bb.0:
993 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
994 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
995 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
996 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
997 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
998 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
999 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rmm
1000 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1001 ; RV32IZFINXZDINX-NEXT:    ret
1003 ; RV64IZFINXZDINX-LABEL: test_round_ui32:
1004 ; RV64IZFINXZDINX:       # %bb.0:
1005 ; RV64IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rmm
1006 ; RV64IZFINXZDINX-NEXT:    ret
1007   %a = call double @llvm.round.f64(double %x)
1008   %b = fptoui double %a to i32
1009   ret i32 %b
1012 define i64 @test_round_ui64(double %x) {
1013 ; RV32IFD-LABEL: test_round_ui64:
1014 ; RV32IFD:       # %bb.0:
1015 ; RV32IFD-NEXT:    addi sp, sp, -16
1016 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
1017 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1018 ; RV32IFD-NEXT:    .cfi_offset ra, -4
1019 ; RV32IFD-NEXT:    call round
1020 ; RV32IFD-NEXT:    call __fixunsdfdi
1021 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1022 ; RV32IFD-NEXT:    addi sp, sp, 16
1023 ; RV32IFD-NEXT:    ret
1025 ; RV64IFD-LABEL: test_round_ui64:
1026 ; RV64IFD:       # %bb.0:
1027 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rmm
1028 ; RV64IFD-NEXT:    ret
1030 ; RV32IZFINXZDINX-LABEL: test_round_ui64:
1031 ; RV32IZFINXZDINX:       # %bb.0:
1032 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1033 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
1034 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1035 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
1036 ; RV32IZFINXZDINX-NEXT:    call round
1037 ; RV32IZFINXZDINX-NEXT:    call __fixunsdfdi
1038 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1039 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1040 ; RV32IZFINXZDINX-NEXT:    ret
1042 ; RV64IZFINXZDINX-LABEL: test_round_ui64:
1043 ; RV64IZFINXZDINX:       # %bb.0:
1044 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rmm
1045 ; RV64IZFINXZDINX-NEXT:    ret
1046   %a = call double @llvm.round.f64(double %x)
1047   %b = fptoui double %a to i64
1048   ret i64 %b
1051 define signext i8 @test_roundeven_si8(double %x) {
1052 ; RV32IFD-LABEL: test_roundeven_si8:
1053 ; RV32IFD:       # %bb.0:
1054 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rne
1055 ; RV32IFD-NEXT:    ret
1057 ; RV64IFD-LABEL: test_roundeven_si8:
1058 ; RV64IFD:       # %bb.0:
1059 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rne
1060 ; RV64IFD-NEXT:    ret
1062 ; RV32IZFINXZDINX-LABEL: test_roundeven_si8:
1063 ; RV32IZFINXZDINX:       # %bb.0:
1064 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1065 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
1066 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
1067 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
1068 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
1069 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
1070 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rne
1071 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1072 ; RV32IZFINXZDINX-NEXT:    ret
1074 ; RV64IZFINXZDINX-LABEL: test_roundeven_si8:
1075 ; RV64IZFINXZDINX:       # %bb.0:
1076 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rne
1077 ; RV64IZFINXZDINX-NEXT:    ret
1078   %a = call double @llvm.roundeven.f64(double %x)
1079   %b = fptosi double %a to i8
1080   ret i8 %b
1083 define signext i16 @test_roundeven_si16(double %x) {
1084 ; RV32IFD-LABEL: test_roundeven_si16:
1085 ; RV32IFD:       # %bb.0:
1086 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rne
1087 ; RV32IFD-NEXT:    ret
1089 ; RV64IFD-LABEL: test_roundeven_si16:
1090 ; RV64IFD:       # %bb.0:
1091 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rne
1092 ; RV64IFD-NEXT:    ret
1094 ; RV32IZFINXZDINX-LABEL: test_roundeven_si16:
1095 ; RV32IZFINXZDINX:       # %bb.0:
1096 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1097 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
1098 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
1099 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
1100 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
1101 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
1102 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rne
1103 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1104 ; RV32IZFINXZDINX-NEXT:    ret
1106 ; RV64IZFINXZDINX-LABEL: test_roundeven_si16:
1107 ; RV64IZFINXZDINX:       # %bb.0:
1108 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rne
1109 ; RV64IZFINXZDINX-NEXT:    ret
1110   %a = call double @llvm.roundeven.f64(double %x)
1111   %b = fptosi double %a to i16
1112   ret i16 %b
1115 define signext i32 @test_roundeven_si32(double %x) {
1116 ; CHECKIFD-LABEL: test_roundeven_si32:
1117 ; CHECKIFD:       # %bb.0:
1118 ; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rne
1119 ; CHECKIFD-NEXT:    ret
1121 ; RV32IZFINXZDINX-LABEL: test_roundeven_si32:
1122 ; RV32IZFINXZDINX:       # %bb.0:
1123 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1124 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
1125 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
1126 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
1127 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
1128 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
1129 ; RV32IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rne
1130 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1131 ; RV32IZFINXZDINX-NEXT:    ret
1133 ; RV64IZFINXZDINX-LABEL: test_roundeven_si32:
1134 ; RV64IZFINXZDINX:       # %bb.0:
1135 ; RV64IZFINXZDINX-NEXT:    fcvt.w.d a0, a0, rne
1136 ; RV64IZFINXZDINX-NEXT:    ret
1137   %a = call double @llvm.roundeven.f64(double %x)
1138   %b = fptosi double %a to i32
1139   ret i32 %b
1142 define i64 @test_roundeven_si64(double %x) {
1143 ; RV32IFD-LABEL: test_roundeven_si64:
1144 ; RV32IFD:       # %bb.0:
1145 ; RV32IFD-NEXT:    addi sp, sp, -16
1146 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
1147 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1148 ; RV32IFD-NEXT:    .cfi_offset ra, -4
1149 ; RV32IFD-NEXT:    call roundeven
1150 ; RV32IFD-NEXT:    call __fixdfdi
1151 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1152 ; RV32IFD-NEXT:    addi sp, sp, 16
1153 ; RV32IFD-NEXT:    ret
1155 ; RV64IFD-LABEL: test_roundeven_si64:
1156 ; RV64IFD:       # %bb.0:
1157 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rne
1158 ; RV64IFD-NEXT:    ret
1160 ; RV32IZFINXZDINX-LABEL: test_roundeven_si64:
1161 ; RV32IZFINXZDINX:       # %bb.0:
1162 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1163 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
1164 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1165 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
1166 ; RV32IZFINXZDINX-NEXT:    call roundeven
1167 ; RV32IZFINXZDINX-NEXT:    call __fixdfdi
1168 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1169 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1170 ; RV32IZFINXZDINX-NEXT:    ret
1172 ; RV64IZFINXZDINX-LABEL: test_roundeven_si64:
1173 ; RV64IZFINXZDINX:       # %bb.0:
1174 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a0, a0, rne
1175 ; RV64IZFINXZDINX-NEXT:    ret
1176   %a = call double @llvm.roundeven.f64(double %x)
1177   %b = fptosi double %a to i64
1178   ret i64 %b
1181 define zeroext i8 @test_roundeven_ui8(double %x) {
1182 ; RV32IFD-LABEL: test_roundeven_ui8:
1183 ; RV32IFD:       # %bb.0:
1184 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rne
1185 ; RV32IFD-NEXT:    ret
1187 ; RV64IFD-LABEL: test_roundeven_ui8:
1188 ; RV64IFD:       # %bb.0:
1189 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rne
1190 ; RV64IFD-NEXT:    ret
1192 ; RV32IZFINXZDINX-LABEL: test_roundeven_ui8:
1193 ; RV32IZFINXZDINX:       # %bb.0:
1194 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1195 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
1196 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
1197 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
1198 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
1199 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
1200 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rne
1201 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1202 ; RV32IZFINXZDINX-NEXT:    ret
1204 ; RV64IZFINXZDINX-LABEL: test_roundeven_ui8:
1205 ; RV64IZFINXZDINX:       # %bb.0:
1206 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rne
1207 ; RV64IZFINXZDINX-NEXT:    ret
1208   %a = call double @llvm.roundeven.f64(double %x)
1209   %b = fptoui double %a to i8
1210   ret i8 %b
1213 define zeroext i16 @test_roundeven_ui16(double %x) {
1214 ; RV32IFD-LABEL: test_roundeven_ui16:
1215 ; RV32IFD:       # %bb.0:
1216 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rne
1217 ; RV32IFD-NEXT:    ret
1219 ; RV64IFD-LABEL: test_roundeven_ui16:
1220 ; RV64IFD:       # %bb.0:
1221 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rne
1222 ; RV64IFD-NEXT:    ret
1224 ; RV32IZFINXZDINX-LABEL: test_roundeven_ui16:
1225 ; RV32IZFINXZDINX:       # %bb.0:
1226 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1227 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
1228 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
1229 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
1230 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
1231 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
1232 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rne
1233 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1234 ; RV32IZFINXZDINX-NEXT:    ret
1236 ; RV64IZFINXZDINX-LABEL: test_roundeven_ui16:
1237 ; RV64IZFINXZDINX:       # %bb.0:
1238 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rne
1239 ; RV64IZFINXZDINX-NEXT:    ret
1240   %a = call double @llvm.roundeven.f64(double %x)
1241   %b = fptoui double %a to i16
1242   ret i16 %b
1245 define signext i32 @test_roundeven_ui32(double %x) {
1246 ; CHECKIFD-LABEL: test_roundeven_ui32:
1247 ; CHECKIFD:       # %bb.0:
1248 ; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rne
1249 ; CHECKIFD-NEXT:    ret
1251 ; RV32IZFINXZDINX-LABEL: test_roundeven_ui32:
1252 ; RV32IZFINXZDINX:       # %bb.0:
1253 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1254 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
1255 ; RV32IZFINXZDINX-NEXT:    sw a0, 8(sp)
1256 ; RV32IZFINXZDINX-NEXT:    sw a1, 12(sp)
1257 ; RV32IZFINXZDINX-NEXT:    lw a0, 8(sp)
1258 ; RV32IZFINXZDINX-NEXT:    lw a1, 12(sp)
1259 ; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rne
1260 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1261 ; RV32IZFINXZDINX-NEXT:    ret
1263 ; RV64IZFINXZDINX-LABEL: test_roundeven_ui32:
1264 ; RV64IZFINXZDINX:       # %bb.0:
1265 ; RV64IZFINXZDINX-NEXT:    fcvt.wu.d a0, a0, rne
1266 ; RV64IZFINXZDINX-NEXT:    ret
1267   %a = call double @llvm.roundeven.f64(double %x)
1268   %b = fptoui double %a to i32
1269   ret i32 %b
1272 define i64 @test_roundeven_ui64(double %x) {
1273 ; RV32IFD-LABEL: test_roundeven_ui64:
1274 ; RV32IFD:       # %bb.0:
1275 ; RV32IFD-NEXT:    addi sp, sp, -16
1276 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 16
1277 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1278 ; RV32IFD-NEXT:    .cfi_offset ra, -4
1279 ; RV32IFD-NEXT:    call roundeven
1280 ; RV32IFD-NEXT:    call __fixunsdfdi
1281 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1282 ; RV32IFD-NEXT:    addi sp, sp, 16
1283 ; RV32IFD-NEXT:    ret
1285 ; RV64IFD-LABEL: test_roundeven_ui64:
1286 ; RV64IFD:       # %bb.0:
1287 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rne
1288 ; RV64IFD-NEXT:    ret
1290 ; RV32IZFINXZDINX-LABEL: test_roundeven_ui64:
1291 ; RV32IZFINXZDINX:       # %bb.0:
1292 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1293 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
1294 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1295 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
1296 ; RV32IZFINXZDINX-NEXT:    call roundeven
1297 ; RV32IZFINXZDINX-NEXT:    call __fixunsdfdi
1298 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1299 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1300 ; RV32IZFINXZDINX-NEXT:    ret
1302 ; RV64IZFINXZDINX-LABEL: test_roundeven_ui64:
1303 ; RV64IZFINXZDINX:       # %bb.0:
1304 ; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a0, a0, rne
1305 ; RV64IZFINXZDINX-NEXT:    ret
1306   %a = call double @llvm.roundeven.f64(double %x)
1307   %b = fptoui double %a to i64
1308   ret i64 %b
1311 define double @test_floor_double(double %x) {
1312 ; RV32IFD-LABEL: test_floor_double:
1313 ; RV32IFD:       # %bb.0:
1314 ; RV32IFD-NEXT:    tail floor
1316 ; RV64IFD-LABEL: test_floor_double:
1317 ; RV64IFD:       # %bb.0:
1318 ; RV64IFD-NEXT:    lui a0, %hi(.LCPI40_0)
1319 ; RV64IFD-NEXT:    fld fa5, %lo(.LCPI40_0)(a0)
1320 ; RV64IFD-NEXT:    fabs.d fa4, fa0
1321 ; RV64IFD-NEXT:    flt.d a0, fa4, fa5
1322 ; RV64IFD-NEXT:    beqz a0, .LBB40_2
1323 ; RV64IFD-NEXT:  # %bb.1:
1324 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rdn
1325 ; RV64IFD-NEXT:    fcvt.d.l fa5, a0, rdn
1326 ; RV64IFD-NEXT:    fsgnj.d fa0, fa5, fa0
1327 ; RV64IFD-NEXT:  .LBB40_2:
1328 ; RV64IFD-NEXT:    ret
1330 ; RV32IZFINXZDINX-LABEL: test_floor_double:
1331 ; RV32IZFINXZDINX:       # %bb.0:
1332 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1333 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
1334 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1335 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
1336 ; RV32IZFINXZDINX-NEXT:    call floor
1337 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1338 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1339 ; RV32IZFINXZDINX-NEXT:    ret
1341 ; RV64IZFINXZDINX-LABEL: test_floor_double:
1342 ; RV64IZFINXZDINX:       # %bb.0:
1343 ; RV64IZFINXZDINX-NEXT:    lui a1, %hi(.LCPI40_0)
1344 ; RV64IZFINXZDINX-NEXT:    ld a1, %lo(.LCPI40_0)(a1)
1345 ; RV64IZFINXZDINX-NEXT:    fabs.d a2, a0
1346 ; RV64IZFINXZDINX-NEXT:    flt.d a1, a2, a1
1347 ; RV64IZFINXZDINX-NEXT:    beqz a1, .LBB40_2
1348 ; RV64IZFINXZDINX-NEXT:  # %bb.1:
1349 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a1, a0, rdn
1350 ; RV64IZFINXZDINX-NEXT:    fcvt.d.l a1, a1, rdn
1351 ; RV64IZFINXZDINX-NEXT:    fsgnj.d a0, a1, a0
1352 ; RV64IZFINXZDINX-NEXT:  .LBB40_2:
1353 ; RV64IZFINXZDINX-NEXT:    ret
1354   %a = call double @llvm.floor.f64(double %x)
1355   ret double %a
1358 define double @test_ceil_double(double %x) {
1359 ; RV32IFD-LABEL: test_ceil_double:
1360 ; RV32IFD:       # %bb.0:
1361 ; RV32IFD-NEXT:    tail ceil
1363 ; RV64IFD-LABEL: test_ceil_double:
1364 ; RV64IFD:       # %bb.0:
1365 ; RV64IFD-NEXT:    lui a0, %hi(.LCPI41_0)
1366 ; RV64IFD-NEXT:    fld fa5, %lo(.LCPI41_0)(a0)
1367 ; RV64IFD-NEXT:    fabs.d fa4, fa0
1368 ; RV64IFD-NEXT:    flt.d a0, fa4, fa5
1369 ; RV64IFD-NEXT:    beqz a0, .LBB41_2
1370 ; RV64IFD-NEXT:  # %bb.1:
1371 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rup
1372 ; RV64IFD-NEXT:    fcvt.d.l fa5, a0, rup
1373 ; RV64IFD-NEXT:    fsgnj.d fa0, fa5, fa0
1374 ; RV64IFD-NEXT:  .LBB41_2:
1375 ; RV64IFD-NEXT:    ret
1377 ; RV32IZFINXZDINX-LABEL: test_ceil_double:
1378 ; RV32IZFINXZDINX:       # %bb.0:
1379 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1380 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
1381 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1382 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
1383 ; RV32IZFINXZDINX-NEXT:    call ceil
1384 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1385 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1386 ; RV32IZFINXZDINX-NEXT:    ret
1388 ; RV64IZFINXZDINX-LABEL: test_ceil_double:
1389 ; RV64IZFINXZDINX:       # %bb.0:
1390 ; RV64IZFINXZDINX-NEXT:    lui a1, %hi(.LCPI41_0)
1391 ; RV64IZFINXZDINX-NEXT:    ld a1, %lo(.LCPI41_0)(a1)
1392 ; RV64IZFINXZDINX-NEXT:    fabs.d a2, a0
1393 ; RV64IZFINXZDINX-NEXT:    flt.d a1, a2, a1
1394 ; RV64IZFINXZDINX-NEXT:    beqz a1, .LBB41_2
1395 ; RV64IZFINXZDINX-NEXT:  # %bb.1:
1396 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a1, a0, rup
1397 ; RV64IZFINXZDINX-NEXT:    fcvt.d.l a1, a1, rup
1398 ; RV64IZFINXZDINX-NEXT:    fsgnj.d a0, a1, a0
1399 ; RV64IZFINXZDINX-NEXT:  .LBB41_2:
1400 ; RV64IZFINXZDINX-NEXT:    ret
1401   %a = call double @llvm.ceil.f64(double %x)
1402   ret double %a
1405 define double @test_trunc_double(double %x) {
1406 ; RV32IFD-LABEL: test_trunc_double:
1407 ; RV32IFD:       # %bb.0:
1408 ; RV32IFD-NEXT:    tail trunc
1410 ; RV64IFD-LABEL: test_trunc_double:
1411 ; RV64IFD:       # %bb.0:
1412 ; RV64IFD-NEXT:    lui a0, %hi(.LCPI42_0)
1413 ; RV64IFD-NEXT:    fld fa5, %lo(.LCPI42_0)(a0)
1414 ; RV64IFD-NEXT:    fabs.d fa4, fa0
1415 ; RV64IFD-NEXT:    flt.d a0, fa4, fa5
1416 ; RV64IFD-NEXT:    beqz a0, .LBB42_2
1417 ; RV64IFD-NEXT:  # %bb.1:
1418 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
1419 ; RV64IFD-NEXT:    fcvt.d.l fa5, a0, rtz
1420 ; RV64IFD-NEXT:    fsgnj.d fa0, fa5, fa0
1421 ; RV64IFD-NEXT:  .LBB42_2:
1422 ; RV64IFD-NEXT:    ret
1424 ; RV32IZFINXZDINX-LABEL: test_trunc_double:
1425 ; RV32IZFINXZDINX:       # %bb.0:
1426 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1427 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
1428 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1429 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
1430 ; RV32IZFINXZDINX-NEXT:    call trunc
1431 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1432 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1433 ; RV32IZFINXZDINX-NEXT:    ret
1435 ; RV64IZFINXZDINX-LABEL: test_trunc_double:
1436 ; RV64IZFINXZDINX:       # %bb.0:
1437 ; RV64IZFINXZDINX-NEXT:    lui a1, %hi(.LCPI42_0)
1438 ; RV64IZFINXZDINX-NEXT:    ld a1, %lo(.LCPI42_0)(a1)
1439 ; RV64IZFINXZDINX-NEXT:    fabs.d a2, a0
1440 ; RV64IZFINXZDINX-NEXT:    flt.d a1, a2, a1
1441 ; RV64IZFINXZDINX-NEXT:    beqz a1, .LBB42_2
1442 ; RV64IZFINXZDINX-NEXT:  # %bb.1:
1443 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a1, a0, rtz
1444 ; RV64IZFINXZDINX-NEXT:    fcvt.d.l a1, a1, rtz
1445 ; RV64IZFINXZDINX-NEXT:    fsgnj.d a0, a1, a0
1446 ; RV64IZFINXZDINX-NEXT:  .LBB42_2:
1447 ; RV64IZFINXZDINX-NEXT:    ret
1448   %a = call double @llvm.trunc.f64(double %x)
1449   ret double %a
1452 define double @test_round_double(double %x) {
1453 ; RV32IFD-LABEL: test_round_double:
1454 ; RV32IFD:       # %bb.0:
1455 ; RV32IFD-NEXT:    tail round
1457 ; RV64IFD-LABEL: test_round_double:
1458 ; RV64IFD:       # %bb.0:
1459 ; RV64IFD-NEXT:    lui a0, %hi(.LCPI43_0)
1460 ; RV64IFD-NEXT:    fld fa5, %lo(.LCPI43_0)(a0)
1461 ; RV64IFD-NEXT:    fabs.d fa4, fa0
1462 ; RV64IFD-NEXT:    flt.d a0, fa4, fa5
1463 ; RV64IFD-NEXT:    beqz a0, .LBB43_2
1464 ; RV64IFD-NEXT:  # %bb.1:
1465 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rmm
1466 ; RV64IFD-NEXT:    fcvt.d.l fa5, a0, rmm
1467 ; RV64IFD-NEXT:    fsgnj.d fa0, fa5, fa0
1468 ; RV64IFD-NEXT:  .LBB43_2:
1469 ; RV64IFD-NEXT:    ret
1471 ; RV32IZFINXZDINX-LABEL: test_round_double:
1472 ; RV32IZFINXZDINX:       # %bb.0:
1473 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1474 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
1475 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1476 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
1477 ; RV32IZFINXZDINX-NEXT:    call round
1478 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1479 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1480 ; RV32IZFINXZDINX-NEXT:    ret
1482 ; RV64IZFINXZDINX-LABEL: test_round_double:
1483 ; RV64IZFINXZDINX:       # %bb.0:
1484 ; RV64IZFINXZDINX-NEXT:    lui a1, %hi(.LCPI43_0)
1485 ; RV64IZFINXZDINX-NEXT:    ld a1, %lo(.LCPI43_0)(a1)
1486 ; RV64IZFINXZDINX-NEXT:    fabs.d a2, a0
1487 ; RV64IZFINXZDINX-NEXT:    flt.d a1, a2, a1
1488 ; RV64IZFINXZDINX-NEXT:    beqz a1, .LBB43_2
1489 ; RV64IZFINXZDINX-NEXT:  # %bb.1:
1490 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a1, a0, rmm
1491 ; RV64IZFINXZDINX-NEXT:    fcvt.d.l a1, a1, rmm
1492 ; RV64IZFINXZDINX-NEXT:    fsgnj.d a0, a1, a0
1493 ; RV64IZFINXZDINX-NEXT:  .LBB43_2:
1494 ; RV64IZFINXZDINX-NEXT:    ret
1495   %a = call double @llvm.round.f64(double %x)
1496   ret double %a
1499 define double @test_roundeven_double(double %x) {
1500 ; RV32IFD-LABEL: test_roundeven_double:
1501 ; RV32IFD:       # %bb.0:
1502 ; RV32IFD-NEXT:    tail roundeven
1504 ; RV64IFD-LABEL: test_roundeven_double:
1505 ; RV64IFD:       # %bb.0:
1506 ; RV64IFD-NEXT:    lui a0, %hi(.LCPI44_0)
1507 ; RV64IFD-NEXT:    fld fa5, %lo(.LCPI44_0)(a0)
1508 ; RV64IFD-NEXT:    fabs.d fa4, fa0
1509 ; RV64IFD-NEXT:    flt.d a0, fa4, fa5
1510 ; RV64IFD-NEXT:    beqz a0, .LBB44_2
1511 ; RV64IFD-NEXT:  # %bb.1:
1512 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rne
1513 ; RV64IFD-NEXT:    fcvt.d.l fa5, a0, rne
1514 ; RV64IFD-NEXT:    fsgnj.d fa0, fa5, fa0
1515 ; RV64IFD-NEXT:  .LBB44_2:
1516 ; RV64IFD-NEXT:    ret
1518 ; RV32IZFINXZDINX-LABEL: test_roundeven_double:
1519 ; RV32IZFINXZDINX:       # %bb.0:
1520 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1521 ; RV32IZFINXZDINX-NEXT:    .cfi_def_cfa_offset 16
1522 ; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1523 ; RV32IZFINXZDINX-NEXT:    .cfi_offset ra, -4
1524 ; RV32IZFINXZDINX-NEXT:    call roundeven
1525 ; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1526 ; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1527 ; RV32IZFINXZDINX-NEXT:    ret
1529 ; RV64IZFINXZDINX-LABEL: test_roundeven_double:
1530 ; RV64IZFINXZDINX:       # %bb.0:
1531 ; RV64IZFINXZDINX-NEXT:    lui a1, %hi(.LCPI44_0)
1532 ; RV64IZFINXZDINX-NEXT:    ld a1, %lo(.LCPI44_0)(a1)
1533 ; RV64IZFINXZDINX-NEXT:    fabs.d a2, a0
1534 ; RV64IZFINXZDINX-NEXT:    flt.d a1, a2, a1
1535 ; RV64IZFINXZDINX-NEXT:    beqz a1, .LBB44_2
1536 ; RV64IZFINXZDINX-NEXT:  # %bb.1:
1537 ; RV64IZFINXZDINX-NEXT:    fcvt.l.d a1, a0, rne
1538 ; RV64IZFINXZDINX-NEXT:    fcvt.d.l a1, a1, rne
1539 ; RV64IZFINXZDINX-NEXT:    fsgnj.d a0, a1, a0
1540 ; RV64IZFINXZDINX-NEXT:  .LBB44_2:
1541 ; RV64IZFINXZDINX-NEXT:    ret
1542   %a = call double @llvm.roundeven.f64(double %x)
1543   ret double %a
1546 declare double @llvm.floor.f64(double)
1547 declare double @llvm.ceil.f64(double)
1548 declare double @llvm.trunc.f64(double)
1549 declare double @llvm.round.f64(double)
1550 declare double @llvm.roundeven.f64(double)