xref: /llvm-project/llvm/test/CodeGen/RISCV/double-round-conv-sat.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
194e69fbbSCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
294e69fbbSCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \
384bacb18SShao-Ce SUN; RUN:   -target-abi=ilp32d | FileCheck -check-prefixes=CHECKIFD,RV32IFD %s
494e69fbbSCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs < %s \
584bacb18SShao-Ce SUN; RUN:   -target-abi=lp64d | FileCheck -check-prefixes=CHECKIFD,RV64IFD %s
68b90f8e0SShao-Ce SUN; RUN: llc -mtriple=riscv32 -mattr=+zdinx -verify-machineinstrs < %s \
78b90f8e0SShao-Ce SUN; RUN:   -target-abi=ilp32 | FileCheck -check-prefixes=RV32IZFINXZDINX %s
82dc0fa05SShao-Ce SUN; RUN: llc -mtriple=riscv64 -mattr=+zdinx -verify-machineinstrs < %s \
92dc0fa05SShao-Ce SUN; RUN:   -target-abi=lp64 | FileCheck -check-prefixes=RV64IZFINXZDINX %s
1094e69fbbSCraig Topper
1194e69fbbSCraig Topperdefine signext i32 @test_floor_si32(double %x) {
1284bacb18SShao-Ce SUN; CHECKIFD-LABEL: test_floor_si32:
1384bacb18SShao-Ce SUN; CHECKIFD:       # %bb.0:
1484bacb18SShao-Ce SUN; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rdn
151c41d0cbSPhilip Reames; CHECKIFD-NEXT:    feq.d a1, fa0, fa0
161c41d0cbSPhilip Reames; CHECKIFD-NEXT:    seqz a1, a1
171c41d0cbSPhilip Reames; CHECKIFD-NEXT:    addi a1, a1, -1
181c41d0cbSPhilip Reames; CHECKIFD-NEXT:    and a0, a1, a0
1984bacb18SShao-Ce SUN; CHECKIFD-NEXT:    ret
202dc0fa05SShao-Ce SUN;
218b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_floor_si32:
228b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
238b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    fcvt.w.d a2, a0, rdn
248b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    feq.d a0, a0, a0
258b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    seqz a0, a0
268b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    addi a0, a0, -1
278b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    and a0, a0, a2
288b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
298b90f8e0SShao-Ce SUN;
302dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_floor_si32:
312dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
322dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.w.d a1, a0, rdn
332dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
342dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
352dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
362dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
372dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
3894e69fbbSCraig Topper  %a = call double @llvm.floor.f64(double %x)
3994e69fbbSCraig Topper  %b = call i32 @llvm.fptosi.sat.i32.f64(double %a)
4094e69fbbSCraig Topper  ret i32 %b
4194e69fbbSCraig Topper}
4294e69fbbSCraig Topper
4394e69fbbSCraig Topperdefine i64 @test_floor_si64(double %x) nounwind {
4494e69fbbSCraig Topper; RV32IFD-LABEL: test_floor_si64:
4594e69fbbSCraig Topper; RV32IFD:       # %bb.0:
46ce37a713SCraig Topper; RV32IFD-NEXT:    addi sp, sp, -16
47ce37a713SCraig Topper; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
48ce37a713SCraig Topper; RV32IFD-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
4994e69fbbSCraig Topper; RV32IFD-NEXT:    fsd fs0, 0(sp) # 8-byte Folded Spill
50eabaee0cSFangrui Song; RV32IFD-NEXT:    call floor
5194e69fbbSCraig Topper; RV32IFD-NEXT:    lui a0, %hi(.LCPI1_0)
527b0c4184SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI1_0)(a0)
5394e69fbbSCraig Topper; RV32IFD-NEXT:    fmv.d fs0, fa0
54ce37a713SCraig Topper; RV32IFD-NEXT:    fle.d s0, fa5, fa0
55eabaee0cSFangrui Song; RV32IFD-NEXT:    call __fixdfdi
56*9122c523SPengcheng Wang; RV32IFD-NEXT:    lui a3, 524288
57ce37a713SCraig Topper; RV32IFD-NEXT:    lui a2, 524288
5855c6bda0SBjorn Pettersson; RV32IFD-NEXT:    beqz s0, .LBB1_2
5994e69fbbSCraig Topper; RV32IFD-NEXT:  # %bb.1:
60ce37a713SCraig Topper; RV32IFD-NEXT:    mv a2, a1
6194e69fbbSCraig Topper; RV32IFD-NEXT:  .LBB1_2:
62ce37a713SCraig Topper; RV32IFD-NEXT:    lui a1, %hi(.LCPI1_1)
63ce37a713SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI1_1)(a1)
64*9122c523SPengcheng Wang; RV32IFD-NEXT:    flt.d a1, fa5, fs0
65*9122c523SPengcheng Wang; RV32IFD-NEXT:    beqz a1, .LBB1_4
6694e69fbbSCraig Topper; RV32IFD-NEXT:  # %bb.3:
67*9122c523SPengcheng Wang; RV32IFD-NEXT:    addi a2, a3, -1
6894e69fbbSCraig Topper; RV32IFD-NEXT:  .LBB1_4:
69*9122c523SPengcheng Wang; RV32IFD-NEXT:    feq.d a3, fs0, fs0
7055c6bda0SBjorn Pettersson; RV32IFD-NEXT:    neg a4, a1
71*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg a1, s0
72*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg a3, a3
73*9122c523SPengcheng Wang; RV32IFD-NEXT:    and a0, a1, a0
74*9122c523SPengcheng Wang; RV32IFD-NEXT:    and a1, a3, a2
75*9122c523SPengcheng Wang; RV32IFD-NEXT:    or a0, a4, a0
7616bd10a3SDavid Spickett; RV32IFD-NEXT:    and a0, a3, a0
77ce37a713SCraig Topper; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
78ce37a713SCraig Topper; RV32IFD-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
7994e69fbbSCraig Topper; RV32IFD-NEXT:    fld fs0, 0(sp) # 8-byte Folded Reload
80ce37a713SCraig Topper; RV32IFD-NEXT:    addi sp, sp, 16
8194e69fbbSCraig Topper; RV32IFD-NEXT:    ret
8294e69fbbSCraig Topper;
8394e69fbbSCraig Topper; RV64IFD-LABEL: test_floor_si64:
8494e69fbbSCraig Topper; RV64IFD:       # %bb.0:
8594e69fbbSCraig Topper; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rdn
861c41d0cbSPhilip Reames; RV64IFD-NEXT:    feq.d a1, fa0, fa0
871c41d0cbSPhilip Reames; RV64IFD-NEXT:    seqz a1, a1
881c41d0cbSPhilip Reames; RV64IFD-NEXT:    addi a1, a1, -1
891c41d0cbSPhilip Reames; RV64IFD-NEXT:    and a0, a1, a0
9094e69fbbSCraig Topper; RV64IFD-NEXT:    ret
912dc0fa05SShao-Ce SUN;
928b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_floor_si64:
938b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
94ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
95ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
96ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
97ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
98eabaee0cSFangrui Song; RV32IZFINXZDINX-NEXT:    call floor
99ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    mv s0, a0
100ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    mv s1, a1
101ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    call __fixdfdi
1028b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    lui a2, %hi(.LCPI1_0)
103*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lui a3, %hi(.LCPI1_1)
104*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a4, %lo(.LCPI1_0)(a2)
105*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a5, %lo(.LCPI1_0+4)(a2)
106*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a2, %lo(.LCPI1_1)(a3)
107*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a3, %lo(.LCPI1_1+4)(a3)
108*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    fle.d a6, a4, s0
109*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    flt.d a3, a2, s0
1108ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    feq.d a2, s0, s0
111*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lui a4, 524288
1128ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    neg a2, a2
113*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a5, a6
114*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    and a0, a5, a0
115*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a5, a3
116*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a0, a5, a0
117909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:    lui a5, 524288
1188ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    beqz a6, .LBB1_2
119909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  # %bb.1:
120*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    mv a5, a1
121909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  .LBB1_2:
1228ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    and a0, a2, a0
123*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    beqz a3, .LBB1_4
124909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  # %bb.3:
125*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    addi a5, a4, -1
126909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  .LBB1_4:
127*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    and a1, a2, a5
128ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
129ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
130ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
131ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1328b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
1338b90f8e0SShao-Ce SUN;
1342dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_floor_si64:
1352dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
1362dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.l.d a1, a0, rdn
1372dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
1382dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
1392dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
1402dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
1412dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
14294e69fbbSCraig Topper  %a = call double @llvm.floor.f64(double %x)
14394e69fbbSCraig Topper  %b = call i64 @llvm.fptosi.sat.i64.f64(double %a)
14494e69fbbSCraig Topper  ret i64 %b
14594e69fbbSCraig Topper}
14694e69fbbSCraig Topper
14794e69fbbSCraig Topperdefine signext i32 @test_floor_ui32(double %x) {
14884bacb18SShao-Ce SUN; CHECKIFD-LABEL: test_floor_ui32:
14984bacb18SShao-Ce SUN; CHECKIFD:       # %bb.0:
15084bacb18SShao-Ce SUN; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rdn
1511c41d0cbSPhilip Reames; CHECKIFD-NEXT:    feq.d a1, fa0, fa0
1521c41d0cbSPhilip Reames; CHECKIFD-NEXT:    seqz a1, a1
1531c41d0cbSPhilip Reames; CHECKIFD-NEXT:    addi a1, a1, -1
1541c41d0cbSPhilip Reames; CHECKIFD-NEXT:    and a0, a1, a0
15584bacb18SShao-Ce SUN; CHECKIFD-NEXT:    ret
1562dc0fa05SShao-Ce SUN;
1578b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_floor_ui32:
1588b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
1598b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a2, a0, rdn
1608b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    feq.d a0, a0, a0
1618b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    seqz a0, a0
1628b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    addi a0, a0, -1
1638b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    and a0, a0, a2
1648b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
1658b90f8e0SShao-Ce SUN;
1662dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_floor_ui32:
1672dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
1682dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.wu.d a1, a0, rdn
1692dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
1702dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
1712dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
1722dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
1732dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
17494e69fbbSCraig Topper  %a = call double @llvm.floor.f64(double %x)
17594e69fbbSCraig Topper  %b = call i32 @llvm.fptoui.sat.i32.f64(double %a)
17694e69fbbSCraig Topper  ret i32 %b
17794e69fbbSCraig Topper}
17894e69fbbSCraig Topper
17994e69fbbSCraig Topperdefine i64 @test_floor_ui64(double %x) nounwind {
18094e69fbbSCraig Topper; RV32IFD-LABEL: test_floor_ui64:
18194e69fbbSCraig Topper; RV32IFD:       # %bb.0:
18294e69fbbSCraig Topper; RV32IFD-NEXT:    addi sp, sp, -16
18394e69fbbSCraig Topper; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
18494e69fbbSCraig Topper; RV32IFD-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
185e68b0d58SCraig Topper; RV32IFD-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
186eabaee0cSFangrui Song; RV32IFD-NEXT:    call floor
187e68b0d58SCraig Topper; RV32IFD-NEXT:    lui a0, %hi(.LCPI3_0)
1887b0c4184SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI3_0)(a0)
189*9122c523SPengcheng Wang; RV32IFD-NEXT:    fcvt.d.w fa4, zero
190*9122c523SPengcheng Wang; RV32IFD-NEXT:    fle.d a0, fa4, fa0
191*9122c523SPengcheng Wang; RV32IFD-NEXT:    flt.d a1, fa5, fa0
192*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg s0, a1
1936b270358SCraig Topper; RV32IFD-NEXT:    neg s1, a0
194eabaee0cSFangrui Song; RV32IFD-NEXT:    call __fixunsdfdi
195e68b0d58SCraig Topper; RV32IFD-NEXT:    and a0, s1, a0
196e68b0d58SCraig Topper; RV32IFD-NEXT:    and a1, s1, a1
197*9122c523SPengcheng Wang; RV32IFD-NEXT:    or a0, s0, a0
198e68b0d58SCraig Topper; RV32IFD-NEXT:    or a1, s0, a1
19994e69fbbSCraig Topper; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20094e69fbbSCraig Topper; RV32IFD-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
201e68b0d58SCraig Topper; RV32IFD-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
20294e69fbbSCraig Topper; RV32IFD-NEXT:    addi sp, sp, 16
20394e69fbbSCraig Topper; RV32IFD-NEXT:    ret
20494e69fbbSCraig Topper;
20594e69fbbSCraig Topper; RV64IFD-LABEL: test_floor_ui64:
20694e69fbbSCraig Topper; RV64IFD:       # %bb.0:
20794e69fbbSCraig Topper; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rdn
2081c41d0cbSPhilip Reames; RV64IFD-NEXT:    feq.d a1, fa0, fa0
2091c41d0cbSPhilip Reames; RV64IFD-NEXT:    seqz a1, a1
2101c41d0cbSPhilip Reames; RV64IFD-NEXT:    addi a1, a1, -1
2111c41d0cbSPhilip Reames; RV64IFD-NEXT:    and a0, a1, a0
21294e69fbbSCraig Topper; RV64IFD-NEXT:    ret
2132dc0fa05SShao-Ce SUN;
2148b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_floor_ui64:
2158b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
216576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
217576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
218576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
219576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
220eabaee0cSFangrui Song; RV32IZFINXZDINX-NEXT:    call floor
221576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    mv s0, a0
222576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    mv s1, a1
2236b270358SCraig Topper; RV32IZFINXZDINX-NEXT:    call __fixunsdfdi
224576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    fcvt.d.w a2, zero
225576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lui a4, %hi(.LCPI3_0)
226*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    fle.d a2, a2, s0
227576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw a5, %lo(.LCPI3_0+4)(a4)
228576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw a4, %lo(.LCPI3_0)(a4)
2296b270358SCraig Topper; RV32IZFINXZDINX-NEXT:    neg a2, a2
230576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    and a0, a2, a0
231576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    and a1, a2, a1
232*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    flt.d a2, a4, s0
233*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a2, a2
234*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a0, a2, a0
235*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a1, a2, a1
236576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
237576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
238576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
239576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
2408b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
2418b90f8e0SShao-Ce SUN;
2422dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_floor_ui64:
2432dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
2442dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a1, a0, rdn
2452dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
2462dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
2472dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
2482dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
2492dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
25094e69fbbSCraig Topper  %a = call double @llvm.floor.f64(double %x)
25194e69fbbSCraig Topper  %b = call i64 @llvm.fptoui.sat.i64.f64(double %a)
25294e69fbbSCraig Topper  ret i64 %b
25394e69fbbSCraig Topper}
25494e69fbbSCraig Topper
25594e69fbbSCraig Topperdefine signext i32 @test_ceil_si32(double %x) {
25684bacb18SShao-Ce SUN; CHECKIFD-LABEL: test_ceil_si32:
25784bacb18SShao-Ce SUN; CHECKIFD:       # %bb.0:
25884bacb18SShao-Ce SUN; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rup
2591c41d0cbSPhilip Reames; CHECKIFD-NEXT:    feq.d a1, fa0, fa0
2601c41d0cbSPhilip Reames; CHECKIFD-NEXT:    seqz a1, a1
2611c41d0cbSPhilip Reames; CHECKIFD-NEXT:    addi a1, a1, -1
2621c41d0cbSPhilip Reames; CHECKIFD-NEXT:    and a0, a1, a0
26384bacb18SShao-Ce SUN; CHECKIFD-NEXT:    ret
2642dc0fa05SShao-Ce SUN;
2658b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_ceil_si32:
2668b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
2678b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    fcvt.w.d a2, a0, rup
2688b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    feq.d a0, a0, a0
2698b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    seqz a0, a0
2708b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    addi a0, a0, -1
2718b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    and a0, a0, a2
2728b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
2738b90f8e0SShao-Ce SUN;
2742dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_ceil_si32:
2752dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
2762dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.w.d a1, a0, rup
2772dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
2782dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
2792dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
2802dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
2812dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
28294e69fbbSCraig Topper  %a = call double @llvm.ceil.f64(double %x)
28394e69fbbSCraig Topper  %b = call i32 @llvm.fptosi.sat.i32.f64(double %a)
28494e69fbbSCraig Topper  ret i32 %b
28594e69fbbSCraig Topper}
28694e69fbbSCraig Topper
28794e69fbbSCraig Topperdefine i64 @test_ceil_si64(double %x) nounwind {
28894e69fbbSCraig Topper; RV32IFD-LABEL: test_ceil_si64:
28994e69fbbSCraig Topper; RV32IFD:       # %bb.0:
290ce37a713SCraig Topper; RV32IFD-NEXT:    addi sp, sp, -16
291ce37a713SCraig Topper; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
292ce37a713SCraig Topper; RV32IFD-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
29394e69fbbSCraig Topper; RV32IFD-NEXT:    fsd fs0, 0(sp) # 8-byte Folded Spill
294eabaee0cSFangrui Song; RV32IFD-NEXT:    call ceil
29594e69fbbSCraig Topper; RV32IFD-NEXT:    lui a0, %hi(.LCPI5_0)
2967b0c4184SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI5_0)(a0)
29794e69fbbSCraig Topper; RV32IFD-NEXT:    fmv.d fs0, fa0
298ce37a713SCraig Topper; RV32IFD-NEXT:    fle.d s0, fa5, fa0
299eabaee0cSFangrui Song; RV32IFD-NEXT:    call __fixdfdi
300*9122c523SPengcheng Wang; RV32IFD-NEXT:    lui a3, 524288
301ce37a713SCraig Topper; RV32IFD-NEXT:    lui a2, 524288
30255c6bda0SBjorn Pettersson; RV32IFD-NEXT:    beqz s0, .LBB5_2
30394e69fbbSCraig Topper; RV32IFD-NEXT:  # %bb.1:
304ce37a713SCraig Topper; RV32IFD-NEXT:    mv a2, a1
30594e69fbbSCraig Topper; RV32IFD-NEXT:  .LBB5_2:
306ce37a713SCraig Topper; RV32IFD-NEXT:    lui a1, %hi(.LCPI5_1)
307ce37a713SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI5_1)(a1)
308*9122c523SPengcheng Wang; RV32IFD-NEXT:    flt.d a1, fa5, fs0
309*9122c523SPengcheng Wang; RV32IFD-NEXT:    beqz a1, .LBB5_4
31094e69fbbSCraig Topper; RV32IFD-NEXT:  # %bb.3:
311*9122c523SPengcheng Wang; RV32IFD-NEXT:    addi a2, a3, -1
31294e69fbbSCraig Topper; RV32IFD-NEXT:  .LBB5_4:
313*9122c523SPengcheng Wang; RV32IFD-NEXT:    feq.d a3, fs0, fs0
31455c6bda0SBjorn Pettersson; RV32IFD-NEXT:    neg a4, a1
315*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg a1, s0
316*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg a3, a3
317*9122c523SPengcheng Wang; RV32IFD-NEXT:    and a0, a1, a0
318*9122c523SPengcheng Wang; RV32IFD-NEXT:    and a1, a3, a2
319*9122c523SPengcheng Wang; RV32IFD-NEXT:    or a0, a4, a0
32016bd10a3SDavid Spickett; RV32IFD-NEXT:    and a0, a3, a0
321ce37a713SCraig Topper; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
322ce37a713SCraig Topper; RV32IFD-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
32394e69fbbSCraig Topper; RV32IFD-NEXT:    fld fs0, 0(sp) # 8-byte Folded Reload
324ce37a713SCraig Topper; RV32IFD-NEXT:    addi sp, sp, 16
32594e69fbbSCraig Topper; RV32IFD-NEXT:    ret
32694e69fbbSCraig Topper;
32794e69fbbSCraig Topper; RV64IFD-LABEL: test_ceil_si64:
32894e69fbbSCraig Topper; RV64IFD:       # %bb.0:
32994e69fbbSCraig Topper; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rup
3301c41d0cbSPhilip Reames; RV64IFD-NEXT:    feq.d a1, fa0, fa0
3311c41d0cbSPhilip Reames; RV64IFD-NEXT:    seqz a1, a1
3321c41d0cbSPhilip Reames; RV64IFD-NEXT:    addi a1, a1, -1
3331c41d0cbSPhilip Reames; RV64IFD-NEXT:    and a0, a1, a0
33494e69fbbSCraig Topper; RV64IFD-NEXT:    ret
3352dc0fa05SShao-Ce SUN;
3368b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_ceil_si64:
3378b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
338ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
339ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
340ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
341ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
342eabaee0cSFangrui Song; RV32IZFINXZDINX-NEXT:    call ceil
343ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    mv s0, a0
344ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    mv s1, a1
345ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    call __fixdfdi
3468b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    lui a2, %hi(.LCPI5_0)
347*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lui a3, %hi(.LCPI5_1)
348*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a4, %lo(.LCPI5_0)(a2)
349*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a5, %lo(.LCPI5_0+4)(a2)
350*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a2, %lo(.LCPI5_1)(a3)
351*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a3, %lo(.LCPI5_1+4)(a3)
352*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    fle.d a6, a4, s0
353*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    flt.d a3, a2, s0
3548ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    feq.d a2, s0, s0
355*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lui a4, 524288
3568ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    neg a2, a2
357*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a5, a6
358*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    and a0, a5, a0
359*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a5, a3
360*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a0, a5, a0
361909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:    lui a5, 524288
3628ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    beqz a6, .LBB5_2
363909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  # %bb.1:
364*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    mv a5, a1
365909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  .LBB5_2:
3668ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    and a0, a2, a0
367*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    beqz a3, .LBB5_4
368909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  # %bb.3:
369*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    addi a5, a4, -1
370909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  .LBB5_4:
371*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    and a1, a2, a5
372ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
373ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
374ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
375ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
3768b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
3778b90f8e0SShao-Ce SUN;
3782dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_ceil_si64:
3792dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
3802dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.l.d a1, a0, rup
3812dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
3822dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
3832dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
3842dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
3852dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
38694e69fbbSCraig Topper  %a = call double @llvm.ceil.f64(double %x)
38794e69fbbSCraig Topper  %b = call i64 @llvm.fptosi.sat.i64.f64(double %a)
38894e69fbbSCraig Topper  ret i64 %b
38994e69fbbSCraig Topper}
39094e69fbbSCraig Topper
39194e69fbbSCraig Topperdefine signext i32 @test_ceil_ui32(double %x) {
39284bacb18SShao-Ce SUN; CHECKIFD-LABEL: test_ceil_ui32:
39384bacb18SShao-Ce SUN; CHECKIFD:       # %bb.0:
39484bacb18SShao-Ce SUN; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rup
3951c41d0cbSPhilip Reames; CHECKIFD-NEXT:    feq.d a1, fa0, fa0
3961c41d0cbSPhilip Reames; CHECKIFD-NEXT:    seqz a1, a1
3971c41d0cbSPhilip Reames; CHECKIFD-NEXT:    addi a1, a1, -1
3981c41d0cbSPhilip Reames; CHECKIFD-NEXT:    and a0, a1, a0
39984bacb18SShao-Ce SUN; CHECKIFD-NEXT:    ret
4002dc0fa05SShao-Ce SUN;
4018b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_ceil_ui32:
4028b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
4038b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a2, a0, rup
4048b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    feq.d a0, a0, a0
4058b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    seqz a0, a0
4068b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    addi a0, a0, -1
4078b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    and a0, a0, a2
4088b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
4098b90f8e0SShao-Ce SUN;
4102dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_ceil_ui32:
4112dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
4122dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.wu.d a1, a0, rup
4132dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
4142dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
4152dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
4162dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
4172dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
41894e69fbbSCraig Topper  %a = call double @llvm.ceil.f64(double %x)
41994e69fbbSCraig Topper  %b = call i32 @llvm.fptoui.sat.i32.f64(double %a)
42094e69fbbSCraig Topper  ret i32 %b
42194e69fbbSCraig Topper}
42294e69fbbSCraig Topper
42394e69fbbSCraig Topperdefine i64 @test_ceil_ui64(double %x) nounwind {
42494e69fbbSCraig Topper; RV32IFD-LABEL: test_ceil_ui64:
42594e69fbbSCraig Topper; RV32IFD:       # %bb.0:
42694e69fbbSCraig Topper; RV32IFD-NEXT:    addi sp, sp, -16
42794e69fbbSCraig Topper; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
42894e69fbbSCraig Topper; RV32IFD-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
429e68b0d58SCraig Topper; RV32IFD-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
430eabaee0cSFangrui Song; RV32IFD-NEXT:    call ceil
431e68b0d58SCraig Topper; RV32IFD-NEXT:    lui a0, %hi(.LCPI7_0)
4327b0c4184SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI7_0)(a0)
433*9122c523SPengcheng Wang; RV32IFD-NEXT:    fcvt.d.w fa4, zero
434*9122c523SPengcheng Wang; RV32IFD-NEXT:    fle.d a0, fa4, fa0
435*9122c523SPengcheng Wang; RV32IFD-NEXT:    flt.d a1, fa5, fa0
436*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg s0, a1
4376b270358SCraig Topper; RV32IFD-NEXT:    neg s1, a0
438eabaee0cSFangrui Song; RV32IFD-NEXT:    call __fixunsdfdi
439e68b0d58SCraig Topper; RV32IFD-NEXT:    and a0, s1, a0
440e68b0d58SCraig Topper; RV32IFD-NEXT:    and a1, s1, a1
441*9122c523SPengcheng Wang; RV32IFD-NEXT:    or a0, s0, a0
442e68b0d58SCraig Topper; RV32IFD-NEXT:    or a1, s0, a1
44394e69fbbSCraig Topper; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
44494e69fbbSCraig Topper; RV32IFD-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
445e68b0d58SCraig Topper; RV32IFD-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
44694e69fbbSCraig Topper; RV32IFD-NEXT:    addi sp, sp, 16
44794e69fbbSCraig Topper; RV32IFD-NEXT:    ret
44894e69fbbSCraig Topper;
44994e69fbbSCraig Topper; RV64IFD-LABEL: test_ceil_ui64:
45094e69fbbSCraig Topper; RV64IFD:       # %bb.0:
45194e69fbbSCraig Topper; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rup
4521c41d0cbSPhilip Reames; RV64IFD-NEXT:    feq.d a1, fa0, fa0
4531c41d0cbSPhilip Reames; RV64IFD-NEXT:    seqz a1, a1
4541c41d0cbSPhilip Reames; RV64IFD-NEXT:    addi a1, a1, -1
4551c41d0cbSPhilip Reames; RV64IFD-NEXT:    and a0, a1, a0
45694e69fbbSCraig Topper; RV64IFD-NEXT:    ret
4572dc0fa05SShao-Ce SUN;
4588b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_ceil_ui64:
4598b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
460576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
461576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
462576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
463576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
464eabaee0cSFangrui Song; RV32IZFINXZDINX-NEXT:    call ceil
465576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    mv s0, a0
466576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    mv s1, a1
4676b270358SCraig Topper; RV32IZFINXZDINX-NEXT:    call __fixunsdfdi
468576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    fcvt.d.w a2, zero
469576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lui a4, %hi(.LCPI7_0)
470*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    fle.d a2, a2, s0
471576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw a5, %lo(.LCPI7_0+4)(a4)
472576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw a4, %lo(.LCPI7_0)(a4)
4736b270358SCraig Topper; RV32IZFINXZDINX-NEXT:    neg a2, a2
474576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    and a0, a2, a0
475576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    and a1, a2, a1
476*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    flt.d a2, a4, s0
477*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a2, a2
478*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a0, a2, a0
479*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a1, a2, a1
480576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
481576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
482576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
483576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
4848b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
4858b90f8e0SShao-Ce SUN;
4862dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_ceil_ui64:
4872dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
4882dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a1, a0, rup
4892dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
4902dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
4912dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
4922dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
4932dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
49494e69fbbSCraig Topper  %a = call double @llvm.ceil.f64(double %x)
49594e69fbbSCraig Topper  %b = call i64 @llvm.fptoui.sat.i64.f64(double %a)
49694e69fbbSCraig Topper  ret i64 %b
49794e69fbbSCraig Topper}
49894e69fbbSCraig Topper
49994e69fbbSCraig Topperdefine signext i32 @test_trunc_si32(double %x) {
50084bacb18SShao-Ce SUN; CHECKIFD-LABEL: test_trunc_si32:
50184bacb18SShao-Ce SUN; CHECKIFD:       # %bb.0:
50284bacb18SShao-Ce SUN; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rtz
5031c41d0cbSPhilip Reames; CHECKIFD-NEXT:    feq.d a1, fa0, fa0
5041c41d0cbSPhilip Reames; CHECKIFD-NEXT:    seqz a1, a1
5051c41d0cbSPhilip Reames; CHECKIFD-NEXT:    addi a1, a1, -1
5061c41d0cbSPhilip Reames; CHECKIFD-NEXT:    and a0, a1, a0
50784bacb18SShao-Ce SUN; CHECKIFD-NEXT:    ret
5082dc0fa05SShao-Ce SUN;
5098b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_trunc_si32:
5108b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
5118b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    fcvt.w.d a2, a0, rtz
5128b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    feq.d a0, a0, a0
5138b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    seqz a0, a0
5148b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    addi a0, a0, -1
5158b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    and a0, a0, a2
5168b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
5178b90f8e0SShao-Ce SUN;
5182dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_trunc_si32:
5192dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
5202dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.w.d a1, a0, rtz
5212dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
5222dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
5232dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
5242dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
5252dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
52694e69fbbSCraig Topper  %a = call double @llvm.trunc.f64(double %x)
52794e69fbbSCraig Topper  %b = call i32 @llvm.fptosi.sat.i32.f64(double %a)
52894e69fbbSCraig Topper  ret i32 %b
52994e69fbbSCraig Topper}
53094e69fbbSCraig Topper
53194e69fbbSCraig Topperdefine i64 @test_trunc_si64(double %x) nounwind {
53294e69fbbSCraig Topper; RV32IFD-LABEL: test_trunc_si64:
53394e69fbbSCraig Topper; RV32IFD:       # %bb.0:
534ce37a713SCraig Topper; RV32IFD-NEXT:    addi sp, sp, -16
535ce37a713SCraig Topper; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
536ce37a713SCraig Topper; RV32IFD-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
53794e69fbbSCraig Topper; RV32IFD-NEXT:    fsd fs0, 0(sp) # 8-byte Folded Spill
538eabaee0cSFangrui Song; RV32IFD-NEXT:    call trunc
53994e69fbbSCraig Topper; RV32IFD-NEXT:    lui a0, %hi(.LCPI9_0)
5407b0c4184SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI9_0)(a0)
54194e69fbbSCraig Topper; RV32IFD-NEXT:    fmv.d fs0, fa0
542ce37a713SCraig Topper; RV32IFD-NEXT:    fle.d s0, fa5, fa0
543eabaee0cSFangrui Song; RV32IFD-NEXT:    call __fixdfdi
544*9122c523SPengcheng Wang; RV32IFD-NEXT:    lui a3, 524288
545ce37a713SCraig Topper; RV32IFD-NEXT:    lui a2, 524288
54655c6bda0SBjorn Pettersson; RV32IFD-NEXT:    beqz s0, .LBB9_2
54794e69fbbSCraig Topper; RV32IFD-NEXT:  # %bb.1:
548ce37a713SCraig Topper; RV32IFD-NEXT:    mv a2, a1
54994e69fbbSCraig Topper; RV32IFD-NEXT:  .LBB9_2:
550ce37a713SCraig Topper; RV32IFD-NEXT:    lui a1, %hi(.LCPI9_1)
551ce37a713SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI9_1)(a1)
552*9122c523SPengcheng Wang; RV32IFD-NEXT:    flt.d a1, fa5, fs0
553*9122c523SPengcheng Wang; RV32IFD-NEXT:    beqz a1, .LBB9_4
55494e69fbbSCraig Topper; RV32IFD-NEXT:  # %bb.3:
555*9122c523SPengcheng Wang; RV32IFD-NEXT:    addi a2, a3, -1
55694e69fbbSCraig Topper; RV32IFD-NEXT:  .LBB9_4:
557*9122c523SPengcheng Wang; RV32IFD-NEXT:    feq.d a3, fs0, fs0
55855c6bda0SBjorn Pettersson; RV32IFD-NEXT:    neg a4, a1
559*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg a1, s0
560*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg a3, a3
561*9122c523SPengcheng Wang; RV32IFD-NEXT:    and a0, a1, a0
562*9122c523SPengcheng Wang; RV32IFD-NEXT:    and a1, a3, a2
563*9122c523SPengcheng Wang; RV32IFD-NEXT:    or a0, a4, a0
56416bd10a3SDavid Spickett; RV32IFD-NEXT:    and a0, a3, a0
565ce37a713SCraig Topper; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
566ce37a713SCraig Topper; RV32IFD-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
56794e69fbbSCraig Topper; RV32IFD-NEXT:    fld fs0, 0(sp) # 8-byte Folded Reload
568ce37a713SCraig Topper; RV32IFD-NEXT:    addi sp, sp, 16
56994e69fbbSCraig Topper; RV32IFD-NEXT:    ret
57094e69fbbSCraig Topper;
57194e69fbbSCraig Topper; RV64IFD-LABEL: test_trunc_si64:
57294e69fbbSCraig Topper; RV64IFD:       # %bb.0:
57394e69fbbSCraig Topper; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
5741c41d0cbSPhilip Reames; RV64IFD-NEXT:    feq.d a1, fa0, fa0
5751c41d0cbSPhilip Reames; RV64IFD-NEXT:    seqz a1, a1
5761c41d0cbSPhilip Reames; RV64IFD-NEXT:    addi a1, a1, -1
5771c41d0cbSPhilip Reames; RV64IFD-NEXT:    and a0, a1, a0
57894e69fbbSCraig Topper; RV64IFD-NEXT:    ret
5792dc0fa05SShao-Ce SUN;
5808b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_trunc_si64:
5818b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
582ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
583ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
584ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
585ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
586eabaee0cSFangrui Song; RV32IZFINXZDINX-NEXT:    call trunc
587ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    mv s0, a0
588ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    mv s1, a1
589ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    call __fixdfdi
5908b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    lui a2, %hi(.LCPI9_0)
591*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lui a3, %hi(.LCPI9_1)
592*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a4, %lo(.LCPI9_0)(a2)
593*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a5, %lo(.LCPI9_0+4)(a2)
594*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a2, %lo(.LCPI9_1)(a3)
595*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a3, %lo(.LCPI9_1+4)(a3)
596*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    fle.d a6, a4, s0
597*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    flt.d a3, a2, s0
5988ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    feq.d a2, s0, s0
599*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lui a4, 524288
6008ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    neg a2, a2
601*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a5, a6
602*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    and a0, a5, a0
603*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a5, a3
604*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a0, a5, a0
605909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:    lui a5, 524288
6068ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    beqz a6, .LBB9_2
607909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  # %bb.1:
608*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    mv a5, a1
609909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  .LBB9_2:
6108ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    and a0, a2, a0
611*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    beqz a3, .LBB9_4
612909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  # %bb.3:
613*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    addi a5, a4, -1
614909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  .LBB9_4:
615*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    and a1, a2, a5
616ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
617ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
618ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
619ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
6208b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
6218b90f8e0SShao-Ce SUN;
6222dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_trunc_si64:
6232dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
6242dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.l.d a1, a0, rtz
6252dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
6262dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
6272dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
6282dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
6292dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
63094e69fbbSCraig Topper  %a = call double @llvm.trunc.f64(double %x)
63194e69fbbSCraig Topper  %b = call i64 @llvm.fptosi.sat.i64.f64(double %a)
63294e69fbbSCraig Topper  ret i64 %b
63394e69fbbSCraig Topper}
63494e69fbbSCraig Topper
63594e69fbbSCraig Topperdefine signext i32 @test_trunc_ui32(double %x) {
63684bacb18SShao-Ce SUN; CHECKIFD-LABEL: test_trunc_ui32:
63784bacb18SShao-Ce SUN; CHECKIFD:       # %bb.0:
63884bacb18SShao-Ce SUN; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rtz
6391c41d0cbSPhilip Reames; CHECKIFD-NEXT:    feq.d a1, fa0, fa0
6401c41d0cbSPhilip Reames; CHECKIFD-NEXT:    seqz a1, a1
6411c41d0cbSPhilip Reames; CHECKIFD-NEXT:    addi a1, a1, -1
6421c41d0cbSPhilip Reames; CHECKIFD-NEXT:    and a0, a1, a0
64384bacb18SShao-Ce SUN; CHECKIFD-NEXT:    ret
6442dc0fa05SShao-Ce SUN;
6458b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_trunc_ui32:
6468b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
6478b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a2, a0, rtz
6488b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    feq.d a0, a0, a0
6498b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    seqz a0, a0
6508b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    addi a0, a0, -1
6518b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    and a0, a0, a2
6528b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
6538b90f8e0SShao-Ce SUN;
6542dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_trunc_ui32:
6552dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
6562dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.wu.d a1, a0, rtz
6572dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
6582dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
6592dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
6602dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
6612dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
66294e69fbbSCraig Topper  %a = call double @llvm.trunc.f64(double %x)
66394e69fbbSCraig Topper  %b = call i32 @llvm.fptoui.sat.i32.f64(double %a)
66494e69fbbSCraig Topper  ret i32 %b
66594e69fbbSCraig Topper}
66694e69fbbSCraig Topper
66794e69fbbSCraig Topperdefine i64 @test_trunc_ui64(double %x) nounwind {
66894e69fbbSCraig Topper; RV32IFD-LABEL: test_trunc_ui64:
66994e69fbbSCraig Topper; RV32IFD:       # %bb.0:
67094e69fbbSCraig Topper; RV32IFD-NEXT:    addi sp, sp, -16
67194e69fbbSCraig Topper; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
67294e69fbbSCraig Topper; RV32IFD-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
673e68b0d58SCraig Topper; RV32IFD-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
674eabaee0cSFangrui Song; RV32IFD-NEXT:    call trunc
675e68b0d58SCraig Topper; RV32IFD-NEXT:    lui a0, %hi(.LCPI11_0)
6767b0c4184SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI11_0)(a0)
677*9122c523SPengcheng Wang; RV32IFD-NEXT:    fcvt.d.w fa4, zero
678*9122c523SPengcheng Wang; RV32IFD-NEXT:    fle.d a0, fa4, fa0
679*9122c523SPengcheng Wang; RV32IFD-NEXT:    flt.d a1, fa5, fa0
680*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg s0, a1
6816b270358SCraig Topper; RV32IFD-NEXT:    neg s1, a0
682eabaee0cSFangrui Song; RV32IFD-NEXT:    call __fixunsdfdi
683e68b0d58SCraig Topper; RV32IFD-NEXT:    and a0, s1, a0
684e68b0d58SCraig Topper; RV32IFD-NEXT:    and a1, s1, a1
685*9122c523SPengcheng Wang; RV32IFD-NEXT:    or a0, s0, a0
686e68b0d58SCraig Topper; RV32IFD-NEXT:    or a1, s0, a1
68794e69fbbSCraig Topper; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
68894e69fbbSCraig Topper; RV32IFD-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
689e68b0d58SCraig Topper; RV32IFD-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
69094e69fbbSCraig Topper; RV32IFD-NEXT:    addi sp, sp, 16
69194e69fbbSCraig Topper; RV32IFD-NEXT:    ret
69294e69fbbSCraig Topper;
69394e69fbbSCraig Topper; RV64IFD-LABEL: test_trunc_ui64:
69494e69fbbSCraig Topper; RV64IFD:       # %bb.0:
69594e69fbbSCraig Topper; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rtz
6961c41d0cbSPhilip Reames; RV64IFD-NEXT:    feq.d a1, fa0, fa0
6971c41d0cbSPhilip Reames; RV64IFD-NEXT:    seqz a1, a1
6981c41d0cbSPhilip Reames; RV64IFD-NEXT:    addi a1, a1, -1
6991c41d0cbSPhilip Reames; RV64IFD-NEXT:    and a0, a1, a0
70094e69fbbSCraig Topper; RV64IFD-NEXT:    ret
7012dc0fa05SShao-Ce SUN;
7028b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_trunc_ui64:
7038b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
704576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
705576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
706576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
707576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
708eabaee0cSFangrui Song; RV32IZFINXZDINX-NEXT:    call trunc
709576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    mv s0, a0
710576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    mv s1, a1
7116b270358SCraig Topper; RV32IZFINXZDINX-NEXT:    call __fixunsdfdi
712576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    fcvt.d.w a2, zero
713576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lui a4, %hi(.LCPI11_0)
714*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    fle.d a2, a2, s0
715576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw a5, %lo(.LCPI11_0+4)(a4)
716576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw a4, %lo(.LCPI11_0)(a4)
7176b270358SCraig Topper; RV32IZFINXZDINX-NEXT:    neg a2, a2
718576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    and a0, a2, a0
719576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    and a1, a2, a1
720*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    flt.d a2, a4, s0
721*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a2, a2
722*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a0, a2, a0
723*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a1, a2, a1
724576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
725576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
726576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
727576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
7288b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
7298b90f8e0SShao-Ce SUN;
7302dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_trunc_ui64:
7312dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
7322dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a1, a0, rtz
7332dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
7342dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
7352dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
7362dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
7372dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
73894e69fbbSCraig Topper  %a = call double @llvm.trunc.f64(double %x)
73994e69fbbSCraig Topper  %b = call i64 @llvm.fptoui.sat.i64.f64(double %a)
74094e69fbbSCraig Topper  ret i64 %b
74194e69fbbSCraig Topper}
74294e69fbbSCraig Topper
74394e69fbbSCraig Topperdefine signext i32 @test_round_si32(double %x) {
74484bacb18SShao-Ce SUN; CHECKIFD-LABEL: test_round_si32:
74584bacb18SShao-Ce SUN; CHECKIFD:       # %bb.0:
74684bacb18SShao-Ce SUN; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rmm
7471c41d0cbSPhilip Reames; CHECKIFD-NEXT:    feq.d a1, fa0, fa0
7481c41d0cbSPhilip Reames; CHECKIFD-NEXT:    seqz a1, a1
7491c41d0cbSPhilip Reames; CHECKIFD-NEXT:    addi a1, a1, -1
7501c41d0cbSPhilip Reames; CHECKIFD-NEXT:    and a0, a1, a0
75184bacb18SShao-Ce SUN; CHECKIFD-NEXT:    ret
7522dc0fa05SShao-Ce SUN;
7538b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_round_si32:
7548b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
7558b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    fcvt.w.d a2, a0, rmm
7568b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    feq.d a0, a0, a0
7578b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    seqz a0, a0
7588b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    addi a0, a0, -1
7598b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    and a0, a0, a2
7608b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
7618b90f8e0SShao-Ce SUN;
7622dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_round_si32:
7632dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
7642dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.w.d a1, a0, rmm
7652dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
7662dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
7672dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
7682dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
7692dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
77094e69fbbSCraig Topper  %a = call double @llvm.round.f64(double %x)
77194e69fbbSCraig Topper  %b = call i32 @llvm.fptosi.sat.i32.f64(double %a)
77294e69fbbSCraig Topper  ret i32 %b
77394e69fbbSCraig Topper}
77494e69fbbSCraig Topper
77594e69fbbSCraig Topperdefine i64 @test_round_si64(double %x) nounwind {
77694e69fbbSCraig Topper; RV32IFD-LABEL: test_round_si64:
77794e69fbbSCraig Topper; RV32IFD:       # %bb.0:
778ce37a713SCraig Topper; RV32IFD-NEXT:    addi sp, sp, -16
779ce37a713SCraig Topper; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
780ce37a713SCraig Topper; RV32IFD-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
78194e69fbbSCraig Topper; RV32IFD-NEXT:    fsd fs0, 0(sp) # 8-byte Folded Spill
782eabaee0cSFangrui Song; RV32IFD-NEXT:    call round
78394e69fbbSCraig Topper; RV32IFD-NEXT:    lui a0, %hi(.LCPI13_0)
7847b0c4184SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI13_0)(a0)
78594e69fbbSCraig Topper; RV32IFD-NEXT:    fmv.d fs0, fa0
786ce37a713SCraig Topper; RV32IFD-NEXT:    fle.d s0, fa5, fa0
787eabaee0cSFangrui Song; RV32IFD-NEXT:    call __fixdfdi
788*9122c523SPengcheng Wang; RV32IFD-NEXT:    lui a3, 524288
789ce37a713SCraig Topper; RV32IFD-NEXT:    lui a2, 524288
79055c6bda0SBjorn Pettersson; RV32IFD-NEXT:    beqz s0, .LBB13_2
79194e69fbbSCraig Topper; RV32IFD-NEXT:  # %bb.1:
792ce37a713SCraig Topper; RV32IFD-NEXT:    mv a2, a1
79394e69fbbSCraig Topper; RV32IFD-NEXT:  .LBB13_2:
794ce37a713SCraig Topper; RV32IFD-NEXT:    lui a1, %hi(.LCPI13_1)
795ce37a713SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI13_1)(a1)
796*9122c523SPengcheng Wang; RV32IFD-NEXT:    flt.d a1, fa5, fs0
797*9122c523SPengcheng Wang; RV32IFD-NEXT:    beqz a1, .LBB13_4
79894e69fbbSCraig Topper; RV32IFD-NEXT:  # %bb.3:
799*9122c523SPengcheng Wang; RV32IFD-NEXT:    addi a2, a3, -1
80094e69fbbSCraig Topper; RV32IFD-NEXT:  .LBB13_4:
801*9122c523SPengcheng Wang; RV32IFD-NEXT:    feq.d a3, fs0, fs0
80255c6bda0SBjorn Pettersson; RV32IFD-NEXT:    neg a4, a1
803*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg a1, s0
804*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg a3, a3
805*9122c523SPengcheng Wang; RV32IFD-NEXT:    and a0, a1, a0
806*9122c523SPengcheng Wang; RV32IFD-NEXT:    and a1, a3, a2
807*9122c523SPengcheng Wang; RV32IFD-NEXT:    or a0, a4, a0
80816bd10a3SDavid Spickett; RV32IFD-NEXT:    and a0, a3, a0
809ce37a713SCraig Topper; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
810ce37a713SCraig Topper; RV32IFD-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
81194e69fbbSCraig Topper; RV32IFD-NEXT:    fld fs0, 0(sp) # 8-byte Folded Reload
812ce37a713SCraig Topper; RV32IFD-NEXT:    addi sp, sp, 16
81394e69fbbSCraig Topper; RV32IFD-NEXT:    ret
81494e69fbbSCraig Topper;
81594e69fbbSCraig Topper; RV64IFD-LABEL: test_round_si64:
81694e69fbbSCraig Topper; RV64IFD:       # %bb.0:
81794e69fbbSCraig Topper; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rmm
8181c41d0cbSPhilip Reames; RV64IFD-NEXT:    feq.d a1, fa0, fa0
8191c41d0cbSPhilip Reames; RV64IFD-NEXT:    seqz a1, a1
8201c41d0cbSPhilip Reames; RV64IFD-NEXT:    addi a1, a1, -1
8211c41d0cbSPhilip Reames; RV64IFD-NEXT:    and a0, a1, a0
82294e69fbbSCraig Topper; RV64IFD-NEXT:    ret
8232dc0fa05SShao-Ce SUN;
8248b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_round_si64:
8258b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
826ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
827ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
828ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
829ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
830eabaee0cSFangrui Song; RV32IZFINXZDINX-NEXT:    call round
831ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    mv s0, a0
832ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    mv s1, a1
833ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    call __fixdfdi
8348b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    lui a2, %hi(.LCPI13_0)
835*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lui a3, %hi(.LCPI13_1)
836*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a4, %lo(.LCPI13_0)(a2)
837*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a5, %lo(.LCPI13_0+4)(a2)
838*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a2, %lo(.LCPI13_1)(a3)
839*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a3, %lo(.LCPI13_1+4)(a3)
840*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    fle.d a6, a4, s0
841*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    flt.d a3, a2, s0
8428ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    feq.d a2, s0, s0
843*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lui a4, 524288
8448ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    neg a2, a2
845*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a5, a6
846*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    and a0, a5, a0
847*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a5, a3
848*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a0, a5, a0
849909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:    lui a5, 524288
8508ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    beqz a6, .LBB13_2
851909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  # %bb.1:
852*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    mv a5, a1
853909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  .LBB13_2:
8548ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    and a0, a2, a0
855*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    beqz a3, .LBB13_4
856909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  # %bb.3:
857*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    addi a5, a4, -1
858909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  .LBB13_4:
859*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    and a1, a2, a5
860ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
861ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
862ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
863ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
8648b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
8658b90f8e0SShao-Ce SUN;
8662dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_round_si64:
8672dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
8682dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.l.d a1, a0, rmm
8692dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
8702dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
8712dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
8722dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
8732dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
87494e69fbbSCraig Topper  %a = call double @llvm.round.f64(double %x)
87594e69fbbSCraig Topper  %b = call i64 @llvm.fptosi.sat.i64.f64(double %a)
87694e69fbbSCraig Topper  ret i64 %b
87794e69fbbSCraig Topper}
87894e69fbbSCraig Topper
87994e69fbbSCraig Topperdefine signext i32 @test_round_ui32(double %x) {
88084bacb18SShao-Ce SUN; CHECKIFD-LABEL: test_round_ui32:
88184bacb18SShao-Ce SUN; CHECKIFD:       # %bb.0:
88284bacb18SShao-Ce SUN; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rmm
8831c41d0cbSPhilip Reames; CHECKIFD-NEXT:    feq.d a1, fa0, fa0
8841c41d0cbSPhilip Reames; CHECKIFD-NEXT:    seqz a1, a1
8851c41d0cbSPhilip Reames; CHECKIFD-NEXT:    addi a1, a1, -1
8861c41d0cbSPhilip Reames; CHECKIFD-NEXT:    and a0, a1, a0
88784bacb18SShao-Ce SUN; CHECKIFD-NEXT:    ret
8882dc0fa05SShao-Ce SUN;
8898b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_round_ui32:
8908b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
8918b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a2, a0, rmm
8928b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    feq.d a0, a0, a0
8938b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    seqz a0, a0
8948b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    addi a0, a0, -1
8958b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    and a0, a0, a2
8968b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
8978b90f8e0SShao-Ce SUN;
8982dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_round_ui32:
8992dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
9002dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.wu.d a1, a0, rmm
9012dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
9022dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
9032dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
9042dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
9052dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
90694e69fbbSCraig Topper  %a = call double @llvm.round.f64(double %x)
90794e69fbbSCraig Topper  %b = call i32 @llvm.fptoui.sat.i32.f64(double %a)
90894e69fbbSCraig Topper  ret i32 %b
90994e69fbbSCraig Topper}
91094e69fbbSCraig Topper
91194e69fbbSCraig Topperdefine i64 @test_round_ui64(double %x) nounwind {
91294e69fbbSCraig Topper; RV32IFD-LABEL: test_round_ui64:
91394e69fbbSCraig Topper; RV32IFD:       # %bb.0:
91494e69fbbSCraig Topper; RV32IFD-NEXT:    addi sp, sp, -16
91594e69fbbSCraig Topper; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
91694e69fbbSCraig Topper; RV32IFD-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
917e68b0d58SCraig Topper; RV32IFD-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
918eabaee0cSFangrui Song; RV32IFD-NEXT:    call round
919e68b0d58SCraig Topper; RV32IFD-NEXT:    lui a0, %hi(.LCPI15_0)
9207b0c4184SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI15_0)(a0)
921*9122c523SPengcheng Wang; RV32IFD-NEXT:    fcvt.d.w fa4, zero
922*9122c523SPengcheng Wang; RV32IFD-NEXT:    fle.d a0, fa4, fa0
923*9122c523SPengcheng Wang; RV32IFD-NEXT:    flt.d a1, fa5, fa0
924*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg s0, a1
9256b270358SCraig Topper; RV32IFD-NEXT:    neg s1, a0
926eabaee0cSFangrui Song; RV32IFD-NEXT:    call __fixunsdfdi
927e68b0d58SCraig Topper; RV32IFD-NEXT:    and a0, s1, a0
928e68b0d58SCraig Topper; RV32IFD-NEXT:    and a1, s1, a1
929*9122c523SPengcheng Wang; RV32IFD-NEXT:    or a0, s0, a0
930e68b0d58SCraig Topper; RV32IFD-NEXT:    or a1, s0, a1
93194e69fbbSCraig Topper; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
93294e69fbbSCraig Topper; RV32IFD-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
933e68b0d58SCraig Topper; RV32IFD-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
93494e69fbbSCraig Topper; RV32IFD-NEXT:    addi sp, sp, 16
93594e69fbbSCraig Topper; RV32IFD-NEXT:    ret
93694e69fbbSCraig Topper;
93794e69fbbSCraig Topper; RV64IFD-LABEL: test_round_ui64:
93894e69fbbSCraig Topper; RV64IFD:       # %bb.0:
93994e69fbbSCraig Topper; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rmm
9401c41d0cbSPhilip Reames; RV64IFD-NEXT:    feq.d a1, fa0, fa0
9411c41d0cbSPhilip Reames; RV64IFD-NEXT:    seqz a1, a1
9421c41d0cbSPhilip Reames; RV64IFD-NEXT:    addi a1, a1, -1
9431c41d0cbSPhilip Reames; RV64IFD-NEXT:    and a0, a1, a0
94494e69fbbSCraig Topper; RV64IFD-NEXT:    ret
9452dc0fa05SShao-Ce SUN;
9468b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_round_ui64:
9478b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
948576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
949576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
950576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
951576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
952eabaee0cSFangrui Song; RV32IZFINXZDINX-NEXT:    call round
953576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    mv s0, a0
954576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    mv s1, a1
9556b270358SCraig Topper; RV32IZFINXZDINX-NEXT:    call __fixunsdfdi
956576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    fcvt.d.w a2, zero
957576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lui a4, %hi(.LCPI15_0)
958*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    fle.d a2, a2, s0
959576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw a5, %lo(.LCPI15_0+4)(a4)
960576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw a4, %lo(.LCPI15_0)(a4)
9616b270358SCraig Topper; RV32IZFINXZDINX-NEXT:    neg a2, a2
962576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    and a0, a2, a0
963576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    and a1, a2, a1
964*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    flt.d a2, a4, s0
965*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a2, a2
966*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a0, a2, a0
967*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a1, a2, a1
968576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
969576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
970576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
971576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
9728b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
9738b90f8e0SShao-Ce SUN;
9742dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_round_ui64:
9752dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
9762dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a1, a0, rmm
9772dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
9782dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
9792dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
9802dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
9812dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
98294e69fbbSCraig Topper  %a = call double @llvm.round.f64(double %x)
98394e69fbbSCraig Topper  %b = call i64 @llvm.fptoui.sat.i64.f64(double %a)
98494e69fbbSCraig Topper  ret i64 %b
98594e69fbbSCraig Topper}
98694e69fbbSCraig Topper
98794e69fbbSCraig Topperdefine signext i32 @test_roundeven_si32(double %x) {
98884bacb18SShao-Ce SUN; CHECKIFD-LABEL: test_roundeven_si32:
98984bacb18SShao-Ce SUN; CHECKIFD:       # %bb.0:
99084bacb18SShao-Ce SUN; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rne
9911c41d0cbSPhilip Reames; CHECKIFD-NEXT:    feq.d a1, fa0, fa0
9921c41d0cbSPhilip Reames; CHECKIFD-NEXT:    seqz a1, a1
9931c41d0cbSPhilip Reames; CHECKIFD-NEXT:    addi a1, a1, -1
9941c41d0cbSPhilip Reames; CHECKIFD-NEXT:    and a0, a1, a0
99584bacb18SShao-Ce SUN; CHECKIFD-NEXT:    ret
9962dc0fa05SShao-Ce SUN;
9978b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_roundeven_si32:
9988b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
9998b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    fcvt.w.d a2, a0, rne
10008b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    feq.d a0, a0, a0
10018b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    seqz a0, a0
10028b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    addi a0, a0, -1
10038b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    and a0, a0, a2
10048b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
10058b90f8e0SShao-Ce SUN;
10062dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_roundeven_si32:
10072dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
10082dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.w.d a1, a0, rne
10092dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
10102dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
10112dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
10122dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
10132dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
101494e69fbbSCraig Topper  %a = call double @llvm.roundeven.f64(double %x)
101594e69fbbSCraig Topper  %b = call i32 @llvm.fptosi.sat.i32.f64(double %a)
101694e69fbbSCraig Topper  ret i32 %b
101794e69fbbSCraig Topper}
101894e69fbbSCraig Topper
101994e69fbbSCraig Topperdefine i64 @test_roundeven_si64(double %x) nounwind {
102094e69fbbSCraig Topper; RV32IFD-LABEL: test_roundeven_si64:
102194e69fbbSCraig Topper; RV32IFD:       # %bb.0:
1022ce37a713SCraig Topper; RV32IFD-NEXT:    addi sp, sp, -16
1023ce37a713SCraig Topper; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1024ce37a713SCraig Topper; RV32IFD-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
102594e69fbbSCraig Topper; RV32IFD-NEXT:    fsd fs0, 0(sp) # 8-byte Folded Spill
1026eabaee0cSFangrui Song; RV32IFD-NEXT:    call roundeven
102794e69fbbSCraig Topper; RV32IFD-NEXT:    lui a0, %hi(.LCPI17_0)
10287b0c4184SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI17_0)(a0)
102994e69fbbSCraig Topper; RV32IFD-NEXT:    fmv.d fs0, fa0
1030ce37a713SCraig Topper; RV32IFD-NEXT:    fle.d s0, fa5, fa0
1031eabaee0cSFangrui Song; RV32IFD-NEXT:    call __fixdfdi
1032*9122c523SPengcheng Wang; RV32IFD-NEXT:    lui a3, 524288
1033ce37a713SCraig Topper; RV32IFD-NEXT:    lui a2, 524288
103455c6bda0SBjorn Pettersson; RV32IFD-NEXT:    beqz s0, .LBB17_2
103594e69fbbSCraig Topper; RV32IFD-NEXT:  # %bb.1:
1036ce37a713SCraig Topper; RV32IFD-NEXT:    mv a2, a1
103794e69fbbSCraig Topper; RV32IFD-NEXT:  .LBB17_2:
1038ce37a713SCraig Topper; RV32IFD-NEXT:    lui a1, %hi(.LCPI17_1)
1039ce37a713SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI17_1)(a1)
1040*9122c523SPengcheng Wang; RV32IFD-NEXT:    flt.d a1, fa5, fs0
1041*9122c523SPengcheng Wang; RV32IFD-NEXT:    beqz a1, .LBB17_4
104294e69fbbSCraig Topper; RV32IFD-NEXT:  # %bb.3:
1043*9122c523SPengcheng Wang; RV32IFD-NEXT:    addi a2, a3, -1
104494e69fbbSCraig Topper; RV32IFD-NEXT:  .LBB17_4:
1045*9122c523SPengcheng Wang; RV32IFD-NEXT:    feq.d a3, fs0, fs0
104655c6bda0SBjorn Pettersson; RV32IFD-NEXT:    neg a4, a1
1047*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg a1, s0
1048*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg a3, a3
1049*9122c523SPengcheng Wang; RV32IFD-NEXT:    and a0, a1, a0
1050*9122c523SPengcheng Wang; RV32IFD-NEXT:    and a1, a3, a2
1051*9122c523SPengcheng Wang; RV32IFD-NEXT:    or a0, a4, a0
105216bd10a3SDavid Spickett; RV32IFD-NEXT:    and a0, a3, a0
1053ce37a713SCraig Topper; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1054ce37a713SCraig Topper; RV32IFD-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
105594e69fbbSCraig Topper; RV32IFD-NEXT:    fld fs0, 0(sp) # 8-byte Folded Reload
1056ce37a713SCraig Topper; RV32IFD-NEXT:    addi sp, sp, 16
105794e69fbbSCraig Topper; RV32IFD-NEXT:    ret
105894e69fbbSCraig Topper;
105994e69fbbSCraig Topper; RV64IFD-LABEL: test_roundeven_si64:
106094e69fbbSCraig Topper; RV64IFD:       # %bb.0:
106194e69fbbSCraig Topper; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rne
10621c41d0cbSPhilip Reames; RV64IFD-NEXT:    feq.d a1, fa0, fa0
10631c41d0cbSPhilip Reames; RV64IFD-NEXT:    seqz a1, a1
10641c41d0cbSPhilip Reames; RV64IFD-NEXT:    addi a1, a1, -1
10651c41d0cbSPhilip Reames; RV64IFD-NEXT:    and a0, a1, a0
106694e69fbbSCraig Topper; RV64IFD-NEXT:    ret
10672dc0fa05SShao-Ce SUN;
10688b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_roundeven_si64:
10698b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
1070ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1071ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1072ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1073ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1074eabaee0cSFangrui Song; RV32IZFINXZDINX-NEXT:    call roundeven
1075ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    mv s0, a0
1076ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    mv s1, a1
1077ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    call __fixdfdi
10788b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    lui a2, %hi(.LCPI17_0)
1079*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lui a3, %hi(.LCPI17_1)
1080*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a4, %lo(.LCPI17_0)(a2)
1081*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a5, %lo(.LCPI17_0+4)(a2)
1082*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a2, %lo(.LCPI17_1)(a3)
1083*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a3, %lo(.LCPI17_1+4)(a3)
1084*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    fle.d a6, a4, s0
1085*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    flt.d a3, a2, s0
10868ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    feq.d a2, s0, s0
1087*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lui a4, 524288
10888ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    neg a2, a2
1089*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a5, a6
1090*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    and a0, a5, a0
1091*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a5, a3
1092*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a0, a5, a0
1093909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:    lui a5, 524288
10948ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    beqz a6, .LBB17_2
1095909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  # %bb.1:
1096*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    mv a5, a1
1097909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  .LBB17_2:
10988ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    and a0, a2, a0
1099*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    beqz a3, .LBB17_4
1100909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  # %bb.3:
1101*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    addi a5, a4, -1
1102909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  .LBB17_4:
1103*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    and a1, a2, a5
1104ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1105ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1106ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1107ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
11088b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
11098b90f8e0SShao-Ce SUN;
11102dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_roundeven_si64:
11112dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
11122dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.l.d a1, a0, rne
11132dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
11142dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
11152dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
11162dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
11172dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
111894e69fbbSCraig Topper  %a = call double @llvm.roundeven.f64(double %x)
111994e69fbbSCraig Topper  %b = call i64 @llvm.fptosi.sat.i64.f64(double %a)
112094e69fbbSCraig Topper  ret i64 %b
112194e69fbbSCraig Topper}
112294e69fbbSCraig Topper
112394e69fbbSCraig Topperdefine signext i32 @test_roundeven_ui32(double %x) {
112484bacb18SShao-Ce SUN; CHECKIFD-LABEL: test_roundeven_ui32:
112584bacb18SShao-Ce SUN; CHECKIFD:       # %bb.0:
112684bacb18SShao-Ce SUN; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rne
11271c41d0cbSPhilip Reames; CHECKIFD-NEXT:    feq.d a1, fa0, fa0
11281c41d0cbSPhilip Reames; CHECKIFD-NEXT:    seqz a1, a1
11291c41d0cbSPhilip Reames; CHECKIFD-NEXT:    addi a1, a1, -1
11301c41d0cbSPhilip Reames; CHECKIFD-NEXT:    and a0, a1, a0
113184bacb18SShao-Ce SUN; CHECKIFD-NEXT:    ret
11322dc0fa05SShao-Ce SUN;
11338b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_roundeven_ui32:
11348b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
11358b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a2, a0, rne
11368b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    feq.d a0, a0, a0
11378b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    seqz a0, a0
11388b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    addi a0, a0, -1
11398b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    and a0, a0, a2
11408b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
11418b90f8e0SShao-Ce SUN;
11422dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_roundeven_ui32:
11432dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
11442dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.wu.d a1, a0, rne
11452dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
11462dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
11472dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
11482dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
11492dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
115094e69fbbSCraig Topper  %a = call double @llvm.roundeven.f64(double %x)
115194e69fbbSCraig Topper  %b = call i32 @llvm.fptoui.sat.i32.f64(double %a)
115294e69fbbSCraig Topper  ret i32 %b
115394e69fbbSCraig Topper}
115494e69fbbSCraig Topper
115594e69fbbSCraig Topperdefine i64 @test_roundeven_ui64(double %x) nounwind {
115694e69fbbSCraig Topper; RV32IFD-LABEL: test_roundeven_ui64:
115794e69fbbSCraig Topper; RV32IFD:       # %bb.0:
115894e69fbbSCraig Topper; RV32IFD-NEXT:    addi sp, sp, -16
115994e69fbbSCraig Topper; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
116094e69fbbSCraig Topper; RV32IFD-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1161e68b0d58SCraig Topper; RV32IFD-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1162eabaee0cSFangrui Song; RV32IFD-NEXT:    call roundeven
1163e68b0d58SCraig Topper; RV32IFD-NEXT:    lui a0, %hi(.LCPI19_0)
11647b0c4184SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI19_0)(a0)
1165*9122c523SPengcheng Wang; RV32IFD-NEXT:    fcvt.d.w fa4, zero
1166*9122c523SPengcheng Wang; RV32IFD-NEXT:    fle.d a0, fa4, fa0
1167*9122c523SPengcheng Wang; RV32IFD-NEXT:    flt.d a1, fa5, fa0
1168*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg s0, a1
11696b270358SCraig Topper; RV32IFD-NEXT:    neg s1, a0
1170eabaee0cSFangrui Song; RV32IFD-NEXT:    call __fixunsdfdi
1171e68b0d58SCraig Topper; RV32IFD-NEXT:    and a0, s1, a0
1172e68b0d58SCraig Topper; RV32IFD-NEXT:    and a1, s1, a1
1173*9122c523SPengcheng Wang; RV32IFD-NEXT:    or a0, s0, a0
1174e68b0d58SCraig Topper; RV32IFD-NEXT:    or a1, s0, a1
117594e69fbbSCraig Topper; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
117694e69fbbSCraig Topper; RV32IFD-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1177e68b0d58SCraig Topper; RV32IFD-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
117894e69fbbSCraig Topper; RV32IFD-NEXT:    addi sp, sp, 16
117994e69fbbSCraig Topper; RV32IFD-NEXT:    ret
118094e69fbbSCraig Topper;
118194e69fbbSCraig Topper; RV64IFD-LABEL: test_roundeven_ui64:
118294e69fbbSCraig Topper; RV64IFD:       # %bb.0:
118394e69fbbSCraig Topper; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rne
11841c41d0cbSPhilip Reames; RV64IFD-NEXT:    feq.d a1, fa0, fa0
11851c41d0cbSPhilip Reames; RV64IFD-NEXT:    seqz a1, a1
11861c41d0cbSPhilip Reames; RV64IFD-NEXT:    addi a1, a1, -1
11871c41d0cbSPhilip Reames; RV64IFD-NEXT:    and a0, a1, a0
118894e69fbbSCraig Topper; RV64IFD-NEXT:    ret
11892dc0fa05SShao-Ce SUN;
11908b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: test_roundeven_ui64:
11918b90f8e0SShao-Ce SUN; RV32IZFINXZDINX:       # %bb.0:
1192576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1193576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1194576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1195576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1196eabaee0cSFangrui Song; RV32IZFINXZDINX-NEXT:    call roundeven
1197576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    mv s0, a0
1198576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    mv s1, a1
11996b270358SCraig Topper; RV32IZFINXZDINX-NEXT:    call __fixunsdfdi
1200576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    fcvt.d.w a2, zero
1201576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lui a4, %hi(.LCPI19_0)
1202*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    fle.d a2, a2, s0
1203576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw a5, %lo(.LCPI19_0+4)(a4)
1204576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw a4, %lo(.LCPI19_0)(a4)
12056b270358SCraig Topper; RV32IZFINXZDINX-NEXT:    neg a2, a2
1206576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    and a0, a2, a0
1207576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    and a1, a2, a1
1208*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    flt.d a2, a4, s0
1209*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a2, a2
1210*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a0, a2, a0
1211*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a1, a2, a1
1212576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1213576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1214576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1215576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
12168b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT:    ret
12178b90f8e0SShao-Ce SUN;
12182dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: test_roundeven_ui64:
12192dc0fa05SShao-Ce SUN; RV64IZFINXZDINX:       # %bb.0:
12202dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a1, a0, rne
12212dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
12222dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    seqz a0, a0
12232dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
12242dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
12252dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT:    ret
122694e69fbbSCraig Topper  %a = call double @llvm.roundeven.f64(double %x)
122794e69fbbSCraig Topper  %b = call i64 @llvm.fptoui.sat.i64.f64(double %a)
122894e69fbbSCraig Topper  ret i64 %b
122994e69fbbSCraig Topper}
123094e69fbbSCraig Topper
1231b7376c31SYeting Kuodefine signext i32 @test_rint_si32(double %x) {
1232b7376c31SYeting Kuo; CHECKIFD-LABEL: test_rint_si32:
1233b7376c31SYeting Kuo; CHECKIFD:       # %bb.0:
1234b7376c31SYeting Kuo; CHECKIFD-NEXT:    fcvt.w.d a0, fa0
1235b7376c31SYeting Kuo; CHECKIFD-NEXT:    feq.d a1, fa0, fa0
1236b7376c31SYeting Kuo; CHECKIFD-NEXT:    seqz a1, a1
1237b7376c31SYeting Kuo; CHECKIFD-NEXT:    addi a1, a1, -1
1238b7376c31SYeting Kuo; CHECKIFD-NEXT:    and a0, a1, a0
1239b7376c31SYeting Kuo; CHECKIFD-NEXT:    ret
1240b7376c31SYeting Kuo;
1241b7376c31SYeting Kuo; RV32IZFINXZDINX-LABEL: test_rint_si32:
1242b7376c31SYeting Kuo; RV32IZFINXZDINX:       # %bb.0:
1243b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    fcvt.w.d a2, a0
1244b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    feq.d a0, a0, a0
1245b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    seqz a0, a0
1246b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    addi a0, a0, -1
1247b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    and a0, a0, a2
1248b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    ret
1249b7376c31SYeting Kuo;
1250b7376c31SYeting Kuo; RV64IZFINXZDINX-LABEL: test_rint_si32:
1251b7376c31SYeting Kuo; RV64IZFINXZDINX:       # %bb.0:
1252b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    fcvt.w.d a1, a0
1253b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
1254b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    seqz a0, a0
1255b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
1256b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
1257b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    ret
1258b7376c31SYeting Kuo  %a = call double @llvm.rint.f64(double %x)
1259b7376c31SYeting Kuo  %b = call i32 @llvm.fptosi.sat.i32.f64(double %a)
1260b7376c31SYeting Kuo  ret i32 %b
1261b7376c31SYeting Kuo}
1262b7376c31SYeting Kuo
1263b7376c31SYeting Kuodefine i64 @test_rint_si64(double %x) nounwind {
1264b7376c31SYeting Kuo; RV32IFD-LABEL: test_rint_si64:
1265b7376c31SYeting Kuo; RV32IFD:       # %bb.0:
1266ce37a713SCraig Topper; RV32IFD-NEXT:    addi sp, sp, -16
1267ce37a713SCraig Topper; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1268ce37a713SCraig Topper; RV32IFD-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1269b7376c31SYeting Kuo; RV32IFD-NEXT:    fsd fs0, 0(sp) # 8-byte Folded Spill
1270eabaee0cSFangrui Song; RV32IFD-NEXT:    call rint
1271b7376c31SYeting Kuo; RV32IFD-NEXT:    lui a0, %hi(.LCPI21_0)
1272b7376c31SYeting Kuo; RV32IFD-NEXT:    fld fa5, %lo(.LCPI21_0)(a0)
1273b7376c31SYeting Kuo; RV32IFD-NEXT:    fmv.d fs0, fa0
1274ce37a713SCraig Topper; RV32IFD-NEXT:    fle.d s0, fa5, fa0
1275eabaee0cSFangrui Song; RV32IFD-NEXT:    call __fixdfdi
1276*9122c523SPengcheng Wang; RV32IFD-NEXT:    lui a3, 524288
1277ce37a713SCraig Topper; RV32IFD-NEXT:    lui a2, 524288
127855c6bda0SBjorn Pettersson; RV32IFD-NEXT:    beqz s0, .LBB21_2
1279b7376c31SYeting Kuo; RV32IFD-NEXT:  # %bb.1:
1280ce37a713SCraig Topper; RV32IFD-NEXT:    mv a2, a1
1281b7376c31SYeting Kuo; RV32IFD-NEXT:  .LBB21_2:
1282ce37a713SCraig Topper; RV32IFD-NEXT:    lui a1, %hi(.LCPI21_1)
1283ce37a713SCraig Topper; RV32IFD-NEXT:    fld fa5, %lo(.LCPI21_1)(a1)
1284*9122c523SPengcheng Wang; RV32IFD-NEXT:    flt.d a1, fa5, fs0
1285*9122c523SPengcheng Wang; RV32IFD-NEXT:    beqz a1, .LBB21_4
1286b7376c31SYeting Kuo; RV32IFD-NEXT:  # %bb.3:
1287*9122c523SPengcheng Wang; RV32IFD-NEXT:    addi a2, a3, -1
1288b7376c31SYeting Kuo; RV32IFD-NEXT:  .LBB21_4:
1289*9122c523SPengcheng Wang; RV32IFD-NEXT:    feq.d a3, fs0, fs0
129055c6bda0SBjorn Pettersson; RV32IFD-NEXT:    neg a4, a1
1291*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg a1, s0
1292*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg a3, a3
1293*9122c523SPengcheng Wang; RV32IFD-NEXT:    and a0, a1, a0
1294*9122c523SPengcheng Wang; RV32IFD-NEXT:    and a1, a3, a2
1295*9122c523SPengcheng Wang; RV32IFD-NEXT:    or a0, a4, a0
129616bd10a3SDavid Spickett; RV32IFD-NEXT:    and a0, a3, a0
1297ce37a713SCraig Topper; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1298ce37a713SCraig Topper; RV32IFD-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1299b7376c31SYeting Kuo; RV32IFD-NEXT:    fld fs0, 0(sp) # 8-byte Folded Reload
1300ce37a713SCraig Topper; RV32IFD-NEXT:    addi sp, sp, 16
1301b7376c31SYeting Kuo; RV32IFD-NEXT:    ret
1302b7376c31SYeting Kuo;
1303b7376c31SYeting Kuo; RV64IFD-LABEL: test_rint_si64:
1304b7376c31SYeting Kuo; RV64IFD:       # %bb.0:
1305b7376c31SYeting Kuo; RV64IFD-NEXT:    fcvt.l.d a0, fa0
1306b7376c31SYeting Kuo; RV64IFD-NEXT:    feq.d a1, fa0, fa0
1307b7376c31SYeting Kuo; RV64IFD-NEXT:    seqz a1, a1
1308b7376c31SYeting Kuo; RV64IFD-NEXT:    addi a1, a1, -1
1309b7376c31SYeting Kuo; RV64IFD-NEXT:    and a0, a1, a0
1310b7376c31SYeting Kuo; RV64IFD-NEXT:    ret
1311b7376c31SYeting Kuo;
1312b7376c31SYeting Kuo; RV32IZFINXZDINX-LABEL: test_rint_si64:
1313b7376c31SYeting Kuo; RV32IZFINXZDINX:       # %bb.0:
1314ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1315ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1316ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1317ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1318eabaee0cSFangrui Song; RV32IZFINXZDINX-NEXT:    call rint
1319ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    mv s0, a0
1320ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    mv s1, a1
1321ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    call __fixdfdi
1322b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    lui a2, %hi(.LCPI21_0)
1323*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lui a3, %hi(.LCPI21_1)
1324*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a4, %lo(.LCPI21_0)(a2)
1325*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a5, %lo(.LCPI21_0+4)(a2)
1326*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a2, %lo(.LCPI21_1)(a3)
1327*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lw a3, %lo(.LCPI21_1+4)(a3)
1328*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    fle.d a6, a4, s0
1329*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    flt.d a3, a2, s0
13308ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    feq.d a2, s0, s0
1331*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    lui a4, 524288
13328ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    neg a2, a2
1333*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a5, a6
1334*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    and a0, a5, a0
1335*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a5, a3
1336*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a0, a5, a0
1337909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:    lui a5, 524288
13388ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    beqz a6, .LBB21_2
1339909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  # %bb.1:
1340*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    mv a5, a1
1341909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  .LBB21_2:
13428ebe7e60SBjorn Pettersson; RV32IZFINXZDINX-NEXT:    and a0, a2, a0
1343*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    beqz a3, .LBB21_4
1344909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  # %bb.3:
1345*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    addi a5, a4, -1
1346909ab0e0SCraig Topper; RV32IZFINXZDINX-NEXT:  .LBB21_4:
1347*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    and a1, a2, a5
1348ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1349ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1350ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1351ce37a713SCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1352b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    ret
1353b7376c31SYeting Kuo;
1354b7376c31SYeting Kuo; RV64IZFINXZDINX-LABEL: test_rint_si64:
1355b7376c31SYeting Kuo; RV64IZFINXZDINX:       # %bb.0:
1356b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    fcvt.l.d a1, a0
1357b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
1358b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    seqz a0, a0
1359b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
1360b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
1361b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    ret
1362b7376c31SYeting Kuo  %a = call double @llvm.rint.f64(double %x)
1363b7376c31SYeting Kuo  %b = call i64 @llvm.fptosi.sat.i64.f64(double %a)
1364b7376c31SYeting Kuo  ret i64 %b
1365b7376c31SYeting Kuo}
1366b7376c31SYeting Kuo
1367b7376c31SYeting Kuodefine signext i32 @test_rint_ui32(double %x) {
1368b7376c31SYeting Kuo; CHECKIFD-LABEL: test_rint_ui32:
1369b7376c31SYeting Kuo; CHECKIFD:       # %bb.0:
1370b7376c31SYeting Kuo; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0
1371b7376c31SYeting Kuo; CHECKIFD-NEXT:    feq.d a1, fa0, fa0
1372b7376c31SYeting Kuo; CHECKIFD-NEXT:    seqz a1, a1
1373b7376c31SYeting Kuo; CHECKIFD-NEXT:    addi a1, a1, -1
1374b7376c31SYeting Kuo; CHECKIFD-NEXT:    and a0, a1, a0
1375b7376c31SYeting Kuo; CHECKIFD-NEXT:    ret
1376b7376c31SYeting Kuo;
1377b7376c31SYeting Kuo; RV32IZFINXZDINX-LABEL: test_rint_ui32:
1378b7376c31SYeting Kuo; RV32IZFINXZDINX:       # %bb.0:
1379b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    fcvt.wu.d a2, a0
1380b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    feq.d a0, a0, a0
1381b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    seqz a0, a0
1382b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    addi a0, a0, -1
1383b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    and a0, a0, a2
1384b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    ret
1385b7376c31SYeting Kuo;
1386b7376c31SYeting Kuo; RV64IZFINXZDINX-LABEL: test_rint_ui32:
1387b7376c31SYeting Kuo; RV64IZFINXZDINX:       # %bb.0:
1388b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    fcvt.wu.d a1, a0
1389b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
1390b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    seqz a0, a0
1391b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
1392b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
1393b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    ret
1394b7376c31SYeting Kuo  %a = call double @llvm.rint.f64(double %x)
1395b7376c31SYeting Kuo  %b = call i32 @llvm.fptoui.sat.i32.f64(double %a)
1396b7376c31SYeting Kuo  ret i32 %b
1397b7376c31SYeting Kuo}
1398b7376c31SYeting Kuo
1399b7376c31SYeting Kuodefine i64 @test_rint_ui64(double %x) nounwind {
1400b7376c31SYeting Kuo; RV32IFD-LABEL: test_rint_ui64:
1401b7376c31SYeting Kuo; RV32IFD:       # %bb.0:
1402b7376c31SYeting Kuo; RV32IFD-NEXT:    addi sp, sp, -16
1403b7376c31SYeting Kuo; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1404b7376c31SYeting Kuo; RV32IFD-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1405b7376c31SYeting Kuo; RV32IFD-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1406eabaee0cSFangrui Song; RV32IFD-NEXT:    call rint
1407b7376c31SYeting Kuo; RV32IFD-NEXT:    lui a0, %hi(.LCPI23_0)
1408b7376c31SYeting Kuo; RV32IFD-NEXT:    fld fa5, %lo(.LCPI23_0)(a0)
1409*9122c523SPengcheng Wang; RV32IFD-NEXT:    fcvt.d.w fa4, zero
1410*9122c523SPengcheng Wang; RV32IFD-NEXT:    fle.d a0, fa4, fa0
1411*9122c523SPengcheng Wang; RV32IFD-NEXT:    flt.d a1, fa5, fa0
1412*9122c523SPengcheng Wang; RV32IFD-NEXT:    neg s0, a1
14136b270358SCraig Topper; RV32IFD-NEXT:    neg s1, a0
1414eabaee0cSFangrui Song; RV32IFD-NEXT:    call __fixunsdfdi
1415b7376c31SYeting Kuo; RV32IFD-NEXT:    and a0, s1, a0
1416b7376c31SYeting Kuo; RV32IFD-NEXT:    and a1, s1, a1
1417*9122c523SPengcheng Wang; RV32IFD-NEXT:    or a0, s0, a0
1418b7376c31SYeting Kuo; RV32IFD-NEXT:    or a1, s0, a1
1419b7376c31SYeting Kuo; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1420b7376c31SYeting Kuo; RV32IFD-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1421b7376c31SYeting Kuo; RV32IFD-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1422b7376c31SYeting Kuo; RV32IFD-NEXT:    addi sp, sp, 16
1423b7376c31SYeting Kuo; RV32IFD-NEXT:    ret
1424b7376c31SYeting Kuo;
1425b7376c31SYeting Kuo; RV64IFD-LABEL: test_rint_ui64:
1426b7376c31SYeting Kuo; RV64IFD:       # %bb.0:
1427b7376c31SYeting Kuo; RV64IFD-NEXT:    fcvt.lu.d a0, fa0
1428b7376c31SYeting Kuo; RV64IFD-NEXT:    feq.d a1, fa0, fa0
1429b7376c31SYeting Kuo; RV64IFD-NEXT:    seqz a1, a1
1430b7376c31SYeting Kuo; RV64IFD-NEXT:    addi a1, a1, -1
1431b7376c31SYeting Kuo; RV64IFD-NEXT:    and a0, a1, a0
1432b7376c31SYeting Kuo; RV64IFD-NEXT:    ret
1433b7376c31SYeting Kuo;
1434b7376c31SYeting Kuo; RV32IZFINXZDINX-LABEL: test_rint_ui64:
1435b7376c31SYeting Kuo; RV32IZFINXZDINX:       # %bb.0:
1436576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, -16
1437576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1438576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1439576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
1440eabaee0cSFangrui Song; RV32IZFINXZDINX-NEXT:    call rint
1441576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    mv s0, a0
1442576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    mv s1, a1
14436b270358SCraig Topper; RV32IZFINXZDINX-NEXT:    call __fixunsdfdi
1444576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    fcvt.d.w a2, zero
1445576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lui a4, %hi(.LCPI23_0)
1446*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    fle.d a2, a2, s0
1447576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw a5, %lo(.LCPI23_0+4)(a4)
1448576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw a4, %lo(.LCPI23_0)(a4)
14496b270358SCraig Topper; RV32IZFINXZDINX-NEXT:    neg a2, a2
1450576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    and a0, a2, a0
1451576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    and a1, a2, a1
1452*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    flt.d a2, a4, s0
1453*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    neg a2, a2
1454*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a0, a2, a0
1455*9122c523SPengcheng Wang; RV32IZFINXZDINX-NEXT:    or a1, a2, a1
1456576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1457576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1458576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
1459576d81baSCraig Topper; RV32IZFINXZDINX-NEXT:    addi sp, sp, 16
1460b7376c31SYeting Kuo; RV32IZFINXZDINX-NEXT:    ret
1461b7376c31SYeting Kuo;
1462b7376c31SYeting Kuo; RV64IZFINXZDINX-LABEL: test_rint_ui64:
1463b7376c31SYeting Kuo; RV64IZFINXZDINX:       # %bb.0:
1464b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    fcvt.lu.d a1, a0
1465b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    feq.d a0, a0, a0
1466b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    seqz a0, a0
1467b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    addi a0, a0, -1
1468b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    and a0, a0, a1
1469b7376c31SYeting Kuo; RV64IZFINXZDINX-NEXT:    ret
1470b7376c31SYeting Kuo  %a = call double @llvm.rint.f64(double %x)
1471b7376c31SYeting Kuo  %b = call i64 @llvm.fptoui.sat.i64.f64(double %a)
1472b7376c31SYeting Kuo  ret i64 %b
1473b7376c31SYeting Kuo}
1474b7376c31SYeting Kuo
147594e69fbbSCraig Topperdeclare double @llvm.floor.f64(double)
147694e69fbbSCraig Topperdeclare double @llvm.ceil.f64(double)
147794e69fbbSCraig Topperdeclare double @llvm.trunc.f64(double)
147894e69fbbSCraig Topperdeclare double @llvm.round.f64(double)
147994e69fbbSCraig Topperdeclare double @llvm.roundeven.f64(double)
1480b7376c31SYeting Kuodeclare double @llvm.rint.f64(double)
148194e69fbbSCraig Topperdeclare i32 @llvm.fptosi.sat.i32.f64(double)
148294e69fbbSCraig Topperdeclare i64 @llvm.fptosi.sat.i64.f64(double)
148394e69fbbSCraig Topperdeclare i32 @llvm.fptoui.sat.i32.f64(double)
148494e69fbbSCraig Topperdeclare i64 @llvm.fptoui.sat.i64.f64(double)
1485