1505 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \3; RUN: -target-abi=ilp32d | FileCheck -check-prefixes=CHECKIFD,RV32IFD %s4; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs < %s \5; RUN: -target-abi=lp64d | FileCheck -check-prefixes=CHECKIFD,RV64IFD %s6; RUN: llc -mtriple=riscv32 -mattr=+zdinx -verify-machineinstrs < %s \7; RUN: -target-abi=ilp32 | FileCheck -check-prefixes=RV32IZFINXZDINX %s8; RUN: llc -mtriple=riscv64 -mattr=+zdinx -verify-machineinstrs < %s \9; RUN: -target-abi=lp64 | FileCheck -check-prefixes=RV64IZFINXZDINX %s10 11define signext i32 @test_floor_si32(double %x) {12; CHECKIFD-LABEL: test_floor_si32:13; CHECKIFD: # %bb.0:14; CHECKIFD-NEXT: fcvt.w.d a0, fa0, rdn15; CHECKIFD-NEXT: feq.d a1, fa0, fa016; CHECKIFD-NEXT: seqz a1, a117; CHECKIFD-NEXT: addi a1, a1, -118; CHECKIFD-NEXT: and a0, a1, a019; CHECKIFD-NEXT: ret20;21; RV32IZFINXZDINX-LABEL: test_floor_si32:22; RV32IZFINXZDINX: # %bb.0:23; RV32IZFINXZDINX-NEXT: fcvt.w.d a2, a0, rdn24; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a025; RV32IZFINXZDINX-NEXT: seqz a0, a026; RV32IZFINXZDINX-NEXT: addi a0, a0, -127; RV32IZFINXZDINX-NEXT: and a0, a0, a228; RV32IZFINXZDINX-NEXT: ret29;30; RV64IZFINXZDINX-LABEL: test_floor_si32:31; RV64IZFINXZDINX: # %bb.0:32; RV64IZFINXZDINX-NEXT: fcvt.w.d a1, a0, rdn33; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a034; RV64IZFINXZDINX-NEXT: seqz a0, a035; RV64IZFINXZDINX-NEXT: addi a0, a0, -136; RV64IZFINXZDINX-NEXT: and a0, a0, a137; RV64IZFINXZDINX-NEXT: ret38 %a = call double @llvm.floor.f64(double %x)39 %b = call i32 @llvm.fptosi.sat.i32.f64(double %a)40 ret i32 %b41}42 43define i64 @test_floor_si64(double %x) nounwind {44; RV32IFD-LABEL: test_floor_si64:45; RV32IFD: # %bb.0:46; RV32IFD-NEXT: addi sp, sp, -1647; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill48; RV32IFD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill49; RV32IFD-NEXT: fsd fs0, 0(sp) # 8-byte Folded Spill50; RV32IFD-NEXT: call floor51; RV32IFD-NEXT: lui a0, %hi(.LCPI1_0)52; RV32IFD-NEXT: fld fa5, %lo(.LCPI1_0)(a0)53; RV32IFD-NEXT: fmv.d fs0, fa054; RV32IFD-NEXT: fle.d s0, fa5, fa055; RV32IFD-NEXT: call __fixdfdi56; RV32IFD-NEXT: lui a3, 52428857; RV32IFD-NEXT: lui a2, 52428858; RV32IFD-NEXT: beqz s0, .LBB1_259; RV32IFD-NEXT: # %bb.1:60; RV32IFD-NEXT: mv a2, a161; RV32IFD-NEXT: .LBB1_2:62; RV32IFD-NEXT: lui a1, %hi(.LCPI1_1)63; RV32IFD-NEXT: fld fa5, %lo(.LCPI1_1)(a1)64; RV32IFD-NEXT: flt.d a1, fa5, fs065; RV32IFD-NEXT: beqz a1, .LBB1_466; RV32IFD-NEXT: # %bb.3:67; RV32IFD-NEXT: addi a2, a3, -168; RV32IFD-NEXT: .LBB1_4:69; RV32IFD-NEXT: feq.d a3, fs0, fs070; RV32IFD-NEXT: neg a4, a171; RV32IFD-NEXT: neg a1, s072; RV32IFD-NEXT: neg a3, a373; RV32IFD-NEXT: and a0, a1, a074; RV32IFD-NEXT: and a1, a3, a275; RV32IFD-NEXT: or a0, a4, a076; RV32IFD-NEXT: and a0, a3, a077; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload78; RV32IFD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload79; RV32IFD-NEXT: fld fs0, 0(sp) # 8-byte Folded Reload80; RV32IFD-NEXT: addi sp, sp, 1681; RV32IFD-NEXT: ret82;83; RV64IFD-LABEL: test_floor_si64:84; RV64IFD: # %bb.0:85; RV64IFD-NEXT: fcvt.l.d a0, fa0, rdn86; RV64IFD-NEXT: feq.d a1, fa0, fa087; RV64IFD-NEXT: seqz a1, a188; RV64IFD-NEXT: addi a1, a1, -189; RV64IFD-NEXT: and a0, a1, a090; RV64IFD-NEXT: ret91;92; RV32IZFINXZDINX-LABEL: test_floor_si64:93; RV32IZFINXZDINX: # %bb.0:94; RV32IZFINXZDINX-NEXT: addi sp, sp, -1695; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill96; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill97; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill98; RV32IZFINXZDINX-NEXT: call floor99; RV32IZFINXZDINX-NEXT: mv s0, a0100; RV32IZFINXZDINX-NEXT: mv s1, a1101; RV32IZFINXZDINX-NEXT: call __fixdfdi102; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI1_0)103; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI1_0)(a2)104; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI1_0)105; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)106; RV32IZFINXZDINX-NEXT: fle.d a3, a4, s0107; RV32IZFINXZDINX-NEXT: lui a4, 524288108; RV32IZFINXZDINX-NEXT: lui a2, 524288109; RV32IZFINXZDINX-NEXT: beqz a3, .LBB1_2110; RV32IZFINXZDINX-NEXT: # %bb.1:111; RV32IZFINXZDINX-NEXT: mv a2, a1112; RV32IZFINXZDINX-NEXT: .LBB1_2:113; RV32IZFINXZDINX-NEXT: lui a1, %hi(.LCPI1_1)114; RV32IZFINXZDINX-NEXT: lw a6, %lo(.LCPI1_1)(a1)115; RV32IZFINXZDINX-NEXT: addi a1, a1, %lo(.LCPI1_1)116; RV32IZFINXZDINX-NEXT: lw a7, 4(a1)117; RV32IZFINXZDINX-NEXT: flt.d a1, a6, s0118; RV32IZFINXZDINX-NEXT: beqz a1, .LBB1_4119; RV32IZFINXZDINX-NEXT: # %bb.3:120; RV32IZFINXZDINX-NEXT: addi a2, a4, -1121; RV32IZFINXZDINX-NEXT: .LBB1_4:122; RV32IZFINXZDINX-NEXT: feq.d a4, s0, s0123; RV32IZFINXZDINX-NEXT: neg a3, a3124; RV32IZFINXZDINX-NEXT: neg a5, a1125; RV32IZFINXZDINX-NEXT: neg a4, a4126; RV32IZFINXZDINX-NEXT: and a0, a3, a0127; RV32IZFINXZDINX-NEXT: and a1, a4, a2128; RV32IZFINXZDINX-NEXT: or a0, a5, a0129; RV32IZFINXZDINX-NEXT: and a0, a4, a0130; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload131; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload132; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload133; RV32IZFINXZDINX-NEXT: addi sp, sp, 16134; RV32IZFINXZDINX-NEXT: ret135;136; RV64IZFINXZDINX-LABEL: test_floor_si64:137; RV64IZFINXZDINX: # %bb.0:138; RV64IZFINXZDINX-NEXT: fcvt.l.d a1, a0, rdn139; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0140; RV64IZFINXZDINX-NEXT: seqz a0, a0141; RV64IZFINXZDINX-NEXT: addi a0, a0, -1142; RV64IZFINXZDINX-NEXT: and a0, a0, a1143; RV64IZFINXZDINX-NEXT: ret144 %a = call double @llvm.floor.f64(double %x)145 %b = call i64 @llvm.fptosi.sat.i64.f64(double %a)146 ret i64 %b147}148 149define signext i32 @test_floor_ui32(double %x) {150; CHECKIFD-LABEL: test_floor_ui32:151; CHECKIFD: # %bb.0:152; CHECKIFD-NEXT: fcvt.wu.d a0, fa0, rdn153; CHECKIFD-NEXT: feq.d a1, fa0, fa0154; CHECKIFD-NEXT: seqz a1, a1155; CHECKIFD-NEXT: addi a1, a1, -1156; CHECKIFD-NEXT: and a0, a1, a0157; CHECKIFD-NEXT: ret158;159; RV32IZFINXZDINX-LABEL: test_floor_ui32:160; RV32IZFINXZDINX: # %bb.0:161; RV32IZFINXZDINX-NEXT: fcvt.wu.d a2, a0, rdn162; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a0163; RV32IZFINXZDINX-NEXT: seqz a0, a0164; RV32IZFINXZDINX-NEXT: addi a0, a0, -1165; RV32IZFINXZDINX-NEXT: and a0, a0, a2166; RV32IZFINXZDINX-NEXT: ret167;168; RV64IZFINXZDINX-LABEL: test_floor_ui32:169; RV64IZFINXZDINX: # %bb.0:170; RV64IZFINXZDINX-NEXT: fcvt.wu.d a1, a0, rdn171; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0172; RV64IZFINXZDINX-NEXT: seqz a0, a0173; RV64IZFINXZDINX-NEXT: addi a0, a0, -1174; RV64IZFINXZDINX-NEXT: and a0, a0, a1175; RV64IZFINXZDINX-NEXT: ret176 %a = call double @llvm.floor.f64(double %x)177 %b = call i32 @llvm.fptoui.sat.i32.f64(double %a)178 ret i32 %b179}180 181define i64 @test_floor_ui64(double %x) nounwind {182; RV32IFD-LABEL: test_floor_ui64:183; RV32IFD: # %bb.0:184; RV32IFD-NEXT: addi sp, sp, -16185; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill186; RV32IFD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill187; RV32IFD-NEXT: sw s1, 4(sp) # 4-byte Folded Spill188; RV32IFD-NEXT: call floor189; RV32IFD-NEXT: lui a0, %hi(.LCPI3_0)190; RV32IFD-NEXT: fld fa5, %lo(.LCPI3_0)(a0)191; RV32IFD-NEXT: fcvt.d.w fa4, zero192; RV32IFD-NEXT: fle.d a0, fa4, fa0193; RV32IFD-NEXT: flt.d a1, fa5, fa0194; RV32IFD-NEXT: neg s0, a1195; RV32IFD-NEXT: neg s1, a0196; RV32IFD-NEXT: call __fixunsdfdi197; RV32IFD-NEXT: and a0, s1, a0198; RV32IFD-NEXT: and a1, s1, a1199; RV32IFD-NEXT: or a0, s0, a0200; RV32IFD-NEXT: or a1, s0, a1201; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload202; RV32IFD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload203; RV32IFD-NEXT: lw s1, 4(sp) # 4-byte Folded Reload204; RV32IFD-NEXT: addi sp, sp, 16205; RV32IFD-NEXT: ret206;207; RV64IFD-LABEL: test_floor_ui64:208; RV64IFD: # %bb.0:209; RV64IFD-NEXT: fcvt.lu.d a0, fa0, rdn210; RV64IFD-NEXT: feq.d a1, fa0, fa0211; RV64IFD-NEXT: seqz a1, a1212; RV64IFD-NEXT: addi a1, a1, -1213; RV64IFD-NEXT: and a0, a1, a0214; RV64IFD-NEXT: ret215;216; RV32IZFINXZDINX-LABEL: test_floor_ui64:217; RV32IZFINXZDINX: # %bb.0:218; RV32IZFINXZDINX-NEXT: addi sp, sp, -16219; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill220; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill221; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill222; RV32IZFINXZDINX-NEXT: sw s2, 0(sp) # 4-byte Folded Spill223; RV32IZFINXZDINX-NEXT: call floor224; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI3_0)225; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI3_0)(a2)226; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI3_0)227; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)228; RV32IZFINXZDINX-NEXT: mv s0, a0229; RV32IZFINXZDINX-NEXT: mv s1, a1230; RV32IZFINXZDINX-NEXT: flt.d a0, a4, s0231; RV32IZFINXZDINX-NEXT: neg s2, a0232; RV32IZFINXZDINX-NEXT: mv a0, s0233; RV32IZFINXZDINX-NEXT: call __fixunsdfdi234; RV32IZFINXZDINX-NEXT: fle.d a2, zero, s0235; RV32IZFINXZDINX-NEXT: neg a2, a2236; RV32IZFINXZDINX-NEXT: and a0, a2, a0237; RV32IZFINXZDINX-NEXT: and a1, a2, a1238; RV32IZFINXZDINX-NEXT: or a0, s2, a0239; RV32IZFINXZDINX-NEXT: or a1, s2, a1240; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload241; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload242; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload243; RV32IZFINXZDINX-NEXT: lw s2, 0(sp) # 4-byte Folded Reload244; RV32IZFINXZDINX-NEXT: addi sp, sp, 16245; RV32IZFINXZDINX-NEXT: ret246;247; RV64IZFINXZDINX-LABEL: test_floor_ui64:248; RV64IZFINXZDINX: # %bb.0:249; RV64IZFINXZDINX-NEXT: fcvt.lu.d a1, a0, rdn250; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0251; RV64IZFINXZDINX-NEXT: seqz a0, a0252; RV64IZFINXZDINX-NEXT: addi a0, a0, -1253; RV64IZFINXZDINX-NEXT: and a0, a0, a1254; RV64IZFINXZDINX-NEXT: ret255 %a = call double @llvm.floor.f64(double %x)256 %b = call i64 @llvm.fptoui.sat.i64.f64(double %a)257 ret i64 %b258}259 260define signext i32 @test_ceil_si32(double %x) {261; CHECKIFD-LABEL: test_ceil_si32:262; CHECKIFD: # %bb.0:263; CHECKIFD-NEXT: fcvt.w.d a0, fa0, rup264; CHECKIFD-NEXT: feq.d a1, fa0, fa0265; CHECKIFD-NEXT: seqz a1, a1266; CHECKIFD-NEXT: addi a1, a1, -1267; CHECKIFD-NEXT: and a0, a1, a0268; CHECKIFD-NEXT: ret269;270; RV32IZFINXZDINX-LABEL: test_ceil_si32:271; RV32IZFINXZDINX: # %bb.0:272; RV32IZFINXZDINX-NEXT: fcvt.w.d a2, a0, rup273; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a0274; RV32IZFINXZDINX-NEXT: seqz a0, a0275; RV32IZFINXZDINX-NEXT: addi a0, a0, -1276; RV32IZFINXZDINX-NEXT: and a0, a0, a2277; RV32IZFINXZDINX-NEXT: ret278;279; RV64IZFINXZDINX-LABEL: test_ceil_si32:280; RV64IZFINXZDINX: # %bb.0:281; RV64IZFINXZDINX-NEXT: fcvt.w.d a1, a0, rup282; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0283; RV64IZFINXZDINX-NEXT: seqz a0, a0284; RV64IZFINXZDINX-NEXT: addi a0, a0, -1285; RV64IZFINXZDINX-NEXT: and a0, a0, a1286; RV64IZFINXZDINX-NEXT: ret287 %a = call double @llvm.ceil.f64(double %x)288 %b = call i32 @llvm.fptosi.sat.i32.f64(double %a)289 ret i32 %b290}291 292define i64 @test_ceil_si64(double %x) nounwind {293; RV32IFD-LABEL: test_ceil_si64:294; RV32IFD: # %bb.0:295; RV32IFD-NEXT: addi sp, sp, -16296; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill297; RV32IFD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill298; RV32IFD-NEXT: fsd fs0, 0(sp) # 8-byte Folded Spill299; RV32IFD-NEXT: call ceil300; RV32IFD-NEXT: lui a0, %hi(.LCPI5_0)301; RV32IFD-NEXT: fld fa5, %lo(.LCPI5_0)(a0)302; RV32IFD-NEXT: fmv.d fs0, fa0303; RV32IFD-NEXT: fle.d s0, fa5, fa0304; RV32IFD-NEXT: call __fixdfdi305; RV32IFD-NEXT: lui a3, 524288306; RV32IFD-NEXT: lui a2, 524288307; RV32IFD-NEXT: beqz s0, .LBB5_2308; RV32IFD-NEXT: # %bb.1:309; RV32IFD-NEXT: mv a2, a1310; RV32IFD-NEXT: .LBB5_2:311; RV32IFD-NEXT: lui a1, %hi(.LCPI5_1)312; RV32IFD-NEXT: fld fa5, %lo(.LCPI5_1)(a1)313; RV32IFD-NEXT: flt.d a1, fa5, fs0314; RV32IFD-NEXT: beqz a1, .LBB5_4315; RV32IFD-NEXT: # %bb.3:316; RV32IFD-NEXT: addi a2, a3, -1317; RV32IFD-NEXT: .LBB5_4:318; RV32IFD-NEXT: feq.d a3, fs0, fs0319; RV32IFD-NEXT: neg a4, a1320; RV32IFD-NEXT: neg a1, s0321; RV32IFD-NEXT: neg a3, a3322; RV32IFD-NEXT: and a0, a1, a0323; RV32IFD-NEXT: and a1, a3, a2324; RV32IFD-NEXT: or a0, a4, a0325; RV32IFD-NEXT: and a0, a3, a0326; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload327; RV32IFD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload328; RV32IFD-NEXT: fld fs0, 0(sp) # 8-byte Folded Reload329; RV32IFD-NEXT: addi sp, sp, 16330; RV32IFD-NEXT: ret331;332; RV64IFD-LABEL: test_ceil_si64:333; RV64IFD: # %bb.0:334; RV64IFD-NEXT: fcvt.l.d a0, fa0, rup335; RV64IFD-NEXT: feq.d a1, fa0, fa0336; RV64IFD-NEXT: seqz a1, a1337; RV64IFD-NEXT: addi a1, a1, -1338; RV64IFD-NEXT: and a0, a1, a0339; RV64IFD-NEXT: ret340;341; RV32IZFINXZDINX-LABEL: test_ceil_si64:342; RV32IZFINXZDINX: # %bb.0:343; RV32IZFINXZDINX-NEXT: addi sp, sp, -16344; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill345; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill346; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill347; RV32IZFINXZDINX-NEXT: call ceil348; RV32IZFINXZDINX-NEXT: mv s0, a0349; RV32IZFINXZDINX-NEXT: mv s1, a1350; RV32IZFINXZDINX-NEXT: call __fixdfdi351; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI5_0)352; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI5_0)(a2)353; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI5_0)354; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)355; RV32IZFINXZDINX-NEXT: fle.d a3, a4, s0356; RV32IZFINXZDINX-NEXT: lui a4, 524288357; RV32IZFINXZDINX-NEXT: lui a2, 524288358; RV32IZFINXZDINX-NEXT: beqz a3, .LBB5_2359; RV32IZFINXZDINX-NEXT: # %bb.1:360; RV32IZFINXZDINX-NEXT: mv a2, a1361; RV32IZFINXZDINX-NEXT: .LBB5_2:362; RV32IZFINXZDINX-NEXT: lui a1, %hi(.LCPI5_1)363; RV32IZFINXZDINX-NEXT: lw a6, %lo(.LCPI5_1)(a1)364; RV32IZFINXZDINX-NEXT: addi a1, a1, %lo(.LCPI5_1)365; RV32IZFINXZDINX-NEXT: lw a7, 4(a1)366; RV32IZFINXZDINX-NEXT: flt.d a1, a6, s0367; RV32IZFINXZDINX-NEXT: beqz a1, .LBB5_4368; RV32IZFINXZDINX-NEXT: # %bb.3:369; RV32IZFINXZDINX-NEXT: addi a2, a4, -1370; RV32IZFINXZDINX-NEXT: .LBB5_4:371; RV32IZFINXZDINX-NEXT: feq.d a4, s0, s0372; RV32IZFINXZDINX-NEXT: neg a3, a3373; RV32IZFINXZDINX-NEXT: neg a5, a1374; RV32IZFINXZDINX-NEXT: neg a4, a4375; RV32IZFINXZDINX-NEXT: and a0, a3, a0376; RV32IZFINXZDINX-NEXT: and a1, a4, a2377; RV32IZFINXZDINX-NEXT: or a0, a5, a0378; RV32IZFINXZDINX-NEXT: and a0, a4, a0379; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload380; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload381; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload382; RV32IZFINXZDINX-NEXT: addi sp, sp, 16383; RV32IZFINXZDINX-NEXT: ret384;385; RV64IZFINXZDINX-LABEL: test_ceil_si64:386; RV64IZFINXZDINX: # %bb.0:387; RV64IZFINXZDINX-NEXT: fcvt.l.d a1, a0, rup388; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0389; RV64IZFINXZDINX-NEXT: seqz a0, a0390; RV64IZFINXZDINX-NEXT: addi a0, a0, -1391; RV64IZFINXZDINX-NEXT: and a0, a0, a1392; RV64IZFINXZDINX-NEXT: ret393 %a = call double @llvm.ceil.f64(double %x)394 %b = call i64 @llvm.fptosi.sat.i64.f64(double %a)395 ret i64 %b396}397 398define signext i32 @test_ceil_ui32(double %x) {399; CHECKIFD-LABEL: test_ceil_ui32:400; CHECKIFD: # %bb.0:401; CHECKIFD-NEXT: fcvt.wu.d a0, fa0, rup402; CHECKIFD-NEXT: feq.d a1, fa0, fa0403; CHECKIFD-NEXT: seqz a1, a1404; CHECKIFD-NEXT: addi a1, a1, -1405; CHECKIFD-NEXT: and a0, a1, a0406; CHECKIFD-NEXT: ret407;408; RV32IZFINXZDINX-LABEL: test_ceil_ui32:409; RV32IZFINXZDINX: # %bb.0:410; RV32IZFINXZDINX-NEXT: fcvt.wu.d a2, a0, rup411; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a0412; RV32IZFINXZDINX-NEXT: seqz a0, a0413; RV32IZFINXZDINX-NEXT: addi a0, a0, -1414; RV32IZFINXZDINX-NEXT: and a0, a0, a2415; RV32IZFINXZDINX-NEXT: ret416;417; RV64IZFINXZDINX-LABEL: test_ceil_ui32:418; RV64IZFINXZDINX: # %bb.0:419; RV64IZFINXZDINX-NEXT: fcvt.wu.d a1, a0, rup420; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0421; RV64IZFINXZDINX-NEXT: seqz a0, a0422; RV64IZFINXZDINX-NEXT: addi a0, a0, -1423; RV64IZFINXZDINX-NEXT: and a0, a0, a1424; RV64IZFINXZDINX-NEXT: ret425 %a = call double @llvm.ceil.f64(double %x)426 %b = call i32 @llvm.fptoui.sat.i32.f64(double %a)427 ret i32 %b428}429 430define i64 @test_ceil_ui64(double %x) nounwind {431; RV32IFD-LABEL: test_ceil_ui64:432; RV32IFD: # %bb.0:433; RV32IFD-NEXT: addi sp, sp, -16434; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill435; RV32IFD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill436; RV32IFD-NEXT: sw s1, 4(sp) # 4-byte Folded Spill437; RV32IFD-NEXT: call ceil438; RV32IFD-NEXT: lui a0, %hi(.LCPI7_0)439; RV32IFD-NEXT: fld fa5, %lo(.LCPI7_0)(a0)440; RV32IFD-NEXT: fcvt.d.w fa4, zero441; RV32IFD-NEXT: fle.d a0, fa4, fa0442; RV32IFD-NEXT: flt.d a1, fa5, fa0443; RV32IFD-NEXT: neg s0, a1444; RV32IFD-NEXT: neg s1, a0445; RV32IFD-NEXT: call __fixunsdfdi446; RV32IFD-NEXT: and a0, s1, a0447; RV32IFD-NEXT: and a1, s1, a1448; RV32IFD-NEXT: or a0, s0, a0449; RV32IFD-NEXT: or a1, s0, a1450; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload451; RV32IFD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload452; RV32IFD-NEXT: lw s1, 4(sp) # 4-byte Folded Reload453; RV32IFD-NEXT: addi sp, sp, 16454; RV32IFD-NEXT: ret455;456; RV64IFD-LABEL: test_ceil_ui64:457; RV64IFD: # %bb.0:458; RV64IFD-NEXT: fcvt.lu.d a0, fa0, rup459; RV64IFD-NEXT: feq.d a1, fa0, fa0460; RV64IFD-NEXT: seqz a1, a1461; RV64IFD-NEXT: addi a1, a1, -1462; RV64IFD-NEXT: and a0, a1, a0463; RV64IFD-NEXT: ret464;465; RV32IZFINXZDINX-LABEL: test_ceil_ui64:466; RV32IZFINXZDINX: # %bb.0:467; RV32IZFINXZDINX-NEXT: addi sp, sp, -16468; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill469; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill470; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill471; RV32IZFINXZDINX-NEXT: sw s2, 0(sp) # 4-byte Folded Spill472; RV32IZFINXZDINX-NEXT: call ceil473; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI7_0)474; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI7_0)(a2)475; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI7_0)476; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)477; RV32IZFINXZDINX-NEXT: mv s0, a0478; RV32IZFINXZDINX-NEXT: mv s1, a1479; RV32IZFINXZDINX-NEXT: flt.d a0, a4, s0480; RV32IZFINXZDINX-NEXT: neg s2, a0481; RV32IZFINXZDINX-NEXT: mv a0, s0482; RV32IZFINXZDINX-NEXT: call __fixunsdfdi483; RV32IZFINXZDINX-NEXT: fle.d a2, zero, s0484; RV32IZFINXZDINX-NEXT: neg a2, a2485; RV32IZFINXZDINX-NEXT: and a0, a2, a0486; RV32IZFINXZDINX-NEXT: and a1, a2, a1487; RV32IZFINXZDINX-NEXT: or a0, s2, a0488; RV32IZFINXZDINX-NEXT: or a1, s2, a1489; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload490; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload491; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload492; RV32IZFINXZDINX-NEXT: lw s2, 0(sp) # 4-byte Folded Reload493; RV32IZFINXZDINX-NEXT: addi sp, sp, 16494; RV32IZFINXZDINX-NEXT: ret495;496; RV64IZFINXZDINX-LABEL: test_ceil_ui64:497; RV64IZFINXZDINX: # %bb.0:498; RV64IZFINXZDINX-NEXT: fcvt.lu.d a1, a0, rup499; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0500; RV64IZFINXZDINX-NEXT: seqz a0, a0501; RV64IZFINXZDINX-NEXT: addi a0, a0, -1502; RV64IZFINXZDINX-NEXT: and a0, a0, a1503; RV64IZFINXZDINX-NEXT: ret504 %a = call double @llvm.ceil.f64(double %x)505 %b = call i64 @llvm.fptoui.sat.i64.f64(double %a)506 ret i64 %b507}508 509define signext i32 @test_trunc_si32(double %x) {510; CHECKIFD-LABEL: test_trunc_si32:511; CHECKIFD: # %bb.0:512; CHECKIFD-NEXT: fcvt.w.d a0, fa0, rtz513; CHECKIFD-NEXT: feq.d a1, fa0, fa0514; CHECKIFD-NEXT: seqz a1, a1515; CHECKIFD-NEXT: addi a1, a1, -1516; CHECKIFD-NEXT: and a0, a1, a0517; CHECKIFD-NEXT: ret518;519; RV32IZFINXZDINX-LABEL: test_trunc_si32:520; RV32IZFINXZDINX: # %bb.0:521; RV32IZFINXZDINX-NEXT: fcvt.w.d a2, a0, rtz522; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a0523; RV32IZFINXZDINX-NEXT: seqz a0, a0524; RV32IZFINXZDINX-NEXT: addi a0, a0, -1525; RV32IZFINXZDINX-NEXT: and a0, a0, a2526; RV32IZFINXZDINX-NEXT: ret527;528; RV64IZFINXZDINX-LABEL: test_trunc_si32:529; RV64IZFINXZDINX: # %bb.0:530; RV64IZFINXZDINX-NEXT: fcvt.w.d a1, a0, rtz531; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0532; RV64IZFINXZDINX-NEXT: seqz a0, a0533; RV64IZFINXZDINX-NEXT: addi a0, a0, -1534; RV64IZFINXZDINX-NEXT: and a0, a0, a1535; RV64IZFINXZDINX-NEXT: ret536 %a = call double @llvm.trunc.f64(double %x)537 %b = call i32 @llvm.fptosi.sat.i32.f64(double %a)538 ret i32 %b539}540 541define i64 @test_trunc_si64(double %x) nounwind {542; RV32IFD-LABEL: test_trunc_si64:543; RV32IFD: # %bb.0:544; RV32IFD-NEXT: addi sp, sp, -16545; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill546; RV32IFD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill547; RV32IFD-NEXT: fsd fs0, 0(sp) # 8-byte Folded Spill548; RV32IFD-NEXT: call trunc549; RV32IFD-NEXT: lui a0, %hi(.LCPI9_0)550; RV32IFD-NEXT: fld fa5, %lo(.LCPI9_0)(a0)551; RV32IFD-NEXT: fmv.d fs0, fa0552; RV32IFD-NEXT: fle.d s0, fa5, fa0553; RV32IFD-NEXT: call __fixdfdi554; RV32IFD-NEXT: lui a3, 524288555; RV32IFD-NEXT: lui a2, 524288556; RV32IFD-NEXT: beqz s0, .LBB9_2557; RV32IFD-NEXT: # %bb.1:558; RV32IFD-NEXT: mv a2, a1559; RV32IFD-NEXT: .LBB9_2:560; RV32IFD-NEXT: lui a1, %hi(.LCPI9_1)561; RV32IFD-NEXT: fld fa5, %lo(.LCPI9_1)(a1)562; RV32IFD-NEXT: flt.d a1, fa5, fs0563; RV32IFD-NEXT: beqz a1, .LBB9_4564; RV32IFD-NEXT: # %bb.3:565; RV32IFD-NEXT: addi a2, a3, -1566; RV32IFD-NEXT: .LBB9_4:567; RV32IFD-NEXT: feq.d a3, fs0, fs0568; RV32IFD-NEXT: neg a4, a1569; RV32IFD-NEXT: neg a1, s0570; RV32IFD-NEXT: neg a3, a3571; RV32IFD-NEXT: and a0, a1, a0572; RV32IFD-NEXT: and a1, a3, a2573; RV32IFD-NEXT: or a0, a4, a0574; RV32IFD-NEXT: and a0, a3, a0575; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload576; RV32IFD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload577; RV32IFD-NEXT: fld fs0, 0(sp) # 8-byte Folded Reload578; RV32IFD-NEXT: addi sp, sp, 16579; RV32IFD-NEXT: ret580;581; RV64IFD-LABEL: test_trunc_si64:582; RV64IFD: # %bb.0:583; RV64IFD-NEXT: fcvt.l.d a0, fa0, rtz584; RV64IFD-NEXT: feq.d a1, fa0, fa0585; RV64IFD-NEXT: seqz a1, a1586; RV64IFD-NEXT: addi a1, a1, -1587; RV64IFD-NEXT: and a0, a1, a0588; RV64IFD-NEXT: ret589;590; RV32IZFINXZDINX-LABEL: test_trunc_si64:591; RV32IZFINXZDINX: # %bb.0:592; RV32IZFINXZDINX-NEXT: addi sp, sp, -16593; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill594; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill595; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill596; RV32IZFINXZDINX-NEXT: call trunc597; RV32IZFINXZDINX-NEXT: mv s0, a0598; RV32IZFINXZDINX-NEXT: mv s1, a1599; RV32IZFINXZDINX-NEXT: call __fixdfdi600; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI9_0)601; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI9_0)(a2)602; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI9_0)603; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)604; RV32IZFINXZDINX-NEXT: fle.d a3, a4, s0605; RV32IZFINXZDINX-NEXT: lui a4, 524288606; RV32IZFINXZDINX-NEXT: lui a2, 524288607; RV32IZFINXZDINX-NEXT: beqz a3, .LBB9_2608; RV32IZFINXZDINX-NEXT: # %bb.1:609; RV32IZFINXZDINX-NEXT: mv a2, a1610; RV32IZFINXZDINX-NEXT: .LBB9_2:611; RV32IZFINXZDINX-NEXT: lui a1, %hi(.LCPI9_1)612; RV32IZFINXZDINX-NEXT: lw a6, %lo(.LCPI9_1)(a1)613; RV32IZFINXZDINX-NEXT: addi a1, a1, %lo(.LCPI9_1)614; RV32IZFINXZDINX-NEXT: lw a7, 4(a1)615; RV32IZFINXZDINX-NEXT: flt.d a1, a6, s0616; RV32IZFINXZDINX-NEXT: beqz a1, .LBB9_4617; RV32IZFINXZDINX-NEXT: # %bb.3:618; RV32IZFINXZDINX-NEXT: addi a2, a4, -1619; RV32IZFINXZDINX-NEXT: .LBB9_4:620; RV32IZFINXZDINX-NEXT: feq.d a4, s0, s0621; RV32IZFINXZDINX-NEXT: neg a3, a3622; RV32IZFINXZDINX-NEXT: neg a5, a1623; RV32IZFINXZDINX-NEXT: neg a4, a4624; RV32IZFINXZDINX-NEXT: and a0, a3, a0625; RV32IZFINXZDINX-NEXT: and a1, a4, a2626; RV32IZFINXZDINX-NEXT: or a0, a5, a0627; RV32IZFINXZDINX-NEXT: and a0, a4, a0628; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload629; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload630; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload631; RV32IZFINXZDINX-NEXT: addi sp, sp, 16632; RV32IZFINXZDINX-NEXT: ret633;634; RV64IZFINXZDINX-LABEL: test_trunc_si64:635; RV64IZFINXZDINX: # %bb.0:636; RV64IZFINXZDINX-NEXT: fcvt.l.d a1, a0, rtz637; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0638; RV64IZFINXZDINX-NEXT: seqz a0, a0639; RV64IZFINXZDINX-NEXT: addi a0, a0, -1640; RV64IZFINXZDINX-NEXT: and a0, a0, a1641; RV64IZFINXZDINX-NEXT: ret642 %a = call double @llvm.trunc.f64(double %x)643 %b = call i64 @llvm.fptosi.sat.i64.f64(double %a)644 ret i64 %b645}646 647define signext i32 @test_trunc_ui32(double %x) {648; CHECKIFD-LABEL: test_trunc_ui32:649; CHECKIFD: # %bb.0:650; CHECKIFD-NEXT: fcvt.wu.d a0, fa0, rtz651; CHECKIFD-NEXT: feq.d a1, fa0, fa0652; CHECKIFD-NEXT: seqz a1, a1653; CHECKIFD-NEXT: addi a1, a1, -1654; CHECKIFD-NEXT: and a0, a1, a0655; CHECKIFD-NEXT: ret656;657; RV32IZFINXZDINX-LABEL: test_trunc_ui32:658; RV32IZFINXZDINX: # %bb.0:659; RV32IZFINXZDINX-NEXT: fcvt.wu.d a2, a0, rtz660; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a0661; RV32IZFINXZDINX-NEXT: seqz a0, a0662; RV32IZFINXZDINX-NEXT: addi a0, a0, -1663; RV32IZFINXZDINX-NEXT: and a0, a0, a2664; RV32IZFINXZDINX-NEXT: ret665;666; RV64IZFINXZDINX-LABEL: test_trunc_ui32:667; RV64IZFINXZDINX: # %bb.0:668; RV64IZFINXZDINX-NEXT: fcvt.wu.d a1, a0, rtz669; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0670; RV64IZFINXZDINX-NEXT: seqz a0, a0671; RV64IZFINXZDINX-NEXT: addi a0, a0, -1672; RV64IZFINXZDINX-NEXT: and a0, a0, a1673; RV64IZFINXZDINX-NEXT: ret674 %a = call double @llvm.trunc.f64(double %x)675 %b = call i32 @llvm.fptoui.sat.i32.f64(double %a)676 ret i32 %b677}678 679define i64 @test_trunc_ui64(double %x) nounwind {680; RV32IFD-LABEL: test_trunc_ui64:681; RV32IFD: # %bb.0:682; RV32IFD-NEXT: addi sp, sp, -16683; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill684; RV32IFD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill685; RV32IFD-NEXT: sw s1, 4(sp) # 4-byte Folded Spill686; RV32IFD-NEXT: call trunc687; RV32IFD-NEXT: lui a0, %hi(.LCPI11_0)688; RV32IFD-NEXT: fld fa5, %lo(.LCPI11_0)(a0)689; RV32IFD-NEXT: fcvt.d.w fa4, zero690; RV32IFD-NEXT: fle.d a0, fa4, fa0691; RV32IFD-NEXT: flt.d a1, fa5, fa0692; RV32IFD-NEXT: neg s0, a1693; RV32IFD-NEXT: neg s1, a0694; RV32IFD-NEXT: call __fixunsdfdi695; RV32IFD-NEXT: and a0, s1, a0696; RV32IFD-NEXT: and a1, s1, a1697; RV32IFD-NEXT: or a0, s0, a0698; RV32IFD-NEXT: or a1, s0, a1699; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload700; RV32IFD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload701; RV32IFD-NEXT: lw s1, 4(sp) # 4-byte Folded Reload702; RV32IFD-NEXT: addi sp, sp, 16703; RV32IFD-NEXT: ret704;705; RV64IFD-LABEL: test_trunc_ui64:706; RV64IFD: # %bb.0:707; RV64IFD-NEXT: fcvt.lu.d a0, fa0, rtz708; RV64IFD-NEXT: feq.d a1, fa0, fa0709; RV64IFD-NEXT: seqz a1, a1710; RV64IFD-NEXT: addi a1, a1, -1711; RV64IFD-NEXT: and a0, a1, a0712; RV64IFD-NEXT: ret713;714; RV32IZFINXZDINX-LABEL: test_trunc_ui64:715; RV32IZFINXZDINX: # %bb.0:716; RV32IZFINXZDINX-NEXT: addi sp, sp, -16717; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill718; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill719; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill720; RV32IZFINXZDINX-NEXT: sw s2, 0(sp) # 4-byte Folded Spill721; RV32IZFINXZDINX-NEXT: call trunc722; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI11_0)723; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI11_0)(a2)724; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI11_0)725; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)726; RV32IZFINXZDINX-NEXT: mv s0, a0727; RV32IZFINXZDINX-NEXT: mv s1, a1728; RV32IZFINXZDINX-NEXT: flt.d a0, a4, s0729; RV32IZFINXZDINX-NEXT: neg s2, a0730; RV32IZFINXZDINX-NEXT: mv a0, s0731; RV32IZFINXZDINX-NEXT: call __fixunsdfdi732; RV32IZFINXZDINX-NEXT: fle.d a2, zero, s0733; RV32IZFINXZDINX-NEXT: neg a2, a2734; RV32IZFINXZDINX-NEXT: and a0, a2, a0735; RV32IZFINXZDINX-NEXT: and a1, a2, a1736; RV32IZFINXZDINX-NEXT: or a0, s2, a0737; RV32IZFINXZDINX-NEXT: or a1, s2, a1738; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload739; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload740; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload741; RV32IZFINXZDINX-NEXT: lw s2, 0(sp) # 4-byte Folded Reload742; RV32IZFINXZDINX-NEXT: addi sp, sp, 16743; RV32IZFINXZDINX-NEXT: ret744;745; RV64IZFINXZDINX-LABEL: test_trunc_ui64:746; RV64IZFINXZDINX: # %bb.0:747; RV64IZFINXZDINX-NEXT: fcvt.lu.d a1, a0, rtz748; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0749; RV64IZFINXZDINX-NEXT: seqz a0, a0750; RV64IZFINXZDINX-NEXT: addi a0, a0, -1751; RV64IZFINXZDINX-NEXT: and a0, a0, a1752; RV64IZFINXZDINX-NEXT: ret753 %a = call double @llvm.trunc.f64(double %x)754 %b = call i64 @llvm.fptoui.sat.i64.f64(double %a)755 ret i64 %b756}757 758define signext i32 @test_round_si32(double %x) {759; CHECKIFD-LABEL: test_round_si32:760; CHECKIFD: # %bb.0:761; CHECKIFD-NEXT: fcvt.w.d a0, fa0, rmm762; CHECKIFD-NEXT: feq.d a1, fa0, fa0763; CHECKIFD-NEXT: seqz a1, a1764; CHECKIFD-NEXT: addi a1, a1, -1765; CHECKIFD-NEXT: and a0, a1, a0766; CHECKIFD-NEXT: ret767;768; RV32IZFINXZDINX-LABEL: test_round_si32:769; RV32IZFINXZDINX: # %bb.0:770; RV32IZFINXZDINX-NEXT: fcvt.w.d a2, a0, rmm771; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a0772; RV32IZFINXZDINX-NEXT: seqz a0, a0773; RV32IZFINXZDINX-NEXT: addi a0, a0, -1774; RV32IZFINXZDINX-NEXT: and a0, a0, a2775; RV32IZFINXZDINX-NEXT: ret776;777; RV64IZFINXZDINX-LABEL: test_round_si32:778; RV64IZFINXZDINX: # %bb.0:779; RV64IZFINXZDINX-NEXT: fcvt.w.d a1, a0, rmm780; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0781; RV64IZFINXZDINX-NEXT: seqz a0, a0782; RV64IZFINXZDINX-NEXT: addi a0, a0, -1783; RV64IZFINXZDINX-NEXT: and a0, a0, a1784; RV64IZFINXZDINX-NEXT: ret785 %a = call double @llvm.round.f64(double %x)786 %b = call i32 @llvm.fptosi.sat.i32.f64(double %a)787 ret i32 %b788}789 790define i64 @test_round_si64(double %x) nounwind {791; RV32IFD-LABEL: test_round_si64:792; RV32IFD: # %bb.0:793; RV32IFD-NEXT: addi sp, sp, -16794; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill795; RV32IFD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill796; RV32IFD-NEXT: fsd fs0, 0(sp) # 8-byte Folded Spill797; RV32IFD-NEXT: call round798; RV32IFD-NEXT: lui a0, %hi(.LCPI13_0)799; RV32IFD-NEXT: fld fa5, %lo(.LCPI13_0)(a0)800; RV32IFD-NEXT: fmv.d fs0, fa0801; RV32IFD-NEXT: fle.d s0, fa5, fa0802; RV32IFD-NEXT: call __fixdfdi803; RV32IFD-NEXT: lui a3, 524288804; RV32IFD-NEXT: lui a2, 524288805; RV32IFD-NEXT: beqz s0, .LBB13_2806; RV32IFD-NEXT: # %bb.1:807; RV32IFD-NEXT: mv a2, a1808; RV32IFD-NEXT: .LBB13_2:809; RV32IFD-NEXT: lui a1, %hi(.LCPI13_1)810; RV32IFD-NEXT: fld fa5, %lo(.LCPI13_1)(a1)811; RV32IFD-NEXT: flt.d a1, fa5, fs0812; RV32IFD-NEXT: beqz a1, .LBB13_4813; RV32IFD-NEXT: # %bb.3:814; RV32IFD-NEXT: addi a2, a3, -1815; RV32IFD-NEXT: .LBB13_4:816; RV32IFD-NEXT: feq.d a3, fs0, fs0817; RV32IFD-NEXT: neg a4, a1818; RV32IFD-NEXT: neg a1, s0819; RV32IFD-NEXT: neg a3, a3820; RV32IFD-NEXT: and a0, a1, a0821; RV32IFD-NEXT: and a1, a3, a2822; RV32IFD-NEXT: or a0, a4, a0823; RV32IFD-NEXT: and a0, a3, a0824; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload825; RV32IFD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload826; RV32IFD-NEXT: fld fs0, 0(sp) # 8-byte Folded Reload827; RV32IFD-NEXT: addi sp, sp, 16828; RV32IFD-NEXT: ret829;830; RV64IFD-LABEL: test_round_si64:831; RV64IFD: # %bb.0:832; RV64IFD-NEXT: fcvt.l.d a0, fa0, rmm833; RV64IFD-NEXT: feq.d a1, fa0, fa0834; RV64IFD-NEXT: seqz a1, a1835; RV64IFD-NEXT: addi a1, a1, -1836; RV64IFD-NEXT: and a0, a1, a0837; RV64IFD-NEXT: ret838;839; RV32IZFINXZDINX-LABEL: test_round_si64:840; RV32IZFINXZDINX: # %bb.0:841; RV32IZFINXZDINX-NEXT: addi sp, sp, -16842; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill843; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill844; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill845; RV32IZFINXZDINX-NEXT: call round846; RV32IZFINXZDINX-NEXT: mv s0, a0847; RV32IZFINXZDINX-NEXT: mv s1, a1848; RV32IZFINXZDINX-NEXT: call __fixdfdi849; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI13_0)850; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI13_0)(a2)851; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI13_0)852; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)853; RV32IZFINXZDINX-NEXT: fle.d a3, a4, s0854; RV32IZFINXZDINX-NEXT: lui a4, 524288855; RV32IZFINXZDINX-NEXT: lui a2, 524288856; RV32IZFINXZDINX-NEXT: beqz a3, .LBB13_2857; RV32IZFINXZDINX-NEXT: # %bb.1:858; RV32IZFINXZDINX-NEXT: mv a2, a1859; RV32IZFINXZDINX-NEXT: .LBB13_2:860; RV32IZFINXZDINX-NEXT: lui a1, %hi(.LCPI13_1)861; RV32IZFINXZDINX-NEXT: lw a6, %lo(.LCPI13_1)(a1)862; RV32IZFINXZDINX-NEXT: addi a1, a1, %lo(.LCPI13_1)863; RV32IZFINXZDINX-NEXT: lw a7, 4(a1)864; RV32IZFINXZDINX-NEXT: flt.d a1, a6, s0865; RV32IZFINXZDINX-NEXT: beqz a1, .LBB13_4866; RV32IZFINXZDINX-NEXT: # %bb.3:867; RV32IZFINXZDINX-NEXT: addi a2, a4, -1868; RV32IZFINXZDINX-NEXT: .LBB13_4:869; RV32IZFINXZDINX-NEXT: feq.d a4, s0, s0870; RV32IZFINXZDINX-NEXT: neg a3, a3871; RV32IZFINXZDINX-NEXT: neg a5, a1872; RV32IZFINXZDINX-NEXT: neg a4, a4873; RV32IZFINXZDINX-NEXT: and a0, a3, a0874; RV32IZFINXZDINX-NEXT: and a1, a4, a2875; RV32IZFINXZDINX-NEXT: or a0, a5, a0876; RV32IZFINXZDINX-NEXT: and a0, a4, a0877; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload878; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload879; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload880; RV32IZFINXZDINX-NEXT: addi sp, sp, 16881; RV32IZFINXZDINX-NEXT: ret882;883; RV64IZFINXZDINX-LABEL: test_round_si64:884; RV64IZFINXZDINX: # %bb.0:885; RV64IZFINXZDINX-NEXT: fcvt.l.d a1, a0, rmm886; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0887; RV64IZFINXZDINX-NEXT: seqz a0, a0888; RV64IZFINXZDINX-NEXT: addi a0, a0, -1889; RV64IZFINXZDINX-NEXT: and a0, a0, a1890; RV64IZFINXZDINX-NEXT: ret891 %a = call double @llvm.round.f64(double %x)892 %b = call i64 @llvm.fptosi.sat.i64.f64(double %a)893 ret i64 %b894}895 896define signext i32 @test_round_ui32(double %x) {897; CHECKIFD-LABEL: test_round_ui32:898; CHECKIFD: # %bb.0:899; CHECKIFD-NEXT: fcvt.wu.d a0, fa0, rmm900; CHECKIFD-NEXT: feq.d a1, fa0, fa0901; CHECKIFD-NEXT: seqz a1, a1902; CHECKIFD-NEXT: addi a1, a1, -1903; CHECKIFD-NEXT: and a0, a1, a0904; CHECKIFD-NEXT: ret905;906; RV32IZFINXZDINX-LABEL: test_round_ui32:907; RV32IZFINXZDINX: # %bb.0:908; RV32IZFINXZDINX-NEXT: fcvt.wu.d a2, a0, rmm909; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a0910; RV32IZFINXZDINX-NEXT: seqz a0, a0911; RV32IZFINXZDINX-NEXT: addi a0, a0, -1912; RV32IZFINXZDINX-NEXT: and a0, a0, a2913; RV32IZFINXZDINX-NEXT: ret914;915; RV64IZFINXZDINX-LABEL: test_round_ui32:916; RV64IZFINXZDINX: # %bb.0:917; RV64IZFINXZDINX-NEXT: fcvt.wu.d a1, a0, rmm918; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0919; RV64IZFINXZDINX-NEXT: seqz a0, a0920; RV64IZFINXZDINX-NEXT: addi a0, a0, -1921; RV64IZFINXZDINX-NEXT: and a0, a0, a1922; RV64IZFINXZDINX-NEXT: ret923 %a = call double @llvm.round.f64(double %x)924 %b = call i32 @llvm.fptoui.sat.i32.f64(double %a)925 ret i32 %b926}927 928define i64 @test_round_ui64(double %x) nounwind {929; RV32IFD-LABEL: test_round_ui64:930; RV32IFD: # %bb.0:931; RV32IFD-NEXT: addi sp, sp, -16932; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill933; RV32IFD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill934; RV32IFD-NEXT: sw s1, 4(sp) # 4-byte Folded Spill935; RV32IFD-NEXT: call round936; RV32IFD-NEXT: lui a0, %hi(.LCPI15_0)937; RV32IFD-NEXT: fld fa5, %lo(.LCPI15_0)(a0)938; RV32IFD-NEXT: fcvt.d.w fa4, zero939; RV32IFD-NEXT: fle.d a0, fa4, fa0940; RV32IFD-NEXT: flt.d a1, fa5, fa0941; RV32IFD-NEXT: neg s0, a1942; RV32IFD-NEXT: neg s1, a0943; RV32IFD-NEXT: call __fixunsdfdi944; RV32IFD-NEXT: and a0, s1, a0945; RV32IFD-NEXT: and a1, s1, a1946; RV32IFD-NEXT: or a0, s0, a0947; RV32IFD-NEXT: or a1, s0, a1948; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload949; RV32IFD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload950; RV32IFD-NEXT: lw s1, 4(sp) # 4-byte Folded Reload951; RV32IFD-NEXT: addi sp, sp, 16952; RV32IFD-NEXT: ret953;954; RV64IFD-LABEL: test_round_ui64:955; RV64IFD: # %bb.0:956; RV64IFD-NEXT: fcvt.lu.d a0, fa0, rmm957; RV64IFD-NEXT: feq.d a1, fa0, fa0958; RV64IFD-NEXT: seqz a1, a1959; RV64IFD-NEXT: addi a1, a1, -1960; RV64IFD-NEXT: and a0, a1, a0961; RV64IFD-NEXT: ret962;963; RV32IZFINXZDINX-LABEL: test_round_ui64:964; RV32IZFINXZDINX: # %bb.0:965; RV32IZFINXZDINX-NEXT: addi sp, sp, -16966; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill967; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill968; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill969; RV32IZFINXZDINX-NEXT: sw s2, 0(sp) # 4-byte Folded Spill970; RV32IZFINXZDINX-NEXT: call round971; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI15_0)972; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI15_0)(a2)973; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI15_0)974; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)975; RV32IZFINXZDINX-NEXT: mv s0, a0976; RV32IZFINXZDINX-NEXT: mv s1, a1977; RV32IZFINXZDINX-NEXT: flt.d a0, a4, s0978; RV32IZFINXZDINX-NEXT: neg s2, a0979; RV32IZFINXZDINX-NEXT: mv a0, s0980; RV32IZFINXZDINX-NEXT: call __fixunsdfdi981; RV32IZFINXZDINX-NEXT: fle.d a2, zero, s0982; RV32IZFINXZDINX-NEXT: neg a2, a2983; RV32IZFINXZDINX-NEXT: and a0, a2, a0984; RV32IZFINXZDINX-NEXT: and a1, a2, a1985; RV32IZFINXZDINX-NEXT: or a0, s2, a0986; RV32IZFINXZDINX-NEXT: or a1, s2, a1987; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload988; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload989; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload990; RV32IZFINXZDINX-NEXT: lw s2, 0(sp) # 4-byte Folded Reload991; RV32IZFINXZDINX-NEXT: addi sp, sp, 16992; RV32IZFINXZDINX-NEXT: ret993;994; RV64IZFINXZDINX-LABEL: test_round_ui64:995; RV64IZFINXZDINX: # %bb.0:996; RV64IZFINXZDINX-NEXT: fcvt.lu.d a1, a0, rmm997; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0998; RV64IZFINXZDINX-NEXT: seqz a0, a0999; RV64IZFINXZDINX-NEXT: addi a0, a0, -11000; RV64IZFINXZDINX-NEXT: and a0, a0, a11001; RV64IZFINXZDINX-NEXT: ret1002 %a = call double @llvm.round.f64(double %x)1003 %b = call i64 @llvm.fptoui.sat.i64.f64(double %a)1004 ret i64 %b1005}1006 1007define signext i32 @test_roundeven_si32(double %x) {1008; CHECKIFD-LABEL: test_roundeven_si32:1009; CHECKIFD: # %bb.0:1010; CHECKIFD-NEXT: fcvt.w.d a0, fa0, rne1011; CHECKIFD-NEXT: feq.d a1, fa0, fa01012; CHECKIFD-NEXT: seqz a1, a11013; CHECKIFD-NEXT: addi a1, a1, -11014; CHECKIFD-NEXT: and a0, a1, a01015; CHECKIFD-NEXT: ret1016;1017; RV32IZFINXZDINX-LABEL: test_roundeven_si32:1018; RV32IZFINXZDINX: # %bb.0:1019; RV32IZFINXZDINX-NEXT: fcvt.w.d a2, a0, rne1020; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a01021; RV32IZFINXZDINX-NEXT: seqz a0, a01022; RV32IZFINXZDINX-NEXT: addi a0, a0, -11023; RV32IZFINXZDINX-NEXT: and a0, a0, a21024; RV32IZFINXZDINX-NEXT: ret1025;1026; RV64IZFINXZDINX-LABEL: test_roundeven_si32:1027; RV64IZFINXZDINX: # %bb.0:1028; RV64IZFINXZDINX-NEXT: fcvt.w.d a1, a0, rne1029; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a01030; RV64IZFINXZDINX-NEXT: seqz a0, a01031; RV64IZFINXZDINX-NEXT: addi a0, a0, -11032; RV64IZFINXZDINX-NEXT: and a0, a0, a11033; RV64IZFINXZDINX-NEXT: ret1034 %a = call double @llvm.roundeven.f64(double %x)1035 %b = call i32 @llvm.fptosi.sat.i32.f64(double %a)1036 ret i32 %b1037}1038 1039define i64 @test_roundeven_si64(double %x) nounwind {1040; RV32IFD-LABEL: test_roundeven_si64:1041; RV32IFD: # %bb.0:1042; RV32IFD-NEXT: addi sp, sp, -161043; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1044; RV32IFD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1045; RV32IFD-NEXT: fsd fs0, 0(sp) # 8-byte Folded Spill1046; RV32IFD-NEXT: call roundeven1047; RV32IFD-NEXT: lui a0, %hi(.LCPI17_0)1048; RV32IFD-NEXT: fld fa5, %lo(.LCPI17_0)(a0)1049; RV32IFD-NEXT: fmv.d fs0, fa01050; RV32IFD-NEXT: fle.d s0, fa5, fa01051; RV32IFD-NEXT: call __fixdfdi1052; RV32IFD-NEXT: lui a3, 5242881053; RV32IFD-NEXT: lui a2, 5242881054; RV32IFD-NEXT: beqz s0, .LBB17_21055; RV32IFD-NEXT: # %bb.1:1056; RV32IFD-NEXT: mv a2, a11057; RV32IFD-NEXT: .LBB17_2:1058; RV32IFD-NEXT: lui a1, %hi(.LCPI17_1)1059; RV32IFD-NEXT: fld fa5, %lo(.LCPI17_1)(a1)1060; RV32IFD-NEXT: flt.d a1, fa5, fs01061; RV32IFD-NEXT: beqz a1, .LBB17_41062; RV32IFD-NEXT: # %bb.3:1063; RV32IFD-NEXT: addi a2, a3, -11064; RV32IFD-NEXT: .LBB17_4:1065; RV32IFD-NEXT: feq.d a3, fs0, fs01066; RV32IFD-NEXT: neg a4, a11067; RV32IFD-NEXT: neg a1, s01068; RV32IFD-NEXT: neg a3, a31069; RV32IFD-NEXT: and a0, a1, a01070; RV32IFD-NEXT: and a1, a3, a21071; RV32IFD-NEXT: or a0, a4, a01072; RV32IFD-NEXT: and a0, a3, a01073; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1074; RV32IFD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1075; RV32IFD-NEXT: fld fs0, 0(sp) # 8-byte Folded Reload1076; RV32IFD-NEXT: addi sp, sp, 161077; RV32IFD-NEXT: ret1078;1079; RV64IFD-LABEL: test_roundeven_si64:1080; RV64IFD: # %bb.0:1081; RV64IFD-NEXT: fcvt.l.d a0, fa0, rne1082; RV64IFD-NEXT: feq.d a1, fa0, fa01083; RV64IFD-NEXT: seqz a1, a11084; RV64IFD-NEXT: addi a1, a1, -11085; RV64IFD-NEXT: and a0, a1, a01086; RV64IFD-NEXT: ret1087;1088; RV32IZFINXZDINX-LABEL: test_roundeven_si64:1089; RV32IZFINXZDINX: # %bb.0:1090; RV32IZFINXZDINX-NEXT: addi sp, sp, -161091; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1092; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1093; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1094; RV32IZFINXZDINX-NEXT: call roundeven1095; RV32IZFINXZDINX-NEXT: mv s0, a01096; RV32IZFINXZDINX-NEXT: mv s1, a11097; RV32IZFINXZDINX-NEXT: call __fixdfdi1098; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI17_0)1099; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI17_0)(a2)1100; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI17_0)1101; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)1102; RV32IZFINXZDINX-NEXT: fle.d a3, a4, s01103; RV32IZFINXZDINX-NEXT: lui a4, 5242881104; RV32IZFINXZDINX-NEXT: lui a2, 5242881105; RV32IZFINXZDINX-NEXT: beqz a3, .LBB17_21106; RV32IZFINXZDINX-NEXT: # %bb.1:1107; RV32IZFINXZDINX-NEXT: mv a2, a11108; RV32IZFINXZDINX-NEXT: .LBB17_2:1109; RV32IZFINXZDINX-NEXT: lui a1, %hi(.LCPI17_1)1110; RV32IZFINXZDINX-NEXT: lw a6, %lo(.LCPI17_1)(a1)1111; RV32IZFINXZDINX-NEXT: addi a1, a1, %lo(.LCPI17_1)1112; RV32IZFINXZDINX-NEXT: lw a7, 4(a1)1113; RV32IZFINXZDINX-NEXT: flt.d a1, a6, s01114; RV32IZFINXZDINX-NEXT: beqz a1, .LBB17_41115; RV32IZFINXZDINX-NEXT: # %bb.3:1116; RV32IZFINXZDINX-NEXT: addi a2, a4, -11117; RV32IZFINXZDINX-NEXT: .LBB17_4:1118; RV32IZFINXZDINX-NEXT: feq.d a4, s0, s01119; RV32IZFINXZDINX-NEXT: neg a3, a31120; RV32IZFINXZDINX-NEXT: neg a5, a11121; RV32IZFINXZDINX-NEXT: neg a4, a41122; RV32IZFINXZDINX-NEXT: and a0, a3, a01123; RV32IZFINXZDINX-NEXT: and a1, a4, a21124; RV32IZFINXZDINX-NEXT: or a0, a5, a01125; RV32IZFINXZDINX-NEXT: and a0, a4, a01126; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1127; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1128; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1129; RV32IZFINXZDINX-NEXT: addi sp, sp, 161130; RV32IZFINXZDINX-NEXT: ret1131;1132; RV64IZFINXZDINX-LABEL: test_roundeven_si64:1133; RV64IZFINXZDINX: # %bb.0:1134; RV64IZFINXZDINX-NEXT: fcvt.l.d a1, a0, rne1135; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a01136; RV64IZFINXZDINX-NEXT: seqz a0, a01137; RV64IZFINXZDINX-NEXT: addi a0, a0, -11138; RV64IZFINXZDINX-NEXT: and a0, a0, a11139; RV64IZFINXZDINX-NEXT: ret1140 %a = call double @llvm.roundeven.f64(double %x)1141 %b = call i64 @llvm.fptosi.sat.i64.f64(double %a)1142 ret i64 %b1143}1144 1145define signext i32 @test_roundeven_ui32(double %x) {1146; CHECKIFD-LABEL: test_roundeven_ui32:1147; CHECKIFD: # %bb.0:1148; CHECKIFD-NEXT: fcvt.wu.d a0, fa0, rne1149; CHECKIFD-NEXT: feq.d a1, fa0, fa01150; CHECKIFD-NEXT: seqz a1, a11151; CHECKIFD-NEXT: addi a1, a1, -11152; CHECKIFD-NEXT: and a0, a1, a01153; CHECKIFD-NEXT: ret1154;1155; RV32IZFINXZDINX-LABEL: test_roundeven_ui32:1156; RV32IZFINXZDINX: # %bb.0:1157; RV32IZFINXZDINX-NEXT: fcvt.wu.d a2, a0, rne1158; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a01159; RV32IZFINXZDINX-NEXT: seqz a0, a01160; RV32IZFINXZDINX-NEXT: addi a0, a0, -11161; RV32IZFINXZDINX-NEXT: and a0, a0, a21162; RV32IZFINXZDINX-NEXT: ret1163;1164; RV64IZFINXZDINX-LABEL: test_roundeven_ui32:1165; RV64IZFINXZDINX: # %bb.0:1166; RV64IZFINXZDINX-NEXT: fcvt.wu.d a1, a0, rne1167; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a01168; RV64IZFINXZDINX-NEXT: seqz a0, a01169; RV64IZFINXZDINX-NEXT: addi a0, a0, -11170; RV64IZFINXZDINX-NEXT: and a0, a0, a11171; RV64IZFINXZDINX-NEXT: ret1172 %a = call double @llvm.roundeven.f64(double %x)1173 %b = call i32 @llvm.fptoui.sat.i32.f64(double %a)1174 ret i32 %b1175}1176 1177define i64 @test_roundeven_ui64(double %x) nounwind {1178; RV32IFD-LABEL: test_roundeven_ui64:1179; RV32IFD: # %bb.0:1180; RV32IFD-NEXT: addi sp, sp, -161181; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1182; RV32IFD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1183; RV32IFD-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1184; RV32IFD-NEXT: call roundeven1185; RV32IFD-NEXT: lui a0, %hi(.LCPI19_0)1186; RV32IFD-NEXT: fld fa5, %lo(.LCPI19_0)(a0)1187; RV32IFD-NEXT: fcvt.d.w fa4, zero1188; RV32IFD-NEXT: fle.d a0, fa4, fa01189; RV32IFD-NEXT: flt.d a1, fa5, fa01190; RV32IFD-NEXT: neg s0, a11191; RV32IFD-NEXT: neg s1, a01192; RV32IFD-NEXT: call __fixunsdfdi1193; RV32IFD-NEXT: and a0, s1, a01194; RV32IFD-NEXT: and a1, s1, a11195; RV32IFD-NEXT: or a0, s0, a01196; RV32IFD-NEXT: or a1, s0, a11197; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1198; RV32IFD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1199; RV32IFD-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1200; RV32IFD-NEXT: addi sp, sp, 161201; RV32IFD-NEXT: ret1202;1203; RV64IFD-LABEL: test_roundeven_ui64:1204; RV64IFD: # %bb.0:1205; RV64IFD-NEXT: fcvt.lu.d a0, fa0, rne1206; RV64IFD-NEXT: feq.d a1, fa0, fa01207; RV64IFD-NEXT: seqz a1, a11208; RV64IFD-NEXT: addi a1, a1, -11209; RV64IFD-NEXT: and a0, a1, a01210; RV64IFD-NEXT: ret1211;1212; RV32IZFINXZDINX-LABEL: test_roundeven_ui64:1213; RV32IZFINXZDINX: # %bb.0:1214; RV32IZFINXZDINX-NEXT: addi sp, sp, -161215; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1216; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1217; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1218; RV32IZFINXZDINX-NEXT: sw s2, 0(sp) # 4-byte Folded Spill1219; RV32IZFINXZDINX-NEXT: call roundeven1220; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI19_0)1221; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI19_0)(a2)1222; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI19_0)1223; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)1224; RV32IZFINXZDINX-NEXT: mv s0, a01225; RV32IZFINXZDINX-NEXT: mv s1, a11226; RV32IZFINXZDINX-NEXT: flt.d a0, a4, s01227; RV32IZFINXZDINX-NEXT: neg s2, a01228; RV32IZFINXZDINX-NEXT: mv a0, s01229; RV32IZFINXZDINX-NEXT: call __fixunsdfdi1230; RV32IZFINXZDINX-NEXT: fle.d a2, zero, s01231; RV32IZFINXZDINX-NEXT: neg a2, a21232; RV32IZFINXZDINX-NEXT: and a0, a2, a01233; RV32IZFINXZDINX-NEXT: and a1, a2, a11234; RV32IZFINXZDINX-NEXT: or a0, s2, a01235; RV32IZFINXZDINX-NEXT: or a1, s2, a11236; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1237; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1238; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1239; RV32IZFINXZDINX-NEXT: lw s2, 0(sp) # 4-byte Folded Reload1240; RV32IZFINXZDINX-NEXT: addi sp, sp, 161241; RV32IZFINXZDINX-NEXT: ret1242;1243; RV64IZFINXZDINX-LABEL: test_roundeven_ui64:1244; RV64IZFINXZDINX: # %bb.0:1245; RV64IZFINXZDINX-NEXT: fcvt.lu.d a1, a0, rne1246; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a01247; RV64IZFINXZDINX-NEXT: seqz a0, a01248; RV64IZFINXZDINX-NEXT: addi a0, a0, -11249; RV64IZFINXZDINX-NEXT: and a0, a0, a11250; RV64IZFINXZDINX-NEXT: ret1251 %a = call double @llvm.roundeven.f64(double %x)1252 %b = call i64 @llvm.fptoui.sat.i64.f64(double %a)1253 ret i64 %b1254}1255 1256define signext i32 @test_rint_si32(double %x) {1257; CHECKIFD-LABEL: test_rint_si32:1258; CHECKIFD: # %bb.0:1259; CHECKIFD-NEXT: fcvt.w.d a0, fa01260; CHECKIFD-NEXT: feq.d a1, fa0, fa01261; CHECKIFD-NEXT: seqz a1, a11262; CHECKIFD-NEXT: addi a1, a1, -11263; CHECKIFD-NEXT: and a0, a1, a01264; CHECKIFD-NEXT: ret1265;1266; RV32IZFINXZDINX-LABEL: test_rint_si32:1267; RV32IZFINXZDINX: # %bb.0:1268; RV32IZFINXZDINX-NEXT: fcvt.w.d a2, a01269; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a01270; RV32IZFINXZDINX-NEXT: seqz a0, a01271; RV32IZFINXZDINX-NEXT: addi a0, a0, -11272; RV32IZFINXZDINX-NEXT: and a0, a0, a21273; RV32IZFINXZDINX-NEXT: ret1274;1275; RV64IZFINXZDINX-LABEL: test_rint_si32:1276; RV64IZFINXZDINX: # %bb.0:1277; RV64IZFINXZDINX-NEXT: fcvt.w.d a1, a01278; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a01279; RV64IZFINXZDINX-NEXT: seqz a0, a01280; RV64IZFINXZDINX-NEXT: addi a0, a0, -11281; RV64IZFINXZDINX-NEXT: and a0, a0, a11282; RV64IZFINXZDINX-NEXT: ret1283 %a = call double @llvm.rint.f64(double %x)1284 %b = call i32 @llvm.fptosi.sat.i32.f64(double %a)1285 ret i32 %b1286}1287 1288define i64 @test_rint_si64(double %x) nounwind {1289; RV32IFD-LABEL: test_rint_si64:1290; RV32IFD: # %bb.0:1291; RV32IFD-NEXT: addi sp, sp, -161292; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1293; RV32IFD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1294; RV32IFD-NEXT: fsd fs0, 0(sp) # 8-byte Folded Spill1295; RV32IFD-NEXT: call rint1296; RV32IFD-NEXT: lui a0, %hi(.LCPI21_0)1297; RV32IFD-NEXT: fld fa5, %lo(.LCPI21_0)(a0)1298; RV32IFD-NEXT: fmv.d fs0, fa01299; RV32IFD-NEXT: fle.d s0, fa5, fa01300; RV32IFD-NEXT: call __fixdfdi1301; RV32IFD-NEXT: lui a3, 5242881302; RV32IFD-NEXT: lui a2, 5242881303; RV32IFD-NEXT: beqz s0, .LBB21_21304; RV32IFD-NEXT: # %bb.1:1305; RV32IFD-NEXT: mv a2, a11306; RV32IFD-NEXT: .LBB21_2:1307; RV32IFD-NEXT: lui a1, %hi(.LCPI21_1)1308; RV32IFD-NEXT: fld fa5, %lo(.LCPI21_1)(a1)1309; RV32IFD-NEXT: flt.d a1, fa5, fs01310; RV32IFD-NEXT: beqz a1, .LBB21_41311; RV32IFD-NEXT: # %bb.3:1312; RV32IFD-NEXT: addi a2, a3, -11313; RV32IFD-NEXT: .LBB21_4:1314; RV32IFD-NEXT: feq.d a3, fs0, fs01315; RV32IFD-NEXT: neg a4, a11316; RV32IFD-NEXT: neg a1, s01317; RV32IFD-NEXT: neg a3, a31318; RV32IFD-NEXT: and a0, a1, a01319; RV32IFD-NEXT: and a1, a3, a21320; RV32IFD-NEXT: or a0, a4, a01321; RV32IFD-NEXT: and a0, a3, a01322; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1323; RV32IFD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1324; RV32IFD-NEXT: fld fs0, 0(sp) # 8-byte Folded Reload1325; RV32IFD-NEXT: addi sp, sp, 161326; RV32IFD-NEXT: ret1327;1328; RV64IFD-LABEL: test_rint_si64:1329; RV64IFD: # %bb.0:1330; RV64IFD-NEXT: fcvt.l.d a0, fa01331; RV64IFD-NEXT: feq.d a1, fa0, fa01332; RV64IFD-NEXT: seqz a1, a11333; RV64IFD-NEXT: addi a1, a1, -11334; RV64IFD-NEXT: and a0, a1, a01335; RV64IFD-NEXT: ret1336;1337; RV32IZFINXZDINX-LABEL: test_rint_si64:1338; RV32IZFINXZDINX: # %bb.0:1339; RV32IZFINXZDINX-NEXT: addi sp, sp, -161340; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1341; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1342; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1343; RV32IZFINXZDINX-NEXT: call rint1344; RV32IZFINXZDINX-NEXT: mv s0, a01345; RV32IZFINXZDINX-NEXT: mv s1, a11346; RV32IZFINXZDINX-NEXT: call __fixdfdi1347; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI21_0)1348; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI21_0)(a2)1349; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI21_0)1350; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)1351; RV32IZFINXZDINX-NEXT: fle.d a3, a4, s01352; RV32IZFINXZDINX-NEXT: lui a4, 5242881353; RV32IZFINXZDINX-NEXT: lui a2, 5242881354; RV32IZFINXZDINX-NEXT: beqz a3, .LBB21_21355; RV32IZFINXZDINX-NEXT: # %bb.1:1356; RV32IZFINXZDINX-NEXT: mv a2, a11357; RV32IZFINXZDINX-NEXT: .LBB21_2:1358; RV32IZFINXZDINX-NEXT: lui a1, %hi(.LCPI21_1)1359; RV32IZFINXZDINX-NEXT: lw a6, %lo(.LCPI21_1)(a1)1360; RV32IZFINXZDINX-NEXT: addi a1, a1, %lo(.LCPI21_1)1361; RV32IZFINXZDINX-NEXT: lw a7, 4(a1)1362; RV32IZFINXZDINX-NEXT: flt.d a1, a6, s01363; RV32IZFINXZDINX-NEXT: beqz a1, .LBB21_41364; RV32IZFINXZDINX-NEXT: # %bb.3:1365; RV32IZFINXZDINX-NEXT: addi a2, a4, -11366; RV32IZFINXZDINX-NEXT: .LBB21_4:1367; RV32IZFINXZDINX-NEXT: feq.d a4, s0, s01368; RV32IZFINXZDINX-NEXT: neg a3, a31369; RV32IZFINXZDINX-NEXT: neg a5, a11370; RV32IZFINXZDINX-NEXT: neg a4, a41371; RV32IZFINXZDINX-NEXT: and a0, a3, a01372; RV32IZFINXZDINX-NEXT: and a1, a4, a21373; RV32IZFINXZDINX-NEXT: or a0, a5, a01374; RV32IZFINXZDINX-NEXT: and a0, a4, a01375; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1376; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1377; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1378; RV32IZFINXZDINX-NEXT: addi sp, sp, 161379; RV32IZFINXZDINX-NEXT: ret1380;1381; RV64IZFINXZDINX-LABEL: test_rint_si64:1382; RV64IZFINXZDINX: # %bb.0:1383; RV64IZFINXZDINX-NEXT: fcvt.l.d a1, a01384; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a01385; RV64IZFINXZDINX-NEXT: seqz a0, a01386; RV64IZFINXZDINX-NEXT: addi a0, a0, -11387; RV64IZFINXZDINX-NEXT: and a0, a0, a11388; RV64IZFINXZDINX-NEXT: ret1389 %a = call double @llvm.rint.f64(double %x)1390 %b = call i64 @llvm.fptosi.sat.i64.f64(double %a)1391 ret i64 %b1392}1393 1394define signext i32 @test_rint_ui32(double %x) {1395; CHECKIFD-LABEL: test_rint_ui32:1396; CHECKIFD: # %bb.0:1397; CHECKIFD-NEXT: fcvt.wu.d a0, fa01398; CHECKIFD-NEXT: feq.d a1, fa0, fa01399; CHECKIFD-NEXT: seqz a1, a11400; CHECKIFD-NEXT: addi a1, a1, -11401; CHECKIFD-NEXT: and a0, a1, a01402; CHECKIFD-NEXT: ret1403;1404; RV32IZFINXZDINX-LABEL: test_rint_ui32:1405; RV32IZFINXZDINX: # %bb.0:1406; RV32IZFINXZDINX-NEXT: fcvt.wu.d a2, a01407; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a01408; RV32IZFINXZDINX-NEXT: seqz a0, a01409; RV32IZFINXZDINX-NEXT: addi a0, a0, -11410; RV32IZFINXZDINX-NEXT: and a0, a0, a21411; RV32IZFINXZDINX-NEXT: ret1412;1413; RV64IZFINXZDINX-LABEL: test_rint_ui32:1414; RV64IZFINXZDINX: # %bb.0:1415; RV64IZFINXZDINX-NEXT: fcvt.wu.d a1, a01416; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a01417; RV64IZFINXZDINX-NEXT: seqz a0, a01418; RV64IZFINXZDINX-NEXT: addi a0, a0, -11419; RV64IZFINXZDINX-NEXT: and a0, a0, a11420; RV64IZFINXZDINX-NEXT: ret1421 %a = call double @llvm.rint.f64(double %x)1422 %b = call i32 @llvm.fptoui.sat.i32.f64(double %a)1423 ret i32 %b1424}1425 1426define i64 @test_rint_ui64(double %x) nounwind {1427; RV32IFD-LABEL: test_rint_ui64:1428; RV32IFD: # %bb.0:1429; RV32IFD-NEXT: addi sp, sp, -161430; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1431; RV32IFD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1432; RV32IFD-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1433; RV32IFD-NEXT: call rint1434; RV32IFD-NEXT: lui a0, %hi(.LCPI23_0)1435; RV32IFD-NEXT: fld fa5, %lo(.LCPI23_0)(a0)1436; RV32IFD-NEXT: fcvt.d.w fa4, zero1437; RV32IFD-NEXT: fle.d a0, fa4, fa01438; RV32IFD-NEXT: flt.d a1, fa5, fa01439; RV32IFD-NEXT: neg s0, a11440; RV32IFD-NEXT: neg s1, a01441; RV32IFD-NEXT: call __fixunsdfdi1442; RV32IFD-NEXT: and a0, s1, a01443; RV32IFD-NEXT: and a1, s1, a11444; RV32IFD-NEXT: or a0, s0, a01445; RV32IFD-NEXT: or a1, s0, a11446; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1447; RV32IFD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1448; RV32IFD-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1449; RV32IFD-NEXT: addi sp, sp, 161450; RV32IFD-NEXT: ret1451;1452; RV64IFD-LABEL: test_rint_ui64:1453; RV64IFD: # %bb.0:1454; RV64IFD-NEXT: fcvt.lu.d a0, fa01455; RV64IFD-NEXT: feq.d a1, fa0, fa01456; RV64IFD-NEXT: seqz a1, a11457; RV64IFD-NEXT: addi a1, a1, -11458; RV64IFD-NEXT: and a0, a1, a01459; RV64IFD-NEXT: ret1460;1461; RV32IZFINXZDINX-LABEL: test_rint_ui64:1462; RV32IZFINXZDINX: # %bb.0:1463; RV32IZFINXZDINX-NEXT: addi sp, sp, -161464; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1465; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1466; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1467; RV32IZFINXZDINX-NEXT: sw s2, 0(sp) # 4-byte Folded Spill1468; RV32IZFINXZDINX-NEXT: call rint1469; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI23_0)1470; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI23_0)(a2)1471; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI23_0)1472; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)1473; RV32IZFINXZDINX-NEXT: mv s0, a01474; RV32IZFINXZDINX-NEXT: mv s1, a11475; RV32IZFINXZDINX-NEXT: flt.d a0, a4, s01476; RV32IZFINXZDINX-NEXT: neg s2, a01477; RV32IZFINXZDINX-NEXT: mv a0, s01478; RV32IZFINXZDINX-NEXT: call __fixunsdfdi1479; RV32IZFINXZDINX-NEXT: fle.d a2, zero, s01480; RV32IZFINXZDINX-NEXT: neg a2, a21481; RV32IZFINXZDINX-NEXT: and a0, a2, a01482; RV32IZFINXZDINX-NEXT: and a1, a2, a11483; RV32IZFINXZDINX-NEXT: or a0, s2, a01484; RV32IZFINXZDINX-NEXT: or a1, s2, a11485; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1486; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1487; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1488; RV32IZFINXZDINX-NEXT: lw s2, 0(sp) # 4-byte Folded Reload1489; RV32IZFINXZDINX-NEXT: addi sp, sp, 161490; RV32IZFINXZDINX-NEXT: ret1491;1492; RV64IZFINXZDINX-LABEL: test_rint_ui64:1493; RV64IZFINXZDINX: # %bb.0:1494; RV64IZFINXZDINX-NEXT: fcvt.lu.d a1, a01495; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a01496; RV64IZFINXZDINX-NEXT: seqz a0, a01497; RV64IZFINXZDINX-NEXT: addi a0, a0, -11498; RV64IZFINXZDINX-NEXT: and a0, a0, a11499; RV64IZFINXZDINX-NEXT: ret1500 %a = call double @llvm.rint.f64(double %x)1501 %b = call i64 @llvm.fptoui.sat.i64.f64(double %a)1502 ret i64 %b1503}1504 1505