2254 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+f -verify-machineinstrs < %s \3; RUN: -target-abi=ilp32f | FileCheck -check-prefixes=CHECKIF,RV32IF %s4; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs < %s \5; RUN: -target-abi=lp64f | FileCheck -check-prefixes=CHECKIF,RV64IF %s6; RUN: llc -mtriple=riscv32 -mattr=+zfinx -verify-machineinstrs < %s \7; RUN: -target-abi=ilp32 | FileCheck -check-prefixes=CHECKIZFINX,RV32IZFINX %s8; RUN: llc -mtriple=riscv64 -mattr=+zfinx -verify-machineinstrs < %s \9; RUN: -target-abi=lp64 | FileCheck -check-prefixes=CHECKIZFINX,RV64IZFINX %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 i32 @fcvt_w_s(float %a) nounwind {16; CHECKIF-LABEL: fcvt_w_s:17; CHECKIF: # %bb.0:18; CHECKIF-NEXT: fcvt.w.s a0, fa0, rtz19; CHECKIF-NEXT: ret20;21; CHECKIZFINX-LABEL: fcvt_w_s:22; CHECKIZFINX: # %bb.0:23; CHECKIZFINX-NEXT: fcvt.w.s a0, a0, rtz24; CHECKIZFINX-NEXT: ret25;26; RV32I-LABEL: fcvt_w_s:27; RV32I: # %bb.0:28; RV32I-NEXT: addi sp, sp, -1629; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill30; RV32I-NEXT: call __fixsfsi31; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload32; RV32I-NEXT: addi sp, sp, 1633; RV32I-NEXT: ret34;35; RV64I-LABEL: fcvt_w_s:36; RV64I: # %bb.0:37; RV64I-NEXT: addi sp, sp, -1638; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill39; RV64I-NEXT: call __fixsfsi40; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload41; RV64I-NEXT: addi sp, sp, 1642; RV64I-NEXT: ret43 %1 = fptosi float %a to i3244 ret i32 %145}46 47define i32 @fcvt_w_s_sat(float %a) nounwind {48; CHECKIF-LABEL: fcvt_w_s_sat:49; CHECKIF: # %bb.0: # %start50; CHECKIF-NEXT: fcvt.w.s a0, fa0, rtz51; CHECKIF-NEXT: feq.s a1, fa0, fa052; CHECKIF-NEXT: seqz a1, a153; CHECKIF-NEXT: addi a1, a1, -154; CHECKIF-NEXT: and a0, a1, a055; CHECKIF-NEXT: ret56;57; CHECKIZFINX-LABEL: fcvt_w_s_sat:58; CHECKIZFINX: # %bb.0: # %start59; CHECKIZFINX-NEXT: fcvt.w.s a1, a0, rtz60; CHECKIZFINX-NEXT: feq.s a0, a0, a061; CHECKIZFINX-NEXT: seqz a0, a062; CHECKIZFINX-NEXT: addi a0, a0, -163; CHECKIZFINX-NEXT: and a0, a0, a164; CHECKIZFINX-NEXT: ret65;66; RV32I-LABEL: fcvt_w_s_sat:67; RV32I: # %bb.0: # %start68; RV32I-NEXT: addi sp, sp, -3269; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill70; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill71; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill72; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill73; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill74; RV32I-NEXT: mv s0, a075; RV32I-NEXT: lui a1, 84787276; RV32I-NEXT: call __gesf277; RV32I-NEXT: mv s2, a078; RV32I-NEXT: mv a0, s079; RV32I-NEXT: call __fixsfsi80; RV32I-NEXT: mv s1, a081; RV32I-NEXT: lui s3, 52428882; RV32I-NEXT: bgez s2, .LBB1_283; RV32I-NEXT: # %bb.1: # %start84; RV32I-NEXT: lui s1, 52428885; RV32I-NEXT: .LBB1_2: # %start86; RV32I-NEXT: lui a1, 32358487; RV32I-NEXT: addi a1, a1, -188; RV32I-NEXT: mv a0, s089; RV32I-NEXT: call __gtsf290; RV32I-NEXT: blez a0, .LBB1_491; RV32I-NEXT: # %bb.3: # %start92; RV32I-NEXT: addi s1, s3, -193; RV32I-NEXT: .LBB1_4: # %start94; RV32I-NEXT: mv a0, s095; RV32I-NEXT: mv a1, s096; RV32I-NEXT: call __unordsf297; RV32I-NEXT: snez a0, a098; RV32I-NEXT: addi a0, a0, -199; RV32I-NEXT: and a0, a0, s1100; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload101; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload102; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload103; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload104; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload105; RV32I-NEXT: addi sp, sp, 32106; RV32I-NEXT: ret107;108; RV64I-LABEL: fcvt_w_s_sat:109; RV64I: # %bb.0: # %start110; RV64I-NEXT: addi sp, sp, -48111; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill112; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill113; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill114; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill115; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill116; RV64I-NEXT: mv s0, a0117; RV64I-NEXT: lui a1, 847872118; RV64I-NEXT: call __gesf2119; RV64I-NEXT: mv s2, a0120; RV64I-NEXT: mv a0, s0121; RV64I-NEXT: call __fixsfdi122; RV64I-NEXT: mv s1, a0123; RV64I-NEXT: lui s3, 524288124; RV64I-NEXT: bgez s2, .LBB1_2125; RV64I-NEXT: # %bb.1: # %start126; RV64I-NEXT: lui s1, 524288127; RV64I-NEXT: .LBB1_2: # %start128; RV64I-NEXT: lui a1, 323584129; RV64I-NEXT: addi a1, a1, -1130; RV64I-NEXT: mv a0, s0131; RV64I-NEXT: call __gtsf2132; RV64I-NEXT: blez a0, .LBB1_4133; RV64I-NEXT: # %bb.3: # %start134; RV64I-NEXT: addiw s1, s3, -1135; RV64I-NEXT: .LBB1_4: # %start136; RV64I-NEXT: mv a0, s0137; RV64I-NEXT: mv a1, s0138; RV64I-NEXT: call __unordsf2139; RV64I-NEXT: snez a0, a0140; RV64I-NEXT: addi a0, a0, -1141; RV64I-NEXT: and a0, a0, s1142; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload143; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload144; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload145; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload146; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload147; RV64I-NEXT: addi sp, sp, 48148; RV64I-NEXT: ret149start:150 %0 = tail call i32 @llvm.fptosi.sat.i32.f32(float %a)151 ret i32 %0152}153 154define i32 @fcvt_wu_s(float %a) nounwind {155; CHECKIF-LABEL: fcvt_wu_s:156; CHECKIF: # %bb.0:157; CHECKIF-NEXT: fcvt.wu.s a0, fa0, rtz158; CHECKIF-NEXT: ret159;160; CHECKIZFINX-LABEL: fcvt_wu_s:161; CHECKIZFINX: # %bb.0:162; CHECKIZFINX-NEXT: fcvt.wu.s a0, a0, rtz163; CHECKIZFINX-NEXT: ret164;165; RV32I-LABEL: fcvt_wu_s:166; RV32I: # %bb.0:167; RV32I-NEXT: addi sp, sp, -16168; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill169; RV32I-NEXT: call __fixunssfsi170; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload171; RV32I-NEXT: addi sp, sp, 16172; RV32I-NEXT: ret173;174; RV64I-LABEL: fcvt_wu_s:175; RV64I: # %bb.0:176; RV64I-NEXT: addi sp, sp, -16177; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill178; RV64I-NEXT: call __fixunssfsi179; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload180; RV64I-NEXT: addi sp, sp, 16181; RV64I-NEXT: ret182 %1 = fptoui float %a to i32183 ret i32 %1184}185 186; Test where the fptoui has multiple uses, one of which causes a sext to be187; inserted on RV64.188define i32 @fcvt_wu_s_multiple_use(float %x, ptr %y) nounwind {189; CHECKIF-LABEL: fcvt_wu_s_multiple_use:190; CHECKIF: # %bb.0:191; CHECKIF-NEXT: fcvt.wu.s a0, fa0, rtz192; CHECKIF-NEXT: seqz a1, a0193; CHECKIF-NEXT: add a0, a0, a1194; CHECKIF-NEXT: ret195;196; CHECKIZFINX-LABEL: fcvt_wu_s_multiple_use:197; CHECKIZFINX: # %bb.0:198; CHECKIZFINX-NEXT: fcvt.wu.s a0, a0, rtz199; CHECKIZFINX-NEXT: seqz a1, a0200; CHECKIZFINX-NEXT: add a0, a0, a1201; CHECKIZFINX-NEXT: ret202;203; RV32I-LABEL: fcvt_wu_s_multiple_use:204; RV32I: # %bb.0:205; RV32I-NEXT: addi sp, sp, -16206; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill207; RV32I-NEXT: call __fixunssfsi208; RV32I-NEXT: seqz a1, a0209; RV32I-NEXT: add a0, a0, a1210; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload211; RV32I-NEXT: addi sp, sp, 16212; RV32I-NEXT: ret213;214; RV64I-LABEL: fcvt_wu_s_multiple_use:215; RV64I: # %bb.0:216; RV64I-NEXT: addi sp, sp, -16217; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill218; RV64I-NEXT: call __fixunssfsi219; RV64I-NEXT: seqz a1, a0220; RV64I-NEXT: add a0, a0, a1221; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload222; RV64I-NEXT: addi sp, sp, 16223; RV64I-NEXT: ret224 %a = fptoui float %x to i32225 %b = icmp eq i32 %a, 0226 %c = select i1 %b, i32 1, i32 %a227 ret i32 %c228}229 230define i32 @fcvt_wu_s_sat(float %a) nounwind {231; RV32IF-LABEL: fcvt_wu_s_sat:232; RV32IF: # %bb.0: # %start233; RV32IF-NEXT: fcvt.wu.s a0, fa0, rtz234; RV32IF-NEXT: feq.s a1, fa0, fa0235; RV32IF-NEXT: seqz a1, a1236; RV32IF-NEXT: addi a1, a1, -1237; RV32IF-NEXT: and a0, a1, a0238; RV32IF-NEXT: ret239;240; RV64IF-LABEL: fcvt_wu_s_sat:241; RV64IF: # %bb.0: # %start242; RV64IF-NEXT: fcvt.wu.s a0, fa0, rtz243; RV64IF-NEXT: feq.s a1, fa0, fa0244; RV64IF-NEXT: seqz a1, a1245; RV64IF-NEXT: addi a1, a1, -1246; RV64IF-NEXT: and a0, a0, a1247; RV64IF-NEXT: slli a0, a0, 32248; RV64IF-NEXT: srli a0, a0, 32249; RV64IF-NEXT: ret250;251; RV32IZFINX-LABEL: fcvt_wu_s_sat:252; RV32IZFINX: # %bb.0: # %start253; RV32IZFINX-NEXT: fcvt.wu.s a1, a0, rtz254; RV32IZFINX-NEXT: feq.s a0, a0, a0255; RV32IZFINX-NEXT: seqz a0, a0256; RV32IZFINX-NEXT: addi a0, a0, -1257; RV32IZFINX-NEXT: and a0, a0, a1258; RV32IZFINX-NEXT: ret259;260; RV64IZFINX-LABEL: fcvt_wu_s_sat:261; RV64IZFINX: # %bb.0: # %start262; RV64IZFINX-NEXT: fcvt.wu.s a1, a0, rtz263; RV64IZFINX-NEXT: feq.s a0, a0, a0264; RV64IZFINX-NEXT: seqz a0, a0265; RV64IZFINX-NEXT: addi a0, a0, -1266; RV64IZFINX-NEXT: and a0, a1, a0267; RV64IZFINX-NEXT: slli a0, a0, 32268; RV64IZFINX-NEXT: srli a0, a0, 32269; RV64IZFINX-NEXT: ret270;271; RV32I-LABEL: fcvt_wu_s_sat:272; RV32I: # %bb.0: # %start273; RV32I-NEXT: addi sp, sp, -16274; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill275; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill276; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill277; RV32I-NEXT: mv s0, a0278; RV32I-NEXT: li a1, 0279; RV32I-NEXT: call __gesf2280; RV32I-NEXT: srli a0, a0, 31281; RV32I-NEXT: addi s1, a0, -1282; RV32I-NEXT: mv a0, s0283; RV32I-NEXT: call __fixunssfsi284; RV32I-NEXT: and s1, s1, a0285; RV32I-NEXT: lui a1, 325632286; RV32I-NEXT: addi a1, a1, -1287; RV32I-NEXT: mv a0, s0288; RV32I-NEXT: call __gtsf2289; RV32I-NEXT: sgtz a0, a0290; RV32I-NEXT: neg a0, a0291; RV32I-NEXT: or a0, a0, s1292; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload293; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload294; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload295; RV32I-NEXT: addi sp, sp, 16296; RV32I-NEXT: ret297;298; RV64I-LABEL: fcvt_wu_s_sat:299; RV64I: # %bb.0: # %start300; RV64I-NEXT: addi sp, sp, -32301; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill302; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill303; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill304; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill305; RV64I-NEXT: mv s2, a0306; RV64I-NEXT: li a1, 0307; RV64I-NEXT: call __gesf2308; RV64I-NEXT: mv s0, a0309; RV64I-NEXT: mv a0, s2310; RV64I-NEXT: call __fixunssfdi311; RV64I-NEXT: mv s1, a0312; RV64I-NEXT: lui a1, 325632313; RV64I-NEXT: addi a1, a1, -1314; RV64I-NEXT: mv a0, s2315; RV64I-NEXT: call __gtsf2316; RV64I-NEXT: blez a0, .LBB4_2317; RV64I-NEXT: # %bb.1: # %start318; RV64I-NEXT: li a0, -1319; RV64I-NEXT: srli a0, a0, 32320; RV64I-NEXT: j .LBB4_3321; RV64I-NEXT: .LBB4_2:322; RV64I-NEXT: srli s0, s0, 63323; RV64I-NEXT: addi a0, s0, -1324; RV64I-NEXT: and a0, a0, s1325; RV64I-NEXT: .LBB4_3: # %start326; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload327; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload328; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload329; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload330; RV64I-NEXT: addi sp, sp, 32331; RV64I-NEXT: ret332start:333 %0 = tail call i32 @llvm.fptoui.sat.i32.f32(float %a)334 ret i32 %0335}336 337define signext i32 @fmv_x_w(float %a, float %b) nounwind {338; CHECKIF-LABEL: fmv_x_w:339; CHECKIF: # %bb.0:340; CHECKIF-NEXT: fadd.s fa5, fa0, fa1341; CHECKIF-NEXT: fmv.x.w a0, fa5342; CHECKIF-NEXT: ret343;344; RV32IZFINX-LABEL: fmv_x_w:345; RV32IZFINX: # %bb.0:346; RV32IZFINX-NEXT: fadd.s a0, a0, a1347; RV32IZFINX-NEXT: ret348;349; RV64IZFINX-LABEL: fmv_x_w:350; RV64IZFINX: # %bb.0:351; RV64IZFINX-NEXT: fadd.s a0, a0, a1352; RV64IZFINX-NEXT: sext.w a0, a0353; RV64IZFINX-NEXT: ret354;355; RV32I-LABEL: fmv_x_w:356; RV32I: # %bb.0:357; RV32I-NEXT: addi sp, sp, -16358; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill359; RV32I-NEXT: call __addsf3360; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload361; RV32I-NEXT: addi sp, sp, 16362; RV32I-NEXT: ret363;364; RV64I-LABEL: fmv_x_w:365; RV64I: # %bb.0:366; RV64I-NEXT: addi sp, sp, -16367; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill368; RV64I-NEXT: call __addsf3369; RV64I-NEXT: sext.w a0, a0370; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload371; RV64I-NEXT: addi sp, sp, 16372; RV64I-NEXT: ret373; Ensure fmv.x.w is generated even for a soft float calling convention374 %1 = fadd float %a, %b375 %2 = bitcast float %1 to i32376 ret i32 %2377}378 379define float @fcvt_s_w(i32 %a) nounwind {380; CHECKIF-LABEL: fcvt_s_w:381; CHECKIF: # %bb.0:382; CHECKIF-NEXT: fcvt.s.w fa0, a0383; CHECKIF-NEXT: ret384;385; CHECKIZFINX-LABEL: fcvt_s_w:386; CHECKIZFINX: # %bb.0:387; CHECKIZFINX-NEXT: fcvt.s.w a0, a0388; CHECKIZFINX-NEXT: ret389;390; RV32I-LABEL: fcvt_s_w:391; RV32I: # %bb.0:392; RV32I-NEXT: addi sp, sp, -16393; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill394; RV32I-NEXT: call __floatsisf395; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload396; RV32I-NEXT: addi sp, sp, 16397; RV32I-NEXT: ret398;399; RV64I-LABEL: fcvt_s_w:400; RV64I: # %bb.0:401; RV64I-NEXT: addi sp, sp, -16402; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill403; RV64I-NEXT: sext.w a0, a0404; RV64I-NEXT: call __floatsisf405; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload406; RV64I-NEXT: addi sp, sp, 16407; RV64I-NEXT: ret408 %1 = sitofp i32 %a to float409 ret float %1410}411 412define float @fcvt_s_w_load(ptr %p) nounwind {413; CHECKIF-LABEL: fcvt_s_w_load:414; CHECKIF: # %bb.0:415; CHECKIF-NEXT: lw a0, 0(a0)416; CHECKIF-NEXT: fcvt.s.w fa0, a0417; CHECKIF-NEXT: ret418;419; CHECKIZFINX-LABEL: fcvt_s_w_load:420; CHECKIZFINX: # %bb.0:421; CHECKIZFINX-NEXT: lw a0, 0(a0)422; CHECKIZFINX-NEXT: fcvt.s.w a0, a0423; CHECKIZFINX-NEXT: ret424;425; RV32I-LABEL: fcvt_s_w_load:426; RV32I: # %bb.0:427; RV32I-NEXT: addi sp, sp, -16428; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill429; RV32I-NEXT: lw a0, 0(a0)430; RV32I-NEXT: call __floatsisf431; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload432; RV32I-NEXT: addi sp, sp, 16433; RV32I-NEXT: ret434;435; RV64I-LABEL: fcvt_s_w_load:436; RV64I: # %bb.0:437; RV64I-NEXT: addi sp, sp, -16438; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill439; RV64I-NEXT: lw a0, 0(a0)440; RV64I-NEXT: call __floatsisf441; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload442; RV64I-NEXT: addi sp, sp, 16443; RV64I-NEXT: ret444 %a = load i32, ptr %p445 %1 = sitofp i32 %a to float446 ret float %1447}448 449define float @fcvt_s_wu(i32 %a) nounwind {450; CHECKIF-LABEL: fcvt_s_wu:451; CHECKIF: # %bb.0:452; CHECKIF-NEXT: fcvt.s.wu fa0, a0453; CHECKIF-NEXT: ret454;455; CHECKIZFINX-LABEL: fcvt_s_wu:456; CHECKIZFINX: # %bb.0:457; CHECKIZFINX-NEXT: fcvt.s.wu a0, a0458; CHECKIZFINX-NEXT: ret459;460; RV32I-LABEL: fcvt_s_wu:461; RV32I: # %bb.0:462; RV32I-NEXT: addi sp, sp, -16463; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill464; RV32I-NEXT: call __floatunsisf465; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload466; RV32I-NEXT: addi sp, sp, 16467; RV32I-NEXT: ret468;469; RV64I-LABEL: fcvt_s_wu:470; RV64I: # %bb.0:471; RV64I-NEXT: addi sp, sp, -16472; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill473; RV64I-NEXT: sext.w a0, a0474; RV64I-NEXT: call __floatunsisf475; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload476; RV64I-NEXT: addi sp, sp, 16477; RV64I-NEXT: ret478 %1 = uitofp i32 %a to float479 ret float %1480}481 482define float @fcvt_s_wu_load(ptr %p) nounwind {483; CHECKIF-LABEL: fcvt_s_wu_load:484; CHECKIF: # %bb.0:485; CHECKIF-NEXT: lw a0, 0(a0)486; CHECKIF-NEXT: fcvt.s.wu fa0, a0487; CHECKIF-NEXT: ret488;489; CHECKIZFINX-LABEL: fcvt_s_wu_load:490; CHECKIZFINX: # %bb.0:491; CHECKIZFINX-NEXT: lw a0, 0(a0)492; CHECKIZFINX-NEXT: fcvt.s.wu a0, a0493; CHECKIZFINX-NEXT: ret494;495; RV32I-LABEL: fcvt_s_wu_load:496; RV32I: # %bb.0:497; RV32I-NEXT: addi sp, sp, -16498; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill499; RV32I-NEXT: lw a0, 0(a0)500; RV32I-NEXT: call __floatunsisf501; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload502; RV32I-NEXT: addi sp, sp, 16503; RV32I-NEXT: ret504;505; RV64I-LABEL: fcvt_s_wu_load:506; RV64I: # %bb.0:507; RV64I-NEXT: addi sp, sp, -16508; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill509; RV64I-NEXT: lw a0, 0(a0)510; RV64I-NEXT: call __floatunsisf511; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload512; RV64I-NEXT: addi sp, sp, 16513; RV64I-NEXT: ret514 %a = load i32, ptr %p515 %1 = uitofp i32 %a to float516 ret float %1517}518 519define float @fmv_w_x(i32 %a, i32 %b) nounwind {520; CHECKIF-LABEL: fmv_w_x:521; CHECKIF: # %bb.0:522; CHECKIF-NEXT: fmv.w.x fa5, a0523; CHECKIF-NEXT: fmv.w.x fa4, a1524; CHECKIF-NEXT: fadd.s fa0, fa5, fa4525; CHECKIF-NEXT: ret526;527; CHECKIZFINX-LABEL: fmv_w_x:528; CHECKIZFINX: # %bb.0:529; CHECKIZFINX-NEXT: fadd.s a0, a0, a1530; CHECKIZFINX-NEXT: ret531;532; RV32I-LABEL: fmv_w_x:533; RV32I: # %bb.0:534; RV32I-NEXT: addi sp, sp, -16535; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill536; RV32I-NEXT: call __addsf3537; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload538; RV32I-NEXT: addi sp, sp, 16539; RV32I-NEXT: ret540;541; RV64I-LABEL: fmv_w_x:542; RV64I: # %bb.0:543; RV64I-NEXT: addi sp, sp, -16544; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill545; RV64I-NEXT: call __addsf3546; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload547; RV64I-NEXT: addi sp, sp, 16548; RV64I-NEXT: ret549; Ensure fmv.w.x is generated even for a soft float calling convention550 %1 = bitcast i32 %a to float551 %2 = bitcast i32 %b to float552 %3 = fadd float %1, %2553 ret float %3554}555 556define i64 @fcvt_l_s(float %a) nounwind {557; RV32IF-LABEL: fcvt_l_s:558; RV32IF: # %bb.0:559; RV32IF-NEXT: addi sp, sp, -16560; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill561; RV32IF-NEXT: call __fixsfdi562; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload563; RV32IF-NEXT: addi sp, sp, 16564; RV32IF-NEXT: ret565;566; RV64IF-LABEL: fcvt_l_s:567; RV64IF: # %bb.0:568; RV64IF-NEXT: fcvt.l.s a0, fa0, rtz569; RV64IF-NEXT: ret570;571; RV32IZFINX-LABEL: fcvt_l_s:572; RV32IZFINX: # %bb.0:573; RV32IZFINX-NEXT: addi sp, sp, -16574; RV32IZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill575; RV32IZFINX-NEXT: call __fixsfdi576; RV32IZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload577; RV32IZFINX-NEXT: addi sp, sp, 16578; RV32IZFINX-NEXT: ret579;580; RV64IZFINX-LABEL: fcvt_l_s:581; RV64IZFINX: # %bb.0:582; RV64IZFINX-NEXT: fcvt.l.s a0, a0, rtz583; RV64IZFINX-NEXT: ret584;585; RV32I-LABEL: fcvt_l_s:586; RV32I: # %bb.0:587; RV32I-NEXT: addi sp, sp, -16588; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill589; RV32I-NEXT: call __fixsfdi590; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload591; RV32I-NEXT: addi sp, sp, 16592; RV32I-NEXT: ret593;594; RV64I-LABEL: fcvt_l_s:595; RV64I: # %bb.0:596; RV64I-NEXT: addi sp, sp, -16597; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill598; RV64I-NEXT: call __fixsfdi599; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload600; RV64I-NEXT: addi sp, sp, 16601; RV64I-NEXT: ret602 %1 = fptosi float %a to i64603 ret i64 %1604}605 606define i64 @fcvt_l_s_sat(float %a) nounwind {607; RV32IF-LABEL: fcvt_l_s_sat:608; RV32IF: # %bb.0: # %start609; RV32IF-NEXT: addi sp, sp, -16610; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill611; RV32IF-NEXT: sw s0, 8(sp) # 4-byte Folded Spill612; RV32IF-NEXT: fsw fs0, 4(sp) # 4-byte Folded Spill613; RV32IF-NEXT: fmv.s fs0, fa0614; RV32IF-NEXT: lui a0, 913408615; RV32IF-NEXT: fmv.w.x fa5, a0616; RV32IF-NEXT: fle.s s0, fa5, fa0617; RV32IF-NEXT: call __fixsfdi618; RV32IF-NEXT: lui a3, 524288619; RV32IF-NEXT: lui a2, 524288620; RV32IF-NEXT: beqz s0, .LBB12_2621; RV32IF-NEXT: # %bb.1: # %start622; RV32IF-NEXT: mv a2, a1623; RV32IF-NEXT: .LBB12_2: # %start624; RV32IF-NEXT: lui a1, 389120625; RV32IF-NEXT: addi a1, a1, -1626; RV32IF-NEXT: fmv.w.x fa5, a1627; RV32IF-NEXT: flt.s a1, fa5, fs0628; RV32IF-NEXT: beqz a1, .LBB12_4629; RV32IF-NEXT: # %bb.3:630; RV32IF-NEXT: addi a2, a3, -1631; RV32IF-NEXT: .LBB12_4: # %start632; RV32IF-NEXT: feq.s a3, fs0, fs0633; RV32IF-NEXT: neg a4, s0634; RV32IF-NEXT: neg a5, a1635; RV32IF-NEXT: neg a3, a3636; RV32IF-NEXT: and a0, a4, a0637; RV32IF-NEXT: and a1, a3, a2638; RV32IF-NEXT: or a0, a5, a0639; RV32IF-NEXT: and a0, a3, a0640; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload641; RV32IF-NEXT: lw s0, 8(sp) # 4-byte Folded Reload642; RV32IF-NEXT: flw fs0, 4(sp) # 4-byte Folded Reload643; RV32IF-NEXT: addi sp, sp, 16644; RV32IF-NEXT: ret645;646; RV64IF-LABEL: fcvt_l_s_sat:647; RV64IF: # %bb.0: # %start648; RV64IF-NEXT: fcvt.l.s a0, fa0, rtz649; RV64IF-NEXT: feq.s a1, fa0, fa0650; RV64IF-NEXT: seqz a1, a1651; RV64IF-NEXT: addi a1, a1, -1652; RV64IF-NEXT: and a0, a1, a0653; RV64IF-NEXT: ret654;655; RV32IZFINX-LABEL: fcvt_l_s_sat:656; RV32IZFINX: # %bb.0: # %start657; RV32IZFINX-NEXT: addi sp, sp, -16658; RV32IZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill659; RV32IZFINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill660; RV32IZFINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill661; RV32IZFINX-NEXT: mv s0, a0662; RV32IZFINX-NEXT: lui a0, 913408663; RV32IZFINX-NEXT: fle.s s1, a0, s0664; RV32IZFINX-NEXT: mv a0, s0665; RV32IZFINX-NEXT: call __fixsfdi666; RV32IZFINX-NEXT: lui a3, 524288667; RV32IZFINX-NEXT: lui a2, 524288668; RV32IZFINX-NEXT: beqz s1, .LBB12_2669; RV32IZFINX-NEXT: # %bb.1: # %start670; RV32IZFINX-NEXT: mv a2, a1671; RV32IZFINX-NEXT: .LBB12_2: # %start672; RV32IZFINX-NEXT: lui a1, 389120673; RV32IZFINX-NEXT: addi a1, a1, -1674; RV32IZFINX-NEXT: flt.s a1, a1, s0675; RV32IZFINX-NEXT: beqz a1, .LBB12_4676; RV32IZFINX-NEXT: # %bb.3:677; RV32IZFINX-NEXT: addi a2, a3, -1678; RV32IZFINX-NEXT: .LBB12_4: # %start679; RV32IZFINX-NEXT: feq.s a3, s0, s0680; RV32IZFINX-NEXT: neg a4, s1681; RV32IZFINX-NEXT: neg a5, a1682; RV32IZFINX-NEXT: neg a3, a3683; RV32IZFINX-NEXT: and a0, a4, a0684; RV32IZFINX-NEXT: and a1, a3, a2685; RV32IZFINX-NEXT: or a0, a5, a0686; RV32IZFINX-NEXT: and a0, a3, a0687; RV32IZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload688; RV32IZFINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload689; RV32IZFINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload690; RV32IZFINX-NEXT: addi sp, sp, 16691; RV32IZFINX-NEXT: ret692;693; RV64IZFINX-LABEL: fcvt_l_s_sat:694; RV64IZFINX: # %bb.0: # %start695; RV64IZFINX-NEXT: fcvt.l.s a1, a0, rtz696; RV64IZFINX-NEXT: feq.s a0, a0, a0697; RV64IZFINX-NEXT: seqz a0, a0698; RV64IZFINX-NEXT: addi a0, a0, -1699; RV64IZFINX-NEXT: and a0, a0, a1700; RV64IZFINX-NEXT: ret701;702; RV32I-LABEL: fcvt_l_s_sat:703; RV32I: # %bb.0: # %start704; RV32I-NEXT: addi sp, sp, -32705; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill706; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill707; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill708; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill709; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill710; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill711; RV32I-NEXT: sw s5, 4(sp) # 4-byte Folded Spill712; RV32I-NEXT: mv s1, a0713; RV32I-NEXT: lui a1, 913408714; RV32I-NEXT: call __gesf2715; RV32I-NEXT: mv s2, a0716; RV32I-NEXT: mv a0, s1717; RV32I-NEXT: call __fixsfdi718; RV32I-NEXT: mv s0, a0719; RV32I-NEXT: mv s3, a1720; RV32I-NEXT: lui s5, 524288721; RV32I-NEXT: bgez s2, .LBB12_2722; RV32I-NEXT: # %bb.1: # %start723; RV32I-NEXT: lui s3, 524288724; RV32I-NEXT: .LBB12_2: # %start725; RV32I-NEXT: lui a1, 389120726; RV32I-NEXT: addi a1, a1, -1727; RV32I-NEXT: mv a0, s1728; RV32I-NEXT: call __gtsf2729; RV32I-NEXT: mv s4, a0730; RV32I-NEXT: blez a0, .LBB12_4731; RV32I-NEXT: # %bb.3: # %start732; RV32I-NEXT: addi s3, s5, -1733; RV32I-NEXT: .LBB12_4: # %start734; RV32I-NEXT: mv a0, s1735; RV32I-NEXT: mv a1, s1736; RV32I-NEXT: call __unordsf2737; RV32I-NEXT: snez a0, a0738; RV32I-NEXT: srli a1, s2, 31739; RV32I-NEXT: sgtz a2, s4740; RV32I-NEXT: addi a0, a0, -1741; RV32I-NEXT: addi a3, a1, -1742; RV32I-NEXT: and a1, a0, s3743; RV32I-NEXT: and a3, a3, s0744; RV32I-NEXT: neg a2, a2745; RV32I-NEXT: or a2, a2, a3746; RV32I-NEXT: and a0, a0, a2747; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload748; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload749; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload750; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload751; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload752; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload753; RV32I-NEXT: lw s5, 4(sp) # 4-byte Folded Reload754; RV32I-NEXT: addi sp, sp, 32755; RV32I-NEXT: ret756;757; RV64I-LABEL: fcvt_l_s_sat:758; RV64I: # %bb.0: # %start759; RV64I-NEXT: addi sp, sp, -48760; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill761; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill762; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill763; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill764; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill765; RV64I-NEXT: mv s0, a0766; RV64I-NEXT: lui a1, 913408767; RV64I-NEXT: call __gesf2768; RV64I-NEXT: mv s2, a0769; RV64I-NEXT: mv a0, s0770; RV64I-NEXT: call __fixsfdi771; RV64I-NEXT: mv s1, a0772; RV64I-NEXT: li s3, -1773; RV64I-NEXT: bgez s2, .LBB12_2774; RV64I-NEXT: # %bb.1: # %start775; RV64I-NEXT: slli s1, s3, 63776; RV64I-NEXT: .LBB12_2: # %start777; RV64I-NEXT: lui a1, 389120778; RV64I-NEXT: addi a1, a1, -1779; RV64I-NEXT: mv a0, s0780; RV64I-NEXT: call __gtsf2781; RV64I-NEXT: blez a0, .LBB12_4782; RV64I-NEXT: # %bb.3: # %start783; RV64I-NEXT: srli s1, s3, 1784; RV64I-NEXT: .LBB12_4: # %start785; RV64I-NEXT: mv a0, s0786; RV64I-NEXT: mv a1, s0787; RV64I-NEXT: call __unordsf2788; RV64I-NEXT: snez a0, a0789; RV64I-NEXT: addi a0, a0, -1790; RV64I-NEXT: and a0, a0, s1791; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload792; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload793; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload794; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload795; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload796; RV64I-NEXT: addi sp, sp, 48797; RV64I-NEXT: ret798start:799 %0 = tail call i64 @llvm.fptosi.sat.i64.f32(float %a)800 ret i64 %0801}802 803define i64 @fcvt_lu_s(float %a) nounwind {804; RV32IF-LABEL: fcvt_lu_s:805; RV32IF: # %bb.0:806; RV32IF-NEXT: addi sp, sp, -16807; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill808; RV32IF-NEXT: call __fixunssfdi809; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload810; RV32IF-NEXT: addi sp, sp, 16811; RV32IF-NEXT: ret812;813; RV64IF-LABEL: fcvt_lu_s:814; RV64IF: # %bb.0:815; RV64IF-NEXT: fcvt.lu.s a0, fa0, rtz816; RV64IF-NEXT: ret817;818; RV32IZFINX-LABEL: fcvt_lu_s:819; RV32IZFINX: # %bb.0:820; RV32IZFINX-NEXT: addi sp, sp, -16821; RV32IZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill822; RV32IZFINX-NEXT: call __fixunssfdi823; RV32IZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload824; RV32IZFINX-NEXT: addi sp, sp, 16825; RV32IZFINX-NEXT: ret826;827; RV64IZFINX-LABEL: fcvt_lu_s:828; RV64IZFINX: # %bb.0:829; RV64IZFINX-NEXT: fcvt.lu.s a0, a0, rtz830; RV64IZFINX-NEXT: ret831;832; RV32I-LABEL: fcvt_lu_s:833; RV32I: # %bb.0:834; RV32I-NEXT: addi sp, sp, -16835; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill836; RV32I-NEXT: call __fixunssfdi837; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload838; RV32I-NEXT: addi sp, sp, 16839; RV32I-NEXT: ret840;841; RV64I-LABEL: fcvt_lu_s:842; RV64I: # %bb.0:843; RV64I-NEXT: addi sp, sp, -16844; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill845; RV64I-NEXT: call __fixunssfdi846; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload847; RV64I-NEXT: addi sp, sp, 16848; RV64I-NEXT: ret849 %1 = fptoui float %a to i64850 ret i64 %1851}852 853define i64 @fcvt_lu_s_sat(float %a) nounwind {854; RV32IF-LABEL: fcvt_lu_s_sat:855; RV32IF: # %bb.0: # %start856; RV32IF-NEXT: addi sp, sp, -16857; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill858; RV32IF-NEXT: sw s0, 8(sp) # 4-byte Folded Spill859; RV32IF-NEXT: fsw fs0, 4(sp) # 4-byte Folded Spill860; RV32IF-NEXT: fmv.s fs0, fa0861; RV32IF-NEXT: fmv.w.x fa5, zero862; RV32IF-NEXT: fle.s a0, fa5, fa0863; RV32IF-NEXT: neg s0, a0864; RV32IF-NEXT: call __fixunssfdi865; RV32IF-NEXT: and a0, s0, a0866; RV32IF-NEXT: lui a2, 391168867; RV32IF-NEXT: and a1, s0, a1868; RV32IF-NEXT: addi a2, a2, -1869; RV32IF-NEXT: fmv.w.x fa5, a2870; RV32IF-NEXT: flt.s a2, fa5, fs0871; RV32IF-NEXT: neg a2, a2872; RV32IF-NEXT: or a0, a2, a0873; RV32IF-NEXT: or a1, a2, a1874; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload875; RV32IF-NEXT: lw s0, 8(sp) # 4-byte Folded Reload876; RV32IF-NEXT: flw fs0, 4(sp) # 4-byte Folded Reload877; RV32IF-NEXT: addi sp, sp, 16878; RV32IF-NEXT: ret879;880; RV64IF-LABEL: fcvt_lu_s_sat:881; RV64IF: # %bb.0: # %start882; RV64IF-NEXT: fcvt.lu.s a0, fa0, rtz883; RV64IF-NEXT: feq.s a1, fa0, fa0884; RV64IF-NEXT: seqz a1, a1885; RV64IF-NEXT: addi a1, a1, -1886; RV64IF-NEXT: and a0, a1, a0887; RV64IF-NEXT: ret888;889; RV32IZFINX-LABEL: fcvt_lu_s_sat:890; RV32IZFINX: # %bb.0: # %start891; RV32IZFINX-NEXT: addi sp, sp, -16892; RV32IZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill893; RV32IZFINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill894; RV32IZFINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill895; RV32IZFINX-NEXT: mv s0, a0896; RV32IZFINX-NEXT: fle.s a0, zero, a0897; RV32IZFINX-NEXT: neg s1, a0898; RV32IZFINX-NEXT: mv a0, s0899; RV32IZFINX-NEXT: call __fixunssfdi900; RV32IZFINX-NEXT: and a0, s1, a0901; RV32IZFINX-NEXT: lui a2, 391168902; RV32IZFINX-NEXT: and a1, s1, a1903; RV32IZFINX-NEXT: addi a2, a2, -1904; RV32IZFINX-NEXT: flt.s a2, a2, s0905; RV32IZFINX-NEXT: neg a2, a2906; RV32IZFINX-NEXT: or a0, a2, a0907; RV32IZFINX-NEXT: or a1, a2, a1908; RV32IZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload909; RV32IZFINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload910; RV32IZFINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload911; RV32IZFINX-NEXT: addi sp, sp, 16912; RV32IZFINX-NEXT: ret913;914; RV64IZFINX-LABEL: fcvt_lu_s_sat:915; RV64IZFINX: # %bb.0: # %start916; RV64IZFINX-NEXT: fcvt.lu.s a1, a0, rtz917; RV64IZFINX-NEXT: feq.s a0, a0, a0918; RV64IZFINX-NEXT: seqz a0, a0919; RV64IZFINX-NEXT: addi a0, a0, -1920; RV64IZFINX-NEXT: and a0, a0, a1921; RV64IZFINX-NEXT: ret922;923; RV32I-LABEL: fcvt_lu_s_sat:924; RV32I: # %bb.0: # %start925; RV32I-NEXT: addi sp, sp, -32926; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill927; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill928; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill929; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill930; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill931; RV32I-NEXT: mv s0, a0932; RV32I-NEXT: li a1, 0933; RV32I-NEXT: call __gesf2934; RV32I-NEXT: srli a0, a0, 31935; RV32I-NEXT: addi s2, a0, -1936; RV32I-NEXT: mv a0, s0937; RV32I-NEXT: call __fixunssfdi938; RV32I-NEXT: mv s1, a1939; RV32I-NEXT: and s3, s2, a0940; RV32I-NEXT: lui a1, 391168941; RV32I-NEXT: addi a1, a1, -1942; RV32I-NEXT: mv a0, s0943; RV32I-NEXT: call __gtsf2944; RV32I-NEXT: sgtz a0, a0945; RV32I-NEXT: and a1, s2, s1946; RV32I-NEXT: neg a2, a0947; RV32I-NEXT: or a0, a2, s3948; RV32I-NEXT: or a1, a2, a1949; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload950; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload951; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload952; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload953; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload954; RV32I-NEXT: addi sp, sp, 32955; RV32I-NEXT: ret956;957; RV64I-LABEL: fcvt_lu_s_sat:958; RV64I: # %bb.0: # %start959; RV64I-NEXT: addi sp, sp, -32960; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill961; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill962; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill963; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill964; RV64I-NEXT: mv s0, a0965; RV64I-NEXT: lui a1, 391168966; RV64I-NEXT: addi a1, a1, -1967; RV64I-NEXT: call __gtsf2968; RV64I-NEXT: sgtz a0, a0969; RV64I-NEXT: neg s1, a0970; RV64I-NEXT: mv a0, s0971; RV64I-NEXT: li a1, 0972; RV64I-NEXT: call __gesf2973; RV64I-NEXT: srli a0, a0, 63974; RV64I-NEXT: addi s2, a0, -1975; RV64I-NEXT: mv a0, s0976; RV64I-NEXT: call __fixunssfdi977; RV64I-NEXT: and a0, s2, a0978; RV64I-NEXT: or a0, s1, a0979; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload980; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload981; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload982; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload983; RV64I-NEXT: addi sp, sp, 32984; RV64I-NEXT: ret985start:986 %0 = tail call i64 @llvm.fptoui.sat.i64.f32(float %a)987 ret i64 %0988}989 990define float @fcvt_s_l(i64 %a) nounwind {991; RV32IF-LABEL: fcvt_s_l:992; RV32IF: # %bb.0:993; RV32IF-NEXT: addi sp, sp, -16994; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill995; RV32IF-NEXT: call __floatdisf996; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload997; RV32IF-NEXT: addi sp, sp, 16998; RV32IF-NEXT: ret999;1000; RV64IF-LABEL: fcvt_s_l:1001; RV64IF: # %bb.0:1002; RV64IF-NEXT: fcvt.s.l fa0, a01003; RV64IF-NEXT: ret1004;1005; RV32IZFINX-LABEL: fcvt_s_l:1006; RV32IZFINX: # %bb.0:1007; RV32IZFINX-NEXT: addi sp, sp, -161008; RV32IZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1009; RV32IZFINX-NEXT: call __floatdisf1010; RV32IZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1011; RV32IZFINX-NEXT: addi sp, sp, 161012; RV32IZFINX-NEXT: ret1013;1014; RV64IZFINX-LABEL: fcvt_s_l:1015; RV64IZFINX: # %bb.0:1016; RV64IZFINX-NEXT: fcvt.s.l a0, a01017; RV64IZFINX-NEXT: ret1018;1019; RV32I-LABEL: fcvt_s_l:1020; RV32I: # %bb.0:1021; RV32I-NEXT: addi sp, sp, -161022; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1023; RV32I-NEXT: call __floatdisf1024; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1025; RV32I-NEXT: addi sp, sp, 161026; RV32I-NEXT: ret1027;1028; RV64I-LABEL: fcvt_s_l:1029; RV64I: # %bb.0:1030; RV64I-NEXT: addi sp, sp, -161031; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1032; RV64I-NEXT: call __floatdisf1033; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1034; RV64I-NEXT: addi sp, sp, 161035; RV64I-NEXT: ret1036 %1 = sitofp i64 %a to float1037 ret float %11038}1039 1040define float @fcvt_s_lu(i64 %a) nounwind {1041; RV32IF-LABEL: fcvt_s_lu:1042; RV32IF: # %bb.0:1043; RV32IF-NEXT: addi sp, sp, -161044; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1045; RV32IF-NEXT: call __floatundisf1046; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1047; RV32IF-NEXT: addi sp, sp, 161048; RV32IF-NEXT: ret1049;1050; RV64IF-LABEL: fcvt_s_lu:1051; RV64IF: # %bb.0:1052; RV64IF-NEXT: fcvt.s.lu fa0, a01053; RV64IF-NEXT: ret1054;1055; RV32IZFINX-LABEL: fcvt_s_lu:1056; RV32IZFINX: # %bb.0:1057; RV32IZFINX-NEXT: addi sp, sp, -161058; RV32IZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1059; RV32IZFINX-NEXT: call __floatundisf1060; RV32IZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1061; RV32IZFINX-NEXT: addi sp, sp, 161062; RV32IZFINX-NEXT: ret1063;1064; RV64IZFINX-LABEL: fcvt_s_lu:1065; RV64IZFINX: # %bb.0:1066; RV64IZFINX-NEXT: fcvt.s.lu a0, a01067; RV64IZFINX-NEXT: ret1068;1069; RV32I-LABEL: fcvt_s_lu:1070; RV32I: # %bb.0:1071; RV32I-NEXT: addi sp, sp, -161072; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1073; RV32I-NEXT: call __floatundisf1074; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1075; RV32I-NEXT: addi sp, sp, 161076; RV32I-NEXT: ret1077;1078; RV64I-LABEL: fcvt_s_lu:1079; RV64I: # %bb.0:1080; RV64I-NEXT: addi sp, sp, -161081; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1082; RV64I-NEXT: call __floatundisf1083; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1084; RV64I-NEXT: addi sp, sp, 161085; RV64I-NEXT: ret1086 %1 = uitofp i64 %a to float1087 ret float %11088}1089 1090define float @fcvt_s_w_i8(i8 signext %a) nounwind {1091; CHECKIF-LABEL: fcvt_s_w_i8:1092; CHECKIF: # %bb.0:1093; CHECKIF-NEXT: fcvt.s.w fa0, a01094; CHECKIF-NEXT: ret1095;1096; CHECKIZFINX-LABEL: fcvt_s_w_i8:1097; CHECKIZFINX: # %bb.0:1098; CHECKIZFINX-NEXT: fcvt.s.w a0, a01099; CHECKIZFINX-NEXT: ret1100;1101; RV32I-LABEL: fcvt_s_w_i8:1102; RV32I: # %bb.0:1103; RV32I-NEXT: addi sp, sp, -161104; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1105; RV32I-NEXT: call __floatsisf1106; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1107; RV32I-NEXT: addi sp, sp, 161108; RV32I-NEXT: ret1109;1110; RV64I-LABEL: fcvt_s_w_i8:1111; RV64I: # %bb.0:1112; RV64I-NEXT: addi sp, sp, -161113; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1114; RV64I-NEXT: call __floatsisf1115; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1116; RV64I-NEXT: addi sp, sp, 161117; RV64I-NEXT: ret1118 %1 = sitofp i8 %a to float1119 ret float %11120}1121 1122define float @fcvt_s_wu_i8(i8 zeroext %a) nounwind {1123; CHECKIF-LABEL: fcvt_s_wu_i8:1124; CHECKIF: # %bb.0:1125; CHECKIF-NEXT: fcvt.s.wu fa0, a01126; CHECKIF-NEXT: ret1127;1128; CHECKIZFINX-LABEL: fcvt_s_wu_i8:1129; CHECKIZFINX: # %bb.0:1130; CHECKIZFINX-NEXT: fcvt.s.wu a0, a01131; CHECKIZFINX-NEXT: ret1132;1133; RV32I-LABEL: fcvt_s_wu_i8:1134; RV32I: # %bb.0:1135; RV32I-NEXT: addi sp, sp, -161136; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1137; RV32I-NEXT: call __floatunsisf1138; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1139; RV32I-NEXT: addi sp, sp, 161140; RV32I-NEXT: ret1141;1142; RV64I-LABEL: fcvt_s_wu_i8:1143; RV64I: # %bb.0:1144; RV64I-NEXT: addi sp, sp, -161145; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1146; RV64I-NEXT: call __floatunsisf1147; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1148; RV64I-NEXT: addi sp, sp, 161149; RV64I-NEXT: ret1150 %1 = uitofp i8 %a to float1151 ret float %11152}1153 1154define float @fcvt_s_w_i16(i16 signext %a) nounwind {1155; CHECKIF-LABEL: fcvt_s_w_i16:1156; CHECKIF: # %bb.0:1157; CHECKIF-NEXT: fcvt.s.w fa0, a01158; CHECKIF-NEXT: ret1159;1160; CHECKIZFINX-LABEL: fcvt_s_w_i16:1161; CHECKIZFINX: # %bb.0:1162; CHECKIZFINX-NEXT: fcvt.s.w a0, a01163; CHECKIZFINX-NEXT: ret1164;1165; RV32I-LABEL: fcvt_s_w_i16:1166; RV32I: # %bb.0:1167; RV32I-NEXT: addi sp, sp, -161168; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1169; RV32I-NEXT: call __floatsisf1170; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1171; RV32I-NEXT: addi sp, sp, 161172; RV32I-NEXT: ret1173;1174; RV64I-LABEL: fcvt_s_w_i16:1175; RV64I: # %bb.0:1176; RV64I-NEXT: addi sp, sp, -161177; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1178; RV64I-NEXT: call __floatsisf1179; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1180; RV64I-NEXT: addi sp, sp, 161181; RV64I-NEXT: ret1182 %1 = sitofp i16 %a to float1183 ret float %11184}1185 1186define float @fcvt_s_wu_i16(i16 zeroext %a) nounwind {1187; CHECKIF-LABEL: fcvt_s_wu_i16:1188; CHECKIF: # %bb.0:1189; CHECKIF-NEXT: fcvt.s.wu fa0, a01190; CHECKIF-NEXT: ret1191;1192; CHECKIZFINX-LABEL: fcvt_s_wu_i16:1193; CHECKIZFINX: # %bb.0:1194; CHECKIZFINX-NEXT: fcvt.s.wu a0, a01195; CHECKIZFINX-NEXT: ret1196;1197; RV32I-LABEL: fcvt_s_wu_i16:1198; RV32I: # %bb.0:1199; RV32I-NEXT: addi sp, sp, -161200; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1201; RV32I-NEXT: call __floatunsisf1202; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1203; RV32I-NEXT: addi sp, sp, 161204; RV32I-NEXT: ret1205;1206; RV64I-LABEL: fcvt_s_wu_i16:1207; RV64I: # %bb.0:1208; RV64I-NEXT: addi sp, sp, -161209; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1210; RV64I-NEXT: call __floatunsisf1211; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1212; RV64I-NEXT: addi sp, sp, 161213; RV64I-NEXT: ret1214 %1 = uitofp i16 %a to float1215 ret float %11216}1217 1218; Make sure we select W version of addi on RV64.1219define signext i32 @fcvt_s_w_demanded_bits(i32 signext %0, ptr %1) nounwind {1220; RV32IF-LABEL: fcvt_s_w_demanded_bits:1221; RV32IF: # %bb.0:1222; RV32IF-NEXT: addi a0, a0, 11223; RV32IF-NEXT: fcvt.s.w fa5, a01224; RV32IF-NEXT: fsw fa5, 0(a1)1225; RV32IF-NEXT: ret1226;1227; RV64IF-LABEL: fcvt_s_w_demanded_bits:1228; RV64IF: # %bb.0:1229; RV64IF-NEXT: addiw a0, a0, 11230; RV64IF-NEXT: fcvt.s.w fa5, a01231; RV64IF-NEXT: fsw fa5, 0(a1)1232; RV64IF-NEXT: ret1233;1234; RV32IZFINX-LABEL: fcvt_s_w_demanded_bits:1235; RV32IZFINX: # %bb.0:1236; RV32IZFINX-NEXT: addi a0, a0, 11237; RV32IZFINX-NEXT: fcvt.s.w a2, a01238; RV32IZFINX-NEXT: sw a2, 0(a1)1239; RV32IZFINX-NEXT: ret1240;1241; RV64IZFINX-LABEL: fcvt_s_w_demanded_bits:1242; RV64IZFINX: # %bb.0:1243; RV64IZFINX-NEXT: addiw a0, a0, 11244; RV64IZFINX-NEXT: fcvt.s.w a2, a01245; RV64IZFINX-NEXT: sw a2, 0(a1)1246; RV64IZFINX-NEXT: ret1247;1248; RV32I-LABEL: fcvt_s_w_demanded_bits:1249; RV32I: # %bb.0:1250; RV32I-NEXT: addi sp, sp, -161251; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1252; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1253; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1254; RV32I-NEXT: mv s0, a11255; RV32I-NEXT: addi s1, a0, 11256; RV32I-NEXT: mv a0, s11257; RV32I-NEXT: call __floatsisf1258; RV32I-NEXT: sw a0, 0(s0)1259; RV32I-NEXT: mv a0, s11260; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1261; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1262; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1263; RV32I-NEXT: addi sp, sp, 161264; RV32I-NEXT: ret1265;1266; RV64I-LABEL: fcvt_s_w_demanded_bits:1267; RV64I: # %bb.0:1268; RV64I-NEXT: addi sp, sp, -321269; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1270; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1271; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1272; RV64I-NEXT: mv s0, a11273; RV64I-NEXT: addiw s1, a0, 11274; RV64I-NEXT: mv a0, s11275; RV64I-NEXT: call __floatsisf1276; RV64I-NEXT: sw a0, 0(s0)1277; RV64I-NEXT: mv a0, s11278; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1279; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1280; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1281; RV64I-NEXT: addi sp, sp, 321282; RV64I-NEXT: ret1283 %3 = add i32 %0, 11284 %4 = sitofp i32 %3 to float1285 store float %4, ptr %1, align 41286 ret i32 %31287}1288 1289; Make sure we select W version of addi on RV64.1290define signext i32 @fcvt_s_wu_demanded_bits(i32 signext %0, ptr %1) nounwind {1291; RV32IF-LABEL: fcvt_s_wu_demanded_bits:1292; RV32IF: # %bb.0:1293; RV32IF-NEXT: addi a0, a0, 11294; RV32IF-NEXT: fcvt.s.wu fa5, a01295; RV32IF-NEXT: fsw fa5, 0(a1)1296; RV32IF-NEXT: ret1297;1298; RV64IF-LABEL: fcvt_s_wu_demanded_bits:1299; RV64IF: # %bb.0:1300; RV64IF-NEXT: addiw a0, a0, 11301; RV64IF-NEXT: fcvt.s.wu fa5, a01302; RV64IF-NEXT: fsw fa5, 0(a1)1303; RV64IF-NEXT: ret1304;1305; RV32IZFINX-LABEL: fcvt_s_wu_demanded_bits:1306; RV32IZFINX: # %bb.0:1307; RV32IZFINX-NEXT: addi a0, a0, 11308; RV32IZFINX-NEXT: fcvt.s.wu a2, a01309; RV32IZFINX-NEXT: sw a2, 0(a1)1310; RV32IZFINX-NEXT: ret1311;1312; RV64IZFINX-LABEL: fcvt_s_wu_demanded_bits:1313; RV64IZFINX: # %bb.0:1314; RV64IZFINX-NEXT: addiw a0, a0, 11315; RV64IZFINX-NEXT: fcvt.s.wu a2, a01316; RV64IZFINX-NEXT: sw a2, 0(a1)1317; RV64IZFINX-NEXT: ret1318;1319; RV32I-LABEL: fcvt_s_wu_demanded_bits:1320; RV32I: # %bb.0:1321; RV32I-NEXT: addi sp, sp, -161322; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1323; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1324; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1325; RV32I-NEXT: mv s0, a11326; RV32I-NEXT: addi s1, a0, 11327; RV32I-NEXT: mv a0, s11328; RV32I-NEXT: call __floatunsisf1329; RV32I-NEXT: sw a0, 0(s0)1330; RV32I-NEXT: mv a0, s11331; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1332; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1333; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1334; RV32I-NEXT: addi sp, sp, 161335; RV32I-NEXT: ret1336;1337; RV64I-LABEL: fcvt_s_wu_demanded_bits:1338; RV64I: # %bb.0:1339; RV64I-NEXT: addi sp, sp, -321340; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1341; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1342; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1343; RV64I-NEXT: mv s0, a11344; RV64I-NEXT: addiw s1, a0, 11345; RV64I-NEXT: mv a0, s11346; RV64I-NEXT: call __floatunsisf1347; RV64I-NEXT: sw a0, 0(s0)1348; RV64I-NEXT: mv a0, s11349; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1350; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1351; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1352; RV64I-NEXT: addi sp, sp, 321353; RV64I-NEXT: ret1354 %3 = add i32 %0, 11355 %4 = uitofp i32 %3 to float1356 store float %4, ptr %1, align 41357 ret i32 %31358}1359 1360define signext i16 @fcvt_w_s_i16(float %a) nounwind {1361; RV32IF-LABEL: fcvt_w_s_i16:1362; RV32IF: # %bb.0:1363; RV32IF-NEXT: fcvt.w.s a0, fa0, rtz1364; RV32IF-NEXT: ret1365;1366; RV64IF-LABEL: fcvt_w_s_i16:1367; RV64IF: # %bb.0:1368; RV64IF-NEXT: fcvt.l.s a0, fa0, rtz1369; RV64IF-NEXT: ret1370;1371; RV32IZFINX-LABEL: fcvt_w_s_i16:1372; RV32IZFINX: # %bb.0:1373; RV32IZFINX-NEXT: fcvt.w.s a0, a0, rtz1374; RV32IZFINX-NEXT: ret1375;1376; RV64IZFINX-LABEL: fcvt_w_s_i16:1377; RV64IZFINX: # %bb.0:1378; RV64IZFINX-NEXT: fcvt.l.s a0, a0, rtz1379; RV64IZFINX-NEXT: ret1380;1381; RV32I-LABEL: fcvt_w_s_i16:1382; RV32I: # %bb.0:1383; RV32I-NEXT: addi sp, sp, -161384; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1385; RV32I-NEXT: call __fixsfsi1386; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1387; RV32I-NEXT: addi sp, sp, 161388; RV32I-NEXT: ret1389;1390; RV64I-LABEL: fcvt_w_s_i16:1391; RV64I: # %bb.0:1392; RV64I-NEXT: addi sp, sp, -161393; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1394; RV64I-NEXT: call __fixsfdi1395; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1396; RV64I-NEXT: addi sp, sp, 161397; RV64I-NEXT: ret1398 %1 = fptosi float %a to i161399 ret i16 %11400}1401 1402define signext i16 @fcvt_w_s_sat_i16(float %a) nounwind {1403; RV32IF-LABEL: fcvt_w_s_sat_i16:1404; RV32IF: # %bb.0: # %start1405; RV32IF-NEXT: feq.s a0, fa0, fa01406; RV32IF-NEXT: lui a1, 8151041407; RV32IF-NEXT: fmv.w.x fa5, a11408; RV32IF-NEXT: lui a1, 2908161409; RV32IF-NEXT: neg a0, a01410; RV32IF-NEXT: addi a1, a1, -5121411; RV32IF-NEXT: fmax.s fa5, fa0, fa51412; RV32IF-NEXT: fmv.w.x fa4, a11413; RV32IF-NEXT: fmin.s fa5, fa5, fa41414; RV32IF-NEXT: fcvt.w.s a1, fa5, rtz1415; RV32IF-NEXT: and a0, a0, a11416; RV32IF-NEXT: ret1417;1418; RV64IF-LABEL: fcvt_w_s_sat_i16:1419; RV64IF: # %bb.0: # %start1420; RV64IF-NEXT: feq.s a0, fa0, fa01421; RV64IF-NEXT: lui a1, 8151041422; RV64IF-NEXT: fmv.w.x fa5, a11423; RV64IF-NEXT: lui a1, 2908161424; RV64IF-NEXT: neg a0, a01425; RV64IF-NEXT: addi a1, a1, -5121426; RV64IF-NEXT: fmax.s fa5, fa0, fa51427; RV64IF-NEXT: fmv.w.x fa4, a11428; RV64IF-NEXT: fmin.s fa5, fa5, fa41429; RV64IF-NEXT: fcvt.l.s a1, fa5, rtz1430; RV64IF-NEXT: and a0, a0, a11431; RV64IF-NEXT: ret1432;1433; RV32IZFINX-LABEL: fcvt_w_s_sat_i16:1434; RV32IZFINX: # %bb.0: # %start1435; RV32IZFINX-NEXT: feq.s a1, a0, a01436; RV32IZFINX-NEXT: lui a2, 8151041437; RV32IZFINX-NEXT: fmax.s a0, a0, a21438; RV32IZFINX-NEXT: lui a2, 2908161439; RV32IZFINX-NEXT: neg a1, a11440; RV32IZFINX-NEXT: addi a2, a2, -5121441; RV32IZFINX-NEXT: fmin.s a0, a0, a21442; RV32IZFINX-NEXT: fcvt.w.s a0, a0, rtz1443; RV32IZFINX-NEXT: and a0, a1, a01444; RV32IZFINX-NEXT: ret1445;1446; RV64IZFINX-LABEL: fcvt_w_s_sat_i16:1447; RV64IZFINX: # %bb.0: # %start1448; RV64IZFINX-NEXT: feq.s a1, a0, a01449; RV64IZFINX-NEXT: lui a2, 8151041450; RV64IZFINX-NEXT: fmax.s a0, a0, a21451; RV64IZFINX-NEXT: lui a2, 2908161452; RV64IZFINX-NEXT: neg a1, a11453; RV64IZFINX-NEXT: addi a2, a2, -5121454; RV64IZFINX-NEXT: fmin.s a0, a0, a21455; RV64IZFINX-NEXT: fcvt.l.s a0, a0, rtz1456; RV64IZFINX-NEXT: and a0, a1, a01457; RV64IZFINX-NEXT: ret1458;1459; RV32I-LABEL: fcvt_w_s_sat_i16:1460; RV32I: # %bb.0: # %start1461; RV32I-NEXT: addi sp, sp, -161462; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1463; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1464; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1465; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill1466; RV32I-NEXT: mv s0, a01467; RV32I-NEXT: lui a1, 8151041468; RV32I-NEXT: call __gesf21469; RV32I-NEXT: mv s2, a01470; RV32I-NEXT: mv a0, s01471; RV32I-NEXT: call __fixsfsi1472; RV32I-NEXT: mv s1, a01473; RV32I-NEXT: bgez s2, .LBB24_21474; RV32I-NEXT: # %bb.1: # %start1475; RV32I-NEXT: lui s1, 10485681476; RV32I-NEXT: .LBB24_2: # %start1477; RV32I-NEXT: lui a1, 2908161478; RV32I-NEXT: addi a1, a1, -5121479; RV32I-NEXT: mv a0, s01480; RV32I-NEXT: call __gtsf21481; RV32I-NEXT: blez a0, .LBB24_41482; RV32I-NEXT: # %bb.3: # %start1483; RV32I-NEXT: lui s1, 81484; RV32I-NEXT: addi s1, s1, -11485; RV32I-NEXT: .LBB24_4: # %start1486; RV32I-NEXT: mv a0, s01487; RV32I-NEXT: mv a1, s01488; RV32I-NEXT: call __unordsf21489; RV32I-NEXT: snez a0, a01490; RV32I-NEXT: addi a0, a0, -11491; RV32I-NEXT: and a0, a0, s11492; RV32I-NEXT: slli a0, a0, 161493; RV32I-NEXT: srai a0, a0, 161494; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1495; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1496; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1497; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload1498; RV32I-NEXT: addi sp, sp, 161499; RV32I-NEXT: ret1500;1501; RV64I-LABEL: fcvt_w_s_sat_i16:1502; RV64I: # %bb.0: # %start1503; RV64I-NEXT: addi sp, sp, -321504; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1505; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1506; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1507; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill1508; RV64I-NEXT: mv s0, a01509; RV64I-NEXT: lui a1, 8151041510; RV64I-NEXT: call __gesf21511; RV64I-NEXT: mv s2, a01512; RV64I-NEXT: mv a0, s01513; RV64I-NEXT: call __fixsfdi1514; RV64I-NEXT: mv s1, a01515; RV64I-NEXT: bgez s2, .LBB24_21516; RV64I-NEXT: # %bb.1: # %start1517; RV64I-NEXT: lui s1, 10485681518; RV64I-NEXT: .LBB24_2: # %start1519; RV64I-NEXT: lui a1, 2908161520; RV64I-NEXT: addi a1, a1, -5121521; RV64I-NEXT: mv a0, s01522; RV64I-NEXT: call __gtsf21523; RV64I-NEXT: blez a0, .LBB24_41524; RV64I-NEXT: # %bb.3: # %start1525; RV64I-NEXT: lui s1, 81526; RV64I-NEXT: addi s1, s1, -11527; RV64I-NEXT: .LBB24_4: # %start1528; RV64I-NEXT: mv a0, s01529; RV64I-NEXT: mv a1, s01530; RV64I-NEXT: call __unordsf21531; RV64I-NEXT: snez a0, a01532; RV64I-NEXT: addi a0, a0, -11533; RV64I-NEXT: and a0, a0, s11534; RV64I-NEXT: slli a0, a0, 481535; RV64I-NEXT: srai a0, a0, 481536; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1537; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1538; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1539; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload1540; RV64I-NEXT: addi sp, sp, 321541; RV64I-NEXT: ret1542start:1543 %0 = tail call i16 @llvm.fptosi.sat.i16.f32(float %a)1544 ret i16 %01545}1546 1547define zeroext i16 @fcvt_wu_s_i16(float %a) nounwind {1548; RV32IF-LABEL: fcvt_wu_s_i16:1549; RV32IF: # %bb.0:1550; RV32IF-NEXT: fcvt.wu.s a0, fa0, rtz1551; RV32IF-NEXT: ret1552;1553; RV64IF-LABEL: fcvt_wu_s_i16:1554; RV64IF: # %bb.0:1555; RV64IF-NEXT: fcvt.lu.s a0, fa0, rtz1556; RV64IF-NEXT: ret1557;1558; RV32IZFINX-LABEL: fcvt_wu_s_i16:1559; RV32IZFINX: # %bb.0:1560; RV32IZFINX-NEXT: fcvt.wu.s a0, a0, rtz1561; RV32IZFINX-NEXT: ret1562;1563; RV64IZFINX-LABEL: fcvt_wu_s_i16:1564; RV64IZFINX: # %bb.0:1565; RV64IZFINX-NEXT: fcvt.lu.s a0, a0, rtz1566; RV64IZFINX-NEXT: ret1567;1568; RV32I-LABEL: fcvt_wu_s_i16:1569; RV32I: # %bb.0:1570; RV32I-NEXT: addi sp, sp, -161571; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1572; RV32I-NEXT: call __fixunssfsi1573; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1574; RV32I-NEXT: addi sp, sp, 161575; RV32I-NEXT: ret1576;1577; RV64I-LABEL: fcvt_wu_s_i16:1578; RV64I: # %bb.0:1579; RV64I-NEXT: addi sp, sp, -161580; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1581; RV64I-NEXT: call __fixunssfdi1582; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1583; RV64I-NEXT: addi sp, sp, 161584; RV64I-NEXT: ret1585 %1 = fptoui float %a to i161586 ret i16 %11587}1588 1589define zeroext i16 @fcvt_wu_s_sat_i16(float %a) nounwind {1590; RV32IF-LABEL: fcvt_wu_s_sat_i16:1591; RV32IF: # %bb.0: # %start1592; RV32IF-NEXT: fmv.w.x fa5, zero1593; RV32IF-NEXT: lui a0, 2928641594; RV32IF-NEXT: fmax.s fa5, fa0, fa51595; RV32IF-NEXT: addi a0, a0, -2561596; RV32IF-NEXT: fmv.w.x fa4, a01597; RV32IF-NEXT: fmin.s fa5, fa5, fa41598; RV32IF-NEXT: fcvt.wu.s a0, fa5, rtz1599; RV32IF-NEXT: ret1600;1601; RV64IF-LABEL: fcvt_wu_s_sat_i16:1602; RV64IF: # %bb.0: # %start1603; RV64IF-NEXT: fmv.w.x fa5, zero1604; RV64IF-NEXT: lui a0, 2928641605; RV64IF-NEXT: fmax.s fa5, fa0, fa51606; RV64IF-NEXT: addi a0, a0, -2561607; RV64IF-NEXT: fmv.w.x fa4, a01608; RV64IF-NEXT: fmin.s fa5, fa5, fa41609; RV64IF-NEXT: fcvt.lu.s a0, fa5, rtz1610; RV64IF-NEXT: ret1611;1612; RV32IZFINX-LABEL: fcvt_wu_s_sat_i16:1613; RV32IZFINX: # %bb.0: # %start1614; RV32IZFINX-NEXT: fmax.s a0, a0, zero1615; RV32IZFINX-NEXT: lui a1, 2928641616; RV32IZFINX-NEXT: addi a1, a1, -2561617; RV32IZFINX-NEXT: fmin.s a0, a0, a11618; RV32IZFINX-NEXT: fcvt.wu.s a0, a0, rtz1619; RV32IZFINX-NEXT: ret1620;1621; RV64IZFINX-LABEL: fcvt_wu_s_sat_i16:1622; RV64IZFINX: # %bb.0: # %start1623; RV64IZFINX-NEXT: fmax.s a0, a0, zero1624; RV64IZFINX-NEXT: lui a1, 2928641625; RV64IZFINX-NEXT: addi a1, a1, -2561626; RV64IZFINX-NEXT: fmin.s a0, a0, a11627; RV64IZFINX-NEXT: fcvt.lu.s a0, a0, rtz1628; RV64IZFINX-NEXT: ret1629;1630; RV32I-LABEL: fcvt_wu_s_sat_i16:1631; RV32I: # %bb.0: # %start1632; RV32I-NEXT: addi sp, sp, -161633; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1634; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1635; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1636; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill1637; RV32I-NEXT: mv s2, a01638; RV32I-NEXT: li a1, 01639; RV32I-NEXT: call __gesf21640; RV32I-NEXT: mv s0, a01641; RV32I-NEXT: mv a0, s21642; RV32I-NEXT: call __fixunssfsi1643; RV32I-NEXT: mv s1, a01644; RV32I-NEXT: lui a1, 2928641645; RV32I-NEXT: addi a1, a1, -2561646; RV32I-NEXT: mv a0, s21647; RV32I-NEXT: call __gtsf21648; RV32I-NEXT: lui a1, 161649; RV32I-NEXT: addi a1, a1, -11650; RV32I-NEXT: blez a0, .LBB26_21651; RV32I-NEXT: # %bb.1: # %start1652; RV32I-NEXT: mv a0, a11653; RV32I-NEXT: j .LBB26_31654; RV32I-NEXT: .LBB26_2:1655; RV32I-NEXT: srli s0, s0, 311656; RV32I-NEXT: addi a0, s0, -11657; RV32I-NEXT: and a0, a0, s11658; RV32I-NEXT: .LBB26_3: # %start1659; RV32I-NEXT: and a0, a0, a11660; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1661; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1662; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1663; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload1664; RV32I-NEXT: addi sp, sp, 161665; RV32I-NEXT: ret1666;1667; RV64I-LABEL: fcvt_wu_s_sat_i16:1668; RV64I: # %bb.0: # %start1669; RV64I-NEXT: addi sp, sp, -321670; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1671; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1672; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1673; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill1674; RV64I-NEXT: mv s2, a01675; RV64I-NEXT: li a1, 01676; RV64I-NEXT: call __gesf21677; RV64I-NEXT: mv s0, a01678; RV64I-NEXT: mv a0, s21679; RV64I-NEXT: call __fixunssfdi1680; RV64I-NEXT: mv s1, a01681; RV64I-NEXT: lui a1, 2928641682; RV64I-NEXT: addi a1, a1, -2561683; RV64I-NEXT: mv a0, s21684; RV64I-NEXT: call __gtsf21685; RV64I-NEXT: lui a1, 161686; RV64I-NEXT: addi a1, a1, -11687; RV64I-NEXT: blez a0, .LBB26_21688; RV64I-NEXT: # %bb.1: # %start1689; RV64I-NEXT: mv a0, a11690; RV64I-NEXT: j .LBB26_31691; RV64I-NEXT: .LBB26_2:1692; RV64I-NEXT: srli s0, s0, 631693; RV64I-NEXT: addi a0, s0, -11694; RV64I-NEXT: and a0, a0, s11695; RV64I-NEXT: .LBB26_3: # %start1696; RV64I-NEXT: and a0, a0, a11697; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1698; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1699; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1700; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload1701; RV64I-NEXT: addi sp, sp, 321702; RV64I-NEXT: ret1703start:1704 %0 = tail call i16 @llvm.fptoui.sat.i16.f32(float %a)1705 ret i16 %01706}1707 1708define signext i8 @fcvt_w_s_i8(float %a) nounwind {1709; RV32IF-LABEL: fcvt_w_s_i8:1710; RV32IF: # %bb.0:1711; RV32IF-NEXT: fcvt.w.s a0, fa0, rtz1712; RV32IF-NEXT: ret1713;1714; RV64IF-LABEL: fcvt_w_s_i8:1715; RV64IF: # %bb.0:1716; RV64IF-NEXT: fcvt.l.s a0, fa0, rtz1717; RV64IF-NEXT: ret1718;1719; RV32IZFINX-LABEL: fcvt_w_s_i8:1720; RV32IZFINX: # %bb.0:1721; RV32IZFINX-NEXT: fcvt.w.s a0, a0, rtz1722; RV32IZFINX-NEXT: ret1723;1724; RV64IZFINX-LABEL: fcvt_w_s_i8:1725; RV64IZFINX: # %bb.0:1726; RV64IZFINX-NEXT: fcvt.l.s a0, a0, rtz1727; RV64IZFINX-NEXT: ret1728;1729; RV32I-LABEL: fcvt_w_s_i8:1730; RV32I: # %bb.0:1731; RV32I-NEXT: addi sp, sp, -161732; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1733; RV32I-NEXT: call __fixsfsi1734; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1735; RV32I-NEXT: addi sp, sp, 161736; RV32I-NEXT: ret1737;1738; RV64I-LABEL: fcvt_w_s_i8:1739; RV64I: # %bb.0:1740; RV64I-NEXT: addi sp, sp, -161741; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1742; RV64I-NEXT: call __fixsfdi1743; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1744; RV64I-NEXT: addi sp, sp, 161745; RV64I-NEXT: ret1746 %1 = fptosi float %a to i81747 ret i8 %11748}1749 1750define signext i8 @fcvt_w_s_sat_i8(float %a) nounwind {1751; RV32IF-LABEL: fcvt_w_s_sat_i8:1752; RV32IF: # %bb.0: # %start1753; RV32IF-NEXT: feq.s a0, fa0, fa01754; RV32IF-NEXT: lui a1, 7987201755; RV32IF-NEXT: fmv.w.x fa5, a11756; RV32IF-NEXT: lui a1, 2744001757; RV32IF-NEXT: neg a0, a01758; RV32IF-NEXT: fmax.s fa5, fa0, fa51759; RV32IF-NEXT: fmv.w.x fa4, a11760; RV32IF-NEXT: fmin.s fa5, fa5, fa41761; RV32IF-NEXT: fcvt.w.s a1, fa5, rtz1762; RV32IF-NEXT: and a0, a0, a11763; RV32IF-NEXT: ret1764;1765; RV64IF-LABEL: fcvt_w_s_sat_i8:1766; RV64IF: # %bb.0: # %start1767; RV64IF-NEXT: feq.s a0, fa0, fa01768; RV64IF-NEXT: lui a1, 7987201769; RV64IF-NEXT: fmv.w.x fa5, a11770; RV64IF-NEXT: lui a1, 2744001771; RV64IF-NEXT: neg a0, a01772; RV64IF-NEXT: fmax.s fa5, fa0, fa51773; RV64IF-NEXT: fmv.w.x fa4, a11774; RV64IF-NEXT: fmin.s fa5, fa5, fa41775; RV64IF-NEXT: fcvt.l.s a1, fa5, rtz1776; RV64IF-NEXT: and a0, a0, a11777; RV64IF-NEXT: ret1778;1779; RV32IZFINX-LABEL: fcvt_w_s_sat_i8:1780; RV32IZFINX: # %bb.0: # %start1781; RV32IZFINX-NEXT: feq.s a1, a0, a01782; RV32IZFINX-NEXT: lui a2, 7987201783; RV32IZFINX-NEXT: neg a1, a11784; RV32IZFINX-NEXT: fmax.s a0, a0, a21785; RV32IZFINX-NEXT: lui a2, 2744001786; RV32IZFINX-NEXT: fmin.s a0, a0, a21787; RV32IZFINX-NEXT: fcvt.w.s a0, a0, rtz1788; RV32IZFINX-NEXT: and a0, a1, a01789; RV32IZFINX-NEXT: ret1790;1791; RV64IZFINX-LABEL: fcvt_w_s_sat_i8:1792; RV64IZFINX: # %bb.0: # %start1793; RV64IZFINX-NEXT: feq.s a1, a0, a01794; RV64IZFINX-NEXT: lui a2, 7987201795; RV64IZFINX-NEXT: neg a1, a11796; RV64IZFINX-NEXT: fmax.s a0, a0, a21797; RV64IZFINX-NEXT: lui a2, 2744001798; RV64IZFINX-NEXT: fmin.s a0, a0, a21799; RV64IZFINX-NEXT: fcvt.l.s a0, a0, rtz1800; RV64IZFINX-NEXT: and a0, a1, a01801; RV64IZFINX-NEXT: ret1802;1803; RV32I-LABEL: fcvt_w_s_sat_i8:1804; RV32I: # %bb.0: # %start1805; RV32I-NEXT: addi sp, sp, -161806; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1807; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1808; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1809; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill1810; RV32I-NEXT: mv s0, a01811; RV32I-NEXT: lui a1, 7987201812; RV32I-NEXT: call __gesf21813; RV32I-NEXT: mv s2, a01814; RV32I-NEXT: mv a0, s01815; RV32I-NEXT: call __fixsfsi1816; RV32I-NEXT: mv s1, a01817; RV32I-NEXT: bgez s2, .LBB28_21818; RV32I-NEXT: # %bb.1: # %start1819; RV32I-NEXT: li s1, -1281820; RV32I-NEXT: .LBB28_2: # %start1821; RV32I-NEXT: lui a1, 2744001822; RV32I-NEXT: mv a0, s01823; RV32I-NEXT: call __gtsf21824; RV32I-NEXT: blez a0, .LBB28_41825; RV32I-NEXT: # %bb.3: # %start1826; RV32I-NEXT: li s1, 1271827; RV32I-NEXT: .LBB28_4: # %start1828; RV32I-NEXT: mv a0, s01829; RV32I-NEXT: mv a1, s01830; RV32I-NEXT: call __unordsf21831; RV32I-NEXT: snez a0, a01832; RV32I-NEXT: addi a0, a0, -11833; RV32I-NEXT: and a0, a0, s11834; RV32I-NEXT: slli a0, a0, 241835; RV32I-NEXT: srai a0, a0, 241836; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1837; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1838; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1839; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload1840; RV32I-NEXT: addi sp, sp, 161841; RV32I-NEXT: ret1842;1843; RV64I-LABEL: fcvt_w_s_sat_i8:1844; RV64I: # %bb.0: # %start1845; RV64I-NEXT: addi sp, sp, -321846; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1847; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1848; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1849; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill1850; RV64I-NEXT: mv s0, a01851; RV64I-NEXT: lui a1, 7987201852; RV64I-NEXT: call __gesf21853; RV64I-NEXT: mv s2, a01854; RV64I-NEXT: mv a0, s01855; RV64I-NEXT: call __fixsfdi1856; RV64I-NEXT: mv s1, a01857; RV64I-NEXT: bgez s2, .LBB28_21858; RV64I-NEXT: # %bb.1: # %start1859; RV64I-NEXT: li s1, -1281860; RV64I-NEXT: .LBB28_2: # %start1861; RV64I-NEXT: lui a1, 2744001862; RV64I-NEXT: mv a0, s01863; RV64I-NEXT: call __gtsf21864; RV64I-NEXT: blez a0, .LBB28_41865; RV64I-NEXT: # %bb.3: # %start1866; RV64I-NEXT: li s1, 1271867; RV64I-NEXT: .LBB28_4: # %start1868; RV64I-NEXT: mv a0, s01869; RV64I-NEXT: mv a1, s01870; RV64I-NEXT: call __unordsf21871; RV64I-NEXT: snez a0, a01872; RV64I-NEXT: addi a0, a0, -11873; RV64I-NEXT: and a0, a0, s11874; RV64I-NEXT: slli a0, a0, 561875; RV64I-NEXT: srai a0, a0, 561876; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1877; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1878; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1879; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload1880; RV64I-NEXT: addi sp, sp, 321881; RV64I-NEXT: ret1882start:1883 %0 = tail call i8 @llvm.fptosi.sat.i8.f32(float %a)1884 ret i8 %01885}1886 1887define zeroext i8 @fcvt_wu_s_i8(float %a) nounwind {1888; RV32IF-LABEL: fcvt_wu_s_i8:1889; RV32IF: # %bb.0:1890; RV32IF-NEXT: fcvt.wu.s a0, fa0, rtz1891; RV32IF-NEXT: ret1892;1893; RV64IF-LABEL: fcvt_wu_s_i8:1894; RV64IF: # %bb.0:1895; RV64IF-NEXT: fcvt.lu.s a0, fa0, rtz1896; RV64IF-NEXT: ret1897;1898; RV32IZFINX-LABEL: fcvt_wu_s_i8:1899; RV32IZFINX: # %bb.0:1900; RV32IZFINX-NEXT: fcvt.wu.s a0, a0, rtz1901; RV32IZFINX-NEXT: ret1902;1903; RV64IZFINX-LABEL: fcvt_wu_s_i8:1904; RV64IZFINX: # %bb.0:1905; RV64IZFINX-NEXT: fcvt.lu.s a0, a0, rtz1906; RV64IZFINX-NEXT: ret1907;1908; RV32I-LABEL: fcvt_wu_s_i8:1909; RV32I: # %bb.0:1910; RV32I-NEXT: addi sp, sp, -161911; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1912; RV32I-NEXT: call __fixunssfsi1913; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1914; RV32I-NEXT: addi sp, sp, 161915; RV32I-NEXT: ret1916;1917; RV64I-LABEL: fcvt_wu_s_i8:1918; RV64I: # %bb.0:1919; RV64I-NEXT: addi sp, sp, -161920; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1921; RV64I-NEXT: call __fixunssfdi1922; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1923; RV64I-NEXT: addi sp, sp, 161924; RV64I-NEXT: ret1925 %1 = fptoui float %a to i81926 ret i8 %11927}1928 1929define zeroext i8 @fcvt_wu_s_sat_i8(float %a) nounwind {1930; RV32IF-LABEL: fcvt_wu_s_sat_i8:1931; RV32IF: # %bb.0: # %start1932; RV32IF-NEXT: fmv.w.x fa5, zero1933; RV32IF-NEXT: lui a0, 2764641934; RV32IF-NEXT: fmax.s fa5, fa0, fa51935; RV32IF-NEXT: fmv.w.x fa4, a01936; RV32IF-NEXT: fmin.s fa5, fa5, fa41937; RV32IF-NEXT: fcvt.wu.s a0, fa5, rtz1938; RV32IF-NEXT: ret1939;1940; RV64IF-LABEL: fcvt_wu_s_sat_i8:1941; RV64IF: # %bb.0: # %start1942; RV64IF-NEXT: fmv.w.x fa5, zero1943; RV64IF-NEXT: lui a0, 2764641944; RV64IF-NEXT: fmax.s fa5, fa0, fa51945; RV64IF-NEXT: fmv.w.x fa4, a01946; RV64IF-NEXT: fmin.s fa5, fa5, fa41947; RV64IF-NEXT: fcvt.lu.s a0, fa5, rtz1948; RV64IF-NEXT: ret1949;1950; RV32IZFINX-LABEL: fcvt_wu_s_sat_i8:1951; RV32IZFINX: # %bb.0: # %start1952; RV32IZFINX-NEXT: fmax.s a0, a0, zero1953; RV32IZFINX-NEXT: lui a1, 2764641954; RV32IZFINX-NEXT: fmin.s a0, a0, a11955; RV32IZFINX-NEXT: fcvt.wu.s a0, a0, rtz1956; RV32IZFINX-NEXT: ret1957;1958; RV64IZFINX-LABEL: fcvt_wu_s_sat_i8:1959; RV64IZFINX: # %bb.0: # %start1960; RV64IZFINX-NEXT: fmax.s a0, a0, zero1961; RV64IZFINX-NEXT: lui a1, 2764641962; RV64IZFINX-NEXT: fmin.s a0, a0, a11963; RV64IZFINX-NEXT: fcvt.lu.s a0, a0, rtz1964; RV64IZFINX-NEXT: ret1965;1966; RV32I-LABEL: fcvt_wu_s_sat_i8:1967; RV32I: # %bb.0: # %start1968; RV32I-NEXT: addi sp, sp, -161969; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1970; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1971; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1972; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill1973; RV32I-NEXT: mv s2, a01974; RV32I-NEXT: li a1, 01975; RV32I-NEXT: call __gesf21976; RV32I-NEXT: mv s0, a01977; RV32I-NEXT: mv a0, s21978; RV32I-NEXT: call __fixunssfsi1979; RV32I-NEXT: mv s1, a01980; RV32I-NEXT: lui a1, 2764641981; RV32I-NEXT: mv a0, s21982; RV32I-NEXT: call __gtsf21983; RV32I-NEXT: blez a0, .LBB30_21984; RV32I-NEXT: # %bb.1: # %start1985; RV32I-NEXT: li a0, 2551986; RV32I-NEXT: j .LBB30_31987; RV32I-NEXT: .LBB30_2:1988; RV32I-NEXT: srli s0, s0, 311989; RV32I-NEXT: addi a0, s0, -11990; RV32I-NEXT: and a0, a0, s11991; RV32I-NEXT: .LBB30_3: # %start1992; RV32I-NEXT: zext.b a0, a01993; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1994; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1995; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1996; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload1997; RV32I-NEXT: addi sp, sp, 161998; RV32I-NEXT: ret1999;2000; RV64I-LABEL: fcvt_wu_s_sat_i8:2001; RV64I: # %bb.0: # %start2002; RV64I-NEXT: addi sp, sp, -322003; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill2004; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill2005; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill2006; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill2007; RV64I-NEXT: mv s2, a02008; RV64I-NEXT: li a1, 02009; RV64I-NEXT: call __gesf22010; RV64I-NEXT: mv s0, a02011; RV64I-NEXT: mv a0, s22012; RV64I-NEXT: call __fixunssfdi2013; RV64I-NEXT: mv s1, a02014; RV64I-NEXT: lui a1, 2764642015; RV64I-NEXT: mv a0, s22016; RV64I-NEXT: call __gtsf22017; RV64I-NEXT: blez a0, .LBB30_22018; RV64I-NEXT: # %bb.1: # %start2019; RV64I-NEXT: li a0, 2552020; RV64I-NEXT: j .LBB30_32021; RV64I-NEXT: .LBB30_2:2022; RV64I-NEXT: srli s0, s0, 632023; RV64I-NEXT: addi a0, s0, -12024; RV64I-NEXT: and a0, a0, s12025; RV64I-NEXT: .LBB30_3: # %start2026; RV64I-NEXT: zext.b a0, a02027; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload2028; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload2029; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload2030; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload2031; RV64I-NEXT: addi sp, sp, 322032; RV64I-NEXT: ret2033start:2034 %0 = tail call i8 @llvm.fptoui.sat.i8.f32(float %a)2035 ret i8 %02036}2037 2038define zeroext i32 @fcvt_wu_s_sat_zext(float %a) nounwind {2039; RV32IF-LABEL: fcvt_wu_s_sat_zext:2040; RV32IF: # %bb.0: # %start2041; RV32IF-NEXT: fcvt.wu.s a0, fa0, rtz2042; RV32IF-NEXT: feq.s a1, fa0, fa02043; RV32IF-NEXT: seqz a1, a12044; RV32IF-NEXT: addi a1, a1, -12045; RV32IF-NEXT: and a0, a1, a02046; RV32IF-NEXT: ret2047;2048; RV64IF-LABEL: fcvt_wu_s_sat_zext:2049; RV64IF: # %bb.0: # %start2050; RV64IF-NEXT: fcvt.wu.s a0, fa0, rtz2051; RV64IF-NEXT: feq.s a1, fa0, fa02052; RV64IF-NEXT: seqz a1, a12053; RV64IF-NEXT: addi a1, a1, -12054; RV64IF-NEXT: and a0, a0, a12055; RV64IF-NEXT: slli a0, a0, 322056; RV64IF-NEXT: srli a0, a0, 322057; RV64IF-NEXT: ret2058;2059; RV32IZFINX-LABEL: fcvt_wu_s_sat_zext:2060; RV32IZFINX: # %bb.0: # %start2061; RV32IZFINX-NEXT: fcvt.wu.s a1, a0, rtz2062; RV32IZFINX-NEXT: feq.s a0, a0, a02063; RV32IZFINX-NEXT: seqz a0, a02064; RV32IZFINX-NEXT: addi a0, a0, -12065; RV32IZFINX-NEXT: and a0, a0, a12066; RV32IZFINX-NEXT: ret2067;2068; RV64IZFINX-LABEL: fcvt_wu_s_sat_zext:2069; RV64IZFINX: # %bb.0: # %start2070; RV64IZFINX-NEXT: fcvt.wu.s a1, a0, rtz2071; RV64IZFINX-NEXT: feq.s a0, a0, a02072; RV64IZFINX-NEXT: seqz a0, a02073; RV64IZFINX-NEXT: addi a0, a0, -12074; RV64IZFINX-NEXT: and a0, a1, a02075; RV64IZFINX-NEXT: slli a0, a0, 322076; RV64IZFINX-NEXT: srli a0, a0, 322077; RV64IZFINX-NEXT: ret2078;2079; RV32I-LABEL: fcvt_wu_s_sat_zext:2080; RV32I: # %bb.0: # %start2081; RV32I-NEXT: addi sp, sp, -162082; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2083; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill2084; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill2085; RV32I-NEXT: mv s0, a02086; RV32I-NEXT: li a1, 02087; RV32I-NEXT: call __gesf22088; RV32I-NEXT: srli a0, a0, 312089; RV32I-NEXT: addi s1, a0, -12090; RV32I-NEXT: mv a0, s02091; RV32I-NEXT: call __fixunssfsi2092; RV32I-NEXT: and s1, s1, a02093; RV32I-NEXT: lui a1, 3256322094; RV32I-NEXT: addi a1, a1, -12095; RV32I-NEXT: mv a0, s02096; RV32I-NEXT: call __gtsf22097; RV32I-NEXT: sgtz a0, a02098; RV32I-NEXT: neg a0, a02099; RV32I-NEXT: or a0, a0, s12100; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2101; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload2102; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload2103; RV32I-NEXT: addi sp, sp, 162104; RV32I-NEXT: ret2105;2106; RV64I-LABEL: fcvt_wu_s_sat_zext:2107; RV64I: # %bb.0: # %start2108; RV64I-NEXT: addi sp, sp, -322109; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill2110; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill2111; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill2112; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill2113; RV64I-NEXT: mv s2, a02114; RV64I-NEXT: li a1, 02115; RV64I-NEXT: call __gesf22116; RV64I-NEXT: mv s0, a02117; RV64I-NEXT: mv a0, s22118; RV64I-NEXT: call __fixunssfdi2119; RV64I-NEXT: mv s1, a02120; RV64I-NEXT: lui a1, 3256322121; RV64I-NEXT: addi a1, a1, -12122; RV64I-NEXT: mv a0, s22123; RV64I-NEXT: call __gtsf22124; RV64I-NEXT: blez a0, .LBB31_22125; RV64I-NEXT: # %bb.1: # %start2126; RV64I-NEXT: li a0, -12127; RV64I-NEXT: srli a0, a0, 322128; RV64I-NEXT: j .LBB31_32129; RV64I-NEXT: .LBB31_2:2130; RV64I-NEXT: srli s0, s0, 632131; RV64I-NEXT: addi a0, s0, -12132; RV64I-NEXT: and a0, a0, s12133; RV64I-NEXT: .LBB31_3: # %start2134; RV64I-NEXT: slli a0, a0, 322135; RV64I-NEXT: srli a0, a0, 322136; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload2137; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload2138; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload2139; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload2140; RV64I-NEXT: addi sp, sp, 322141; RV64I-NEXT: ret2142start:2143 %0 = tail call i32 @llvm.fptoui.sat.i32.f32(float %a)2144 ret i32 %02145}2146 2147define signext i32 @fcvt_w_s_sat_sext(float %a) nounwind {2148; CHECKIF-LABEL: fcvt_w_s_sat_sext:2149; CHECKIF: # %bb.0: # %start2150; CHECKIF-NEXT: fcvt.w.s a0, fa0, rtz2151; CHECKIF-NEXT: feq.s a1, fa0, fa02152; CHECKIF-NEXT: seqz a1, a12153; CHECKIF-NEXT: addi a1, a1, -12154; CHECKIF-NEXT: and a0, a1, a02155; CHECKIF-NEXT: ret2156;2157; CHECKIZFINX-LABEL: fcvt_w_s_sat_sext:2158; CHECKIZFINX: # %bb.0: # %start2159; CHECKIZFINX-NEXT: fcvt.w.s a1, a0, rtz2160; CHECKIZFINX-NEXT: feq.s a0, a0, a02161; CHECKIZFINX-NEXT: seqz a0, a02162; CHECKIZFINX-NEXT: addi a0, a0, -12163; CHECKIZFINX-NEXT: and a0, a0, a12164; CHECKIZFINX-NEXT: ret2165;2166; RV32I-LABEL: fcvt_w_s_sat_sext:2167; RV32I: # %bb.0: # %start2168; RV32I-NEXT: addi sp, sp, -322169; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill2170; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill2171; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill2172; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill2173; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill2174; RV32I-NEXT: mv s0, a02175; RV32I-NEXT: lui a1, 8478722176; RV32I-NEXT: call __gesf22177; RV32I-NEXT: mv s2, a02178; RV32I-NEXT: mv a0, s02179; RV32I-NEXT: call __fixsfsi2180; RV32I-NEXT: mv s1, a02181; RV32I-NEXT: lui s3, 5242882182; RV32I-NEXT: bgez s2, .LBB32_22183; RV32I-NEXT: # %bb.1: # %start2184; RV32I-NEXT: lui s1, 5242882185; RV32I-NEXT: .LBB32_2: # %start2186; RV32I-NEXT: lui a1, 3235842187; RV32I-NEXT: addi a1, a1, -12188; RV32I-NEXT: mv a0, s02189; RV32I-NEXT: call __gtsf22190; RV32I-NEXT: blez a0, .LBB32_42191; RV32I-NEXT: # %bb.3: # %start2192; RV32I-NEXT: addi s1, s3, -12193; RV32I-NEXT: .LBB32_4: # %start2194; RV32I-NEXT: mv a0, s02195; RV32I-NEXT: mv a1, s02196; RV32I-NEXT: call __unordsf22197; RV32I-NEXT: snez a0, a02198; RV32I-NEXT: addi a0, a0, -12199; RV32I-NEXT: and a0, a0, s12200; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload2201; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload2202; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload2203; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload2204; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload2205; RV32I-NEXT: addi sp, sp, 322206; RV32I-NEXT: ret2207;2208; RV64I-LABEL: fcvt_w_s_sat_sext:2209; RV64I: # %bb.0: # %start2210; RV64I-NEXT: addi sp, sp, -482211; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill2212; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill2213; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill2214; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill2215; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill2216; RV64I-NEXT: mv s0, a02217; RV64I-NEXT: lui a1, 8478722218; RV64I-NEXT: call __gesf22219; RV64I-NEXT: mv s2, a02220; RV64I-NEXT: mv a0, s02221; RV64I-NEXT: call __fixsfdi2222; RV64I-NEXT: mv s1, a02223; RV64I-NEXT: lui s3, 5242882224; RV64I-NEXT: bgez s2, .LBB32_22225; RV64I-NEXT: # %bb.1: # %start2226; RV64I-NEXT: lui s1, 5242882227; RV64I-NEXT: .LBB32_2: # %start2228; RV64I-NEXT: lui a1, 3235842229; RV64I-NEXT: addi a1, a1, -12230; RV64I-NEXT: mv a0, s02231; RV64I-NEXT: call __gtsf22232; RV64I-NEXT: blez a0, .LBB32_42233; RV64I-NEXT: # %bb.3: # %start2234; RV64I-NEXT: addi s1, s3, -12235; RV64I-NEXT: .LBB32_4: # %start2236; RV64I-NEXT: mv a0, s02237; RV64I-NEXT: mv a1, s02238; RV64I-NEXT: call __unordsf22239; RV64I-NEXT: snez a0, a02240; RV64I-NEXT: addi a0, a0, -12241; RV64I-NEXT: and a0, a0, s12242; RV64I-NEXT: sext.w a0, a02243; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload2244; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload2245; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload2246; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload2247; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload2248; RV64I-NEXT: addi sp, sp, 482249; RV64I-NEXT: ret2250start:2251 %0 = tail call i32 @llvm.fptosi.sat.i32.f32(float %a)2252 ret i32 %02253}2254