2573 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; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \11; RUN: | FileCheck -check-prefix=RV32I %s12; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \13; RUN: | FileCheck -check-prefix=RV64I %s14 15define float @fcvt_s_d(double %a) nounwind {16; CHECKIFD-LABEL: fcvt_s_d:17; CHECKIFD: # %bb.0:18; CHECKIFD-NEXT: fcvt.s.d fa0, fa019; CHECKIFD-NEXT: ret20;21; RV32IZFINXZDINX-LABEL: fcvt_s_d:22; RV32IZFINXZDINX: # %bb.0:23; RV32IZFINXZDINX-NEXT: fcvt.s.d a0, a024; RV32IZFINXZDINX-NEXT: ret25;26; RV64IZFINXZDINX-LABEL: fcvt_s_d:27; RV64IZFINXZDINX: # %bb.0:28; RV64IZFINXZDINX-NEXT: fcvt.s.d a0, a029; RV64IZFINXZDINX-NEXT: ret30;31; RV32I-LABEL: fcvt_s_d:32; RV32I: # %bb.0:33; RV32I-NEXT: addi sp, sp, -1634; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill35; RV32I-NEXT: call __truncdfsf236; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload37; RV32I-NEXT: addi sp, sp, 1638; RV32I-NEXT: ret39;40; RV64I-LABEL: fcvt_s_d:41; RV64I: # %bb.0:42; RV64I-NEXT: addi sp, sp, -1643; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill44; RV64I-NEXT: call __truncdfsf245; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload46; RV64I-NEXT: addi sp, sp, 1647; RV64I-NEXT: ret48 %1 = fptrunc double %a to float49 ret float %150}51 52define double @fcvt_d_s(float %a) nounwind {53; CHECKIFD-LABEL: fcvt_d_s:54; CHECKIFD: # %bb.0:55; CHECKIFD-NEXT: fcvt.d.s fa0, fa056; CHECKIFD-NEXT: ret57;58; RV32IZFINXZDINX-LABEL: fcvt_d_s:59; RV32IZFINXZDINX: # %bb.0:60; RV32IZFINXZDINX-NEXT: fcvt.d.s a0, a061; RV32IZFINXZDINX-NEXT: ret62;63; RV64IZFINXZDINX-LABEL: fcvt_d_s:64; RV64IZFINXZDINX: # %bb.0:65; RV64IZFINXZDINX-NEXT: fcvt.d.s a0, a066; RV64IZFINXZDINX-NEXT: ret67;68; RV32I-LABEL: fcvt_d_s:69; RV32I: # %bb.0:70; RV32I-NEXT: addi sp, sp, -1671; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill72; RV32I-NEXT: call __extendsfdf273; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload74; RV32I-NEXT: addi sp, sp, 1675; RV32I-NEXT: ret76;77; RV64I-LABEL: fcvt_d_s:78; RV64I: # %bb.0:79; RV64I-NEXT: addi sp, sp, -1680; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill81; RV64I-NEXT: call __extendsfdf282; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload83; RV64I-NEXT: addi sp, sp, 1684; RV64I-NEXT: ret85 %1 = fpext float %a to double86 ret double %187}88 89define i32 @fcvt_w_d(double %a) nounwind {90; CHECKIFD-LABEL: fcvt_w_d:91; CHECKIFD: # %bb.0:92; CHECKIFD-NEXT: fcvt.w.d a0, fa0, rtz93; CHECKIFD-NEXT: ret94;95; RV32IZFINXZDINX-LABEL: fcvt_w_d:96; RV32IZFINXZDINX: # %bb.0:97; RV32IZFINXZDINX-NEXT: fcvt.w.d a0, a0, rtz98; RV32IZFINXZDINX-NEXT: ret99;100; RV64IZFINXZDINX-LABEL: fcvt_w_d:101; RV64IZFINXZDINX: # %bb.0:102; RV64IZFINXZDINX-NEXT: fcvt.w.d a0, a0, rtz103; RV64IZFINXZDINX-NEXT: ret104;105; RV32I-LABEL: fcvt_w_d:106; RV32I: # %bb.0:107; RV32I-NEXT: addi sp, sp, -16108; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill109; RV32I-NEXT: call __fixdfsi110; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload111; RV32I-NEXT: addi sp, sp, 16112; RV32I-NEXT: ret113;114; RV64I-LABEL: fcvt_w_d:115; RV64I: # %bb.0:116; RV64I-NEXT: addi sp, sp, -16117; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill118; RV64I-NEXT: call __fixdfsi119; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload120; RV64I-NEXT: addi sp, sp, 16121; RV64I-NEXT: ret122 %1 = fptosi double %a to i32123 ret i32 %1124}125 126define i32 @fcvt_w_d_sat(double %a) nounwind {127; CHECKIFD-LABEL: fcvt_w_d_sat:128; CHECKIFD: # %bb.0: # %start129; CHECKIFD-NEXT: fcvt.w.d a0, fa0, rtz130; CHECKIFD-NEXT: feq.d a1, fa0, fa0131; CHECKIFD-NEXT: seqz a1, a1132; CHECKIFD-NEXT: addi a1, a1, -1133; CHECKIFD-NEXT: and a0, a1, a0134; CHECKIFD-NEXT: ret135;136; RV32IZFINXZDINX-LABEL: fcvt_w_d_sat:137; RV32IZFINXZDINX: # %bb.0: # %start138; RV32IZFINXZDINX-NEXT: fcvt.w.d a2, a0, rtz139; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a0140; RV32IZFINXZDINX-NEXT: seqz a0, a0141; RV32IZFINXZDINX-NEXT: addi a0, a0, -1142; RV32IZFINXZDINX-NEXT: and a0, a0, a2143; RV32IZFINXZDINX-NEXT: ret144;145; RV64IZFINXZDINX-LABEL: fcvt_w_d_sat:146; RV64IZFINXZDINX: # %bb.0: # %start147; RV64IZFINXZDINX-NEXT: fcvt.w.d a1, a0, rtz148; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0149; RV64IZFINXZDINX-NEXT: seqz a0, a0150; RV64IZFINXZDINX-NEXT: addi a0, a0, -1151; RV64IZFINXZDINX-NEXT: and a0, a0, a1152; RV64IZFINXZDINX-NEXT: ret153;154; RV32I-LABEL: fcvt_w_d_sat:155; RV32I: # %bb.0: # %start156; RV32I-NEXT: addi sp, sp, -32157; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill158; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill159; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill160; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill161; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill162; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill163; RV32I-NEXT: mv s0, a1164; RV32I-NEXT: mv s1, a0165; RV32I-NEXT: lui a3, 269824166; RV32I-NEXT: addi a3, a3, -1167; RV32I-NEXT: lui a2, 1047552168; RV32I-NEXT: call __gtdf2169; RV32I-NEXT: mv s2, a0170; RV32I-NEXT: lui a3, 794112171; RV32I-NEXT: mv a0, s1172; RV32I-NEXT: mv a1, s0173; RV32I-NEXT: li a2, 0174; RV32I-NEXT: call __gedf2175; RV32I-NEXT: mv s4, a0176; RV32I-NEXT: mv a0, s1177; RV32I-NEXT: mv a1, s0178; RV32I-NEXT: call __fixdfsi179; RV32I-NEXT: mv s3, a0180; RV32I-NEXT: lui a0, 524288181; RV32I-NEXT: bgez s4, .LBB3_2182; RV32I-NEXT: # %bb.1: # %start183; RV32I-NEXT: lui s3, 524288184; RV32I-NEXT: .LBB3_2: # %start185; RV32I-NEXT: blez s2, .LBB3_4186; RV32I-NEXT: # %bb.3: # %start187; RV32I-NEXT: addi s3, a0, -1188; RV32I-NEXT: .LBB3_4: # %start189; RV32I-NEXT: mv a0, s1190; RV32I-NEXT: mv a1, s0191; RV32I-NEXT: mv a2, s1192; RV32I-NEXT: mv a3, s0193; RV32I-NEXT: call __unorddf2194; RV32I-NEXT: snez a0, a0195; RV32I-NEXT: addi a0, a0, -1196; RV32I-NEXT: and a0, a0, s3197; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload198; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload199; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload200; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload201; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload202; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload203; RV32I-NEXT: addi sp, sp, 32204; RV32I-NEXT: ret205;206; RV64I-LABEL: fcvt_w_d_sat:207; RV64I: # %bb.0: # %start208; RV64I-NEXT: addi sp, sp, -48209; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill210; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill211; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill212; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill213; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill214; RV64I-NEXT: mv s0, a0215; RV64I-NEXT: li a1, -497216; RV64I-NEXT: slli a1, a1, 53217; RV64I-NEXT: call __gedf2218; RV64I-NEXT: mv s2, a0219; RV64I-NEXT: mv a0, s0220; RV64I-NEXT: call __fixdfdi221; RV64I-NEXT: mv s1, a0222; RV64I-NEXT: lui s3, 524288223; RV64I-NEXT: bgez s2, .LBB3_2224; RV64I-NEXT: # %bb.1: # %start225; RV64I-NEXT: lui s1, 524288226; RV64I-NEXT: .LBB3_2: # %start227; RV64I-NEXT: li a0, 527228; RV64I-NEXT: slli a0, a0, 31229; RV64I-NEXT: addi a0, a0, -1230; RV64I-NEXT: slli a1, a0, 22231; RV64I-NEXT: mv a0, s0232; RV64I-NEXT: call __gtdf2233; RV64I-NEXT: blez a0, .LBB3_4234; RV64I-NEXT: # %bb.3: # %start235; RV64I-NEXT: addiw s1, s3, -1236; RV64I-NEXT: .LBB3_4: # %start237; RV64I-NEXT: mv a0, s0238; RV64I-NEXT: mv a1, s0239; RV64I-NEXT: call __unorddf2240; RV64I-NEXT: snez a0, a0241; RV64I-NEXT: addi a0, a0, -1242; RV64I-NEXT: and a0, a0, s1243; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload244; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload245; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload246; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload247; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload248; RV64I-NEXT: addi sp, sp, 48249; RV64I-NEXT: ret250start:251 %0 = tail call i32 @llvm.fptosi.sat.i32.f64(double %a)252 ret i32 %0253}254 255; For RV64D, fcvt.lu.d is semantically equivalent to fcvt.wu.d in this case256; because fptosi will produce poison if the result doesn't fit into an i32.257define i32 @fcvt_wu_d(double %a) nounwind {258; CHECKIFD-LABEL: fcvt_wu_d:259; CHECKIFD: # %bb.0:260; CHECKIFD-NEXT: fcvt.wu.d a0, fa0, rtz261; CHECKIFD-NEXT: ret262;263; RV32IZFINXZDINX-LABEL: fcvt_wu_d:264; RV32IZFINXZDINX: # %bb.0:265; RV32IZFINXZDINX-NEXT: fcvt.wu.d a0, a0, rtz266; RV32IZFINXZDINX-NEXT: ret267;268; RV64IZFINXZDINX-LABEL: fcvt_wu_d:269; RV64IZFINXZDINX: # %bb.0:270; RV64IZFINXZDINX-NEXT: fcvt.wu.d a0, a0, rtz271; RV64IZFINXZDINX-NEXT: ret272;273; RV32I-LABEL: fcvt_wu_d:274; RV32I: # %bb.0:275; RV32I-NEXT: addi sp, sp, -16276; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill277; RV32I-NEXT: call __fixunsdfsi278; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload279; RV32I-NEXT: addi sp, sp, 16280; RV32I-NEXT: ret281;282; RV64I-LABEL: fcvt_wu_d:283; RV64I: # %bb.0:284; RV64I-NEXT: addi sp, sp, -16285; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill286; RV64I-NEXT: call __fixunsdfsi287; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload288; RV64I-NEXT: addi sp, sp, 16289; RV64I-NEXT: ret290 %1 = fptoui double %a to i32291 ret i32 %1292}293 294; Test where the fptoui has multiple uses, one of which causes a sext to be295; inserted on RV64.296define i32 @fcvt_wu_d_multiple_use(double %x, ptr %y) nounwind {297; CHECKIFD-LABEL: fcvt_wu_d_multiple_use:298; CHECKIFD: # %bb.0:299; CHECKIFD-NEXT: fcvt.wu.d a0, fa0, rtz300; CHECKIFD-NEXT: seqz a1, a0301; CHECKIFD-NEXT: add a0, a0, a1302; CHECKIFD-NEXT: ret303;304; RV32IZFINXZDINX-LABEL: fcvt_wu_d_multiple_use:305; RV32IZFINXZDINX: # %bb.0:306; RV32IZFINXZDINX-NEXT: fcvt.wu.d a0, a0, rtz307; RV32IZFINXZDINX-NEXT: seqz a1, a0308; RV32IZFINXZDINX-NEXT: add a0, a0, a1309; RV32IZFINXZDINX-NEXT: ret310;311; RV64IZFINXZDINX-LABEL: fcvt_wu_d_multiple_use:312; RV64IZFINXZDINX: # %bb.0:313; RV64IZFINXZDINX-NEXT: fcvt.wu.d a0, a0, rtz314; RV64IZFINXZDINX-NEXT: seqz a1, a0315; RV64IZFINXZDINX-NEXT: add a0, a0, a1316; RV64IZFINXZDINX-NEXT: ret317;318; RV32I-LABEL: fcvt_wu_d_multiple_use:319; RV32I: # %bb.0:320; RV32I-NEXT: addi sp, sp, -16321; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill322; RV32I-NEXT: call __fixunsdfsi323; RV32I-NEXT: seqz a1, a0324; RV32I-NEXT: add a0, a0, a1325; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload326; RV32I-NEXT: addi sp, sp, 16327; RV32I-NEXT: ret328;329; RV64I-LABEL: fcvt_wu_d_multiple_use:330; RV64I: # %bb.0:331; RV64I-NEXT: addi sp, sp, -16332; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill333; RV64I-NEXT: call __fixunsdfsi334; RV64I-NEXT: seqz a1, a0335; RV64I-NEXT: add a0, a0, a1336; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload337; RV64I-NEXT: addi sp, sp, 16338; RV64I-NEXT: ret339 %a = fptoui double %x to i32340 %b = icmp eq i32 %a, 0341 %c = select i1 %b, i32 1, i32 %a342 ret i32 %c343}344 345define i32 @fcvt_wu_d_sat(double %a) nounwind {346; RV32IFD-LABEL: fcvt_wu_d_sat:347; RV32IFD: # %bb.0: # %start348; RV32IFD-NEXT: fcvt.wu.d a0, fa0, rtz349; RV32IFD-NEXT: feq.d a1, fa0, fa0350; RV32IFD-NEXT: seqz a1, a1351; RV32IFD-NEXT: addi a1, a1, -1352; RV32IFD-NEXT: and a0, a1, a0353; RV32IFD-NEXT: ret354;355; RV64IFD-LABEL: fcvt_wu_d_sat:356; RV64IFD: # %bb.0: # %start357; RV64IFD-NEXT: fcvt.wu.d a0, fa0, rtz358; RV64IFD-NEXT: feq.d a1, fa0, fa0359; RV64IFD-NEXT: seqz a1, a1360; RV64IFD-NEXT: addi a1, a1, -1361; RV64IFD-NEXT: and a0, a0, a1362; RV64IFD-NEXT: slli a0, a0, 32363; RV64IFD-NEXT: srli a0, a0, 32364; RV64IFD-NEXT: ret365;366; RV32IZFINXZDINX-LABEL: fcvt_wu_d_sat:367; RV32IZFINXZDINX: # %bb.0: # %start368; RV32IZFINXZDINX-NEXT: fcvt.wu.d a2, a0, rtz369; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a0370; RV32IZFINXZDINX-NEXT: seqz a0, a0371; RV32IZFINXZDINX-NEXT: addi a0, a0, -1372; RV32IZFINXZDINX-NEXT: and a0, a0, a2373; RV32IZFINXZDINX-NEXT: ret374;375; RV64IZFINXZDINX-LABEL: fcvt_wu_d_sat:376; RV64IZFINXZDINX: # %bb.0: # %start377; RV64IZFINXZDINX-NEXT: fcvt.wu.d a1, a0, rtz378; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0379; RV64IZFINXZDINX-NEXT: seqz a0, a0380; RV64IZFINXZDINX-NEXT: addi a0, a0, -1381; RV64IZFINXZDINX-NEXT: and a0, a1, a0382; RV64IZFINXZDINX-NEXT: slli a0, a0, 32383; RV64IZFINXZDINX-NEXT: srli a0, a0, 32384; RV64IZFINXZDINX-NEXT: ret385;386; RV32I-LABEL: fcvt_wu_d_sat:387; RV32I: # %bb.0: # %start388; RV32I-NEXT: addi sp, sp, -32389; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill390; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill391; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill392; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill393; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill394; RV32I-NEXT: mv s0, a1395; RV32I-NEXT: mv s1, a0396; RV32I-NEXT: lui a3, 270080397; RV32I-NEXT: addi a3, a3, -1398; RV32I-NEXT: lui a2, 1048064399; RV32I-NEXT: call __gtdf2400; RV32I-NEXT: sgtz a0, a0401; RV32I-NEXT: neg s2, a0402; RV32I-NEXT: mv a0, s1403; RV32I-NEXT: mv a1, s0404; RV32I-NEXT: li a2, 0405; RV32I-NEXT: li a3, 0406; RV32I-NEXT: call __gedf2407; RV32I-NEXT: srli a0, a0, 31408; RV32I-NEXT: addi s3, a0, -1409; RV32I-NEXT: mv a0, s1410; RV32I-NEXT: mv a1, s0411; RV32I-NEXT: call __fixunsdfsi412; RV32I-NEXT: and a0, s3, a0413; RV32I-NEXT: or a0, s2, a0414; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload415; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload416; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload417; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload418; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload419; RV32I-NEXT: addi sp, sp, 32420; RV32I-NEXT: ret421;422; RV64I-LABEL: fcvt_wu_d_sat:423; RV64I: # %bb.0: # %start424; RV64I-NEXT: addi sp, sp, -32425; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill426; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill427; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill428; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill429; RV64I-NEXT: mv s2, a0430; RV64I-NEXT: li a1, 0431; RV64I-NEXT: call __gedf2432; RV64I-NEXT: mv s0, a0433; RV64I-NEXT: mv a0, s2434; RV64I-NEXT: call __fixunsdfdi435; RV64I-NEXT: mv s1, a0436; RV64I-NEXT: li a0, 1055437; RV64I-NEXT: slli a0, a0, 31438; RV64I-NEXT: addi a0, a0, -1439; RV64I-NEXT: slli a1, a0, 21440; RV64I-NEXT: mv a0, s2441; RV64I-NEXT: call __gtdf2442; RV64I-NEXT: blez a0, .LBB6_2443; RV64I-NEXT: # %bb.1: # %start444; RV64I-NEXT: li a0, -1445; RV64I-NEXT: srli a0, a0, 32446; RV64I-NEXT: j .LBB6_3447; RV64I-NEXT: .LBB6_2:448; RV64I-NEXT: srli s0, s0, 63449; RV64I-NEXT: addi a0, s0, -1450; RV64I-NEXT: and a0, a0, s1451; RV64I-NEXT: .LBB6_3: # %start452; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload453; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload454; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload455; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload456; RV64I-NEXT: addi sp, sp, 32457; RV64I-NEXT: ret458start:459 %0 = tail call i32 @llvm.fptoui.sat.i32.f64(double %a)460 ret i32 %0461}462 463define double @fcvt_d_w(i32 %a) nounwind {464; CHECKIFD-LABEL: fcvt_d_w:465; CHECKIFD: # %bb.0:466; CHECKIFD-NEXT: fcvt.d.w fa0, a0467; CHECKIFD-NEXT: ret468;469; RV32IZFINXZDINX-LABEL: fcvt_d_w:470; RV32IZFINXZDINX: # %bb.0:471; RV32IZFINXZDINX-NEXT: fcvt.d.w a0, a0472; RV32IZFINXZDINX-NEXT: ret473;474; RV64IZFINXZDINX-LABEL: fcvt_d_w:475; RV64IZFINXZDINX: # %bb.0:476; RV64IZFINXZDINX-NEXT: fcvt.d.w a0, a0477; RV64IZFINXZDINX-NEXT: ret478;479; RV32I-LABEL: fcvt_d_w:480; RV32I: # %bb.0:481; RV32I-NEXT: addi sp, sp, -16482; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill483; RV32I-NEXT: call __floatsidf484; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload485; RV32I-NEXT: addi sp, sp, 16486; RV32I-NEXT: ret487;488; RV64I-LABEL: fcvt_d_w:489; RV64I: # %bb.0:490; RV64I-NEXT: addi sp, sp, -16491; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill492; RV64I-NEXT: sext.w a0, a0493; RV64I-NEXT: call __floatsidf494; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload495; RV64I-NEXT: addi sp, sp, 16496; RV64I-NEXT: ret497 %1 = sitofp i32 %a to double498 ret double %1499}500 501define double @fcvt_d_w_load(ptr %p) nounwind {502; CHECKIFD-LABEL: fcvt_d_w_load:503; CHECKIFD: # %bb.0:504; CHECKIFD-NEXT: lw a0, 0(a0)505; CHECKIFD-NEXT: fcvt.d.w fa0, a0506; CHECKIFD-NEXT: ret507;508; RV32IZFINXZDINX-LABEL: fcvt_d_w_load:509; RV32IZFINXZDINX: # %bb.0:510; RV32IZFINXZDINX-NEXT: lw a0, 0(a0)511; RV32IZFINXZDINX-NEXT: fcvt.d.w a0, a0512; RV32IZFINXZDINX-NEXT: ret513;514; RV64IZFINXZDINX-LABEL: fcvt_d_w_load:515; RV64IZFINXZDINX: # %bb.0:516; RV64IZFINXZDINX-NEXT: lw a0, 0(a0)517; RV64IZFINXZDINX-NEXT: fcvt.d.w a0, a0518; RV64IZFINXZDINX-NEXT: ret519;520; RV32I-LABEL: fcvt_d_w_load:521; RV32I: # %bb.0:522; RV32I-NEXT: addi sp, sp, -16523; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill524; RV32I-NEXT: lw a0, 0(a0)525; RV32I-NEXT: call __floatsidf526; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload527; RV32I-NEXT: addi sp, sp, 16528; RV32I-NEXT: ret529;530; RV64I-LABEL: fcvt_d_w_load:531; RV64I: # %bb.0:532; RV64I-NEXT: addi sp, sp, -16533; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill534; RV64I-NEXT: lw a0, 0(a0)535; RV64I-NEXT: call __floatsidf536; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload537; RV64I-NEXT: addi sp, sp, 16538; RV64I-NEXT: ret539 %a = load i32, ptr %p540 %1 = sitofp i32 %a to double541 ret double %1542}543 544define double @fcvt_d_wu(i32 %a) nounwind {545; CHECKIFD-LABEL: fcvt_d_wu:546; CHECKIFD: # %bb.0:547; CHECKIFD-NEXT: fcvt.d.wu fa0, a0548; CHECKIFD-NEXT: ret549;550; RV32IZFINXZDINX-LABEL: fcvt_d_wu:551; RV32IZFINXZDINX: # %bb.0:552; RV32IZFINXZDINX-NEXT: fcvt.d.wu a0, a0553; RV32IZFINXZDINX-NEXT: ret554;555; RV64IZFINXZDINX-LABEL: fcvt_d_wu:556; RV64IZFINXZDINX: # %bb.0:557; RV64IZFINXZDINX-NEXT: fcvt.d.wu a0, a0558; RV64IZFINXZDINX-NEXT: ret559;560; RV32I-LABEL: fcvt_d_wu:561; RV32I: # %bb.0:562; RV32I-NEXT: addi sp, sp, -16563; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill564; RV32I-NEXT: call __floatunsidf565; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload566; RV32I-NEXT: addi sp, sp, 16567; RV32I-NEXT: ret568;569; RV64I-LABEL: fcvt_d_wu:570; RV64I: # %bb.0:571; RV64I-NEXT: addi sp, sp, -16572; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill573; RV64I-NEXT: sext.w a0, a0574; RV64I-NEXT: call __floatunsidf575; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload576; RV64I-NEXT: addi sp, sp, 16577; RV64I-NEXT: ret578 %1 = uitofp i32 %a to double579 ret double %1580}581 582define double @fcvt_d_wu_load(ptr %p) nounwind {583; CHECKIFD-LABEL: fcvt_d_wu_load:584; CHECKIFD: # %bb.0:585; CHECKIFD-NEXT: lw a0, 0(a0)586; CHECKIFD-NEXT: fcvt.d.wu fa0, a0587; CHECKIFD-NEXT: ret588;589; RV32IZFINXZDINX-LABEL: fcvt_d_wu_load:590; RV32IZFINXZDINX: # %bb.0:591; RV32IZFINXZDINX-NEXT: lw a0, 0(a0)592; RV32IZFINXZDINX-NEXT: fcvt.d.wu a0, a0593; RV32IZFINXZDINX-NEXT: ret594;595; RV64IZFINXZDINX-LABEL: fcvt_d_wu_load:596; RV64IZFINXZDINX: # %bb.0:597; RV64IZFINXZDINX-NEXT: lw a0, 0(a0)598; RV64IZFINXZDINX-NEXT: fcvt.d.wu a0, a0599; RV64IZFINXZDINX-NEXT: ret600;601; RV32I-LABEL: fcvt_d_wu_load:602; RV32I: # %bb.0:603; RV32I-NEXT: addi sp, sp, -16604; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill605; RV32I-NEXT: lw a0, 0(a0)606; RV32I-NEXT: call __floatunsidf607; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload608; RV32I-NEXT: addi sp, sp, 16609; RV32I-NEXT: ret610;611; RV64I-LABEL: fcvt_d_wu_load:612; RV64I: # %bb.0:613; RV64I-NEXT: addi sp, sp, -16614; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill615; RV64I-NEXT: lw a0, 0(a0)616; RV64I-NEXT: call __floatunsidf617; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload618; RV64I-NEXT: addi sp, sp, 16619; RV64I-NEXT: ret620 %a = load i32, ptr %p621 %1 = uitofp i32 %a to double622 ret double %1623}624 625define i64 @fcvt_l_d(double %a) nounwind {626; RV32IFD-LABEL: fcvt_l_d:627; RV32IFD: # %bb.0:628; RV32IFD-NEXT: addi sp, sp, -16629; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill630; RV32IFD-NEXT: call __fixdfdi631; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload632; RV32IFD-NEXT: addi sp, sp, 16633; RV32IFD-NEXT: ret634;635; RV64IFD-LABEL: fcvt_l_d:636; RV64IFD: # %bb.0:637; RV64IFD-NEXT: fcvt.l.d a0, fa0, rtz638; RV64IFD-NEXT: ret639;640; RV32IZFINXZDINX-LABEL: fcvt_l_d:641; RV32IZFINXZDINX: # %bb.0:642; RV32IZFINXZDINX-NEXT: addi sp, sp, -16643; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill644; RV32IZFINXZDINX-NEXT: call __fixdfdi645; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload646; RV32IZFINXZDINX-NEXT: addi sp, sp, 16647; RV32IZFINXZDINX-NEXT: ret648;649; RV64IZFINXZDINX-LABEL: fcvt_l_d:650; RV64IZFINXZDINX: # %bb.0:651; RV64IZFINXZDINX-NEXT: fcvt.l.d a0, a0, rtz652; RV64IZFINXZDINX-NEXT: ret653;654; RV32I-LABEL: fcvt_l_d:655; RV32I: # %bb.0:656; RV32I-NEXT: addi sp, sp, -16657; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill658; RV32I-NEXT: call __fixdfdi659; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload660; RV32I-NEXT: addi sp, sp, 16661; RV32I-NEXT: ret662;663; RV64I-LABEL: fcvt_l_d:664; RV64I: # %bb.0:665; RV64I-NEXT: addi sp, sp, -16666; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill667; RV64I-NEXT: call __fixdfdi668; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload669; RV64I-NEXT: addi sp, sp, 16670; RV64I-NEXT: ret671 %1 = fptosi double %a to i64672 ret i64 %1673}674 675define i64 @fcvt_l_d_sat(double %a) nounwind {676; RV32IFD-LABEL: fcvt_l_d_sat:677; RV32IFD: # %bb.0: # %start678; RV32IFD-NEXT: addi sp, sp, -16679; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill680; RV32IFD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill681; RV32IFD-NEXT: fsd fs0, 0(sp) # 8-byte Folded Spill682; RV32IFD-NEXT: lui a0, %hi(.LCPI12_0)683; RV32IFD-NEXT: fld fa5, %lo(.LCPI12_0)(a0)684; RV32IFD-NEXT: fmv.d fs0, fa0685; RV32IFD-NEXT: fle.d s0, fa5, fa0686; RV32IFD-NEXT: call __fixdfdi687; RV32IFD-NEXT: lui a3, 524288688; RV32IFD-NEXT: lui a2, 524288689; RV32IFD-NEXT: beqz s0, .LBB12_2690; RV32IFD-NEXT: # %bb.1: # %start691; RV32IFD-NEXT: mv a2, a1692; RV32IFD-NEXT: .LBB12_2: # %start693; RV32IFD-NEXT: lui a1, %hi(.LCPI12_1)694; RV32IFD-NEXT: fld fa5, %lo(.LCPI12_1)(a1)695; RV32IFD-NEXT: flt.d a1, fa5, fs0696; RV32IFD-NEXT: beqz a1, .LBB12_4697; RV32IFD-NEXT: # %bb.3:698; RV32IFD-NEXT: addi a2, a3, -1699; RV32IFD-NEXT: .LBB12_4: # %start700; RV32IFD-NEXT: feq.d a3, fs0, fs0701; RV32IFD-NEXT: neg a4, a1702; RV32IFD-NEXT: neg a1, s0703; RV32IFD-NEXT: neg a3, a3704; RV32IFD-NEXT: and a0, a1, a0705; RV32IFD-NEXT: and a1, a3, a2706; RV32IFD-NEXT: or a0, a4, a0707; RV32IFD-NEXT: and a0, a3, a0708; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload709; RV32IFD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload710; RV32IFD-NEXT: fld fs0, 0(sp) # 8-byte Folded Reload711; RV32IFD-NEXT: addi sp, sp, 16712; RV32IFD-NEXT: ret713;714; RV64IFD-LABEL: fcvt_l_d_sat:715; RV64IFD: # %bb.0: # %start716; RV64IFD-NEXT: fcvt.l.d a0, fa0, rtz717; RV64IFD-NEXT: feq.d a1, fa0, fa0718; RV64IFD-NEXT: seqz a1, a1719; RV64IFD-NEXT: addi a1, a1, -1720; RV64IFD-NEXT: and a0, a1, a0721; RV64IFD-NEXT: ret722;723; RV32IZFINXZDINX-LABEL: fcvt_l_d_sat:724; RV32IZFINXZDINX: # %bb.0: # %start725; RV32IZFINXZDINX-NEXT: addi sp, sp, -16726; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill727; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill728; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill729; RV32IZFINXZDINX-NEXT: sw s2, 0(sp) # 4-byte Folded Spill730; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI12_0)731; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI12_0)(a2)732; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI12_0)733; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)734; RV32IZFINXZDINX-NEXT: mv s1, a1735; RV32IZFINXZDINX-NEXT: mv s0, a0736; RV32IZFINXZDINX-NEXT: fle.d s2, a4, s0737; RV32IZFINXZDINX-NEXT: call __fixdfdi738; RV32IZFINXZDINX-NEXT: lui a3, 524288739; RV32IZFINXZDINX-NEXT: lui a2, 524288740; RV32IZFINXZDINX-NEXT: beqz s2, .LBB12_2741; RV32IZFINXZDINX-NEXT: # %bb.1: # %start742; RV32IZFINXZDINX-NEXT: mv a2, a1743; RV32IZFINXZDINX-NEXT: .LBB12_2: # %start744; RV32IZFINXZDINX-NEXT: lui a1, %hi(.LCPI12_1)745; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI12_1)(a1)746; RV32IZFINXZDINX-NEXT: addi a1, a1, %lo(.LCPI12_1)747; RV32IZFINXZDINX-NEXT: lw a5, 4(a1)748; RV32IZFINXZDINX-NEXT: flt.d a1, a4, s0749; RV32IZFINXZDINX-NEXT: beqz a1, .LBB12_4750; RV32IZFINXZDINX-NEXT: # %bb.3:751; RV32IZFINXZDINX-NEXT: addi a2, a3, -1752; RV32IZFINXZDINX-NEXT: .LBB12_4: # %start753; RV32IZFINXZDINX-NEXT: feq.d a3, s0, s0754; RV32IZFINXZDINX-NEXT: neg a4, a1755; RV32IZFINXZDINX-NEXT: neg a1, s2756; RV32IZFINXZDINX-NEXT: neg a3, a3757; RV32IZFINXZDINX-NEXT: and a0, a1, a0758; RV32IZFINXZDINX-NEXT: and a1, a3, a2759; RV32IZFINXZDINX-NEXT: or a0, a4, a0760; RV32IZFINXZDINX-NEXT: and a0, a3, a0761; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload762; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload763; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload764; RV32IZFINXZDINX-NEXT: lw s2, 0(sp) # 4-byte Folded Reload765; RV32IZFINXZDINX-NEXT: addi sp, sp, 16766; RV32IZFINXZDINX-NEXT: ret767;768; RV64IZFINXZDINX-LABEL: fcvt_l_d_sat:769; RV64IZFINXZDINX: # %bb.0: # %start770; RV64IZFINXZDINX-NEXT: fcvt.l.d a1, a0, rtz771; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0772; RV64IZFINXZDINX-NEXT: seqz a0, a0773; RV64IZFINXZDINX-NEXT: addi a0, a0, -1774; RV64IZFINXZDINX-NEXT: and a0, a0, a1775; RV64IZFINXZDINX-NEXT: ret776;777; RV32I-LABEL: fcvt_l_d_sat:778; RV32I: # %bb.0: # %start779; RV32I-NEXT: addi sp, sp, -32780; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill781; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill782; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill783; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill784; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill785; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill786; RV32I-NEXT: sw s5, 4(sp) # 4-byte Folded Spill787; RV32I-NEXT: mv s0, a1788; RV32I-NEXT: mv s1, a0789; RV32I-NEXT: lui a3, 278016790; RV32I-NEXT: addi a3, a3, -1791; RV32I-NEXT: li a2, -1792; RV32I-NEXT: call __gtdf2793; RV32I-NEXT: mv s2, a0794; RV32I-NEXT: lui a3, 802304795; RV32I-NEXT: mv a0, s1796; RV32I-NEXT: mv a1, s0797; RV32I-NEXT: li a2, 0798; RV32I-NEXT: call __gedf2799; RV32I-NEXT: mv s4, a0800; RV32I-NEXT: mv a0, s1801; RV32I-NEXT: mv a1, s0802; RV32I-NEXT: call __fixdfdi803; RV32I-NEXT: mv s3, a0804; RV32I-NEXT: mv s5, a1805; RV32I-NEXT: lui a0, 524288806; RV32I-NEXT: bgez s4, .LBB12_2807; RV32I-NEXT: # %bb.1: # %start808; RV32I-NEXT: lui s5, 524288809; RV32I-NEXT: .LBB12_2: # %start810; RV32I-NEXT: blez s2, .LBB12_4811; RV32I-NEXT: # %bb.3: # %start812; RV32I-NEXT: addi s5, a0, -1813; RV32I-NEXT: .LBB12_4: # %start814; RV32I-NEXT: mv a0, s1815; RV32I-NEXT: mv a1, s0816; RV32I-NEXT: mv a2, s1817; RV32I-NEXT: mv a3, s0818; RV32I-NEXT: call __unorddf2819; RV32I-NEXT: snez a0, a0820; RV32I-NEXT: srli a1, s4, 31821; RV32I-NEXT: sgtz a2, s2822; RV32I-NEXT: addi a0, a0, -1823; RV32I-NEXT: addi a3, a1, -1824; RV32I-NEXT: and a1, a0, s5825; RV32I-NEXT: and a3, a3, s3826; RV32I-NEXT: neg a2, a2827; RV32I-NEXT: or a2, a2, a3828; RV32I-NEXT: and a0, a0, a2829; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload830; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload831; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload832; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload833; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload834; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload835; RV32I-NEXT: lw s5, 4(sp) # 4-byte Folded Reload836; RV32I-NEXT: addi sp, sp, 32837; RV32I-NEXT: ret838;839; RV64I-LABEL: fcvt_l_d_sat:840; RV64I: # %bb.0: # %start841; RV64I-NEXT: addi sp, sp, -48842; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill843; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill844; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill845; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill846; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill847; RV64I-NEXT: mv s0, a0848; RV64I-NEXT: li a1, -481849; RV64I-NEXT: slli a1, a1, 53850; RV64I-NEXT: call __gedf2851; RV64I-NEXT: mv s2, a0852; RV64I-NEXT: mv a0, s0853; RV64I-NEXT: call __fixdfdi854; RV64I-NEXT: mv s1, a0855; RV64I-NEXT: li s3, -1856; RV64I-NEXT: bgez s2, .LBB12_2857; RV64I-NEXT: # %bb.1: # %start858; RV64I-NEXT: slli s1, s3, 63859; RV64I-NEXT: .LBB12_2: # %start860; RV64I-NEXT: li a0, 543861; RV64I-NEXT: slli a0, a0, 53862; RV64I-NEXT: addi a1, a0, -1863; RV64I-NEXT: mv a0, s0864; RV64I-NEXT: call __gtdf2865; RV64I-NEXT: blez a0, .LBB12_4866; RV64I-NEXT: # %bb.3: # %start867; RV64I-NEXT: srli s1, s3, 1868; RV64I-NEXT: .LBB12_4: # %start869; RV64I-NEXT: mv a0, s0870; RV64I-NEXT: mv a1, s0871; RV64I-NEXT: call __unorddf2872; RV64I-NEXT: snez a0, a0873; RV64I-NEXT: addi a0, a0, -1874; RV64I-NEXT: and a0, a0, s1875; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload876; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload877; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload878; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload879; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload880; RV64I-NEXT: addi sp, sp, 48881; RV64I-NEXT: ret882start:883 %0 = tail call i64 @llvm.fptosi.sat.i64.f64(double %a)884 ret i64 %0885}886 887define i64 @fcvt_lu_d(double %a) nounwind {888; RV32IFD-LABEL: fcvt_lu_d:889; RV32IFD: # %bb.0:890; RV32IFD-NEXT: addi sp, sp, -16891; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill892; RV32IFD-NEXT: call __fixunsdfdi893; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload894; RV32IFD-NEXT: addi sp, sp, 16895; RV32IFD-NEXT: ret896;897; RV64IFD-LABEL: fcvt_lu_d:898; RV64IFD: # %bb.0:899; RV64IFD-NEXT: fcvt.lu.d a0, fa0, rtz900; RV64IFD-NEXT: ret901;902; RV32IZFINXZDINX-LABEL: fcvt_lu_d:903; RV32IZFINXZDINX: # %bb.0:904; RV32IZFINXZDINX-NEXT: addi sp, sp, -16905; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill906; RV32IZFINXZDINX-NEXT: call __fixunsdfdi907; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload908; RV32IZFINXZDINX-NEXT: addi sp, sp, 16909; RV32IZFINXZDINX-NEXT: ret910;911; RV64IZFINXZDINX-LABEL: fcvt_lu_d:912; RV64IZFINXZDINX: # %bb.0:913; RV64IZFINXZDINX-NEXT: fcvt.lu.d a0, a0, rtz914; RV64IZFINXZDINX-NEXT: ret915;916; RV32I-LABEL: fcvt_lu_d:917; RV32I: # %bb.0:918; RV32I-NEXT: addi sp, sp, -16919; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill920; RV32I-NEXT: call __fixunsdfdi921; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload922; RV32I-NEXT: addi sp, sp, 16923; RV32I-NEXT: ret924;925; RV64I-LABEL: fcvt_lu_d:926; RV64I: # %bb.0:927; RV64I-NEXT: addi sp, sp, -16928; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill929; RV64I-NEXT: call __fixunsdfdi930; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload931; RV64I-NEXT: addi sp, sp, 16932; RV64I-NEXT: ret933 %1 = fptoui double %a to i64934 ret i64 %1935}936 937define i64 @fcvt_lu_d_sat(double %a) nounwind {938; RV32IFD-LABEL: fcvt_lu_d_sat:939; RV32IFD: # %bb.0: # %start940; RV32IFD-NEXT: addi sp, sp, -16941; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill942; RV32IFD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill943; RV32IFD-NEXT: fsd fs0, 0(sp) # 8-byte Folded Spill944; RV32IFD-NEXT: fmv.d fs0, fa0945; RV32IFD-NEXT: fcvt.d.w fa5, zero946; RV32IFD-NEXT: fle.d a0, fa5, fa0947; RV32IFD-NEXT: neg s0, a0948; RV32IFD-NEXT: call __fixunsdfdi949; RV32IFD-NEXT: lui a2, %hi(.LCPI14_0)950; RV32IFD-NEXT: fld fa5, %lo(.LCPI14_0)(a2)951; RV32IFD-NEXT: and a0, s0, a0952; RV32IFD-NEXT: and a1, s0, a1953; RV32IFD-NEXT: flt.d a2, fa5, fs0954; RV32IFD-NEXT: neg a2, a2955; RV32IFD-NEXT: or a0, a2, a0956; RV32IFD-NEXT: or a1, a2, a1957; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload958; RV32IFD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload959; RV32IFD-NEXT: fld fs0, 0(sp) # 8-byte Folded Reload960; RV32IFD-NEXT: addi sp, sp, 16961; RV32IFD-NEXT: ret962;963; RV64IFD-LABEL: fcvt_lu_d_sat:964; RV64IFD: # %bb.0: # %start965; RV64IFD-NEXT: fcvt.lu.d a0, fa0, rtz966; RV64IFD-NEXT: feq.d a1, fa0, fa0967; RV64IFD-NEXT: seqz a1, a1968; RV64IFD-NEXT: addi a1, a1, -1969; RV64IFD-NEXT: and a0, a1, a0970; RV64IFD-NEXT: ret971;972; RV32IZFINXZDINX-LABEL: fcvt_lu_d_sat:973; RV32IZFINXZDINX: # %bb.0: # %start974; RV32IZFINXZDINX-NEXT: addi sp, sp, -16975; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill976; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill977; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill978; RV32IZFINXZDINX-NEXT: mv s1, a1979; RV32IZFINXZDINX-NEXT: mv s0, a0980; RV32IZFINXZDINX-NEXT: call __fixunsdfdi981; RV32IZFINXZDINX-NEXT: fle.d a2, zero, s0982; RV32IZFINXZDINX-NEXT: lui a3, %hi(.LCPI14_0)983; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI14_0)(a3)984; RV32IZFINXZDINX-NEXT: addi a3, a3, %lo(.LCPI14_0)985; RV32IZFINXZDINX-NEXT: lw a5, 4(a3)986; RV32IZFINXZDINX-NEXT: neg a2, a2987; RV32IZFINXZDINX-NEXT: and a0, a2, a0988; RV32IZFINXZDINX-NEXT: and a1, a2, a1989; RV32IZFINXZDINX-NEXT: flt.d a2, a4, s0990; RV32IZFINXZDINX-NEXT: neg a2, a2991; RV32IZFINXZDINX-NEXT: or a0, a2, a0992; RV32IZFINXZDINX-NEXT: or a1, a2, a1993; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload994; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload995; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload996; RV32IZFINXZDINX-NEXT: addi sp, sp, 16997; RV32IZFINXZDINX-NEXT: ret998;999; RV64IZFINXZDINX-LABEL: fcvt_lu_d_sat:1000; RV64IZFINXZDINX: # %bb.0: # %start1001; RV64IZFINXZDINX-NEXT: fcvt.lu.d a1, a0, rtz1002; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a01003; RV64IZFINXZDINX-NEXT: seqz a0, a01004; RV64IZFINXZDINX-NEXT: addi a0, a0, -11005; RV64IZFINXZDINX-NEXT: and a0, a0, a11006; RV64IZFINXZDINX-NEXT: ret1007;1008; RV32I-LABEL: fcvt_lu_d_sat:1009; RV32I: # %bb.0: # %start1010; RV32I-NEXT: addi sp, sp, -321011; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1012; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1013; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1014; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1015; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill1016; RV32I-NEXT: mv s0, a11017; RV32I-NEXT: mv s1, a01018; RV32I-NEXT: lui a3, 2782721019; RV32I-NEXT: addi a3, a3, -11020; RV32I-NEXT: li a2, -11021; RV32I-NEXT: call __gtdf21022; RV32I-NEXT: sgtz a0, a01023; RV32I-NEXT: neg s2, a01024; RV32I-NEXT: mv a0, s11025; RV32I-NEXT: mv a1, s01026; RV32I-NEXT: li a2, 01027; RV32I-NEXT: li a3, 01028; RV32I-NEXT: call __gedf21029; RV32I-NEXT: srli a0, a0, 311030; RV32I-NEXT: addi s3, a0, -11031; RV32I-NEXT: mv a0, s11032; RV32I-NEXT: mv a1, s01033; RV32I-NEXT: call __fixunsdfdi1034; RV32I-NEXT: and a0, s3, a01035; RV32I-NEXT: and a1, s3, a11036; RV32I-NEXT: or a0, s2, a01037; RV32I-NEXT: or a1, s2, a11038; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1039; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1040; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1041; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1042; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload1043; RV32I-NEXT: addi sp, sp, 321044; RV32I-NEXT: ret1045;1046; RV64I-LABEL: fcvt_lu_d_sat:1047; RV64I: # %bb.0: # %start1048; RV64I-NEXT: addi sp, sp, -321049; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1050; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1051; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1052; RV64I-NEXT: mv s0, a01053; RV64I-NEXT: li a1, 01054; RV64I-NEXT: call __gedf21055; RV64I-NEXT: srli a0, a0, 631056; RV64I-NEXT: addi s1, a0, -11057; RV64I-NEXT: mv a0, s01058; RV64I-NEXT: call __fixunsdfdi1059; RV64I-NEXT: and s1, s1, a01060; RV64I-NEXT: li a0, 10871061; RV64I-NEXT: slli a0, a0, 521062; RV64I-NEXT: addi a1, a0, -11063; RV64I-NEXT: mv a0, s01064; RV64I-NEXT: call __gtdf21065; RV64I-NEXT: sgtz a0, a01066; RV64I-NEXT: neg a0, a01067; RV64I-NEXT: or a0, a0, s11068; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1069; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1070; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1071; RV64I-NEXT: addi sp, sp, 321072; RV64I-NEXT: ret1073start:1074 %0 = tail call i64 @llvm.fptoui.sat.i64.f64(double %a)1075 ret i64 %01076}1077 1078define i64 @fmv_x_d(double %a, double %b) nounwind {1079; RV32IFD-LABEL: fmv_x_d:1080; RV32IFD: # %bb.0:1081; RV32IFD-NEXT: addi sp, sp, -161082; RV32IFD-NEXT: fadd.d fa5, fa0, fa11083; RV32IFD-NEXT: fsd fa5, 8(sp)1084; RV32IFD-NEXT: lw a0, 8(sp)1085; RV32IFD-NEXT: lw a1, 12(sp)1086; RV32IFD-NEXT: addi sp, sp, 161087; RV32IFD-NEXT: ret1088;1089; RV64IFD-LABEL: fmv_x_d:1090; RV64IFD: # %bb.0:1091; RV64IFD-NEXT: fadd.d fa5, fa0, fa11092; RV64IFD-NEXT: fmv.x.d a0, fa51093; RV64IFD-NEXT: ret1094;1095; RV32IZFINXZDINX-LABEL: fmv_x_d:1096; RV32IZFINXZDINX: # %bb.0:1097; RV32IZFINXZDINX-NEXT: fadd.d a0, a0, a21098; RV32IZFINXZDINX-NEXT: ret1099;1100; RV64IZFINXZDINX-LABEL: fmv_x_d:1101; RV64IZFINXZDINX: # %bb.0:1102; RV64IZFINXZDINX-NEXT: fadd.d a0, a0, a11103; RV64IZFINXZDINX-NEXT: ret1104;1105; RV32I-LABEL: fmv_x_d:1106; RV32I: # %bb.0:1107; RV32I-NEXT: addi sp, sp, -161108; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1109; RV32I-NEXT: call __adddf31110; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1111; RV32I-NEXT: addi sp, sp, 161112; RV32I-NEXT: ret1113;1114; RV64I-LABEL: fmv_x_d:1115; RV64I: # %bb.0:1116; RV64I-NEXT: addi sp, sp, -161117; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1118; RV64I-NEXT: call __adddf31119; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1120; RV64I-NEXT: addi sp, sp, 161121; RV64I-NEXT: ret1122 %1 = fadd double %a, %b1123 %2 = bitcast double %1 to i641124 ret i64 %21125}1126 1127define double @fcvt_d_l(i64 %a) nounwind {1128; RV32IFD-LABEL: fcvt_d_l:1129; RV32IFD: # %bb.0:1130; RV32IFD-NEXT: addi sp, sp, -161131; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1132; RV32IFD-NEXT: call __floatdidf1133; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1134; RV32IFD-NEXT: addi sp, sp, 161135; RV32IFD-NEXT: ret1136;1137; RV64IFD-LABEL: fcvt_d_l:1138; RV64IFD: # %bb.0:1139; RV64IFD-NEXT: fcvt.d.l fa0, a01140; RV64IFD-NEXT: ret1141;1142; RV32IZFINXZDINX-LABEL: fcvt_d_l:1143; RV32IZFINXZDINX: # %bb.0:1144; RV32IZFINXZDINX-NEXT: addi sp, sp, -161145; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1146; RV32IZFINXZDINX-NEXT: call __floatdidf1147; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1148; RV32IZFINXZDINX-NEXT: addi sp, sp, 161149; RV32IZFINXZDINX-NEXT: ret1150;1151; RV64IZFINXZDINX-LABEL: fcvt_d_l:1152; RV64IZFINXZDINX: # %bb.0:1153; RV64IZFINXZDINX-NEXT: fcvt.d.l a0, a01154; RV64IZFINXZDINX-NEXT: ret1155;1156; RV32I-LABEL: fcvt_d_l:1157; RV32I: # %bb.0:1158; RV32I-NEXT: addi sp, sp, -161159; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1160; RV32I-NEXT: call __floatdidf1161; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1162; RV32I-NEXT: addi sp, sp, 161163; RV32I-NEXT: ret1164;1165; RV64I-LABEL: fcvt_d_l:1166; RV64I: # %bb.0:1167; RV64I-NEXT: addi sp, sp, -161168; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1169; RV64I-NEXT: call __floatdidf1170; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1171; RV64I-NEXT: addi sp, sp, 161172; RV64I-NEXT: ret1173 %1 = sitofp i64 %a to double1174 ret double %11175}1176 1177define double @fcvt_d_lu(i64 %a) nounwind {1178; RV32IFD-LABEL: fcvt_d_lu:1179; RV32IFD: # %bb.0:1180; RV32IFD-NEXT: addi sp, sp, -161181; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1182; RV32IFD-NEXT: call __floatundidf1183; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1184; RV32IFD-NEXT: addi sp, sp, 161185; RV32IFD-NEXT: ret1186;1187; RV64IFD-LABEL: fcvt_d_lu:1188; RV64IFD: # %bb.0:1189; RV64IFD-NEXT: fcvt.d.lu fa0, a01190; RV64IFD-NEXT: ret1191;1192; RV32IZFINXZDINX-LABEL: fcvt_d_lu:1193; RV32IZFINXZDINX: # %bb.0:1194; RV32IZFINXZDINX-NEXT: addi sp, sp, -161195; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1196; RV32IZFINXZDINX-NEXT: call __floatundidf1197; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1198; RV32IZFINXZDINX-NEXT: addi sp, sp, 161199; RV32IZFINXZDINX-NEXT: ret1200;1201; RV64IZFINXZDINX-LABEL: fcvt_d_lu:1202; RV64IZFINXZDINX: # %bb.0:1203; RV64IZFINXZDINX-NEXT: fcvt.d.lu a0, a01204; RV64IZFINXZDINX-NEXT: ret1205;1206; RV32I-LABEL: fcvt_d_lu:1207; RV32I: # %bb.0:1208; RV32I-NEXT: addi sp, sp, -161209; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1210; RV32I-NEXT: call __floatundidf1211; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1212; RV32I-NEXT: addi sp, sp, 161213; RV32I-NEXT: ret1214;1215; RV64I-LABEL: fcvt_d_lu:1216; RV64I: # %bb.0:1217; RV64I-NEXT: addi sp, sp, -161218; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1219; RV64I-NEXT: call __floatundidf1220; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1221; RV64I-NEXT: addi sp, sp, 161222; RV64I-NEXT: ret1223 %1 = uitofp i64 %a to double1224 ret double %11225}1226 1227define double @fmv_d_x(i64 %a, i64 %b) nounwind {1228; Ensure fmv.w.x is generated even for a soft double calling convention1229; RV32IFD-LABEL: fmv_d_x:1230; RV32IFD: # %bb.0:1231; RV32IFD-NEXT: addi sp, sp, -161232; RV32IFD-NEXT: sw a0, 8(sp)1233; RV32IFD-NEXT: sw a1, 12(sp)1234; RV32IFD-NEXT: fld fa5, 8(sp)1235; RV32IFD-NEXT: sw a2, 8(sp)1236; RV32IFD-NEXT: sw a3, 12(sp)1237; RV32IFD-NEXT: fld fa4, 8(sp)1238; RV32IFD-NEXT: fadd.d fa0, fa5, fa41239; RV32IFD-NEXT: addi sp, sp, 161240; RV32IFD-NEXT: ret1241;1242; RV64IFD-LABEL: fmv_d_x:1243; RV64IFD: # %bb.0:1244; RV64IFD-NEXT: fmv.d.x fa5, a01245; RV64IFD-NEXT: fmv.d.x fa4, a11246; RV64IFD-NEXT: fadd.d fa0, fa5, fa41247; RV64IFD-NEXT: ret1248;1249; RV32IZFINXZDINX-LABEL: fmv_d_x:1250; RV32IZFINXZDINX: # %bb.0:1251; RV32IZFINXZDINX-NEXT: fadd.d a0, a0, a21252; RV32IZFINXZDINX-NEXT: ret1253;1254; RV64IZFINXZDINX-LABEL: fmv_d_x:1255; RV64IZFINXZDINX: # %bb.0:1256; RV64IZFINXZDINX-NEXT: fadd.d a0, a0, a11257; RV64IZFINXZDINX-NEXT: ret1258;1259; RV32I-LABEL: fmv_d_x:1260; RV32I: # %bb.0:1261; RV32I-NEXT: addi sp, sp, -161262; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1263; RV32I-NEXT: call __adddf31264; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1265; RV32I-NEXT: addi sp, sp, 161266; RV32I-NEXT: ret1267;1268; RV64I-LABEL: fmv_d_x:1269; RV64I: # %bb.0:1270; RV64I-NEXT: addi sp, sp, -161271; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1272; RV64I-NEXT: call __adddf31273; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1274; RV64I-NEXT: addi sp, sp, 161275; RV64I-NEXT: ret1276 %1 = bitcast i64 %a to double1277 %2 = bitcast i64 %b to double1278 %3 = fadd double %1, %21279 ret double %31280}1281 1282define double @fcvt_d_w_i8(i8 signext %a) nounwind {1283; CHECKIFD-LABEL: fcvt_d_w_i8:1284; CHECKIFD: # %bb.0:1285; CHECKIFD-NEXT: fcvt.d.w fa0, a01286; CHECKIFD-NEXT: ret1287;1288; RV32IZFINXZDINX-LABEL: fcvt_d_w_i8:1289; RV32IZFINXZDINX: # %bb.0:1290; RV32IZFINXZDINX-NEXT: fcvt.d.w a0, a01291; RV32IZFINXZDINX-NEXT: ret1292;1293; RV64IZFINXZDINX-LABEL: fcvt_d_w_i8:1294; RV64IZFINXZDINX: # %bb.0:1295; RV64IZFINXZDINX-NEXT: fcvt.d.w a0, a01296; RV64IZFINXZDINX-NEXT: ret1297;1298; RV32I-LABEL: fcvt_d_w_i8:1299; RV32I: # %bb.0:1300; RV32I-NEXT: addi sp, sp, -161301; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1302; RV32I-NEXT: call __floatsidf1303; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1304; RV32I-NEXT: addi sp, sp, 161305; RV32I-NEXT: ret1306;1307; RV64I-LABEL: fcvt_d_w_i8:1308; RV64I: # %bb.0:1309; RV64I-NEXT: addi sp, sp, -161310; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1311; RV64I-NEXT: call __floatsidf1312; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1313; RV64I-NEXT: addi sp, sp, 161314; RV64I-NEXT: ret1315 %1 = sitofp i8 %a to double1316 ret double %11317}1318 1319define double @fcvt_d_wu_i8(i8 zeroext %a) nounwind {1320; CHECKIFD-LABEL: fcvt_d_wu_i8:1321; CHECKIFD: # %bb.0:1322; CHECKIFD-NEXT: fcvt.d.wu fa0, a01323; CHECKIFD-NEXT: ret1324;1325; RV32IZFINXZDINX-LABEL: fcvt_d_wu_i8:1326; RV32IZFINXZDINX: # %bb.0:1327; RV32IZFINXZDINX-NEXT: fcvt.d.wu a0, a01328; RV32IZFINXZDINX-NEXT: ret1329;1330; RV64IZFINXZDINX-LABEL: fcvt_d_wu_i8:1331; RV64IZFINXZDINX: # %bb.0:1332; RV64IZFINXZDINX-NEXT: fcvt.d.wu a0, a01333; RV64IZFINXZDINX-NEXT: ret1334;1335; RV32I-LABEL: fcvt_d_wu_i8:1336; RV32I: # %bb.0:1337; RV32I-NEXT: addi sp, sp, -161338; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1339; RV32I-NEXT: call __floatunsidf1340; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1341; RV32I-NEXT: addi sp, sp, 161342; RV32I-NEXT: ret1343;1344; RV64I-LABEL: fcvt_d_wu_i8:1345; RV64I: # %bb.0:1346; RV64I-NEXT: addi sp, sp, -161347; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1348; RV64I-NEXT: call __floatunsidf1349; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1350; RV64I-NEXT: addi sp, sp, 161351; RV64I-NEXT: ret1352 %1 = uitofp i8 %a to double1353 ret double %11354}1355 1356define double @fcvt_d_w_i16(i16 signext %a) nounwind {1357; CHECKIFD-LABEL: fcvt_d_w_i16:1358; CHECKIFD: # %bb.0:1359; CHECKIFD-NEXT: fcvt.d.w fa0, a01360; CHECKIFD-NEXT: ret1361;1362; RV32IZFINXZDINX-LABEL: fcvt_d_w_i16:1363; RV32IZFINXZDINX: # %bb.0:1364; RV32IZFINXZDINX-NEXT: fcvt.d.w a0, a01365; RV32IZFINXZDINX-NEXT: ret1366;1367; RV64IZFINXZDINX-LABEL: fcvt_d_w_i16:1368; RV64IZFINXZDINX: # %bb.0:1369; RV64IZFINXZDINX-NEXT: fcvt.d.w a0, a01370; RV64IZFINXZDINX-NEXT: ret1371;1372; RV32I-LABEL: fcvt_d_w_i16:1373; RV32I: # %bb.0:1374; RV32I-NEXT: addi sp, sp, -161375; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1376; RV32I-NEXT: call __floatsidf1377; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1378; RV32I-NEXT: addi sp, sp, 161379; RV32I-NEXT: ret1380;1381; RV64I-LABEL: fcvt_d_w_i16:1382; RV64I: # %bb.0:1383; RV64I-NEXT: addi sp, sp, -161384; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1385; RV64I-NEXT: call __floatsidf1386; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1387; RV64I-NEXT: addi sp, sp, 161388; RV64I-NEXT: ret1389 %1 = sitofp i16 %a to double1390 ret double %11391}1392 1393define double @fcvt_d_wu_i16(i16 zeroext %a) nounwind {1394; CHECKIFD-LABEL: fcvt_d_wu_i16:1395; CHECKIFD: # %bb.0:1396; CHECKIFD-NEXT: fcvt.d.wu fa0, a01397; CHECKIFD-NEXT: ret1398;1399; RV32IZFINXZDINX-LABEL: fcvt_d_wu_i16:1400; RV32IZFINXZDINX: # %bb.0:1401; RV32IZFINXZDINX-NEXT: fcvt.d.wu a0, a01402; RV32IZFINXZDINX-NEXT: ret1403;1404; RV64IZFINXZDINX-LABEL: fcvt_d_wu_i16:1405; RV64IZFINXZDINX: # %bb.0:1406; RV64IZFINXZDINX-NEXT: fcvt.d.wu a0, a01407; RV64IZFINXZDINX-NEXT: ret1408;1409; RV32I-LABEL: fcvt_d_wu_i16:1410; RV32I: # %bb.0:1411; RV32I-NEXT: addi sp, sp, -161412; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1413; RV32I-NEXT: call __floatunsidf1414; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1415; RV32I-NEXT: addi sp, sp, 161416; RV32I-NEXT: ret1417;1418; RV64I-LABEL: fcvt_d_wu_i16:1419; RV64I: # %bb.0:1420; RV64I-NEXT: addi sp, sp, -161421; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1422; RV64I-NEXT: call __floatunsidf1423; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1424; RV64I-NEXT: addi sp, sp, 161425; RV64I-NEXT: ret1426 %1 = uitofp i16 %a to double1427 ret double %11428}1429 1430; Make sure we select W version of addi on RV64.1431define signext i32 @fcvt_d_w_demanded_bits(i32 signext %0, ptr %1) nounwind {1432; RV32IFD-LABEL: fcvt_d_w_demanded_bits:1433; RV32IFD: # %bb.0:1434; RV32IFD-NEXT: addi a0, a0, 11435; RV32IFD-NEXT: fcvt.d.w fa5, a01436; RV32IFD-NEXT: fsd fa5, 0(a1)1437; RV32IFD-NEXT: ret1438;1439; RV64IFD-LABEL: fcvt_d_w_demanded_bits:1440; RV64IFD: # %bb.0:1441; RV64IFD-NEXT: addiw a0, a0, 11442; RV64IFD-NEXT: fcvt.d.w fa5, a01443; RV64IFD-NEXT: fsd fa5, 0(a1)1444; RV64IFD-NEXT: ret1445;1446; RV32IZFINXZDINX-LABEL: fcvt_d_w_demanded_bits:1447; RV32IZFINXZDINX: # %bb.0:1448; RV32IZFINXZDINX-NEXT: addi a0, a0, 11449; RV32IZFINXZDINX-NEXT: fcvt.d.w a2, a01450; RV32IZFINXZDINX-NEXT: sw a2, 0(a1)1451; RV32IZFINXZDINX-NEXT: sw a3, 4(a1)1452; RV32IZFINXZDINX-NEXT: ret1453;1454; RV64IZFINXZDINX-LABEL: fcvt_d_w_demanded_bits:1455; RV64IZFINXZDINX: # %bb.0:1456; RV64IZFINXZDINX-NEXT: addiw a0, a0, 11457; RV64IZFINXZDINX-NEXT: fcvt.d.w a2, a01458; RV64IZFINXZDINX-NEXT: sd a2, 0(a1)1459; RV64IZFINXZDINX-NEXT: ret1460;1461; RV32I-LABEL: fcvt_d_w_demanded_bits:1462; RV32I: # %bb.0:1463; RV32I-NEXT: addi sp, sp, -161464; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1465; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1466; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1467; RV32I-NEXT: mv s0, a11468; RV32I-NEXT: addi s1, a0, 11469; RV32I-NEXT: mv a0, s11470; RV32I-NEXT: call __floatsidf1471; RV32I-NEXT: sw a0, 0(s0)1472; RV32I-NEXT: sw a1, 4(s0)1473; RV32I-NEXT: mv a0, s11474; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1475; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1476; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1477; RV32I-NEXT: addi sp, sp, 161478; RV32I-NEXT: ret1479;1480; RV64I-LABEL: fcvt_d_w_demanded_bits:1481; RV64I: # %bb.0:1482; RV64I-NEXT: addi sp, sp, -321483; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1484; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1485; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1486; RV64I-NEXT: mv s0, a11487; RV64I-NEXT: addiw s1, a0, 11488; RV64I-NEXT: mv a0, s11489; RV64I-NEXT: call __floatsidf1490; RV64I-NEXT: sd a0, 0(s0)1491; RV64I-NEXT: mv a0, s11492; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1493; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1494; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1495; RV64I-NEXT: addi sp, sp, 321496; RV64I-NEXT: ret1497 %3 = add i32 %0, 11498 %4 = sitofp i32 %3 to double1499 store double %4, ptr %1, align 81500 ret i32 %31501}1502 1503; Make sure we select W version of addi on RV64.1504define signext i32 @fcvt_d_wu_demanded_bits(i32 signext %0, ptr %1) nounwind {1505; RV32IFD-LABEL: fcvt_d_wu_demanded_bits:1506; RV32IFD: # %bb.0:1507; RV32IFD-NEXT: addi a0, a0, 11508; RV32IFD-NEXT: fcvt.d.wu fa5, a01509; RV32IFD-NEXT: fsd fa5, 0(a1)1510; RV32IFD-NEXT: ret1511;1512; RV64IFD-LABEL: fcvt_d_wu_demanded_bits:1513; RV64IFD: # %bb.0:1514; RV64IFD-NEXT: addiw a0, a0, 11515; RV64IFD-NEXT: fcvt.d.wu fa5, a01516; RV64IFD-NEXT: fsd fa5, 0(a1)1517; RV64IFD-NEXT: ret1518;1519; RV32IZFINXZDINX-LABEL: fcvt_d_wu_demanded_bits:1520; RV32IZFINXZDINX: # %bb.0:1521; RV32IZFINXZDINX-NEXT: addi a0, a0, 11522; RV32IZFINXZDINX-NEXT: fcvt.d.wu a2, a01523; RV32IZFINXZDINX-NEXT: sw a2, 0(a1)1524; RV32IZFINXZDINX-NEXT: sw a3, 4(a1)1525; RV32IZFINXZDINX-NEXT: ret1526;1527; RV64IZFINXZDINX-LABEL: fcvt_d_wu_demanded_bits:1528; RV64IZFINXZDINX: # %bb.0:1529; RV64IZFINXZDINX-NEXT: addiw a0, a0, 11530; RV64IZFINXZDINX-NEXT: fcvt.d.wu a2, a01531; RV64IZFINXZDINX-NEXT: sd a2, 0(a1)1532; RV64IZFINXZDINX-NEXT: ret1533;1534; RV32I-LABEL: fcvt_d_wu_demanded_bits:1535; RV32I: # %bb.0:1536; RV32I-NEXT: addi sp, sp, -161537; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1538; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1539; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1540; RV32I-NEXT: mv s0, a11541; RV32I-NEXT: addi s1, a0, 11542; RV32I-NEXT: mv a0, s11543; RV32I-NEXT: call __floatunsidf1544; RV32I-NEXT: sw a0, 0(s0)1545; RV32I-NEXT: sw a1, 4(s0)1546; RV32I-NEXT: mv a0, s11547; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1548; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1549; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1550; RV32I-NEXT: addi sp, sp, 161551; RV32I-NEXT: ret1552;1553; RV64I-LABEL: fcvt_d_wu_demanded_bits:1554; RV64I: # %bb.0:1555; RV64I-NEXT: addi sp, sp, -321556; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1557; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1558; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1559; RV64I-NEXT: mv s0, a11560; RV64I-NEXT: addiw s1, a0, 11561; RV64I-NEXT: mv a0, s11562; RV64I-NEXT: call __floatunsidf1563; RV64I-NEXT: sd a0, 0(s0)1564; RV64I-NEXT: mv a0, s11565; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1566; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1567; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1568; RV64I-NEXT: addi sp, sp, 321569; RV64I-NEXT: ret1570 %3 = add i32 %0, 11571 %4 = uitofp i32 %3 to double1572 store double %4, ptr %1, align 81573 ret i32 %31574}1575 1576define signext i16 @fcvt_w_s_i16(double %a) nounwind {1577; RV32IFD-LABEL: fcvt_w_s_i16:1578; RV32IFD: # %bb.0:1579; RV32IFD-NEXT: fcvt.w.d a0, fa0, rtz1580; RV32IFD-NEXT: ret1581;1582; RV64IFD-LABEL: fcvt_w_s_i16:1583; RV64IFD: # %bb.0:1584; RV64IFD-NEXT: fcvt.l.d a0, fa0, rtz1585; RV64IFD-NEXT: ret1586;1587; RV32IZFINXZDINX-LABEL: fcvt_w_s_i16:1588; RV32IZFINXZDINX: # %bb.0:1589; RV32IZFINXZDINX-NEXT: fcvt.w.d a0, a0, rtz1590; RV32IZFINXZDINX-NEXT: ret1591;1592; RV64IZFINXZDINX-LABEL: fcvt_w_s_i16:1593; RV64IZFINXZDINX: # %bb.0:1594; RV64IZFINXZDINX-NEXT: fcvt.l.d a0, a0, rtz1595; RV64IZFINXZDINX-NEXT: ret1596;1597; RV32I-LABEL: fcvt_w_s_i16:1598; RV32I: # %bb.0:1599; RV32I-NEXT: addi sp, sp, -161600; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1601; RV32I-NEXT: call __fixdfsi1602; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1603; RV32I-NEXT: addi sp, sp, 161604; RV32I-NEXT: ret1605;1606; RV64I-LABEL: fcvt_w_s_i16:1607; RV64I: # %bb.0:1608; RV64I-NEXT: addi sp, sp, -161609; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1610; RV64I-NEXT: call __fixdfdi1611; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1612; RV64I-NEXT: addi sp, sp, 161613; RV64I-NEXT: ret1614 %1 = fptosi double %a to i161615 ret i16 %11616}1617 1618define signext i16 @fcvt_w_s_sat_i16(double %a) nounwind {1619; RV32IFD-LABEL: fcvt_w_s_sat_i16:1620; RV32IFD: # %bb.0: # %start1621; RV32IFD-NEXT: lui a0, %hi(.LCPI26_0)1622; RV32IFD-NEXT: fld fa5, %lo(.LCPI26_0)(a0)1623; RV32IFD-NEXT: lui a0, %hi(.LCPI26_1)1624; RV32IFD-NEXT: fld fa4, %lo(.LCPI26_1)(a0)1625; RV32IFD-NEXT: feq.d a0, fa0, fa01626; RV32IFD-NEXT: fmax.d fa5, fa0, fa51627; RV32IFD-NEXT: neg a0, a01628; RV32IFD-NEXT: fmin.d fa5, fa5, fa41629; RV32IFD-NEXT: fcvt.w.d a1, fa5, rtz1630; RV32IFD-NEXT: and a0, a0, a11631; RV32IFD-NEXT: ret1632;1633; RV64IFD-LABEL: fcvt_w_s_sat_i16:1634; RV64IFD: # %bb.0: # %start1635; RV64IFD-NEXT: feq.d a0, fa0, fa01636; RV64IFD-NEXT: lui a1, %hi(.LCPI26_0)1637; RV64IFD-NEXT: fld fa5, %lo(.LCPI26_0)(a1)1638; RV64IFD-NEXT: li a1, -5051639; RV64IFD-NEXT: slli a1, a1, 531640; RV64IFD-NEXT: fmv.d.x fa4, a11641; RV64IFD-NEXT: fmax.d fa4, fa0, fa41642; RV64IFD-NEXT: neg a0, a01643; RV64IFD-NEXT: fmin.d fa5, fa4, fa51644; RV64IFD-NEXT: fcvt.l.d a1, fa5, rtz1645; RV64IFD-NEXT: and a0, a0, a11646; RV64IFD-NEXT: ret1647;1648; RV32IZFINXZDINX-LABEL: fcvt_w_s_sat_i16:1649; RV32IZFINXZDINX: # %bb.0: # %start1650; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI26_0)1651; RV32IZFINXZDINX-NEXT: lui a3, %hi(.LCPI26_1)1652; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI26_0)(a2)1653; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI26_0)1654; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)1655; RV32IZFINXZDINX-NEXT: lw a2, %lo(.LCPI26_1)(a3)1656; RV32IZFINXZDINX-NEXT: addi a3, a3, %lo(.LCPI26_1)1657; RV32IZFINXZDINX-NEXT: lw a3, 4(a3)1658; RV32IZFINXZDINX-NEXT: feq.d a6, a0, a01659; RV32IZFINXZDINX-NEXT: fmax.d a0, a0, a41660; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a21661; RV32IZFINXZDINX-NEXT: fcvt.w.d a0, a0, rtz1662; RV32IZFINXZDINX-NEXT: neg a1, a61663; RV32IZFINXZDINX-NEXT: and a0, a1, a01664; RV32IZFINXZDINX-NEXT: ret1665;1666; RV64IZFINXZDINX-LABEL: fcvt_w_s_sat_i16:1667; RV64IZFINXZDINX: # %bb.0: # %start1668; RV64IZFINXZDINX-NEXT: feq.d a1, a0, a01669; RV64IZFINXZDINX-NEXT: li a2, -5051670; RV64IZFINXZDINX-NEXT: slli a2, a2, 531671; RV64IZFINXZDINX-NEXT: fmax.d a0, a0, a21672; RV64IZFINXZDINX-NEXT: lui a2, 41521673; RV64IZFINXZDINX-NEXT: neg a1, a11674; RV64IZFINXZDINX-NEXT: addi a2, a2, -11675; RV64IZFINXZDINX-NEXT: slli a2, a2, 381676; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a21677; RV64IZFINXZDINX-NEXT: fcvt.l.d a0, a0, rtz1678; RV64IZFINXZDINX-NEXT: and a0, a1, a01679; RV64IZFINXZDINX-NEXT: ret1680;1681; RV32I-LABEL: fcvt_w_s_sat_i16:1682; RV32I: # %bb.0: # %start1683; RV32I-NEXT: addi sp, sp, -321684; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1685; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1686; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1687; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1688; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill1689; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill1690; RV32I-NEXT: mv s0, a11691; RV32I-NEXT: mv s1, a01692; RV32I-NEXT: lui a3, 2657281693; RV32I-NEXT: addi a3, a3, -641694; RV32I-NEXT: li a2, 01695; RV32I-NEXT: call __gtdf21696; RV32I-NEXT: mv s2, a01697; RV32I-NEXT: lui a3, 7900161698; RV32I-NEXT: mv a0, s11699; RV32I-NEXT: mv a1, s01700; RV32I-NEXT: li a2, 01701; RV32I-NEXT: call __gedf21702; RV32I-NEXT: mv s4, a01703; RV32I-NEXT: mv a0, s11704; RV32I-NEXT: mv a1, s01705; RV32I-NEXT: call __fixdfsi1706; RV32I-NEXT: mv s3, a01707; RV32I-NEXT: bgez s4, .LBB26_21708; RV32I-NEXT: # %bb.1: # %start1709; RV32I-NEXT: lui s3, 10485681710; RV32I-NEXT: .LBB26_2: # %start1711; RV32I-NEXT: blez s2, .LBB26_41712; RV32I-NEXT: # %bb.3: # %start1713; RV32I-NEXT: lui s3, 81714; RV32I-NEXT: addi s3, s3, -11715; RV32I-NEXT: .LBB26_4: # %start1716; RV32I-NEXT: mv a0, s11717; RV32I-NEXT: mv a1, s01718; RV32I-NEXT: mv a2, s11719; RV32I-NEXT: mv a3, s01720; RV32I-NEXT: call __unorddf21721; RV32I-NEXT: snez a0, a01722; RV32I-NEXT: addi a0, a0, -11723; RV32I-NEXT: and a0, a0, s31724; RV32I-NEXT: slli a0, a0, 161725; RV32I-NEXT: srai a0, a0, 161726; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1727; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1728; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1729; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1730; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload1731; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload1732; RV32I-NEXT: addi sp, sp, 321733; RV32I-NEXT: ret1734;1735; RV64I-LABEL: fcvt_w_s_sat_i16:1736; RV64I: # %bb.0: # %start1737; RV64I-NEXT: addi sp, sp, -321738; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1739; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1740; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1741; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill1742; RV64I-NEXT: mv s0, a01743; RV64I-NEXT: li a1, -5051744; RV64I-NEXT: slli a1, a1, 531745; RV64I-NEXT: call __gedf21746; RV64I-NEXT: mv s2, a01747; RV64I-NEXT: mv a0, s01748; RV64I-NEXT: call __fixdfdi1749; RV64I-NEXT: mv s1, a01750; RV64I-NEXT: bgez s2, .LBB26_21751; RV64I-NEXT: # %bb.1: # %start1752; RV64I-NEXT: lui s1, 10485681753; RV64I-NEXT: .LBB26_2: # %start1754; RV64I-NEXT: lui a0, 41521755; RV64I-NEXT: addi a0, a0, -11756; RV64I-NEXT: slli a1, a0, 381757; RV64I-NEXT: mv a0, s01758; RV64I-NEXT: call __gtdf21759; RV64I-NEXT: blez a0, .LBB26_41760; RV64I-NEXT: # %bb.3: # %start1761; RV64I-NEXT: lui s1, 81762; RV64I-NEXT: addi s1, s1, -11763; RV64I-NEXT: .LBB26_4: # %start1764; RV64I-NEXT: mv a0, s01765; RV64I-NEXT: mv a1, s01766; RV64I-NEXT: call __unorddf21767; RV64I-NEXT: snez a0, a01768; RV64I-NEXT: addi a0, a0, -11769; RV64I-NEXT: and a0, a0, s11770; RV64I-NEXT: slli a0, a0, 481771; RV64I-NEXT: srai a0, a0, 481772; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1773; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1774; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1775; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload1776; RV64I-NEXT: addi sp, sp, 321777; RV64I-NEXT: ret1778start:1779 %0 = tail call i16 @llvm.fptosi.sat.i16.f64(double %a)1780 ret i16 %01781}1782 1783define zeroext i16 @fcvt_wu_s_i16(double %a) nounwind {1784; RV32IFD-LABEL: fcvt_wu_s_i16:1785; RV32IFD: # %bb.0:1786; RV32IFD-NEXT: fcvt.wu.d a0, fa0, rtz1787; RV32IFD-NEXT: ret1788;1789; RV64IFD-LABEL: fcvt_wu_s_i16:1790; RV64IFD: # %bb.0:1791; RV64IFD-NEXT: fcvt.lu.d a0, fa0, rtz1792; RV64IFD-NEXT: ret1793;1794; RV32IZFINXZDINX-LABEL: fcvt_wu_s_i16:1795; RV32IZFINXZDINX: # %bb.0:1796; RV32IZFINXZDINX-NEXT: fcvt.wu.d a0, a0, rtz1797; RV32IZFINXZDINX-NEXT: ret1798;1799; RV64IZFINXZDINX-LABEL: fcvt_wu_s_i16:1800; RV64IZFINXZDINX: # %bb.0:1801; RV64IZFINXZDINX-NEXT: fcvt.lu.d a0, a0, rtz1802; RV64IZFINXZDINX-NEXT: ret1803;1804; RV32I-LABEL: fcvt_wu_s_i16:1805; RV32I: # %bb.0:1806; RV32I-NEXT: addi sp, sp, -161807; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1808; RV32I-NEXT: call __fixunsdfsi1809; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1810; RV32I-NEXT: addi sp, sp, 161811; RV32I-NEXT: ret1812;1813; RV64I-LABEL: fcvt_wu_s_i16:1814; RV64I: # %bb.0:1815; RV64I-NEXT: addi sp, sp, -161816; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1817; RV64I-NEXT: call __fixunsdfdi1818; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1819; RV64I-NEXT: addi sp, sp, 161820; RV64I-NEXT: ret1821 %1 = fptoui double %a to i161822 ret i16 %11823}1824 1825define zeroext i16 @fcvt_wu_s_sat_i16(double %a) nounwind {1826; RV32IFD-LABEL: fcvt_wu_s_sat_i16:1827; RV32IFD: # %bb.0: # %start1828; RV32IFD-NEXT: lui a0, %hi(.LCPI28_0)1829; RV32IFD-NEXT: fld fa5, %lo(.LCPI28_0)(a0)1830; RV32IFD-NEXT: fcvt.d.w fa4, zero1831; RV32IFD-NEXT: fmax.d fa4, fa0, fa41832; RV32IFD-NEXT: fmin.d fa5, fa4, fa51833; RV32IFD-NEXT: fcvt.wu.d a0, fa5, rtz1834; RV32IFD-NEXT: ret1835;1836; RV64IFD-LABEL: fcvt_wu_s_sat_i16:1837; RV64IFD: # %bb.0: # %start1838; RV64IFD-NEXT: lui a0, %hi(.LCPI28_0)1839; RV64IFD-NEXT: fld fa5, %lo(.LCPI28_0)(a0)1840; RV64IFD-NEXT: fmv.d.x fa4, zero1841; RV64IFD-NEXT: fmax.d fa4, fa0, fa41842; RV64IFD-NEXT: fmin.d fa5, fa4, fa51843; RV64IFD-NEXT: fcvt.lu.d a0, fa5, rtz1844; RV64IFD-NEXT: ret1845;1846; RV32IZFINXZDINX-LABEL: fcvt_wu_s_sat_i16:1847; RV32IZFINXZDINX: # %bb.0: # %start1848; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI28_0)1849; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI28_0)(a2)1850; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI28_0)1851; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)1852; RV32IZFINXZDINX-NEXT: fmax.d a0, a0, zero1853; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a41854; RV32IZFINXZDINX-NEXT: fcvt.wu.d a0, a0, rtz1855; RV32IZFINXZDINX-NEXT: ret1856;1857; RV64IZFINXZDINX-LABEL: fcvt_wu_s_sat_i16:1858; RV64IZFINXZDINX: # %bb.0: # %start1859; RV64IZFINXZDINX-NEXT: fmax.d a0, a0, zero1860; RV64IZFINXZDINX-NEXT: lui a1, 83121861; RV64IZFINXZDINX-NEXT: addi a1, a1, -11862; RV64IZFINXZDINX-NEXT: slli a1, a1, 371863; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a11864; RV64IZFINXZDINX-NEXT: fcvt.lu.d a0, a0, rtz1865; RV64IZFINXZDINX-NEXT: ret1866;1867; RV32I-LABEL: fcvt_wu_s_sat_i16:1868; RV32I: # %bb.0: # %start1869; RV32I-NEXT: addi sp, sp, -321870; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1871; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1872; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1873; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1874; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill1875; RV32I-NEXT: mv s1, a11876; RV32I-NEXT: mv s2, a01877; RV32I-NEXT: lui a3, 2659841878; RV32I-NEXT: addi a3, a3, -321879; RV32I-NEXT: li a2, 01880; RV32I-NEXT: call __gtdf21881; RV32I-NEXT: mv s3, a01882; RV32I-NEXT: mv a0, s21883; RV32I-NEXT: mv a1, s11884; RV32I-NEXT: li a2, 01885; RV32I-NEXT: li a3, 01886; RV32I-NEXT: call __gedf21887; RV32I-NEXT: mv s0, a01888; RV32I-NEXT: mv a0, s21889; RV32I-NEXT: mv a1, s11890; RV32I-NEXT: call __fixunsdfsi1891; RV32I-NEXT: lui a1, 161892; RV32I-NEXT: addi a1, a1, -11893; RV32I-NEXT: blez s3, .LBB28_21894; RV32I-NEXT: # %bb.1: # %start1895; RV32I-NEXT: mv a0, a11896; RV32I-NEXT: j .LBB28_31897; RV32I-NEXT: .LBB28_2:1898; RV32I-NEXT: srli s0, s0, 311899; RV32I-NEXT: addi s0, s0, -11900; RV32I-NEXT: and a0, s0, a01901; RV32I-NEXT: .LBB28_3: # %start1902; RV32I-NEXT: and a0, a0, a11903; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1904; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1905; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1906; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1907; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload1908; RV32I-NEXT: addi sp, sp, 321909; RV32I-NEXT: ret1910;1911; RV64I-LABEL: fcvt_wu_s_sat_i16:1912; RV64I: # %bb.0: # %start1913; RV64I-NEXT: addi sp, sp, -321914; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1915; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1916; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1917; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill1918; RV64I-NEXT: mv s2, a01919; RV64I-NEXT: li a1, 01920; RV64I-NEXT: call __gedf21921; RV64I-NEXT: mv s0, a01922; RV64I-NEXT: mv a0, s21923; RV64I-NEXT: call __fixunsdfdi1924; RV64I-NEXT: mv s1, a01925; RV64I-NEXT: lui a0, 83121926; RV64I-NEXT: addi a0, a0, -11927; RV64I-NEXT: slli a1, a0, 371928; RV64I-NEXT: mv a0, s21929; RV64I-NEXT: call __gtdf21930; RV64I-NEXT: lui a1, 161931; RV64I-NEXT: addi a1, a1, -11932; RV64I-NEXT: blez a0, .LBB28_21933; RV64I-NEXT: # %bb.1: # %start1934; RV64I-NEXT: mv a0, a11935; RV64I-NEXT: j .LBB28_31936; RV64I-NEXT: .LBB28_2:1937; RV64I-NEXT: srli s0, s0, 631938; RV64I-NEXT: addi a0, s0, -11939; RV64I-NEXT: and a0, a0, s11940; RV64I-NEXT: .LBB28_3: # %start1941; RV64I-NEXT: and a0, a0, a11942; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1943; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1944; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1945; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload1946; RV64I-NEXT: addi sp, sp, 321947; RV64I-NEXT: ret1948start:1949 %0 = tail call i16 @llvm.fptoui.sat.i16.f64(double %a)1950 ret i16 %01951}1952 1953define signext i8 @fcvt_w_s_i8(double %a) nounwind {1954; RV32IFD-LABEL: fcvt_w_s_i8:1955; RV32IFD: # %bb.0:1956; RV32IFD-NEXT: fcvt.w.d a0, fa0, rtz1957; RV32IFD-NEXT: ret1958;1959; RV64IFD-LABEL: fcvt_w_s_i8:1960; RV64IFD: # %bb.0:1961; RV64IFD-NEXT: fcvt.l.d a0, fa0, rtz1962; RV64IFD-NEXT: ret1963;1964; RV32IZFINXZDINX-LABEL: fcvt_w_s_i8:1965; RV32IZFINXZDINX: # %bb.0:1966; RV32IZFINXZDINX-NEXT: fcvt.w.d a0, a0, rtz1967; RV32IZFINXZDINX-NEXT: ret1968;1969; RV64IZFINXZDINX-LABEL: fcvt_w_s_i8:1970; RV64IZFINXZDINX: # %bb.0:1971; RV64IZFINXZDINX-NEXT: fcvt.l.d a0, a0, rtz1972; RV64IZFINXZDINX-NEXT: ret1973;1974; RV32I-LABEL: fcvt_w_s_i8:1975; RV32I: # %bb.0:1976; RV32I-NEXT: addi sp, sp, -161977; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1978; RV32I-NEXT: call __fixdfsi1979; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1980; RV32I-NEXT: addi sp, sp, 161981; RV32I-NEXT: ret1982;1983; RV64I-LABEL: fcvt_w_s_i8:1984; RV64I: # %bb.0:1985; RV64I-NEXT: addi sp, sp, -161986; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1987; RV64I-NEXT: call __fixdfdi1988; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1989; RV64I-NEXT: addi sp, sp, 161990; RV64I-NEXT: ret1991 %1 = fptosi double %a to i81992 ret i8 %11993}1994 1995define signext i8 @fcvt_w_s_sat_i8(double %a) nounwind {1996; RV32IFD-LABEL: fcvt_w_s_sat_i8:1997; RV32IFD: # %bb.0: # %start1998; RV32IFD-NEXT: lui a0, %hi(.LCPI30_0)1999; RV32IFD-NEXT: fld fa5, %lo(.LCPI30_0)(a0)2000; RV32IFD-NEXT: lui a0, %hi(.LCPI30_1)2001; RV32IFD-NEXT: fld fa4, %lo(.LCPI30_1)(a0)2002; RV32IFD-NEXT: feq.d a0, fa0, fa02003; RV32IFD-NEXT: fmax.d fa5, fa0, fa52004; RV32IFD-NEXT: neg a0, a02005; RV32IFD-NEXT: fmin.d fa5, fa5, fa42006; RV32IFD-NEXT: fcvt.w.d a1, fa5, rtz2007; RV32IFD-NEXT: and a0, a0, a12008; RV32IFD-NEXT: ret2009;2010; RV64IFD-LABEL: fcvt_w_s_sat_i8:2011; RV64IFD: # %bb.0: # %start2012; RV64IFD-NEXT: feq.d a0, fa0, fa02013; RV64IFD-NEXT: li a1, -5092014; RV64IFD-NEXT: slli a1, a1, 532015; RV64IFD-NEXT: fmv.d.x fa5, a12016; RV64IFD-NEXT: lui a1, 659192017; RV64IFD-NEXT: neg a0, a02018; RV64IFD-NEXT: slli a1, a1, 342019; RV64IFD-NEXT: fmax.d fa5, fa0, fa52020; RV64IFD-NEXT: fmv.d.x fa4, a12021; RV64IFD-NEXT: fmin.d fa5, fa5, fa42022; RV64IFD-NEXT: fcvt.l.d a1, fa5, rtz2023; RV64IFD-NEXT: and a0, a0, a12024; RV64IFD-NEXT: ret2025;2026; RV32IZFINXZDINX-LABEL: fcvt_w_s_sat_i8:2027; RV32IZFINXZDINX: # %bb.0: # %start2028; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI30_0)2029; RV32IZFINXZDINX-NEXT: lui a3, %hi(.LCPI30_1)2030; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI30_0)(a2)2031; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI30_0)2032; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)2033; RV32IZFINXZDINX-NEXT: lw a2, %lo(.LCPI30_1)(a3)2034; RV32IZFINXZDINX-NEXT: addi a3, a3, %lo(.LCPI30_1)2035; RV32IZFINXZDINX-NEXT: lw a3, 4(a3)2036; RV32IZFINXZDINX-NEXT: feq.d a6, a0, a02037; RV32IZFINXZDINX-NEXT: fmax.d a0, a0, a42038; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a22039; RV32IZFINXZDINX-NEXT: fcvt.w.d a0, a0, rtz2040; RV32IZFINXZDINX-NEXT: neg a1, a62041; RV32IZFINXZDINX-NEXT: and a0, a1, a02042; RV32IZFINXZDINX-NEXT: ret2043;2044; RV64IZFINXZDINX-LABEL: fcvt_w_s_sat_i8:2045; RV64IZFINXZDINX: # %bb.0: # %start2046; RV64IZFINXZDINX-NEXT: feq.d a1, a0, a02047; RV64IZFINXZDINX-NEXT: li a2, -5092048; RV64IZFINXZDINX-NEXT: slli a2, a2, 532049; RV64IZFINXZDINX-NEXT: fmax.d a0, a0, a22050; RV64IZFINXZDINX-NEXT: lui a2, 659192051; RV64IZFINXZDINX-NEXT: neg a1, a12052; RV64IZFINXZDINX-NEXT: slli a2, a2, 342053; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a22054; RV64IZFINXZDINX-NEXT: fcvt.l.d a0, a0, rtz2055; RV64IZFINXZDINX-NEXT: and a0, a1, a02056; RV64IZFINXZDINX-NEXT: ret2057;2058; RV32I-LABEL: fcvt_w_s_sat_i8:2059; RV32I: # %bb.0: # %start2060; RV32I-NEXT: addi sp, sp, -322061; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill2062; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill2063; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill2064; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill2065; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill2066; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill2067; RV32I-NEXT: mv s0, a12068; RV32I-NEXT: mv s1, a02069; RV32I-NEXT: lui a3, 2636762070; RV32I-NEXT: li a2, 02071; RV32I-NEXT: call __gtdf22072; RV32I-NEXT: mv s2, a02073; RV32I-NEXT: lui a3, 7879682074; RV32I-NEXT: mv a0, s12075; RV32I-NEXT: mv a1, s02076; RV32I-NEXT: li a2, 02077; RV32I-NEXT: call __gedf22078; RV32I-NEXT: mv s4, a02079; RV32I-NEXT: mv a0, s12080; RV32I-NEXT: mv a1, s02081; RV32I-NEXT: call __fixdfsi2082; RV32I-NEXT: mv s3, a02083; RV32I-NEXT: bgez s4, .LBB30_22084; RV32I-NEXT: # %bb.1: # %start2085; RV32I-NEXT: li s3, -1282086; RV32I-NEXT: .LBB30_2: # %start2087; RV32I-NEXT: blez s2, .LBB30_42088; RV32I-NEXT: # %bb.3: # %start2089; RV32I-NEXT: li s3, 1272090; RV32I-NEXT: .LBB30_4: # %start2091; RV32I-NEXT: mv a0, s12092; RV32I-NEXT: mv a1, s02093; RV32I-NEXT: mv a2, s12094; RV32I-NEXT: mv a3, s02095; RV32I-NEXT: call __unorddf22096; RV32I-NEXT: snez a0, a02097; RV32I-NEXT: addi a0, a0, -12098; RV32I-NEXT: and a0, a0, s32099; RV32I-NEXT: slli a0, a0, 242100; RV32I-NEXT: srai a0, a0, 242101; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload2102; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload2103; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload2104; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload2105; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload2106; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload2107; RV32I-NEXT: addi sp, sp, 322108; RV32I-NEXT: ret2109;2110; RV64I-LABEL: fcvt_w_s_sat_i8:2111; RV64I: # %bb.0: # %start2112; RV64I-NEXT: addi sp, sp, -322113; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill2114; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill2115; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill2116; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill2117; RV64I-NEXT: mv s0, a02118; RV64I-NEXT: li a1, -5092119; RV64I-NEXT: slli a1, a1, 532120; RV64I-NEXT: call __gedf22121; RV64I-NEXT: mv s2, a02122; RV64I-NEXT: mv a0, s02123; RV64I-NEXT: call __fixdfdi2124; RV64I-NEXT: mv s1, a02125; RV64I-NEXT: bgez s2, .LBB30_22126; RV64I-NEXT: # %bb.1: # %start2127; RV64I-NEXT: li s1, -1282128; RV64I-NEXT: .LBB30_2: # %start2129; RV64I-NEXT: lui a1, 659192130; RV64I-NEXT: slli a1, a1, 342131; RV64I-NEXT: mv a0, s02132; RV64I-NEXT: call __gtdf22133; RV64I-NEXT: blez a0, .LBB30_42134; RV64I-NEXT: # %bb.3: # %start2135; RV64I-NEXT: li s1, 1272136; RV64I-NEXT: .LBB30_4: # %start2137; RV64I-NEXT: mv a0, s02138; RV64I-NEXT: mv a1, s02139; RV64I-NEXT: call __unorddf22140; RV64I-NEXT: snez a0, a02141; RV64I-NEXT: addi a0, a0, -12142; RV64I-NEXT: and a0, a0, s12143; RV64I-NEXT: slli a0, a0, 562144; RV64I-NEXT: srai a0, a0, 562145; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload2146; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload2147; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload2148; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload2149; RV64I-NEXT: addi sp, sp, 322150; RV64I-NEXT: ret2151start:2152 %0 = tail call i8 @llvm.fptosi.sat.i8.f64(double %a)2153 ret i8 %02154}2155 2156define zeroext i8 @fcvt_wu_s_i8(double %a) nounwind {2157;2158;2159; RV32IFD-LABEL: fcvt_wu_s_i8:2160; RV32IFD: # %bb.0:2161; RV32IFD-NEXT: fcvt.wu.d a0, fa0, rtz2162; RV32IFD-NEXT: ret2163;2164; RV64IFD-LABEL: fcvt_wu_s_i8:2165; RV64IFD: # %bb.0:2166; RV64IFD-NEXT: fcvt.lu.d a0, fa0, rtz2167; RV64IFD-NEXT: ret2168;2169; RV32IZFINXZDINX-LABEL: fcvt_wu_s_i8:2170; RV32IZFINXZDINX: # %bb.0:2171; RV32IZFINXZDINX-NEXT: fcvt.wu.d a0, a0, rtz2172; RV32IZFINXZDINX-NEXT: ret2173;2174; RV64IZFINXZDINX-LABEL: fcvt_wu_s_i8:2175; RV64IZFINXZDINX: # %bb.0:2176; RV64IZFINXZDINX-NEXT: fcvt.lu.d a0, a0, rtz2177; RV64IZFINXZDINX-NEXT: ret2178;2179; RV32I-LABEL: fcvt_wu_s_i8:2180; RV32I: # %bb.0:2181; RV32I-NEXT: addi sp, sp, -162182; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2183; RV32I-NEXT: call __fixunsdfsi2184; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2185; RV32I-NEXT: addi sp, sp, 162186; RV32I-NEXT: ret2187;2188; RV64I-LABEL: fcvt_wu_s_i8:2189; RV64I: # %bb.0:2190; RV64I-NEXT: addi sp, sp, -162191; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2192; RV64I-NEXT: call __fixunsdfdi2193; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2194; RV64I-NEXT: addi sp, sp, 162195; RV64I-NEXT: ret2196 %1 = fptoui double %a to i82197 ret i8 %12198}2199 2200define zeroext i8 @fcvt_wu_s_sat_i8(double %a) nounwind {2201;2202;2203; RV32IFD-LABEL: fcvt_wu_s_sat_i8:2204; RV32IFD: # %bb.0: # %start2205; RV32IFD-NEXT: lui a0, %hi(.LCPI32_0)2206; RV32IFD-NEXT: fld fa5, %lo(.LCPI32_0)(a0)2207; RV32IFD-NEXT: fcvt.d.w fa4, zero2208; RV32IFD-NEXT: fmax.d fa4, fa0, fa42209; RV32IFD-NEXT: fmin.d fa5, fa4, fa52210; RV32IFD-NEXT: fcvt.wu.d a0, fa5, rtz2211; RV32IFD-NEXT: ret2212;2213; RV64IFD-LABEL: fcvt_wu_s_sat_i8:2214; RV64IFD: # %bb.0: # %start2215; RV64IFD-NEXT: fmv.d.x fa5, zero2216; RV64IFD-NEXT: lui a0, 1319672217; RV64IFD-NEXT: fmax.d fa5, fa0, fa52218; RV64IFD-NEXT: slli a0, a0, 332219; RV64IFD-NEXT: fmv.d.x fa4, a02220; RV64IFD-NEXT: fmin.d fa5, fa5, fa42221; RV64IFD-NEXT: fcvt.lu.d a0, fa5, rtz2222; RV64IFD-NEXT: ret2223;2224; RV32IZFINXZDINX-LABEL: fcvt_wu_s_sat_i8:2225; RV32IZFINXZDINX: # %bb.0: # %start2226; RV32IZFINXZDINX-NEXT: lui a2, %hi(.LCPI32_0)2227; RV32IZFINXZDINX-NEXT: lw a4, %lo(.LCPI32_0)(a2)2228; RV32IZFINXZDINX-NEXT: addi a2, a2, %lo(.LCPI32_0)2229; RV32IZFINXZDINX-NEXT: lw a5, 4(a2)2230; RV32IZFINXZDINX-NEXT: fmax.d a0, a0, zero2231; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a42232; RV32IZFINXZDINX-NEXT: fcvt.wu.d a0, a0, rtz2233; RV32IZFINXZDINX-NEXT: ret2234;2235; RV64IZFINXZDINX-LABEL: fcvt_wu_s_sat_i8:2236; RV64IZFINXZDINX: # %bb.0: # %start2237; RV64IZFINXZDINX-NEXT: fmax.d a0, a0, zero2238; RV64IZFINXZDINX-NEXT: lui a1, 1319672239; RV64IZFINXZDINX-NEXT: slli a1, a1, 332240; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a12241; RV64IZFINXZDINX-NEXT: fcvt.lu.d a0, a0, rtz2242; RV64IZFINXZDINX-NEXT: ret2243;2244; RV32I-LABEL: fcvt_wu_s_sat_i8:2245; RV32I: # %bb.0: # %start2246; RV32I-NEXT: addi sp, sp, -322247; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill2248; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill2249; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill2250; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill2251; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill2252; RV32I-NEXT: mv s1, a12253; RV32I-NEXT: mv s2, a02254; RV32I-NEXT: lui a3, 2639342255; RV32I-NEXT: li a2, 02256; RV32I-NEXT: call __gtdf22257; RV32I-NEXT: mv s3, a02258; RV32I-NEXT: mv a0, s22259; RV32I-NEXT: mv a1, s12260; RV32I-NEXT: li a2, 02261; RV32I-NEXT: li a3, 02262; RV32I-NEXT: call __gedf22263; RV32I-NEXT: mv s0, a02264; RV32I-NEXT: mv a0, s22265; RV32I-NEXT: mv a1, s12266; RV32I-NEXT: call __fixunsdfsi2267; RV32I-NEXT: blez s3, .LBB32_22268; RV32I-NEXT: # %bb.1: # %start2269; RV32I-NEXT: li a0, 2552270; RV32I-NEXT: j .LBB32_32271; RV32I-NEXT: .LBB32_2:2272; RV32I-NEXT: srli s0, s0, 312273; RV32I-NEXT: addi s0, s0, -12274; RV32I-NEXT: and a0, s0, a02275; RV32I-NEXT: .LBB32_3: # %start2276; RV32I-NEXT: zext.b a0, a02277; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload2278; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload2279; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload2280; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload2281; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload2282; RV32I-NEXT: addi sp, sp, 322283; RV32I-NEXT: ret2284;2285; RV64I-LABEL: fcvt_wu_s_sat_i8:2286; RV64I: # %bb.0: # %start2287; RV64I-NEXT: addi sp, sp, -322288; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill2289; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill2290; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill2291; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill2292; RV64I-NEXT: mv s2, a02293; RV64I-NEXT: li a1, 02294; RV64I-NEXT: call __gedf22295; RV64I-NEXT: mv s0, a02296; RV64I-NEXT: mv a0, s22297; RV64I-NEXT: call __fixunsdfdi2298; RV64I-NEXT: mv s1, a02299; RV64I-NEXT: lui a1, 1319672300; RV64I-NEXT: slli a1, a1, 332301; RV64I-NEXT: mv a0, s22302; RV64I-NEXT: call __gtdf22303; RV64I-NEXT: blez a0, .LBB32_22304; RV64I-NEXT: # %bb.1: # %start2305; RV64I-NEXT: li a0, 2552306; RV64I-NEXT: j .LBB32_32307; RV64I-NEXT: .LBB32_2:2308; RV64I-NEXT: srli s0, s0, 632309; RV64I-NEXT: addi a0, s0, -12310; RV64I-NEXT: and a0, a0, s12311; RV64I-NEXT: .LBB32_3: # %start2312; RV64I-NEXT: zext.b a0, a02313; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload2314; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload2315; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload2316; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload2317; RV64I-NEXT: addi sp, sp, 322318; RV64I-NEXT: ret2319start:2320 %0 = tail call i8 @llvm.fptoui.sat.i8.f64(double %a)2321 ret i8 %02322}2323 2324define zeroext i32 @fcvt_wu_d_sat_zext(double %a) nounwind {2325; RV32IFD-LABEL: fcvt_wu_d_sat_zext:2326; RV32IFD: # %bb.0: # %start2327; RV32IFD-NEXT: fcvt.wu.d a0, fa0, rtz2328; RV32IFD-NEXT: feq.d a1, fa0, fa02329; RV32IFD-NEXT: seqz a1, a12330; RV32IFD-NEXT: addi a1, a1, -12331; RV32IFD-NEXT: and a0, a1, a02332; RV32IFD-NEXT: ret2333;2334; RV64IFD-LABEL: fcvt_wu_d_sat_zext:2335; RV64IFD: # %bb.0: # %start2336; RV64IFD-NEXT: fcvt.wu.d a0, fa0, rtz2337; RV64IFD-NEXT: feq.d a1, fa0, fa02338; RV64IFD-NEXT: seqz a1, a12339; RV64IFD-NEXT: addi a1, a1, -12340; RV64IFD-NEXT: and a0, a0, a12341; RV64IFD-NEXT: slli a0, a0, 322342; RV64IFD-NEXT: srli a0, a0, 322343; RV64IFD-NEXT: ret2344;2345; RV32IZFINXZDINX-LABEL: fcvt_wu_d_sat_zext:2346; RV32IZFINXZDINX: # %bb.0: # %start2347; RV32IZFINXZDINX-NEXT: fcvt.wu.d a2, a0, rtz2348; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a02349; RV32IZFINXZDINX-NEXT: seqz a0, a02350; RV32IZFINXZDINX-NEXT: addi a0, a0, -12351; RV32IZFINXZDINX-NEXT: and a0, a0, a22352; RV32IZFINXZDINX-NEXT: ret2353;2354; RV64IZFINXZDINX-LABEL: fcvt_wu_d_sat_zext:2355; RV64IZFINXZDINX: # %bb.0: # %start2356; RV64IZFINXZDINX-NEXT: fcvt.wu.d a1, a0, rtz2357; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a02358; RV64IZFINXZDINX-NEXT: seqz a0, a02359; RV64IZFINXZDINX-NEXT: addi a0, a0, -12360; RV64IZFINXZDINX-NEXT: and a0, a1, a02361; RV64IZFINXZDINX-NEXT: slli a0, a0, 322362; RV64IZFINXZDINX-NEXT: srli a0, a0, 322363; RV64IZFINXZDINX-NEXT: ret2364;2365; RV32I-LABEL: fcvt_wu_d_sat_zext:2366; RV32I: # %bb.0: # %start2367; RV32I-NEXT: addi sp, sp, -322368; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill2369; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill2370; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill2371; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill2372; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill2373; RV32I-NEXT: mv s0, a12374; RV32I-NEXT: mv s1, a02375; RV32I-NEXT: lui a3, 2700802376; RV32I-NEXT: addi a3, a3, -12377; RV32I-NEXT: lui a2, 10480642378; RV32I-NEXT: call __gtdf22379; RV32I-NEXT: sgtz a0, a02380; RV32I-NEXT: neg s2, a02381; RV32I-NEXT: mv a0, s12382; RV32I-NEXT: mv a1, s02383; RV32I-NEXT: li a2, 02384; RV32I-NEXT: li a3, 02385; RV32I-NEXT: call __gedf22386; RV32I-NEXT: srli a0, a0, 312387; RV32I-NEXT: addi s3, a0, -12388; RV32I-NEXT: mv a0, s12389; RV32I-NEXT: mv a1, s02390; RV32I-NEXT: call __fixunsdfsi2391; RV32I-NEXT: and a0, s3, a02392; RV32I-NEXT: or a0, s2, a02393; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload2394; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload2395; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload2396; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload2397; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload2398; RV32I-NEXT: addi sp, sp, 322399; RV32I-NEXT: ret2400;2401; RV64I-LABEL: fcvt_wu_d_sat_zext:2402; RV64I: # %bb.0: # %start2403; RV64I-NEXT: addi sp, sp, -322404; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill2405; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill2406; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill2407; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill2408; RV64I-NEXT: mv s2, a02409; RV64I-NEXT: li a1, 02410; RV64I-NEXT: call __gedf22411; RV64I-NEXT: mv s0, a02412; RV64I-NEXT: mv a0, s22413; RV64I-NEXT: call __fixunsdfdi2414; RV64I-NEXT: mv s1, a02415; RV64I-NEXT: li a0, 10552416; RV64I-NEXT: slli a0, a0, 312417; RV64I-NEXT: addi a0, a0, -12418; RV64I-NEXT: slli a1, a0, 212419; RV64I-NEXT: mv a0, s22420; RV64I-NEXT: call __gtdf22421; RV64I-NEXT: blez a0, .LBB33_22422; RV64I-NEXT: # %bb.1: # %start2423; RV64I-NEXT: li a0, -12424; RV64I-NEXT: srli a0, a0, 322425; RV64I-NEXT: j .LBB33_32426; RV64I-NEXT: .LBB33_2:2427; RV64I-NEXT: srli s0, s0, 632428; RV64I-NEXT: addi a0, s0, -12429; RV64I-NEXT: and a0, a0, s12430; RV64I-NEXT: .LBB33_3: # %start2431; RV64I-NEXT: slli a0, a0, 322432; RV64I-NEXT: srli a0, a0, 322433; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload2434; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload2435; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload2436; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload2437; RV64I-NEXT: addi sp, sp, 322438; RV64I-NEXT: ret2439start:2440 %0 = tail call i32 @llvm.fptoui.sat.i32.f64(double %a)2441 ret i32 %02442}2443 2444define signext i32 @fcvt_w_d_sat_sext(double %a) nounwind {2445; CHECKIFD-LABEL: fcvt_w_d_sat_sext:2446; CHECKIFD: # %bb.0: # %start2447; CHECKIFD-NEXT: fcvt.w.d a0, fa0, rtz2448; CHECKIFD-NEXT: feq.d a1, fa0, fa02449; CHECKIFD-NEXT: seqz a1, a12450; CHECKIFD-NEXT: addi a1, a1, -12451; CHECKIFD-NEXT: and a0, a1, a02452; CHECKIFD-NEXT: ret2453;2454; RV32IZFINXZDINX-LABEL: fcvt_w_d_sat_sext:2455; RV32IZFINXZDINX: # %bb.0: # %start2456; RV32IZFINXZDINX-NEXT: fcvt.w.d a2, a0, rtz2457; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a02458; RV32IZFINXZDINX-NEXT: seqz a0, a02459; RV32IZFINXZDINX-NEXT: addi a0, a0, -12460; RV32IZFINXZDINX-NEXT: and a0, a0, a22461; RV32IZFINXZDINX-NEXT: ret2462;2463; RV64IZFINXZDINX-LABEL: fcvt_w_d_sat_sext:2464; RV64IZFINXZDINX: # %bb.0: # %start2465; RV64IZFINXZDINX-NEXT: fcvt.w.d a1, a0, rtz2466; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a02467; RV64IZFINXZDINX-NEXT: seqz a0, a02468; RV64IZFINXZDINX-NEXT: addi a0, a0, -12469; RV64IZFINXZDINX-NEXT: and a0, a0, a12470; RV64IZFINXZDINX-NEXT: ret2471;2472; RV32I-LABEL: fcvt_w_d_sat_sext:2473; RV32I: # %bb.0: # %start2474; RV32I-NEXT: addi sp, sp, -322475; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill2476; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill2477; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill2478; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill2479; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill2480; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill2481; RV32I-NEXT: mv s0, a12482; RV32I-NEXT: mv s1, a02483; RV32I-NEXT: lui a3, 2698242484; RV32I-NEXT: addi a3, a3, -12485; RV32I-NEXT: lui a2, 10475522486; RV32I-NEXT: call __gtdf22487; RV32I-NEXT: mv s2, a02488; RV32I-NEXT: lui a3, 7941122489; RV32I-NEXT: mv a0, s12490; RV32I-NEXT: mv a1, s02491; RV32I-NEXT: li a2, 02492; RV32I-NEXT: call __gedf22493; RV32I-NEXT: mv s4, a02494; RV32I-NEXT: mv a0, s12495; RV32I-NEXT: mv a1, s02496; RV32I-NEXT: call __fixdfsi2497; RV32I-NEXT: mv s3, a02498; RV32I-NEXT: lui a0, 5242882499; RV32I-NEXT: bgez s4, .LBB34_22500; RV32I-NEXT: # %bb.1: # %start2501; RV32I-NEXT: lui s3, 5242882502; RV32I-NEXT: .LBB34_2: # %start2503; RV32I-NEXT: blez s2, .LBB34_42504; RV32I-NEXT: # %bb.3: # %start2505; RV32I-NEXT: addi s3, a0, -12506; RV32I-NEXT: .LBB34_4: # %start2507; RV32I-NEXT: mv a0, s12508; RV32I-NEXT: mv a1, s02509; RV32I-NEXT: mv a2, s12510; RV32I-NEXT: mv a3, s02511; RV32I-NEXT: call __unorddf22512; RV32I-NEXT: snez a0, a02513; RV32I-NEXT: addi a0, a0, -12514; RV32I-NEXT: and a0, a0, s32515; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload2516; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload2517; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload2518; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload2519; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload2520; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload2521; RV32I-NEXT: addi sp, sp, 322522; RV32I-NEXT: ret2523;2524; RV64I-LABEL: fcvt_w_d_sat_sext:2525; RV64I: # %bb.0: # %start2526; RV64I-NEXT: addi sp, sp, -482527; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill2528; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill2529; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill2530; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill2531; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill2532; RV64I-NEXT: mv s0, a02533; RV64I-NEXT: li a1, -4972534; RV64I-NEXT: slli a1, a1, 532535; RV64I-NEXT: call __gedf22536; RV64I-NEXT: mv s2, a02537; RV64I-NEXT: mv a0, s02538; RV64I-NEXT: call __fixdfdi2539; RV64I-NEXT: mv s1, a02540; RV64I-NEXT: lui s3, 5242882541; RV64I-NEXT: bgez s2, .LBB34_22542; RV64I-NEXT: # %bb.1: # %start2543; RV64I-NEXT: lui s1, 5242882544; RV64I-NEXT: .LBB34_2: # %start2545; RV64I-NEXT: li a0, 5272546; RV64I-NEXT: slli a0, a0, 312547; RV64I-NEXT: addi a0, a0, -12548; RV64I-NEXT: slli a1, a0, 222549; RV64I-NEXT: mv a0, s02550; RV64I-NEXT: call __gtdf22551; RV64I-NEXT: blez a0, .LBB34_42552; RV64I-NEXT: # %bb.3: # %start2553; RV64I-NEXT: addi s1, s3, -12554; RV64I-NEXT: .LBB34_4: # %start2555; RV64I-NEXT: mv a0, s02556; RV64I-NEXT: mv a1, s02557; RV64I-NEXT: call __unorddf22558; RV64I-NEXT: snez a0, a02559; RV64I-NEXT: addi a0, a0, -12560; RV64I-NEXT: and a0, a0, s12561; RV64I-NEXT: sext.w a0, a02562; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload2563; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload2564; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload2565; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload2566; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload2567; RV64I-NEXT: addi sp, sp, 482568; RV64I-NEXT: ret2569start:2570 %0 = tail call i32 @llvm.fptosi.sat.i32.f64(double %a)2571 ret i32 %02572}2573