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