Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / float-round-conv-sat.ll
blob5e99c7eb9056282b18ec7bb8e14da746cc10b8c0
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+f -verify-machineinstrs < %s \
3 ; RUN:   -target-abi=ilp32f | FileCheck -check-prefixes=CHECKIF,RV32IF %s
4 ; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs < %s \
5 ; RUN:   -target-abi=lp64f | FileCheck -check-prefixes=CHECKIF,RV64IF %s
6 ; RUN: llc -mtriple=riscv32 -mattr=+zfinx -verify-machineinstrs < %s \
7 ; RUN:   -target-abi=ilp32 | FileCheck -check-prefixes=CHECKIZFINX,RV32IZFINX %s
8 ; RUN: llc -mtriple=riscv64 -mattr=+zfinx -verify-machineinstrs < %s \
9 ; RUN:   -target-abi=lp64 | FileCheck -check-prefixes=CHECKIZFINX,RV64IZFINX %s
11 define signext i32 @test_floor_si32(float %x) {
12 ; CHECKIF-LABEL: test_floor_si32:
13 ; CHECKIF:       # %bb.0:
14 ; CHECKIF-NEXT:    fcvt.w.s a0, fa0, rdn
15 ; CHECKIF-NEXT:    feq.s a1, fa0, fa0
16 ; CHECKIF-NEXT:    seqz a1, a1
17 ; CHECKIF-NEXT:    addi a1, a1, -1
18 ; CHECKIF-NEXT:    and a0, a1, a0
19 ; CHECKIF-NEXT:    ret
21 ; CHECKIZFINX-LABEL: test_floor_si32:
22 ; CHECKIZFINX:       # %bb.0:
23 ; CHECKIZFINX-NEXT:    fcvt.w.s a1, a0, rdn
24 ; CHECKIZFINX-NEXT:    feq.s a0, a0, a0
25 ; CHECKIZFINX-NEXT:    seqz a0, a0
26 ; CHECKIZFINX-NEXT:    addi a0, a0, -1
27 ; CHECKIZFINX-NEXT:    and a0, a0, a1
28 ; CHECKIZFINX-NEXT:    ret
29   %a = call float @llvm.floor.f32(float %x)
30   %b = call i32 @llvm.fptosi.sat.i32.f32(float %a)
31   ret i32 %b
34 define i64 @test_floor_si64(float %x) nounwind {
35 ; RV32IF-LABEL: test_floor_si64:
36 ; RV32IF:       # %bb.0:
37 ; RV32IF-NEXT:    addi sp, sp, -16
38 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
39 ; RV32IF-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
40 ; RV32IF-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
41 ; RV32IF-NEXT:    fmv.s fs0, fa0
42 ; RV32IF-NEXT:    lui a0, 307200
43 ; RV32IF-NEXT:    fmv.w.x fa5, a0
44 ; RV32IF-NEXT:    fabs.s fa4, fa0
45 ; RV32IF-NEXT:    flt.s a0, fa4, fa5
46 ; RV32IF-NEXT:    beqz a0, .LBB1_2
47 ; RV32IF-NEXT:  # %bb.1:
48 ; RV32IF-NEXT:    fcvt.w.s a0, fs0, rdn
49 ; RV32IF-NEXT:    fcvt.s.w fa5, a0, rdn
50 ; RV32IF-NEXT:    fsgnj.s fs0, fa5, fs0
51 ; RV32IF-NEXT:  .LBB1_2:
52 ; RV32IF-NEXT:    lui a0, 913408
53 ; RV32IF-NEXT:    fmv.w.x fa5, a0
54 ; RV32IF-NEXT:    fle.s s0, fa5, fs0
55 ; RV32IF-NEXT:    fmv.s fa0, fs0
56 ; RV32IF-NEXT:    call __fixsfdi
57 ; RV32IF-NEXT:    lui a4, 524288
58 ; RV32IF-NEXT:    lui a2, 524288
59 ; RV32IF-NEXT:    beqz s0, .LBB1_4
60 ; RV32IF-NEXT:  # %bb.3:
61 ; RV32IF-NEXT:    mv a2, a1
62 ; RV32IF-NEXT:  .LBB1_4:
63 ; RV32IF-NEXT:    lui a1, %hi(.LCPI1_0)
64 ; RV32IF-NEXT:    flw fa5, %lo(.LCPI1_0)(a1)
65 ; RV32IF-NEXT:    flt.s a3, fa5, fs0
66 ; RV32IF-NEXT:    beqz a3, .LBB1_6
67 ; RV32IF-NEXT:  # %bb.5:
68 ; RV32IF-NEXT:    addi a2, a4, -1
69 ; RV32IF-NEXT:  .LBB1_6:
70 ; RV32IF-NEXT:    feq.s a1, fs0, fs0
71 ; RV32IF-NEXT:    neg a4, a1
72 ; RV32IF-NEXT:    and a1, a4, a2
73 ; RV32IF-NEXT:    neg a2, s0
74 ; RV32IF-NEXT:    and a0, a2, a0
75 ; RV32IF-NEXT:    neg a2, a3
76 ; RV32IF-NEXT:    or a0, a2, a0
77 ; RV32IF-NEXT:    and a0, a4, a0
78 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
79 ; RV32IF-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
80 ; RV32IF-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
81 ; RV32IF-NEXT:    addi sp, sp, 16
82 ; RV32IF-NEXT:    ret
84 ; RV64IF-LABEL: test_floor_si64:
85 ; RV64IF:       # %bb.0:
86 ; RV64IF-NEXT:    fcvt.l.s a0, fa0, rdn
87 ; RV64IF-NEXT:    feq.s a1, fa0, fa0
88 ; RV64IF-NEXT:    seqz a1, a1
89 ; RV64IF-NEXT:    addi a1, a1, -1
90 ; RV64IF-NEXT:    and a0, a1, a0
91 ; RV64IF-NEXT:    ret
93 ; RV32IZFINX-LABEL: test_floor_si64:
94 ; RV32IZFINX:       # %bb.0:
95 ; RV32IZFINX-NEXT:    addi sp, sp, -16
96 ; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
97 ; RV32IZFINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
98 ; RV32IZFINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
99 ; RV32IZFINX-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
100 ; RV32IZFINX-NEXT:    mv s0, a0
101 ; RV32IZFINX-NEXT:    lui a0, 307200
102 ; RV32IZFINX-NEXT:    fabs.s a1, s0
103 ; RV32IZFINX-NEXT:    flt.s a0, a1, a0
104 ; RV32IZFINX-NEXT:    beqz a0, .LBB1_2
105 ; RV32IZFINX-NEXT:  # %bb.1:
106 ; RV32IZFINX-NEXT:    fcvt.w.s a0, s0, rdn
107 ; RV32IZFINX-NEXT:    fcvt.s.w a0, a0, rdn
108 ; RV32IZFINX-NEXT:    fsgnj.s s0, a0, s0
109 ; RV32IZFINX-NEXT:  .LBB1_2:
110 ; RV32IZFINX-NEXT:    lui a0, 913408
111 ; RV32IZFINX-NEXT:    fle.s s1, a0, s0
112 ; RV32IZFINX-NEXT:    neg s2, s1
113 ; RV32IZFINX-NEXT:    mv a0, s0
114 ; RV32IZFINX-NEXT:    call __fixsfdi
115 ; RV32IZFINX-NEXT:    lui a2, %hi(.LCPI1_0)
116 ; RV32IZFINX-NEXT:    lw a2, %lo(.LCPI1_0)(a2)
117 ; RV32IZFINX-NEXT:    and a0, s2, a0
118 ; RV32IZFINX-NEXT:    flt.s a4, a2, s0
119 ; RV32IZFINX-NEXT:    neg a2, a4
120 ; RV32IZFINX-NEXT:    or a0, a2, a0
121 ; RV32IZFINX-NEXT:    feq.s a2, s0, s0
122 ; RV32IZFINX-NEXT:    neg a2, a2
123 ; RV32IZFINX-NEXT:    lui a5, 524288
124 ; RV32IZFINX-NEXT:    lui a3, 524288
125 ; RV32IZFINX-NEXT:    beqz s1, .LBB1_4
126 ; RV32IZFINX-NEXT:  # %bb.3:
127 ; RV32IZFINX-NEXT:    mv a3, a1
128 ; RV32IZFINX-NEXT:  .LBB1_4:
129 ; RV32IZFINX-NEXT:    and a0, a2, a0
130 ; RV32IZFINX-NEXT:    beqz a4, .LBB1_6
131 ; RV32IZFINX-NEXT:  # %bb.5:
132 ; RV32IZFINX-NEXT:    addi a3, a5, -1
133 ; RV32IZFINX-NEXT:  .LBB1_6:
134 ; RV32IZFINX-NEXT:    and a1, a2, a3
135 ; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
136 ; RV32IZFINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
137 ; RV32IZFINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
138 ; RV32IZFINX-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
139 ; RV32IZFINX-NEXT:    addi sp, sp, 16
140 ; RV32IZFINX-NEXT:    ret
142 ; RV64IZFINX-LABEL: test_floor_si64:
143 ; RV64IZFINX:       # %bb.0:
144 ; RV64IZFINX-NEXT:    fcvt.l.s a1, a0, rdn
145 ; RV64IZFINX-NEXT:    feq.s a0, a0, a0
146 ; RV64IZFINX-NEXT:    seqz a0, a0
147 ; RV64IZFINX-NEXT:    addi a0, a0, -1
148 ; RV64IZFINX-NEXT:    and a0, a0, a1
149 ; RV64IZFINX-NEXT:    ret
150   %a = call float @llvm.floor.f32(float %x)
151   %b = call i64 @llvm.fptosi.sat.i64.f32(float %a)
152   ret i64 %b
155 define signext i32 @test_floor_ui32(float %x) {
156 ; CHECKIF-LABEL: test_floor_ui32:
157 ; CHECKIF:       # %bb.0:
158 ; CHECKIF-NEXT:    fcvt.wu.s a0, fa0, rdn
159 ; CHECKIF-NEXT:    feq.s a1, fa0, fa0
160 ; CHECKIF-NEXT:    seqz a1, a1
161 ; CHECKIF-NEXT:    addi a1, a1, -1
162 ; CHECKIF-NEXT:    and a0, a1, a0
163 ; CHECKIF-NEXT:    ret
165 ; CHECKIZFINX-LABEL: test_floor_ui32:
166 ; CHECKIZFINX:       # %bb.0:
167 ; CHECKIZFINX-NEXT:    fcvt.wu.s a1, a0, rdn
168 ; CHECKIZFINX-NEXT:    feq.s a0, a0, a0
169 ; CHECKIZFINX-NEXT:    seqz a0, a0
170 ; CHECKIZFINX-NEXT:    addi a0, a0, -1
171 ; CHECKIZFINX-NEXT:    and a0, a0, a1
172 ; CHECKIZFINX-NEXT:    ret
173   %a = call float @llvm.floor.f32(float %x)
174   %b = call i32 @llvm.fptoui.sat.i32.f32(float %a)
175   ret i32 %b
178 define i64 @test_floor_ui64(float %x) nounwind {
179 ; RV32IF-LABEL: test_floor_ui64:
180 ; RV32IF:       # %bb.0:
181 ; RV32IF-NEXT:    addi sp, sp, -16
182 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
183 ; RV32IF-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
184 ; RV32IF-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
185 ; RV32IF-NEXT:    fmv.s fs0, fa0
186 ; RV32IF-NEXT:    lui a0, 307200
187 ; RV32IF-NEXT:    fmv.w.x fa5, a0
188 ; RV32IF-NEXT:    fabs.s fa4, fa0
189 ; RV32IF-NEXT:    flt.s a0, fa4, fa5
190 ; RV32IF-NEXT:    beqz a0, .LBB3_2
191 ; RV32IF-NEXT:  # %bb.1:
192 ; RV32IF-NEXT:    fcvt.w.s a0, fs0, rdn
193 ; RV32IF-NEXT:    fcvt.s.w fa5, a0, rdn
194 ; RV32IF-NEXT:    fsgnj.s fs0, fa5, fs0
195 ; RV32IF-NEXT:  .LBB3_2:
196 ; RV32IF-NEXT:    fmv.w.x fa5, zero
197 ; RV32IF-NEXT:    fle.s a0, fa5, fs0
198 ; RV32IF-NEXT:    neg s0, a0
199 ; RV32IF-NEXT:    fmv.s fa0, fs0
200 ; RV32IF-NEXT:    call __fixunssfdi
201 ; RV32IF-NEXT:    lui a2, %hi(.LCPI3_0)
202 ; RV32IF-NEXT:    flw fa5, %lo(.LCPI3_0)(a2)
203 ; RV32IF-NEXT:    and a0, s0, a0
204 ; RV32IF-NEXT:    flt.s a2, fa5, fs0
205 ; RV32IF-NEXT:    neg a2, a2
206 ; RV32IF-NEXT:    or a0, a2, a0
207 ; RV32IF-NEXT:    and a1, s0, a1
208 ; RV32IF-NEXT:    or a1, a2, a1
209 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
210 ; RV32IF-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
211 ; RV32IF-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
212 ; RV32IF-NEXT:    addi sp, sp, 16
213 ; RV32IF-NEXT:    ret
215 ; RV64IF-LABEL: test_floor_ui64:
216 ; RV64IF:       # %bb.0:
217 ; RV64IF-NEXT:    fcvt.lu.s a0, fa0, rdn
218 ; RV64IF-NEXT:    feq.s a1, fa0, fa0
219 ; RV64IF-NEXT:    seqz a1, a1
220 ; RV64IF-NEXT:    addi a1, a1, -1
221 ; RV64IF-NEXT:    and a0, a1, a0
222 ; RV64IF-NEXT:    ret
224 ; RV32IZFINX-LABEL: test_floor_ui64:
225 ; RV32IZFINX:       # %bb.0:
226 ; RV32IZFINX-NEXT:    addi sp, sp, -16
227 ; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
228 ; RV32IZFINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
229 ; RV32IZFINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
230 ; RV32IZFINX-NEXT:    mv s0, a0
231 ; RV32IZFINX-NEXT:    lui a0, 307200
232 ; RV32IZFINX-NEXT:    fabs.s a1, s0
233 ; RV32IZFINX-NEXT:    flt.s a0, a1, a0
234 ; RV32IZFINX-NEXT:    beqz a0, .LBB3_2
235 ; RV32IZFINX-NEXT:  # %bb.1:
236 ; RV32IZFINX-NEXT:    fcvt.w.s a0, s0, rdn
237 ; RV32IZFINX-NEXT:    fcvt.s.w a0, a0, rdn
238 ; RV32IZFINX-NEXT:    fsgnj.s s0, a0, s0
239 ; RV32IZFINX-NEXT:  .LBB3_2:
240 ; RV32IZFINX-NEXT:    fle.s a0, zero, s0
241 ; RV32IZFINX-NEXT:    neg s1, a0
242 ; RV32IZFINX-NEXT:    mv a0, s0
243 ; RV32IZFINX-NEXT:    call __fixunssfdi
244 ; RV32IZFINX-NEXT:    lui a2, %hi(.LCPI3_0)
245 ; RV32IZFINX-NEXT:    lw a2, %lo(.LCPI3_0)(a2)
246 ; RV32IZFINX-NEXT:    and a0, s1, a0
247 ; RV32IZFINX-NEXT:    flt.s a2, a2, s0
248 ; RV32IZFINX-NEXT:    neg a2, a2
249 ; RV32IZFINX-NEXT:    or a0, a2, a0
250 ; RV32IZFINX-NEXT:    and a1, s1, a1
251 ; RV32IZFINX-NEXT:    or a1, a2, a1
252 ; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
253 ; RV32IZFINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
254 ; RV32IZFINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
255 ; RV32IZFINX-NEXT:    addi sp, sp, 16
256 ; RV32IZFINX-NEXT:    ret
258 ; RV64IZFINX-LABEL: test_floor_ui64:
259 ; RV64IZFINX:       # %bb.0:
260 ; RV64IZFINX-NEXT:    fcvt.lu.s a1, a0, rdn
261 ; RV64IZFINX-NEXT:    feq.s a0, a0, a0
262 ; RV64IZFINX-NEXT:    seqz a0, a0
263 ; RV64IZFINX-NEXT:    addi a0, a0, -1
264 ; RV64IZFINX-NEXT:    and a0, a0, a1
265 ; RV64IZFINX-NEXT:    ret
266   %a = call float @llvm.floor.f32(float %x)
267   %b = call i64 @llvm.fptoui.sat.i64.f32(float %a)
268   ret i64 %b
271 define signext i32 @test_ceil_si32(float %x) {
272 ; CHECKIF-LABEL: test_ceil_si32:
273 ; CHECKIF:       # %bb.0:
274 ; CHECKIF-NEXT:    fcvt.w.s a0, fa0, rup
275 ; CHECKIF-NEXT:    feq.s a1, fa0, fa0
276 ; CHECKIF-NEXT:    seqz a1, a1
277 ; CHECKIF-NEXT:    addi a1, a1, -1
278 ; CHECKIF-NEXT:    and a0, a1, a0
279 ; CHECKIF-NEXT:    ret
281 ; CHECKIZFINX-LABEL: test_ceil_si32:
282 ; CHECKIZFINX:       # %bb.0:
283 ; CHECKIZFINX-NEXT:    fcvt.w.s a1, a0, rup
284 ; CHECKIZFINX-NEXT:    feq.s a0, a0, a0
285 ; CHECKIZFINX-NEXT:    seqz a0, a0
286 ; CHECKIZFINX-NEXT:    addi a0, a0, -1
287 ; CHECKIZFINX-NEXT:    and a0, a0, a1
288 ; CHECKIZFINX-NEXT:    ret
289   %a = call float @llvm.ceil.f32(float %x)
290   %b = call i32 @llvm.fptosi.sat.i32.f32(float %a)
291   ret i32 %b
294 define i64 @test_ceil_si64(float %x) nounwind {
295 ; RV32IF-LABEL: test_ceil_si64:
296 ; RV32IF:       # %bb.0:
297 ; RV32IF-NEXT:    addi sp, sp, -16
298 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
299 ; RV32IF-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
300 ; RV32IF-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
301 ; RV32IF-NEXT:    fmv.s fs0, fa0
302 ; RV32IF-NEXT:    lui a0, 307200
303 ; RV32IF-NEXT:    fmv.w.x fa5, a0
304 ; RV32IF-NEXT:    fabs.s fa4, fa0
305 ; RV32IF-NEXT:    flt.s a0, fa4, fa5
306 ; RV32IF-NEXT:    beqz a0, .LBB5_2
307 ; RV32IF-NEXT:  # %bb.1:
308 ; RV32IF-NEXT:    fcvt.w.s a0, fs0, rup
309 ; RV32IF-NEXT:    fcvt.s.w fa5, a0, rup
310 ; RV32IF-NEXT:    fsgnj.s fs0, fa5, fs0
311 ; RV32IF-NEXT:  .LBB5_2:
312 ; RV32IF-NEXT:    lui a0, 913408
313 ; RV32IF-NEXT:    fmv.w.x fa5, a0
314 ; RV32IF-NEXT:    fle.s s0, fa5, fs0
315 ; RV32IF-NEXT:    fmv.s fa0, fs0
316 ; RV32IF-NEXT:    call __fixsfdi
317 ; RV32IF-NEXT:    lui a4, 524288
318 ; RV32IF-NEXT:    lui a2, 524288
319 ; RV32IF-NEXT:    beqz s0, .LBB5_4
320 ; RV32IF-NEXT:  # %bb.3:
321 ; RV32IF-NEXT:    mv a2, a1
322 ; RV32IF-NEXT:  .LBB5_4:
323 ; RV32IF-NEXT:    lui a1, %hi(.LCPI5_0)
324 ; RV32IF-NEXT:    flw fa5, %lo(.LCPI5_0)(a1)
325 ; RV32IF-NEXT:    flt.s a3, fa5, fs0
326 ; RV32IF-NEXT:    beqz a3, .LBB5_6
327 ; RV32IF-NEXT:  # %bb.5:
328 ; RV32IF-NEXT:    addi a2, a4, -1
329 ; RV32IF-NEXT:  .LBB5_6:
330 ; RV32IF-NEXT:    feq.s a1, fs0, fs0
331 ; RV32IF-NEXT:    neg a4, a1
332 ; RV32IF-NEXT:    and a1, a4, a2
333 ; RV32IF-NEXT:    neg a2, s0
334 ; RV32IF-NEXT:    and a0, a2, a0
335 ; RV32IF-NEXT:    neg a2, a3
336 ; RV32IF-NEXT:    or a0, a2, a0
337 ; RV32IF-NEXT:    and a0, a4, a0
338 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
339 ; RV32IF-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
340 ; RV32IF-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
341 ; RV32IF-NEXT:    addi sp, sp, 16
342 ; RV32IF-NEXT:    ret
344 ; RV64IF-LABEL: test_ceil_si64:
345 ; RV64IF:       # %bb.0:
346 ; RV64IF-NEXT:    fcvt.l.s a0, fa0, rup
347 ; RV64IF-NEXT:    feq.s a1, fa0, fa0
348 ; RV64IF-NEXT:    seqz a1, a1
349 ; RV64IF-NEXT:    addi a1, a1, -1
350 ; RV64IF-NEXT:    and a0, a1, a0
351 ; RV64IF-NEXT:    ret
353 ; RV32IZFINX-LABEL: test_ceil_si64:
354 ; RV32IZFINX:       # %bb.0:
355 ; RV32IZFINX-NEXT:    addi sp, sp, -16
356 ; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
357 ; RV32IZFINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
358 ; RV32IZFINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
359 ; RV32IZFINX-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
360 ; RV32IZFINX-NEXT:    mv s0, a0
361 ; RV32IZFINX-NEXT:    lui a0, 307200
362 ; RV32IZFINX-NEXT:    fabs.s a1, s0
363 ; RV32IZFINX-NEXT:    flt.s a0, a1, a0
364 ; RV32IZFINX-NEXT:    beqz a0, .LBB5_2
365 ; RV32IZFINX-NEXT:  # %bb.1:
366 ; RV32IZFINX-NEXT:    fcvt.w.s a0, s0, rup
367 ; RV32IZFINX-NEXT:    fcvt.s.w a0, a0, rup
368 ; RV32IZFINX-NEXT:    fsgnj.s s0, a0, s0
369 ; RV32IZFINX-NEXT:  .LBB5_2:
370 ; RV32IZFINX-NEXT:    lui a0, 913408
371 ; RV32IZFINX-NEXT:    fle.s s1, a0, s0
372 ; RV32IZFINX-NEXT:    neg s2, s1
373 ; RV32IZFINX-NEXT:    mv a0, s0
374 ; RV32IZFINX-NEXT:    call __fixsfdi
375 ; RV32IZFINX-NEXT:    lui a2, %hi(.LCPI5_0)
376 ; RV32IZFINX-NEXT:    lw a2, %lo(.LCPI5_0)(a2)
377 ; RV32IZFINX-NEXT:    and a0, s2, a0
378 ; RV32IZFINX-NEXT:    flt.s a4, a2, s0
379 ; RV32IZFINX-NEXT:    neg a2, a4
380 ; RV32IZFINX-NEXT:    or a0, a2, a0
381 ; RV32IZFINX-NEXT:    feq.s a2, s0, s0
382 ; RV32IZFINX-NEXT:    neg a2, a2
383 ; RV32IZFINX-NEXT:    lui a5, 524288
384 ; RV32IZFINX-NEXT:    lui a3, 524288
385 ; RV32IZFINX-NEXT:    beqz s1, .LBB5_4
386 ; RV32IZFINX-NEXT:  # %bb.3:
387 ; RV32IZFINX-NEXT:    mv a3, a1
388 ; RV32IZFINX-NEXT:  .LBB5_4:
389 ; RV32IZFINX-NEXT:    and a0, a2, a0
390 ; RV32IZFINX-NEXT:    beqz a4, .LBB5_6
391 ; RV32IZFINX-NEXT:  # %bb.5:
392 ; RV32IZFINX-NEXT:    addi a3, a5, -1
393 ; RV32IZFINX-NEXT:  .LBB5_6:
394 ; RV32IZFINX-NEXT:    and a1, a2, a3
395 ; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
396 ; RV32IZFINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
397 ; RV32IZFINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
398 ; RV32IZFINX-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
399 ; RV32IZFINX-NEXT:    addi sp, sp, 16
400 ; RV32IZFINX-NEXT:    ret
402 ; RV64IZFINX-LABEL: test_ceil_si64:
403 ; RV64IZFINX:       # %bb.0:
404 ; RV64IZFINX-NEXT:    fcvt.l.s a1, a0, rup
405 ; RV64IZFINX-NEXT:    feq.s a0, a0, a0
406 ; RV64IZFINX-NEXT:    seqz a0, a0
407 ; RV64IZFINX-NEXT:    addi a0, a0, -1
408 ; RV64IZFINX-NEXT:    and a0, a0, a1
409 ; RV64IZFINX-NEXT:    ret
410   %a = call float @llvm.ceil.f32(float %x)
411   %b = call i64 @llvm.fptosi.sat.i64.f32(float %a)
412   ret i64 %b
415 define signext i32 @test_ceil_ui32(float %x) {
416 ; CHECKIF-LABEL: test_ceil_ui32:
417 ; CHECKIF:       # %bb.0:
418 ; CHECKIF-NEXT:    fcvt.wu.s a0, fa0, rup
419 ; CHECKIF-NEXT:    feq.s a1, fa0, fa0
420 ; CHECKIF-NEXT:    seqz a1, a1
421 ; CHECKIF-NEXT:    addi a1, a1, -1
422 ; CHECKIF-NEXT:    and a0, a1, a0
423 ; CHECKIF-NEXT:    ret
425 ; CHECKIZFINX-LABEL: test_ceil_ui32:
426 ; CHECKIZFINX:       # %bb.0:
427 ; CHECKIZFINX-NEXT:    fcvt.wu.s a1, a0, rup
428 ; CHECKIZFINX-NEXT:    feq.s a0, a0, a0
429 ; CHECKIZFINX-NEXT:    seqz a0, a0
430 ; CHECKIZFINX-NEXT:    addi a0, a0, -1
431 ; CHECKIZFINX-NEXT:    and a0, a0, a1
432 ; CHECKIZFINX-NEXT:    ret
433   %a = call float @llvm.ceil.f32(float %x)
434   %b = call i32 @llvm.fptoui.sat.i32.f32(float %a)
435   ret i32 %b
438 define i64 @test_ceil_ui64(float %x) nounwind {
439 ; RV32IF-LABEL: test_ceil_ui64:
440 ; RV32IF:       # %bb.0:
441 ; RV32IF-NEXT:    addi sp, sp, -16
442 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
443 ; RV32IF-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
444 ; RV32IF-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
445 ; RV32IF-NEXT:    fmv.s fs0, fa0
446 ; RV32IF-NEXT:    lui a0, 307200
447 ; RV32IF-NEXT:    fmv.w.x fa5, a0
448 ; RV32IF-NEXT:    fabs.s fa4, fa0
449 ; RV32IF-NEXT:    flt.s a0, fa4, fa5
450 ; RV32IF-NEXT:    beqz a0, .LBB7_2
451 ; RV32IF-NEXT:  # %bb.1:
452 ; RV32IF-NEXT:    fcvt.w.s a0, fs0, rup
453 ; RV32IF-NEXT:    fcvt.s.w fa5, a0, rup
454 ; RV32IF-NEXT:    fsgnj.s fs0, fa5, fs0
455 ; RV32IF-NEXT:  .LBB7_2:
456 ; RV32IF-NEXT:    fmv.w.x fa5, zero
457 ; RV32IF-NEXT:    fle.s a0, fa5, fs0
458 ; RV32IF-NEXT:    neg s0, a0
459 ; RV32IF-NEXT:    fmv.s fa0, fs0
460 ; RV32IF-NEXT:    call __fixunssfdi
461 ; RV32IF-NEXT:    lui a2, %hi(.LCPI7_0)
462 ; RV32IF-NEXT:    flw fa5, %lo(.LCPI7_0)(a2)
463 ; RV32IF-NEXT:    and a0, s0, a0
464 ; RV32IF-NEXT:    flt.s a2, fa5, fs0
465 ; RV32IF-NEXT:    neg a2, a2
466 ; RV32IF-NEXT:    or a0, a2, a0
467 ; RV32IF-NEXT:    and a1, s0, a1
468 ; RV32IF-NEXT:    or a1, a2, a1
469 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
470 ; RV32IF-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
471 ; RV32IF-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
472 ; RV32IF-NEXT:    addi sp, sp, 16
473 ; RV32IF-NEXT:    ret
475 ; RV64IF-LABEL: test_ceil_ui64:
476 ; RV64IF:       # %bb.0:
477 ; RV64IF-NEXT:    fcvt.lu.s a0, fa0, rup
478 ; RV64IF-NEXT:    feq.s a1, fa0, fa0
479 ; RV64IF-NEXT:    seqz a1, a1
480 ; RV64IF-NEXT:    addi a1, a1, -1
481 ; RV64IF-NEXT:    and a0, a1, a0
482 ; RV64IF-NEXT:    ret
484 ; RV32IZFINX-LABEL: test_ceil_ui64:
485 ; RV32IZFINX:       # %bb.0:
486 ; RV32IZFINX-NEXT:    addi sp, sp, -16
487 ; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
488 ; RV32IZFINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
489 ; RV32IZFINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
490 ; RV32IZFINX-NEXT:    mv s0, a0
491 ; RV32IZFINX-NEXT:    lui a0, 307200
492 ; RV32IZFINX-NEXT:    fabs.s a1, s0
493 ; RV32IZFINX-NEXT:    flt.s a0, a1, a0
494 ; RV32IZFINX-NEXT:    beqz a0, .LBB7_2
495 ; RV32IZFINX-NEXT:  # %bb.1:
496 ; RV32IZFINX-NEXT:    fcvt.w.s a0, s0, rup
497 ; RV32IZFINX-NEXT:    fcvt.s.w a0, a0, rup
498 ; RV32IZFINX-NEXT:    fsgnj.s s0, a0, s0
499 ; RV32IZFINX-NEXT:  .LBB7_2:
500 ; RV32IZFINX-NEXT:    fle.s a0, zero, s0
501 ; RV32IZFINX-NEXT:    neg s1, a0
502 ; RV32IZFINX-NEXT:    mv a0, s0
503 ; RV32IZFINX-NEXT:    call __fixunssfdi
504 ; RV32IZFINX-NEXT:    lui a2, %hi(.LCPI7_0)
505 ; RV32IZFINX-NEXT:    lw a2, %lo(.LCPI7_0)(a2)
506 ; RV32IZFINX-NEXT:    and a0, s1, a0
507 ; RV32IZFINX-NEXT:    flt.s a2, a2, s0
508 ; RV32IZFINX-NEXT:    neg a2, a2
509 ; RV32IZFINX-NEXT:    or a0, a2, a0
510 ; RV32IZFINX-NEXT:    and a1, s1, a1
511 ; RV32IZFINX-NEXT:    or a1, a2, a1
512 ; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
513 ; RV32IZFINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
514 ; RV32IZFINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
515 ; RV32IZFINX-NEXT:    addi sp, sp, 16
516 ; RV32IZFINX-NEXT:    ret
518 ; RV64IZFINX-LABEL: test_ceil_ui64:
519 ; RV64IZFINX:       # %bb.0:
520 ; RV64IZFINX-NEXT:    fcvt.lu.s a1, a0, rup
521 ; RV64IZFINX-NEXT:    feq.s a0, a0, a0
522 ; RV64IZFINX-NEXT:    seqz a0, a0
523 ; RV64IZFINX-NEXT:    addi a0, a0, -1
524 ; RV64IZFINX-NEXT:    and a0, a0, a1
525 ; RV64IZFINX-NEXT:    ret
526   %a = call float @llvm.ceil.f32(float %x)
527   %b = call i64 @llvm.fptoui.sat.i64.f32(float %a)
528   ret i64 %b
531 define signext i32 @test_trunc_si32(float %x) {
532 ; CHECKIF-LABEL: test_trunc_si32:
533 ; CHECKIF:       # %bb.0:
534 ; CHECKIF-NEXT:    fcvt.w.s a0, fa0, rtz
535 ; CHECKIF-NEXT:    feq.s a1, fa0, fa0
536 ; CHECKIF-NEXT:    seqz a1, a1
537 ; CHECKIF-NEXT:    addi a1, a1, -1
538 ; CHECKIF-NEXT:    and a0, a1, a0
539 ; CHECKIF-NEXT:    ret
541 ; CHECKIZFINX-LABEL: test_trunc_si32:
542 ; CHECKIZFINX:       # %bb.0:
543 ; CHECKIZFINX-NEXT:    fcvt.w.s a1, a0, rtz
544 ; CHECKIZFINX-NEXT:    feq.s a0, a0, a0
545 ; CHECKIZFINX-NEXT:    seqz a0, a0
546 ; CHECKIZFINX-NEXT:    addi a0, a0, -1
547 ; CHECKIZFINX-NEXT:    and a0, a0, a1
548 ; CHECKIZFINX-NEXT:    ret
549   %a = call float @llvm.trunc.f32(float %x)
550   %b = call i32 @llvm.fptosi.sat.i32.f32(float %a)
551   ret i32 %b
554 define i64 @test_trunc_si64(float %x) nounwind {
555 ; RV32IF-LABEL: test_trunc_si64:
556 ; RV32IF:       # %bb.0:
557 ; RV32IF-NEXT:    addi sp, sp, -16
558 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
559 ; RV32IF-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
560 ; RV32IF-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
561 ; RV32IF-NEXT:    fmv.s fs0, fa0
562 ; RV32IF-NEXT:    lui a0, 307200
563 ; RV32IF-NEXT:    fmv.w.x fa5, a0
564 ; RV32IF-NEXT:    fabs.s fa4, fa0
565 ; RV32IF-NEXT:    flt.s a0, fa4, fa5
566 ; RV32IF-NEXT:    beqz a0, .LBB9_2
567 ; RV32IF-NEXT:  # %bb.1:
568 ; RV32IF-NEXT:    fcvt.w.s a0, fs0, rtz
569 ; RV32IF-NEXT:    fcvt.s.w fa5, a0, rtz
570 ; RV32IF-NEXT:    fsgnj.s fs0, fa5, fs0
571 ; RV32IF-NEXT:  .LBB9_2:
572 ; RV32IF-NEXT:    lui a0, 913408
573 ; RV32IF-NEXT:    fmv.w.x fa5, a0
574 ; RV32IF-NEXT:    fle.s s0, fa5, fs0
575 ; RV32IF-NEXT:    fmv.s fa0, fs0
576 ; RV32IF-NEXT:    call __fixsfdi
577 ; RV32IF-NEXT:    lui a4, 524288
578 ; RV32IF-NEXT:    lui a2, 524288
579 ; RV32IF-NEXT:    beqz s0, .LBB9_4
580 ; RV32IF-NEXT:  # %bb.3:
581 ; RV32IF-NEXT:    mv a2, a1
582 ; RV32IF-NEXT:  .LBB9_4:
583 ; RV32IF-NEXT:    lui a1, %hi(.LCPI9_0)
584 ; RV32IF-NEXT:    flw fa5, %lo(.LCPI9_0)(a1)
585 ; RV32IF-NEXT:    flt.s a3, fa5, fs0
586 ; RV32IF-NEXT:    beqz a3, .LBB9_6
587 ; RV32IF-NEXT:  # %bb.5:
588 ; RV32IF-NEXT:    addi a2, a4, -1
589 ; RV32IF-NEXT:  .LBB9_6:
590 ; RV32IF-NEXT:    feq.s a1, fs0, fs0
591 ; RV32IF-NEXT:    neg a4, a1
592 ; RV32IF-NEXT:    and a1, a4, a2
593 ; RV32IF-NEXT:    neg a2, s0
594 ; RV32IF-NEXT:    and a0, a2, a0
595 ; RV32IF-NEXT:    neg a2, a3
596 ; RV32IF-NEXT:    or a0, a2, a0
597 ; RV32IF-NEXT:    and a0, a4, a0
598 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
599 ; RV32IF-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
600 ; RV32IF-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
601 ; RV32IF-NEXT:    addi sp, sp, 16
602 ; RV32IF-NEXT:    ret
604 ; RV64IF-LABEL: test_trunc_si64:
605 ; RV64IF:       # %bb.0:
606 ; RV64IF-NEXT:    fcvt.l.s a0, fa0, rtz
607 ; RV64IF-NEXT:    feq.s a1, fa0, fa0
608 ; RV64IF-NEXT:    seqz a1, a1
609 ; RV64IF-NEXT:    addi a1, a1, -1
610 ; RV64IF-NEXT:    and a0, a1, a0
611 ; RV64IF-NEXT:    ret
613 ; RV32IZFINX-LABEL: test_trunc_si64:
614 ; RV32IZFINX:       # %bb.0:
615 ; RV32IZFINX-NEXT:    addi sp, sp, -16
616 ; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
617 ; RV32IZFINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
618 ; RV32IZFINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
619 ; RV32IZFINX-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
620 ; RV32IZFINX-NEXT:    mv s0, a0
621 ; RV32IZFINX-NEXT:    lui a0, 307200
622 ; RV32IZFINX-NEXT:    fabs.s a1, s0
623 ; RV32IZFINX-NEXT:    flt.s a0, a1, a0
624 ; RV32IZFINX-NEXT:    beqz a0, .LBB9_2
625 ; RV32IZFINX-NEXT:  # %bb.1:
626 ; RV32IZFINX-NEXT:    fcvt.w.s a0, s0, rtz
627 ; RV32IZFINX-NEXT:    fcvt.s.w a0, a0, rtz
628 ; RV32IZFINX-NEXT:    fsgnj.s s0, a0, s0
629 ; RV32IZFINX-NEXT:  .LBB9_2:
630 ; RV32IZFINX-NEXT:    lui a0, 913408
631 ; RV32IZFINX-NEXT:    fle.s s1, a0, s0
632 ; RV32IZFINX-NEXT:    neg s2, s1
633 ; RV32IZFINX-NEXT:    mv a0, s0
634 ; RV32IZFINX-NEXT:    call __fixsfdi
635 ; RV32IZFINX-NEXT:    lui a2, %hi(.LCPI9_0)
636 ; RV32IZFINX-NEXT:    lw a2, %lo(.LCPI9_0)(a2)
637 ; RV32IZFINX-NEXT:    and a0, s2, a0
638 ; RV32IZFINX-NEXT:    flt.s a4, a2, s0
639 ; RV32IZFINX-NEXT:    neg a2, a4
640 ; RV32IZFINX-NEXT:    or a0, a2, a0
641 ; RV32IZFINX-NEXT:    feq.s a2, s0, s0
642 ; RV32IZFINX-NEXT:    neg a2, a2
643 ; RV32IZFINX-NEXT:    lui a5, 524288
644 ; RV32IZFINX-NEXT:    lui a3, 524288
645 ; RV32IZFINX-NEXT:    beqz s1, .LBB9_4
646 ; RV32IZFINX-NEXT:  # %bb.3:
647 ; RV32IZFINX-NEXT:    mv a3, a1
648 ; RV32IZFINX-NEXT:  .LBB9_4:
649 ; RV32IZFINX-NEXT:    and a0, a2, a0
650 ; RV32IZFINX-NEXT:    beqz a4, .LBB9_6
651 ; RV32IZFINX-NEXT:  # %bb.5:
652 ; RV32IZFINX-NEXT:    addi a3, a5, -1
653 ; RV32IZFINX-NEXT:  .LBB9_6:
654 ; RV32IZFINX-NEXT:    and a1, a2, a3
655 ; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
656 ; RV32IZFINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
657 ; RV32IZFINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
658 ; RV32IZFINX-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
659 ; RV32IZFINX-NEXT:    addi sp, sp, 16
660 ; RV32IZFINX-NEXT:    ret
662 ; RV64IZFINX-LABEL: test_trunc_si64:
663 ; RV64IZFINX:       # %bb.0:
664 ; RV64IZFINX-NEXT:    fcvt.l.s a1, a0, rtz
665 ; RV64IZFINX-NEXT:    feq.s a0, a0, a0
666 ; RV64IZFINX-NEXT:    seqz a0, a0
667 ; RV64IZFINX-NEXT:    addi a0, a0, -1
668 ; RV64IZFINX-NEXT:    and a0, a0, a1
669 ; RV64IZFINX-NEXT:    ret
670   %a = call float @llvm.trunc.f32(float %x)
671   %b = call i64 @llvm.fptosi.sat.i64.f32(float %a)
672   ret i64 %b
675 define signext i32 @test_trunc_ui32(float %x) {
676 ; CHECKIF-LABEL: test_trunc_ui32:
677 ; CHECKIF:       # %bb.0:
678 ; CHECKIF-NEXT:    fcvt.wu.s a0, fa0, rtz
679 ; CHECKIF-NEXT:    feq.s a1, fa0, fa0
680 ; CHECKIF-NEXT:    seqz a1, a1
681 ; CHECKIF-NEXT:    addi a1, a1, -1
682 ; CHECKIF-NEXT:    and a0, a1, a0
683 ; CHECKIF-NEXT:    ret
685 ; CHECKIZFINX-LABEL: test_trunc_ui32:
686 ; CHECKIZFINX:       # %bb.0:
687 ; CHECKIZFINX-NEXT:    fcvt.wu.s a1, a0, rtz
688 ; CHECKIZFINX-NEXT:    feq.s a0, a0, a0
689 ; CHECKIZFINX-NEXT:    seqz a0, a0
690 ; CHECKIZFINX-NEXT:    addi a0, a0, -1
691 ; CHECKIZFINX-NEXT:    and a0, a0, a1
692 ; CHECKIZFINX-NEXT:    ret
693   %a = call float @llvm.trunc.f32(float %x)
694   %b = call i32 @llvm.fptoui.sat.i32.f32(float %a)
695   ret i32 %b
698 define i64 @test_trunc_ui64(float %x) nounwind {
699 ; RV32IF-LABEL: test_trunc_ui64:
700 ; RV32IF:       # %bb.0:
701 ; RV32IF-NEXT:    addi sp, sp, -16
702 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
703 ; RV32IF-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
704 ; RV32IF-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
705 ; RV32IF-NEXT:    fmv.s fs0, fa0
706 ; RV32IF-NEXT:    lui a0, 307200
707 ; RV32IF-NEXT:    fmv.w.x fa5, a0
708 ; RV32IF-NEXT:    fabs.s fa4, fa0
709 ; RV32IF-NEXT:    flt.s a0, fa4, fa5
710 ; RV32IF-NEXT:    beqz a0, .LBB11_2
711 ; RV32IF-NEXT:  # %bb.1:
712 ; RV32IF-NEXT:    fcvt.w.s a0, fs0, rtz
713 ; RV32IF-NEXT:    fcvt.s.w fa5, a0, rtz
714 ; RV32IF-NEXT:    fsgnj.s fs0, fa5, fs0
715 ; RV32IF-NEXT:  .LBB11_2:
716 ; RV32IF-NEXT:    fmv.w.x fa5, zero
717 ; RV32IF-NEXT:    fle.s a0, fa5, fs0
718 ; RV32IF-NEXT:    neg s0, a0
719 ; RV32IF-NEXT:    fmv.s fa0, fs0
720 ; RV32IF-NEXT:    call __fixunssfdi
721 ; RV32IF-NEXT:    lui a2, %hi(.LCPI11_0)
722 ; RV32IF-NEXT:    flw fa5, %lo(.LCPI11_0)(a2)
723 ; RV32IF-NEXT:    and a0, s0, a0
724 ; RV32IF-NEXT:    flt.s a2, fa5, fs0
725 ; RV32IF-NEXT:    neg a2, a2
726 ; RV32IF-NEXT:    or a0, a2, a0
727 ; RV32IF-NEXT:    and a1, s0, a1
728 ; RV32IF-NEXT:    or a1, a2, a1
729 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
730 ; RV32IF-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
731 ; RV32IF-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
732 ; RV32IF-NEXT:    addi sp, sp, 16
733 ; RV32IF-NEXT:    ret
735 ; RV64IF-LABEL: test_trunc_ui64:
736 ; RV64IF:       # %bb.0:
737 ; RV64IF-NEXT:    fcvt.lu.s a0, fa0, rtz
738 ; RV64IF-NEXT:    feq.s a1, fa0, fa0
739 ; RV64IF-NEXT:    seqz a1, a1
740 ; RV64IF-NEXT:    addi a1, a1, -1
741 ; RV64IF-NEXT:    and a0, a1, a0
742 ; RV64IF-NEXT:    ret
744 ; RV32IZFINX-LABEL: test_trunc_ui64:
745 ; RV32IZFINX:       # %bb.0:
746 ; RV32IZFINX-NEXT:    addi sp, sp, -16
747 ; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
748 ; RV32IZFINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
749 ; RV32IZFINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
750 ; RV32IZFINX-NEXT:    mv s0, a0
751 ; RV32IZFINX-NEXT:    lui a0, 307200
752 ; RV32IZFINX-NEXT:    fabs.s a1, s0
753 ; RV32IZFINX-NEXT:    flt.s a0, a1, a0
754 ; RV32IZFINX-NEXT:    beqz a0, .LBB11_2
755 ; RV32IZFINX-NEXT:  # %bb.1:
756 ; RV32IZFINX-NEXT:    fcvt.w.s a0, s0, rtz
757 ; RV32IZFINX-NEXT:    fcvt.s.w a0, a0, rtz
758 ; RV32IZFINX-NEXT:    fsgnj.s s0, a0, s0
759 ; RV32IZFINX-NEXT:  .LBB11_2:
760 ; RV32IZFINX-NEXT:    fle.s a0, zero, s0
761 ; RV32IZFINX-NEXT:    neg s1, a0
762 ; RV32IZFINX-NEXT:    mv a0, s0
763 ; RV32IZFINX-NEXT:    call __fixunssfdi
764 ; RV32IZFINX-NEXT:    lui a2, %hi(.LCPI11_0)
765 ; RV32IZFINX-NEXT:    lw a2, %lo(.LCPI11_0)(a2)
766 ; RV32IZFINX-NEXT:    and a0, s1, a0
767 ; RV32IZFINX-NEXT:    flt.s a2, a2, s0
768 ; RV32IZFINX-NEXT:    neg a2, a2
769 ; RV32IZFINX-NEXT:    or a0, a2, a0
770 ; RV32IZFINX-NEXT:    and a1, s1, a1
771 ; RV32IZFINX-NEXT:    or a1, a2, a1
772 ; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
773 ; RV32IZFINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
774 ; RV32IZFINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
775 ; RV32IZFINX-NEXT:    addi sp, sp, 16
776 ; RV32IZFINX-NEXT:    ret
778 ; RV64IZFINX-LABEL: test_trunc_ui64:
779 ; RV64IZFINX:       # %bb.0:
780 ; RV64IZFINX-NEXT:    fcvt.lu.s a1, a0, rtz
781 ; RV64IZFINX-NEXT:    feq.s a0, a0, a0
782 ; RV64IZFINX-NEXT:    seqz a0, a0
783 ; RV64IZFINX-NEXT:    addi a0, a0, -1
784 ; RV64IZFINX-NEXT:    and a0, a0, a1
785 ; RV64IZFINX-NEXT:    ret
786   %a = call float @llvm.trunc.f32(float %x)
787   %b = call i64 @llvm.fptoui.sat.i64.f32(float %a)
788   ret i64 %b
791 define signext i32 @test_round_si32(float %x) {
792 ; CHECKIF-LABEL: test_round_si32:
793 ; CHECKIF:       # %bb.0:
794 ; CHECKIF-NEXT:    fcvt.w.s a0, fa0, rmm
795 ; CHECKIF-NEXT:    feq.s a1, fa0, fa0
796 ; CHECKIF-NEXT:    seqz a1, a1
797 ; CHECKIF-NEXT:    addi a1, a1, -1
798 ; CHECKIF-NEXT:    and a0, a1, a0
799 ; CHECKIF-NEXT:    ret
801 ; CHECKIZFINX-LABEL: test_round_si32:
802 ; CHECKIZFINX:       # %bb.0:
803 ; CHECKIZFINX-NEXT:    fcvt.w.s a1, a0, rmm
804 ; CHECKIZFINX-NEXT:    feq.s a0, a0, a0
805 ; CHECKIZFINX-NEXT:    seqz a0, a0
806 ; CHECKIZFINX-NEXT:    addi a0, a0, -1
807 ; CHECKIZFINX-NEXT:    and a0, a0, a1
808 ; CHECKIZFINX-NEXT:    ret
809   %a = call float @llvm.round.f32(float %x)
810   %b = call i32 @llvm.fptosi.sat.i32.f32(float %a)
811   ret i32 %b
814 define i64 @test_round_si64(float %x) nounwind {
815 ; RV32IF-LABEL: test_round_si64:
816 ; RV32IF:       # %bb.0:
817 ; RV32IF-NEXT:    addi sp, sp, -16
818 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
819 ; RV32IF-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
820 ; RV32IF-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
821 ; RV32IF-NEXT:    fmv.s fs0, fa0
822 ; RV32IF-NEXT:    lui a0, 307200
823 ; RV32IF-NEXT:    fmv.w.x fa5, a0
824 ; RV32IF-NEXT:    fabs.s fa4, fa0
825 ; RV32IF-NEXT:    flt.s a0, fa4, fa5
826 ; RV32IF-NEXT:    beqz a0, .LBB13_2
827 ; RV32IF-NEXT:  # %bb.1:
828 ; RV32IF-NEXT:    fcvt.w.s a0, fs0, rmm
829 ; RV32IF-NEXT:    fcvt.s.w fa5, a0, rmm
830 ; RV32IF-NEXT:    fsgnj.s fs0, fa5, fs0
831 ; RV32IF-NEXT:  .LBB13_2:
832 ; RV32IF-NEXT:    lui a0, 913408
833 ; RV32IF-NEXT:    fmv.w.x fa5, a0
834 ; RV32IF-NEXT:    fle.s s0, fa5, fs0
835 ; RV32IF-NEXT:    fmv.s fa0, fs0
836 ; RV32IF-NEXT:    call __fixsfdi
837 ; RV32IF-NEXT:    lui a4, 524288
838 ; RV32IF-NEXT:    lui a2, 524288
839 ; RV32IF-NEXT:    beqz s0, .LBB13_4
840 ; RV32IF-NEXT:  # %bb.3:
841 ; RV32IF-NEXT:    mv a2, a1
842 ; RV32IF-NEXT:  .LBB13_4:
843 ; RV32IF-NEXT:    lui a1, %hi(.LCPI13_0)
844 ; RV32IF-NEXT:    flw fa5, %lo(.LCPI13_0)(a1)
845 ; RV32IF-NEXT:    flt.s a3, fa5, fs0
846 ; RV32IF-NEXT:    beqz a3, .LBB13_6
847 ; RV32IF-NEXT:  # %bb.5:
848 ; RV32IF-NEXT:    addi a2, a4, -1
849 ; RV32IF-NEXT:  .LBB13_6:
850 ; RV32IF-NEXT:    feq.s a1, fs0, fs0
851 ; RV32IF-NEXT:    neg a4, a1
852 ; RV32IF-NEXT:    and a1, a4, a2
853 ; RV32IF-NEXT:    neg a2, s0
854 ; RV32IF-NEXT:    and a0, a2, a0
855 ; RV32IF-NEXT:    neg a2, a3
856 ; RV32IF-NEXT:    or a0, a2, a0
857 ; RV32IF-NEXT:    and a0, a4, a0
858 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
859 ; RV32IF-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
860 ; RV32IF-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
861 ; RV32IF-NEXT:    addi sp, sp, 16
862 ; RV32IF-NEXT:    ret
864 ; RV64IF-LABEL: test_round_si64:
865 ; RV64IF:       # %bb.0:
866 ; RV64IF-NEXT:    fcvt.l.s a0, fa0, rmm
867 ; RV64IF-NEXT:    feq.s a1, fa0, fa0
868 ; RV64IF-NEXT:    seqz a1, a1
869 ; RV64IF-NEXT:    addi a1, a1, -1
870 ; RV64IF-NEXT:    and a0, a1, a0
871 ; RV64IF-NEXT:    ret
873 ; RV32IZFINX-LABEL: test_round_si64:
874 ; RV32IZFINX:       # %bb.0:
875 ; RV32IZFINX-NEXT:    addi sp, sp, -16
876 ; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
877 ; RV32IZFINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
878 ; RV32IZFINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
879 ; RV32IZFINX-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
880 ; RV32IZFINX-NEXT:    mv s0, a0
881 ; RV32IZFINX-NEXT:    lui a0, 307200
882 ; RV32IZFINX-NEXT:    fabs.s a1, s0
883 ; RV32IZFINX-NEXT:    flt.s a0, a1, a0
884 ; RV32IZFINX-NEXT:    beqz a0, .LBB13_2
885 ; RV32IZFINX-NEXT:  # %bb.1:
886 ; RV32IZFINX-NEXT:    fcvt.w.s a0, s0, rmm
887 ; RV32IZFINX-NEXT:    fcvt.s.w a0, a0, rmm
888 ; RV32IZFINX-NEXT:    fsgnj.s s0, a0, s0
889 ; RV32IZFINX-NEXT:  .LBB13_2:
890 ; RV32IZFINX-NEXT:    lui a0, 913408
891 ; RV32IZFINX-NEXT:    fle.s s1, a0, s0
892 ; RV32IZFINX-NEXT:    neg s2, s1
893 ; RV32IZFINX-NEXT:    mv a0, s0
894 ; RV32IZFINX-NEXT:    call __fixsfdi
895 ; RV32IZFINX-NEXT:    lui a2, %hi(.LCPI13_0)
896 ; RV32IZFINX-NEXT:    lw a2, %lo(.LCPI13_0)(a2)
897 ; RV32IZFINX-NEXT:    and a0, s2, a0
898 ; RV32IZFINX-NEXT:    flt.s a4, a2, s0
899 ; RV32IZFINX-NEXT:    neg a2, a4
900 ; RV32IZFINX-NEXT:    or a0, a2, a0
901 ; RV32IZFINX-NEXT:    feq.s a2, s0, s0
902 ; RV32IZFINX-NEXT:    neg a2, a2
903 ; RV32IZFINX-NEXT:    lui a5, 524288
904 ; RV32IZFINX-NEXT:    lui a3, 524288
905 ; RV32IZFINX-NEXT:    beqz s1, .LBB13_4
906 ; RV32IZFINX-NEXT:  # %bb.3:
907 ; RV32IZFINX-NEXT:    mv a3, a1
908 ; RV32IZFINX-NEXT:  .LBB13_4:
909 ; RV32IZFINX-NEXT:    and a0, a2, a0
910 ; RV32IZFINX-NEXT:    beqz a4, .LBB13_6
911 ; RV32IZFINX-NEXT:  # %bb.5:
912 ; RV32IZFINX-NEXT:    addi a3, a5, -1
913 ; RV32IZFINX-NEXT:  .LBB13_6:
914 ; RV32IZFINX-NEXT:    and a1, a2, a3
915 ; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
916 ; RV32IZFINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
917 ; RV32IZFINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
918 ; RV32IZFINX-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
919 ; RV32IZFINX-NEXT:    addi sp, sp, 16
920 ; RV32IZFINX-NEXT:    ret
922 ; RV64IZFINX-LABEL: test_round_si64:
923 ; RV64IZFINX:       # %bb.0:
924 ; RV64IZFINX-NEXT:    fcvt.l.s a1, a0, rmm
925 ; RV64IZFINX-NEXT:    feq.s a0, a0, a0
926 ; RV64IZFINX-NEXT:    seqz a0, a0
927 ; RV64IZFINX-NEXT:    addi a0, a0, -1
928 ; RV64IZFINX-NEXT:    and a0, a0, a1
929 ; RV64IZFINX-NEXT:    ret
930   %a = call float @llvm.round.f32(float %x)
931   %b = call i64 @llvm.fptosi.sat.i64.f32(float %a)
932   ret i64 %b
935 define signext i32 @test_round_ui32(float %x) {
936 ; CHECKIF-LABEL: test_round_ui32:
937 ; CHECKIF:       # %bb.0:
938 ; CHECKIF-NEXT:    fcvt.wu.s a0, fa0, rmm
939 ; CHECKIF-NEXT:    feq.s a1, fa0, fa0
940 ; CHECKIF-NEXT:    seqz a1, a1
941 ; CHECKIF-NEXT:    addi a1, a1, -1
942 ; CHECKIF-NEXT:    and a0, a1, a0
943 ; CHECKIF-NEXT:    ret
945 ; CHECKIZFINX-LABEL: test_round_ui32:
946 ; CHECKIZFINX:       # %bb.0:
947 ; CHECKIZFINX-NEXT:    fcvt.wu.s a1, a0, rmm
948 ; CHECKIZFINX-NEXT:    feq.s a0, a0, a0
949 ; CHECKIZFINX-NEXT:    seqz a0, a0
950 ; CHECKIZFINX-NEXT:    addi a0, a0, -1
951 ; CHECKIZFINX-NEXT:    and a0, a0, a1
952 ; CHECKIZFINX-NEXT:    ret
953   %a = call float @llvm.round.f32(float %x)
954   %b = call i32 @llvm.fptoui.sat.i32.f32(float %a)
955   ret i32 %b
958 define i64 @test_round_ui64(float %x) nounwind {
959 ; RV32IF-LABEL: test_round_ui64:
960 ; RV32IF:       # %bb.0:
961 ; RV32IF-NEXT:    addi sp, sp, -16
962 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
963 ; RV32IF-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
964 ; RV32IF-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
965 ; RV32IF-NEXT:    fmv.s fs0, fa0
966 ; RV32IF-NEXT:    lui a0, 307200
967 ; RV32IF-NEXT:    fmv.w.x fa5, a0
968 ; RV32IF-NEXT:    fabs.s fa4, fa0
969 ; RV32IF-NEXT:    flt.s a0, fa4, fa5
970 ; RV32IF-NEXT:    beqz a0, .LBB15_2
971 ; RV32IF-NEXT:  # %bb.1:
972 ; RV32IF-NEXT:    fcvt.w.s a0, fs0, rmm
973 ; RV32IF-NEXT:    fcvt.s.w fa5, a0, rmm
974 ; RV32IF-NEXT:    fsgnj.s fs0, fa5, fs0
975 ; RV32IF-NEXT:  .LBB15_2:
976 ; RV32IF-NEXT:    fmv.w.x fa5, zero
977 ; RV32IF-NEXT:    fle.s a0, fa5, fs0
978 ; RV32IF-NEXT:    neg s0, a0
979 ; RV32IF-NEXT:    fmv.s fa0, fs0
980 ; RV32IF-NEXT:    call __fixunssfdi
981 ; RV32IF-NEXT:    lui a2, %hi(.LCPI15_0)
982 ; RV32IF-NEXT:    flw fa5, %lo(.LCPI15_0)(a2)
983 ; RV32IF-NEXT:    and a0, s0, a0
984 ; RV32IF-NEXT:    flt.s a2, fa5, fs0
985 ; RV32IF-NEXT:    neg a2, a2
986 ; RV32IF-NEXT:    or a0, a2, a0
987 ; RV32IF-NEXT:    and a1, s0, a1
988 ; RV32IF-NEXT:    or a1, a2, a1
989 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
990 ; RV32IF-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
991 ; RV32IF-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
992 ; RV32IF-NEXT:    addi sp, sp, 16
993 ; RV32IF-NEXT:    ret
995 ; RV64IF-LABEL: test_round_ui64:
996 ; RV64IF:       # %bb.0:
997 ; RV64IF-NEXT:    fcvt.lu.s a0, fa0, rmm
998 ; RV64IF-NEXT:    feq.s a1, fa0, fa0
999 ; RV64IF-NEXT:    seqz a1, a1
1000 ; RV64IF-NEXT:    addi a1, a1, -1
1001 ; RV64IF-NEXT:    and a0, a1, a0
1002 ; RV64IF-NEXT:    ret
1004 ; RV32IZFINX-LABEL: test_round_ui64:
1005 ; RV32IZFINX:       # %bb.0:
1006 ; RV32IZFINX-NEXT:    addi sp, sp, -16
1007 ; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1008 ; RV32IZFINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1009 ; RV32IZFINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1010 ; RV32IZFINX-NEXT:    mv s0, a0
1011 ; RV32IZFINX-NEXT:    lui a0, 307200
1012 ; RV32IZFINX-NEXT:    fabs.s a1, s0
1013 ; RV32IZFINX-NEXT:    flt.s a0, a1, a0
1014 ; RV32IZFINX-NEXT:    beqz a0, .LBB15_2
1015 ; RV32IZFINX-NEXT:  # %bb.1:
1016 ; RV32IZFINX-NEXT:    fcvt.w.s a0, s0, rmm
1017 ; RV32IZFINX-NEXT:    fcvt.s.w a0, a0, rmm
1018 ; RV32IZFINX-NEXT:    fsgnj.s s0, a0, s0
1019 ; RV32IZFINX-NEXT:  .LBB15_2:
1020 ; RV32IZFINX-NEXT:    fle.s a0, zero, s0
1021 ; RV32IZFINX-NEXT:    neg s1, a0
1022 ; RV32IZFINX-NEXT:    mv a0, s0
1023 ; RV32IZFINX-NEXT:    call __fixunssfdi
1024 ; RV32IZFINX-NEXT:    lui a2, %hi(.LCPI15_0)
1025 ; RV32IZFINX-NEXT:    lw a2, %lo(.LCPI15_0)(a2)
1026 ; RV32IZFINX-NEXT:    and a0, s1, a0
1027 ; RV32IZFINX-NEXT:    flt.s a2, a2, s0
1028 ; RV32IZFINX-NEXT:    neg a2, a2
1029 ; RV32IZFINX-NEXT:    or a0, a2, a0
1030 ; RV32IZFINX-NEXT:    and a1, s1, a1
1031 ; RV32IZFINX-NEXT:    or a1, a2, a1
1032 ; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1033 ; RV32IZFINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1034 ; RV32IZFINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1035 ; RV32IZFINX-NEXT:    addi sp, sp, 16
1036 ; RV32IZFINX-NEXT:    ret
1038 ; RV64IZFINX-LABEL: test_round_ui64:
1039 ; RV64IZFINX:       # %bb.0:
1040 ; RV64IZFINX-NEXT:    fcvt.lu.s a1, a0, rmm
1041 ; RV64IZFINX-NEXT:    feq.s a0, a0, a0
1042 ; RV64IZFINX-NEXT:    seqz a0, a0
1043 ; RV64IZFINX-NEXT:    addi a0, a0, -1
1044 ; RV64IZFINX-NEXT:    and a0, a0, a1
1045 ; RV64IZFINX-NEXT:    ret
1046   %a = call float @llvm.round.f32(float %x)
1047   %b = call i64 @llvm.fptoui.sat.i64.f32(float %a)
1048   ret i64 %b
1051 define signext i32 @test_roundeven_si32(float %x) {
1052 ; CHECKIF-LABEL: test_roundeven_si32:
1053 ; CHECKIF:       # %bb.0:
1054 ; CHECKIF-NEXT:    fcvt.w.s a0, fa0, rne
1055 ; CHECKIF-NEXT:    feq.s a1, fa0, fa0
1056 ; CHECKIF-NEXT:    seqz a1, a1
1057 ; CHECKIF-NEXT:    addi a1, a1, -1
1058 ; CHECKIF-NEXT:    and a0, a1, a0
1059 ; CHECKIF-NEXT:    ret
1061 ; CHECKIZFINX-LABEL: test_roundeven_si32:
1062 ; CHECKIZFINX:       # %bb.0:
1063 ; CHECKIZFINX-NEXT:    fcvt.w.s a1, a0, rne
1064 ; CHECKIZFINX-NEXT:    feq.s a0, a0, a0
1065 ; CHECKIZFINX-NEXT:    seqz a0, a0
1066 ; CHECKIZFINX-NEXT:    addi a0, a0, -1
1067 ; CHECKIZFINX-NEXT:    and a0, a0, a1
1068 ; CHECKIZFINX-NEXT:    ret
1069   %a = call float @llvm.roundeven.f32(float %x)
1070   %b = call i32 @llvm.fptosi.sat.i32.f32(float %a)
1071   ret i32 %b
1074 define i64 @test_roundeven_si64(float %x) nounwind {
1075 ; RV32IF-LABEL: test_roundeven_si64:
1076 ; RV32IF:       # %bb.0:
1077 ; RV32IF-NEXT:    addi sp, sp, -16
1078 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1079 ; RV32IF-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1080 ; RV32IF-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
1081 ; RV32IF-NEXT:    fmv.s fs0, fa0
1082 ; RV32IF-NEXT:    lui a0, 307200
1083 ; RV32IF-NEXT:    fmv.w.x fa5, a0
1084 ; RV32IF-NEXT:    fabs.s fa4, fa0
1085 ; RV32IF-NEXT:    flt.s a0, fa4, fa5
1086 ; RV32IF-NEXT:    beqz a0, .LBB17_2
1087 ; RV32IF-NEXT:  # %bb.1:
1088 ; RV32IF-NEXT:    fcvt.w.s a0, fs0, rne
1089 ; RV32IF-NEXT:    fcvt.s.w fa5, a0, rne
1090 ; RV32IF-NEXT:    fsgnj.s fs0, fa5, fs0
1091 ; RV32IF-NEXT:  .LBB17_2:
1092 ; RV32IF-NEXT:    lui a0, 913408
1093 ; RV32IF-NEXT:    fmv.w.x fa5, a0
1094 ; RV32IF-NEXT:    fle.s s0, fa5, fs0
1095 ; RV32IF-NEXT:    fmv.s fa0, fs0
1096 ; RV32IF-NEXT:    call __fixsfdi
1097 ; RV32IF-NEXT:    lui a4, 524288
1098 ; RV32IF-NEXT:    lui a2, 524288
1099 ; RV32IF-NEXT:    beqz s0, .LBB17_4
1100 ; RV32IF-NEXT:  # %bb.3:
1101 ; RV32IF-NEXT:    mv a2, a1
1102 ; RV32IF-NEXT:  .LBB17_4:
1103 ; RV32IF-NEXT:    lui a1, %hi(.LCPI17_0)
1104 ; RV32IF-NEXT:    flw fa5, %lo(.LCPI17_0)(a1)
1105 ; RV32IF-NEXT:    flt.s a3, fa5, fs0
1106 ; RV32IF-NEXT:    beqz a3, .LBB17_6
1107 ; RV32IF-NEXT:  # %bb.5:
1108 ; RV32IF-NEXT:    addi a2, a4, -1
1109 ; RV32IF-NEXT:  .LBB17_6:
1110 ; RV32IF-NEXT:    feq.s a1, fs0, fs0
1111 ; RV32IF-NEXT:    neg a4, a1
1112 ; RV32IF-NEXT:    and a1, a4, a2
1113 ; RV32IF-NEXT:    neg a2, s0
1114 ; RV32IF-NEXT:    and a0, a2, a0
1115 ; RV32IF-NEXT:    neg a2, a3
1116 ; RV32IF-NEXT:    or a0, a2, a0
1117 ; RV32IF-NEXT:    and a0, a4, a0
1118 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1119 ; RV32IF-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1120 ; RV32IF-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
1121 ; RV32IF-NEXT:    addi sp, sp, 16
1122 ; RV32IF-NEXT:    ret
1124 ; RV64IF-LABEL: test_roundeven_si64:
1125 ; RV64IF:       # %bb.0:
1126 ; RV64IF-NEXT:    fcvt.l.s a0, fa0, rne
1127 ; RV64IF-NEXT:    feq.s a1, fa0, fa0
1128 ; RV64IF-NEXT:    seqz a1, a1
1129 ; RV64IF-NEXT:    addi a1, a1, -1
1130 ; RV64IF-NEXT:    and a0, a1, a0
1131 ; RV64IF-NEXT:    ret
1133 ; RV32IZFINX-LABEL: test_roundeven_si64:
1134 ; RV32IZFINX:       # %bb.0:
1135 ; RV32IZFINX-NEXT:    addi sp, sp, -16
1136 ; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1137 ; RV32IZFINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1138 ; RV32IZFINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1139 ; RV32IZFINX-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
1140 ; RV32IZFINX-NEXT:    mv s0, a0
1141 ; RV32IZFINX-NEXT:    lui a0, 307200
1142 ; RV32IZFINX-NEXT:    fabs.s a1, s0
1143 ; RV32IZFINX-NEXT:    flt.s a0, a1, a0
1144 ; RV32IZFINX-NEXT:    beqz a0, .LBB17_2
1145 ; RV32IZFINX-NEXT:  # %bb.1:
1146 ; RV32IZFINX-NEXT:    fcvt.w.s a0, s0, rne
1147 ; RV32IZFINX-NEXT:    fcvt.s.w a0, a0, rne
1148 ; RV32IZFINX-NEXT:    fsgnj.s s0, a0, s0
1149 ; RV32IZFINX-NEXT:  .LBB17_2:
1150 ; RV32IZFINX-NEXT:    lui a0, 913408
1151 ; RV32IZFINX-NEXT:    fle.s s1, a0, s0
1152 ; RV32IZFINX-NEXT:    neg s2, s1
1153 ; RV32IZFINX-NEXT:    mv a0, s0
1154 ; RV32IZFINX-NEXT:    call __fixsfdi
1155 ; RV32IZFINX-NEXT:    lui a2, %hi(.LCPI17_0)
1156 ; RV32IZFINX-NEXT:    lw a2, %lo(.LCPI17_0)(a2)
1157 ; RV32IZFINX-NEXT:    and a0, s2, a0
1158 ; RV32IZFINX-NEXT:    flt.s a4, a2, s0
1159 ; RV32IZFINX-NEXT:    neg a2, a4
1160 ; RV32IZFINX-NEXT:    or a0, a2, a0
1161 ; RV32IZFINX-NEXT:    feq.s a2, s0, s0
1162 ; RV32IZFINX-NEXT:    neg a2, a2
1163 ; RV32IZFINX-NEXT:    lui a5, 524288
1164 ; RV32IZFINX-NEXT:    lui a3, 524288
1165 ; RV32IZFINX-NEXT:    beqz s1, .LBB17_4
1166 ; RV32IZFINX-NEXT:  # %bb.3:
1167 ; RV32IZFINX-NEXT:    mv a3, a1
1168 ; RV32IZFINX-NEXT:  .LBB17_4:
1169 ; RV32IZFINX-NEXT:    and a0, a2, a0
1170 ; RV32IZFINX-NEXT:    beqz a4, .LBB17_6
1171 ; RV32IZFINX-NEXT:  # %bb.5:
1172 ; RV32IZFINX-NEXT:    addi a3, a5, -1
1173 ; RV32IZFINX-NEXT:  .LBB17_6:
1174 ; RV32IZFINX-NEXT:    and a1, a2, a3
1175 ; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1176 ; RV32IZFINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1177 ; RV32IZFINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1178 ; RV32IZFINX-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
1179 ; RV32IZFINX-NEXT:    addi sp, sp, 16
1180 ; RV32IZFINX-NEXT:    ret
1182 ; RV64IZFINX-LABEL: test_roundeven_si64:
1183 ; RV64IZFINX:       # %bb.0:
1184 ; RV64IZFINX-NEXT:    fcvt.l.s a1, a0, rne
1185 ; RV64IZFINX-NEXT:    feq.s a0, a0, a0
1186 ; RV64IZFINX-NEXT:    seqz a0, a0
1187 ; RV64IZFINX-NEXT:    addi a0, a0, -1
1188 ; RV64IZFINX-NEXT:    and a0, a0, a1
1189 ; RV64IZFINX-NEXT:    ret
1190   %a = call float @llvm.roundeven.f32(float %x)
1191   %b = call i64 @llvm.fptosi.sat.i64.f32(float %a)
1192   ret i64 %b
1195 define signext i32 @test_roundeven_ui32(float %x) {
1196 ; CHECKIF-LABEL: test_roundeven_ui32:
1197 ; CHECKIF:       # %bb.0:
1198 ; CHECKIF-NEXT:    fcvt.wu.s a0, fa0, rne
1199 ; CHECKIF-NEXT:    feq.s a1, fa0, fa0
1200 ; CHECKIF-NEXT:    seqz a1, a1
1201 ; CHECKIF-NEXT:    addi a1, a1, -1
1202 ; CHECKIF-NEXT:    and a0, a1, a0
1203 ; CHECKIF-NEXT:    ret
1205 ; CHECKIZFINX-LABEL: test_roundeven_ui32:
1206 ; CHECKIZFINX:       # %bb.0:
1207 ; CHECKIZFINX-NEXT:    fcvt.wu.s a1, a0, rne
1208 ; CHECKIZFINX-NEXT:    feq.s a0, a0, a0
1209 ; CHECKIZFINX-NEXT:    seqz a0, a0
1210 ; CHECKIZFINX-NEXT:    addi a0, a0, -1
1211 ; CHECKIZFINX-NEXT:    and a0, a0, a1
1212 ; CHECKIZFINX-NEXT:    ret
1213   %a = call float @llvm.roundeven.f32(float %x)
1214   %b = call i32 @llvm.fptoui.sat.i32.f32(float %a)
1215   ret i32 %b
1218 define i64 @test_roundeven_ui64(float %x) nounwind {
1219 ; RV32IF-LABEL: test_roundeven_ui64:
1220 ; RV32IF:       # %bb.0:
1221 ; RV32IF-NEXT:    addi sp, sp, -16
1222 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1223 ; RV32IF-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1224 ; RV32IF-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
1225 ; RV32IF-NEXT:    fmv.s fs0, fa0
1226 ; RV32IF-NEXT:    lui a0, 307200
1227 ; RV32IF-NEXT:    fmv.w.x fa5, a0
1228 ; RV32IF-NEXT:    fabs.s fa4, fa0
1229 ; RV32IF-NEXT:    flt.s a0, fa4, fa5
1230 ; RV32IF-NEXT:    beqz a0, .LBB19_2
1231 ; RV32IF-NEXT:  # %bb.1:
1232 ; RV32IF-NEXT:    fcvt.w.s a0, fs0, rne
1233 ; RV32IF-NEXT:    fcvt.s.w fa5, a0, rne
1234 ; RV32IF-NEXT:    fsgnj.s fs0, fa5, fs0
1235 ; RV32IF-NEXT:  .LBB19_2:
1236 ; RV32IF-NEXT:    fmv.w.x fa5, zero
1237 ; RV32IF-NEXT:    fle.s a0, fa5, fs0
1238 ; RV32IF-NEXT:    neg s0, a0
1239 ; RV32IF-NEXT:    fmv.s fa0, fs0
1240 ; RV32IF-NEXT:    call __fixunssfdi
1241 ; RV32IF-NEXT:    lui a2, %hi(.LCPI19_0)
1242 ; RV32IF-NEXT:    flw fa5, %lo(.LCPI19_0)(a2)
1243 ; RV32IF-NEXT:    and a0, s0, a0
1244 ; RV32IF-NEXT:    flt.s a2, fa5, fs0
1245 ; RV32IF-NEXT:    neg a2, a2
1246 ; RV32IF-NEXT:    or a0, a2, a0
1247 ; RV32IF-NEXT:    and a1, s0, a1
1248 ; RV32IF-NEXT:    or a1, a2, a1
1249 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1250 ; RV32IF-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1251 ; RV32IF-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
1252 ; RV32IF-NEXT:    addi sp, sp, 16
1253 ; RV32IF-NEXT:    ret
1255 ; RV64IF-LABEL: test_roundeven_ui64:
1256 ; RV64IF:       # %bb.0:
1257 ; RV64IF-NEXT:    fcvt.lu.s a0, fa0, rne
1258 ; RV64IF-NEXT:    feq.s a1, fa0, fa0
1259 ; RV64IF-NEXT:    seqz a1, a1
1260 ; RV64IF-NEXT:    addi a1, a1, -1
1261 ; RV64IF-NEXT:    and a0, a1, a0
1262 ; RV64IF-NEXT:    ret
1264 ; RV32IZFINX-LABEL: test_roundeven_ui64:
1265 ; RV32IZFINX:       # %bb.0:
1266 ; RV32IZFINX-NEXT:    addi sp, sp, -16
1267 ; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1268 ; RV32IZFINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1269 ; RV32IZFINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1270 ; RV32IZFINX-NEXT:    mv s0, a0
1271 ; RV32IZFINX-NEXT:    lui a0, 307200
1272 ; RV32IZFINX-NEXT:    fabs.s a1, s0
1273 ; RV32IZFINX-NEXT:    flt.s a0, a1, a0
1274 ; RV32IZFINX-NEXT:    beqz a0, .LBB19_2
1275 ; RV32IZFINX-NEXT:  # %bb.1:
1276 ; RV32IZFINX-NEXT:    fcvt.w.s a0, s0, rne
1277 ; RV32IZFINX-NEXT:    fcvt.s.w a0, a0, rne
1278 ; RV32IZFINX-NEXT:    fsgnj.s s0, a0, s0
1279 ; RV32IZFINX-NEXT:  .LBB19_2:
1280 ; RV32IZFINX-NEXT:    fle.s a0, zero, s0
1281 ; RV32IZFINX-NEXT:    neg s1, a0
1282 ; RV32IZFINX-NEXT:    mv a0, s0
1283 ; RV32IZFINX-NEXT:    call __fixunssfdi
1284 ; RV32IZFINX-NEXT:    lui a2, %hi(.LCPI19_0)
1285 ; RV32IZFINX-NEXT:    lw a2, %lo(.LCPI19_0)(a2)
1286 ; RV32IZFINX-NEXT:    and a0, s1, a0
1287 ; RV32IZFINX-NEXT:    flt.s a2, a2, s0
1288 ; RV32IZFINX-NEXT:    neg a2, a2
1289 ; RV32IZFINX-NEXT:    or a0, a2, a0
1290 ; RV32IZFINX-NEXT:    and a1, s1, a1
1291 ; RV32IZFINX-NEXT:    or a1, a2, a1
1292 ; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1293 ; RV32IZFINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1294 ; RV32IZFINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1295 ; RV32IZFINX-NEXT:    addi sp, sp, 16
1296 ; RV32IZFINX-NEXT:    ret
1298 ; RV64IZFINX-LABEL: test_roundeven_ui64:
1299 ; RV64IZFINX:       # %bb.0:
1300 ; RV64IZFINX-NEXT:    fcvt.lu.s a1, a0, rne
1301 ; RV64IZFINX-NEXT:    feq.s a0, a0, a0
1302 ; RV64IZFINX-NEXT:    seqz a0, a0
1303 ; RV64IZFINX-NEXT:    addi a0, a0, -1
1304 ; RV64IZFINX-NEXT:    and a0, a0, a1
1305 ; RV64IZFINX-NEXT:    ret
1306   %a = call float @llvm.roundeven.f32(float %x)
1307   %b = call i64 @llvm.fptoui.sat.i64.f32(float %a)
1308   ret i64 %b
1311 define signext i32 @test_rint_si32(float %x) {
1312 ; CHECKIF-LABEL: test_rint_si32:
1313 ; CHECKIF:       # %bb.0:
1314 ; CHECKIF-NEXT:    fcvt.w.s a0, fa0
1315 ; CHECKIF-NEXT:    feq.s a1, fa0, fa0
1316 ; CHECKIF-NEXT:    seqz a1, a1
1317 ; CHECKIF-NEXT:    addi a1, a1, -1
1318 ; CHECKIF-NEXT:    and a0, a1, a0
1319 ; CHECKIF-NEXT:    ret
1321 ; CHECKIZFINX-LABEL: test_rint_si32:
1322 ; CHECKIZFINX:       # %bb.0:
1323 ; CHECKIZFINX-NEXT:    fcvt.w.s a1, a0
1324 ; CHECKIZFINX-NEXT:    feq.s a0, a0, a0
1325 ; CHECKIZFINX-NEXT:    seqz a0, a0
1326 ; CHECKIZFINX-NEXT:    addi a0, a0, -1
1327 ; CHECKIZFINX-NEXT:    and a0, a0, a1
1328 ; CHECKIZFINX-NEXT:    ret
1329   %a = call float @llvm.rint.f32(float %x)
1330   %b = call i32 @llvm.fptosi.sat.i32.f32(float %a)
1331   ret i32 %b
1334 define i64 @test_rint_si64(float %x) nounwind {
1335 ; RV32IF-LABEL: test_rint_si64:
1336 ; RV32IF:       # %bb.0:
1337 ; RV32IF-NEXT:    addi sp, sp, -16
1338 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1339 ; RV32IF-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1340 ; RV32IF-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
1341 ; RV32IF-NEXT:    fmv.s fs0, fa0
1342 ; RV32IF-NEXT:    lui a0, 307200
1343 ; RV32IF-NEXT:    fmv.w.x fa5, a0
1344 ; RV32IF-NEXT:    fabs.s fa4, fa0
1345 ; RV32IF-NEXT:    flt.s a0, fa4, fa5
1346 ; RV32IF-NEXT:    beqz a0, .LBB21_2
1347 ; RV32IF-NEXT:  # %bb.1:
1348 ; RV32IF-NEXT:    fcvt.w.s a0, fs0
1349 ; RV32IF-NEXT:    fcvt.s.w fa5, a0
1350 ; RV32IF-NEXT:    fsgnj.s fs0, fa5, fs0
1351 ; RV32IF-NEXT:  .LBB21_2:
1352 ; RV32IF-NEXT:    lui a0, 913408
1353 ; RV32IF-NEXT:    fmv.w.x fa5, a0
1354 ; RV32IF-NEXT:    fle.s s0, fa5, fs0
1355 ; RV32IF-NEXT:    fmv.s fa0, fs0
1356 ; RV32IF-NEXT:    call __fixsfdi
1357 ; RV32IF-NEXT:    lui a4, 524288
1358 ; RV32IF-NEXT:    lui a2, 524288
1359 ; RV32IF-NEXT:    beqz s0, .LBB21_4
1360 ; RV32IF-NEXT:  # %bb.3:
1361 ; RV32IF-NEXT:    mv a2, a1
1362 ; RV32IF-NEXT:  .LBB21_4:
1363 ; RV32IF-NEXT:    lui a1, %hi(.LCPI21_0)
1364 ; RV32IF-NEXT:    flw fa5, %lo(.LCPI21_0)(a1)
1365 ; RV32IF-NEXT:    flt.s a3, fa5, fs0
1366 ; RV32IF-NEXT:    beqz a3, .LBB21_6
1367 ; RV32IF-NEXT:  # %bb.5:
1368 ; RV32IF-NEXT:    addi a2, a4, -1
1369 ; RV32IF-NEXT:  .LBB21_6:
1370 ; RV32IF-NEXT:    feq.s a1, fs0, fs0
1371 ; RV32IF-NEXT:    neg a4, a1
1372 ; RV32IF-NEXT:    and a1, a4, a2
1373 ; RV32IF-NEXT:    neg a2, s0
1374 ; RV32IF-NEXT:    and a0, a2, a0
1375 ; RV32IF-NEXT:    neg a2, a3
1376 ; RV32IF-NEXT:    or a0, a2, a0
1377 ; RV32IF-NEXT:    and a0, a4, a0
1378 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1379 ; RV32IF-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1380 ; RV32IF-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
1381 ; RV32IF-NEXT:    addi sp, sp, 16
1382 ; RV32IF-NEXT:    ret
1384 ; RV64IF-LABEL: test_rint_si64:
1385 ; RV64IF:       # %bb.0:
1386 ; RV64IF-NEXT:    fcvt.l.s a0, fa0
1387 ; RV64IF-NEXT:    feq.s a1, fa0, fa0
1388 ; RV64IF-NEXT:    seqz a1, a1
1389 ; RV64IF-NEXT:    addi a1, a1, -1
1390 ; RV64IF-NEXT:    and a0, a1, a0
1391 ; RV64IF-NEXT:    ret
1393 ; RV32IZFINX-LABEL: test_rint_si64:
1394 ; RV32IZFINX:       # %bb.0:
1395 ; RV32IZFINX-NEXT:    addi sp, sp, -16
1396 ; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1397 ; RV32IZFINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1398 ; RV32IZFINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1399 ; RV32IZFINX-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
1400 ; RV32IZFINX-NEXT:    mv s0, a0
1401 ; RV32IZFINX-NEXT:    lui a0, 307200
1402 ; RV32IZFINX-NEXT:    fabs.s a1, s0
1403 ; RV32IZFINX-NEXT:    flt.s a0, a1, a0
1404 ; RV32IZFINX-NEXT:    beqz a0, .LBB21_2
1405 ; RV32IZFINX-NEXT:  # %bb.1:
1406 ; RV32IZFINX-NEXT:    fcvt.w.s a0, s0
1407 ; RV32IZFINX-NEXT:    fcvt.s.w a0, a0
1408 ; RV32IZFINX-NEXT:    fsgnj.s s0, a0, s0
1409 ; RV32IZFINX-NEXT:  .LBB21_2:
1410 ; RV32IZFINX-NEXT:    lui a0, 913408
1411 ; RV32IZFINX-NEXT:    fle.s s1, a0, s0
1412 ; RV32IZFINX-NEXT:    neg s2, s1
1413 ; RV32IZFINX-NEXT:    mv a0, s0
1414 ; RV32IZFINX-NEXT:    call __fixsfdi
1415 ; RV32IZFINX-NEXT:    lui a2, %hi(.LCPI21_0)
1416 ; RV32IZFINX-NEXT:    lw a2, %lo(.LCPI21_0)(a2)
1417 ; RV32IZFINX-NEXT:    and a0, s2, a0
1418 ; RV32IZFINX-NEXT:    flt.s a4, a2, s0
1419 ; RV32IZFINX-NEXT:    neg a2, a4
1420 ; RV32IZFINX-NEXT:    or a0, a2, a0
1421 ; RV32IZFINX-NEXT:    feq.s a2, s0, s0
1422 ; RV32IZFINX-NEXT:    neg a2, a2
1423 ; RV32IZFINX-NEXT:    lui a5, 524288
1424 ; RV32IZFINX-NEXT:    lui a3, 524288
1425 ; RV32IZFINX-NEXT:    beqz s1, .LBB21_4
1426 ; RV32IZFINX-NEXT:  # %bb.3:
1427 ; RV32IZFINX-NEXT:    mv a3, a1
1428 ; RV32IZFINX-NEXT:  .LBB21_4:
1429 ; RV32IZFINX-NEXT:    and a0, a2, a0
1430 ; RV32IZFINX-NEXT:    beqz a4, .LBB21_6
1431 ; RV32IZFINX-NEXT:  # %bb.5:
1432 ; RV32IZFINX-NEXT:    addi a3, a5, -1
1433 ; RV32IZFINX-NEXT:  .LBB21_6:
1434 ; RV32IZFINX-NEXT:    and a1, a2, a3
1435 ; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1436 ; RV32IZFINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1437 ; RV32IZFINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1438 ; RV32IZFINX-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
1439 ; RV32IZFINX-NEXT:    addi sp, sp, 16
1440 ; RV32IZFINX-NEXT:    ret
1442 ; RV64IZFINX-LABEL: test_rint_si64:
1443 ; RV64IZFINX:       # %bb.0:
1444 ; RV64IZFINX-NEXT:    fcvt.l.s a1, a0
1445 ; RV64IZFINX-NEXT:    feq.s a0, a0, a0
1446 ; RV64IZFINX-NEXT:    seqz a0, a0
1447 ; RV64IZFINX-NEXT:    addi a0, a0, -1
1448 ; RV64IZFINX-NEXT:    and a0, a0, a1
1449 ; RV64IZFINX-NEXT:    ret
1450   %a = call float @llvm.rint.f32(float %x)
1451   %b = call i64 @llvm.fptosi.sat.i64.f32(float %a)
1452   ret i64 %b
1455 define signext i32 @test_rint_ui32(float %x) {
1456 ; CHECKIF-LABEL: test_rint_ui32:
1457 ; CHECKIF:       # %bb.0:
1458 ; CHECKIF-NEXT:    fcvt.wu.s a0, fa0
1459 ; CHECKIF-NEXT:    feq.s a1, fa0, fa0
1460 ; CHECKIF-NEXT:    seqz a1, a1
1461 ; CHECKIF-NEXT:    addi a1, a1, -1
1462 ; CHECKIF-NEXT:    and a0, a1, a0
1463 ; CHECKIF-NEXT:    ret
1465 ; CHECKIZFINX-LABEL: test_rint_ui32:
1466 ; CHECKIZFINX:       # %bb.0:
1467 ; CHECKIZFINX-NEXT:    fcvt.wu.s a1, a0
1468 ; CHECKIZFINX-NEXT:    feq.s a0, a0, a0
1469 ; CHECKIZFINX-NEXT:    seqz a0, a0
1470 ; CHECKIZFINX-NEXT:    addi a0, a0, -1
1471 ; CHECKIZFINX-NEXT:    and a0, a0, a1
1472 ; CHECKIZFINX-NEXT:    ret
1473   %a = call float @llvm.rint.f32(float %x)
1474   %b = call i32 @llvm.fptoui.sat.i32.f32(float %a)
1475   ret i32 %b
1478 define i64 @test_rint_ui64(float %x) nounwind {
1479 ; RV32IF-LABEL: test_rint_ui64:
1480 ; RV32IF:       # %bb.0:
1481 ; RV32IF-NEXT:    addi sp, sp, -16
1482 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1483 ; RV32IF-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1484 ; RV32IF-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
1485 ; RV32IF-NEXT:    fmv.s fs0, fa0
1486 ; RV32IF-NEXT:    lui a0, 307200
1487 ; RV32IF-NEXT:    fmv.w.x fa5, a0
1488 ; RV32IF-NEXT:    fabs.s fa4, fa0
1489 ; RV32IF-NEXT:    flt.s a0, fa4, fa5
1490 ; RV32IF-NEXT:    beqz a0, .LBB23_2
1491 ; RV32IF-NEXT:  # %bb.1:
1492 ; RV32IF-NEXT:    fcvt.w.s a0, fs0
1493 ; RV32IF-NEXT:    fcvt.s.w fa5, a0
1494 ; RV32IF-NEXT:    fsgnj.s fs0, fa5, fs0
1495 ; RV32IF-NEXT:  .LBB23_2:
1496 ; RV32IF-NEXT:    fmv.w.x fa5, zero
1497 ; RV32IF-NEXT:    fle.s a0, fa5, fs0
1498 ; RV32IF-NEXT:    neg s0, a0
1499 ; RV32IF-NEXT:    fmv.s fa0, fs0
1500 ; RV32IF-NEXT:    call __fixunssfdi
1501 ; RV32IF-NEXT:    lui a2, %hi(.LCPI23_0)
1502 ; RV32IF-NEXT:    flw fa5, %lo(.LCPI23_0)(a2)
1503 ; RV32IF-NEXT:    and a0, s0, a0
1504 ; RV32IF-NEXT:    flt.s a2, fa5, fs0
1505 ; RV32IF-NEXT:    neg a2, a2
1506 ; RV32IF-NEXT:    or a0, a2, a0
1507 ; RV32IF-NEXT:    and a1, s0, a1
1508 ; RV32IF-NEXT:    or a1, a2, a1
1509 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1510 ; RV32IF-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1511 ; RV32IF-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
1512 ; RV32IF-NEXT:    addi sp, sp, 16
1513 ; RV32IF-NEXT:    ret
1515 ; RV64IF-LABEL: test_rint_ui64:
1516 ; RV64IF:       # %bb.0:
1517 ; RV64IF-NEXT:    fcvt.lu.s a0, fa0
1518 ; RV64IF-NEXT:    feq.s a1, fa0, fa0
1519 ; RV64IF-NEXT:    seqz a1, a1
1520 ; RV64IF-NEXT:    addi a1, a1, -1
1521 ; RV64IF-NEXT:    and a0, a1, a0
1522 ; RV64IF-NEXT:    ret
1524 ; RV32IZFINX-LABEL: test_rint_ui64:
1525 ; RV32IZFINX:       # %bb.0:
1526 ; RV32IZFINX-NEXT:    addi sp, sp, -16
1527 ; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1528 ; RV32IZFINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1529 ; RV32IZFINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1530 ; RV32IZFINX-NEXT:    mv s0, a0
1531 ; RV32IZFINX-NEXT:    lui a0, 307200
1532 ; RV32IZFINX-NEXT:    fabs.s a1, s0
1533 ; RV32IZFINX-NEXT:    flt.s a0, a1, a0
1534 ; RV32IZFINX-NEXT:    beqz a0, .LBB23_2
1535 ; RV32IZFINX-NEXT:  # %bb.1:
1536 ; RV32IZFINX-NEXT:    fcvt.w.s a0, s0
1537 ; RV32IZFINX-NEXT:    fcvt.s.w a0, a0
1538 ; RV32IZFINX-NEXT:    fsgnj.s s0, a0, s0
1539 ; RV32IZFINX-NEXT:  .LBB23_2:
1540 ; RV32IZFINX-NEXT:    fle.s a0, zero, s0
1541 ; RV32IZFINX-NEXT:    neg s1, a0
1542 ; RV32IZFINX-NEXT:    mv a0, s0
1543 ; RV32IZFINX-NEXT:    call __fixunssfdi
1544 ; RV32IZFINX-NEXT:    lui a2, %hi(.LCPI23_0)
1545 ; RV32IZFINX-NEXT:    lw a2, %lo(.LCPI23_0)(a2)
1546 ; RV32IZFINX-NEXT:    and a0, s1, a0
1547 ; RV32IZFINX-NEXT:    flt.s a2, a2, s0
1548 ; RV32IZFINX-NEXT:    neg a2, a2
1549 ; RV32IZFINX-NEXT:    or a0, a2, a0
1550 ; RV32IZFINX-NEXT:    and a1, s1, a1
1551 ; RV32IZFINX-NEXT:    or a1, a2, a1
1552 ; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1553 ; RV32IZFINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1554 ; RV32IZFINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1555 ; RV32IZFINX-NEXT:    addi sp, sp, 16
1556 ; RV32IZFINX-NEXT:    ret
1558 ; RV64IZFINX-LABEL: test_rint_ui64:
1559 ; RV64IZFINX:       # %bb.0:
1560 ; RV64IZFINX-NEXT:    fcvt.lu.s a1, a0
1561 ; RV64IZFINX-NEXT:    feq.s a0, a0, a0
1562 ; RV64IZFINX-NEXT:    seqz a0, a0
1563 ; RV64IZFINX-NEXT:    addi a0, a0, -1
1564 ; RV64IZFINX-NEXT:    and a0, a0, a1
1565 ; RV64IZFINX-NEXT:    ret
1566   %a = call float @llvm.rint.f32(float %x)
1567   %b = call i64 @llvm.fptoui.sat.i64.f32(float %a)
1568   ret i64 %b
1571 declare float @llvm.floor.f32(float)
1572 declare float @llvm.ceil.f32(float)
1573 declare float @llvm.trunc.f32(float)
1574 declare float @llvm.round.f32(float)
1575 declare float @llvm.roundeven.f32(float)
1576 declare float @llvm.rint.f32(float)
1577 declare i32 @llvm.fptosi.sat.i32.f32(float)
1578 declare i64 @llvm.fptosi.sat.i64.f32(float)
1579 declare i32 @llvm.fptoui.sat.i32.f32(float)
1580 declare i64 @llvm.fptoui.sat.i64.f32(float)