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