671 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: -disable-strictnode-mutation -target-abi=ilp32f \4; RUN: | FileCheck -check-prefixes=CHECKIF,RV32IF %s5; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs < %s \6; RUN: -disable-strictnode-mutation -target-abi=lp64f \7; RUN: | FileCheck -check-prefixes=CHECKIF,RV64IF %s8; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \9; RUN: -disable-strictnode-mutation | FileCheck -check-prefix=RV32I %s10; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \11; RUN: -disable-strictnode-mutation | FileCheck -check-prefix=RV64I %s12; RUN: llc -mtriple=riscv32 -mattr=+zfinx -verify-machineinstrs < %s \13; RUN: -disable-strictnode-mutation -target-abi=ilp32 \14; RUN: | FileCheck -check-prefixes=CHECKIZFINX,RV32IZFINX %s15; RUN: llc -mtriple=riscv64 -mattr=+zfinx -verify-machineinstrs < %s \16; RUN: -disable-strictnode-mutation -target-abi=lp64 \17; RUN: | FileCheck -check-prefixes=CHECKIZFINX,RV64IZFINX %s18 19define float @fadd_s(float %a, float %b) nounwind strictfp {20; CHECKIF-LABEL: fadd_s:21; CHECKIF: # %bb.0:22; CHECKIF-NEXT: fadd.s fa0, fa0, fa123; CHECKIF-NEXT: ret24;25; RV32I-LABEL: fadd_s:26; RV32I: # %bb.0:27; RV32I-NEXT: addi sp, sp, -1628; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill29; RV32I-NEXT: call __addsf330; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload31; RV32I-NEXT: addi sp, sp, 1632; RV32I-NEXT: ret33;34; RV64I-LABEL: fadd_s:35; RV64I: # %bb.0:36; RV64I-NEXT: addi sp, sp, -1637; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill38; RV64I-NEXT: call __addsf339; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload40; RV64I-NEXT: addi sp, sp, 1641; RV64I-NEXT: ret42;43; CHECKIZFINX-LABEL: fadd_s:44; CHECKIZFINX: # %bb.0:45; CHECKIZFINX-NEXT: fadd.s a0, a0, a146; CHECKIZFINX-NEXT: ret47 %1 = call float @llvm.experimental.constrained.fadd.f32(float %a, float %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp48 ret float %149}50 51define float @fsub_s(float %a, float %b) nounwind strictfp {52; CHECKIF-LABEL: fsub_s:53; CHECKIF: # %bb.0:54; CHECKIF-NEXT: fsub.s fa0, fa0, fa155; CHECKIF-NEXT: ret56;57; RV32I-LABEL: fsub_s:58; RV32I: # %bb.0:59; RV32I-NEXT: addi sp, sp, -1660; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill61; RV32I-NEXT: call __subsf362; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload63; RV32I-NEXT: addi sp, sp, 1664; RV32I-NEXT: ret65;66; RV64I-LABEL: fsub_s:67; RV64I: # %bb.0:68; RV64I-NEXT: addi sp, sp, -1669; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill70; RV64I-NEXT: call __subsf371; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload72; RV64I-NEXT: addi sp, sp, 1673; RV64I-NEXT: ret74;75; CHECKIZFINX-LABEL: fsub_s:76; CHECKIZFINX: # %bb.0:77; CHECKIZFINX-NEXT: fsub.s a0, a0, a178; CHECKIZFINX-NEXT: ret79 %1 = call float @llvm.experimental.constrained.fsub.f32(float %a, float %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp80 ret float %181}82 83define float @fmul_s(float %a, float %b) nounwind strictfp {84; CHECKIF-LABEL: fmul_s:85; CHECKIF: # %bb.0:86; CHECKIF-NEXT: fmul.s fa0, fa0, fa187; CHECKIF-NEXT: ret88;89; RV32I-LABEL: fmul_s:90; RV32I: # %bb.0:91; RV32I-NEXT: addi sp, sp, -1692; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill93; RV32I-NEXT: call __mulsf394; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload95; RV32I-NEXT: addi sp, sp, 1696; RV32I-NEXT: ret97;98; RV64I-LABEL: fmul_s:99; RV64I: # %bb.0:100; RV64I-NEXT: addi sp, sp, -16101; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill102; RV64I-NEXT: call __mulsf3103; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload104; RV64I-NEXT: addi sp, sp, 16105; RV64I-NEXT: ret106;107; CHECKIZFINX-LABEL: fmul_s:108; CHECKIZFINX: # %bb.0:109; CHECKIZFINX-NEXT: fmul.s a0, a0, a1110; CHECKIZFINX-NEXT: ret111 %1 = call float @llvm.experimental.constrained.fmul.f32(float %a, float %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp112 ret float %1113}114 115define float @fdiv_s(float %a, float %b) nounwind strictfp {116; CHECKIF-LABEL: fdiv_s:117; CHECKIF: # %bb.0:118; CHECKIF-NEXT: fdiv.s fa0, fa0, fa1119; CHECKIF-NEXT: ret120;121; RV32I-LABEL: fdiv_s:122; RV32I: # %bb.0:123; RV32I-NEXT: addi sp, sp, -16124; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill125; RV32I-NEXT: call __divsf3126; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload127; RV32I-NEXT: addi sp, sp, 16128; RV32I-NEXT: ret129;130; RV64I-LABEL: fdiv_s:131; RV64I: # %bb.0:132; RV64I-NEXT: addi sp, sp, -16133; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill134; RV64I-NEXT: call __divsf3135; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload136; RV64I-NEXT: addi sp, sp, 16137; RV64I-NEXT: ret138;139; CHECKIZFINX-LABEL: fdiv_s:140; CHECKIZFINX: # %bb.0:141; CHECKIZFINX-NEXT: fdiv.s a0, a0, a1142; CHECKIZFINX-NEXT: ret143 %1 = call float @llvm.experimental.constrained.fdiv.f32(float %a, float %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp144 ret float %1145}146 147define float @fsqrt_s(float %a) nounwind strictfp {148; CHECKIF-LABEL: fsqrt_s:149; CHECKIF: # %bb.0:150; CHECKIF-NEXT: fsqrt.s fa0, fa0151; CHECKIF-NEXT: ret152;153; RV32I-LABEL: fsqrt_s:154; RV32I: # %bb.0:155; RV32I-NEXT: addi sp, sp, -16156; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill157; RV32I-NEXT: call sqrtf158; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload159; RV32I-NEXT: addi sp, sp, 16160; RV32I-NEXT: ret161;162; RV64I-LABEL: fsqrt_s:163; RV64I: # %bb.0:164; RV64I-NEXT: addi sp, sp, -16165; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill166; RV64I-NEXT: call sqrtf167; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload168; RV64I-NEXT: addi sp, sp, 16169; RV64I-NEXT: ret170;171; CHECKIZFINX-LABEL: fsqrt_s:172; CHECKIZFINX: # %bb.0:173; CHECKIZFINX-NEXT: fsqrt.s a0, a0174; CHECKIZFINX-NEXT: ret175 %1 = call float @llvm.experimental.constrained.sqrt.f32(float %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp176 ret float %1177}178 179define float @fmin_s(float %a, float %b) nounwind strictfp {180; RV32IF-LABEL: fmin_s:181; RV32IF: # %bb.0:182; RV32IF-NEXT: addi sp, sp, -16183; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill184; RV32IF-NEXT: call fminf185; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload186; RV32IF-NEXT: addi sp, sp, 16187; RV32IF-NEXT: ret188;189; RV64IF-LABEL: fmin_s:190; RV64IF: # %bb.0:191; RV64IF-NEXT: addi sp, sp, -16192; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill193; RV64IF-NEXT: call fminf194; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload195; RV64IF-NEXT: addi sp, sp, 16196; RV64IF-NEXT: ret197;198; RV32I-LABEL: fmin_s:199; RV32I: # %bb.0:200; RV32I-NEXT: addi sp, sp, -16201; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill202; RV32I-NEXT: call fminf203; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload204; RV32I-NEXT: addi sp, sp, 16205; RV32I-NEXT: ret206;207; RV64I-LABEL: fmin_s:208; RV64I: # %bb.0:209; RV64I-NEXT: addi sp, sp, -16210; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill211; RV64I-NEXT: call fminf212; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload213; RV64I-NEXT: addi sp, sp, 16214; RV64I-NEXT: ret215;216; RV32IZFINX-LABEL: fmin_s:217; RV32IZFINX: # %bb.0:218; RV32IZFINX-NEXT: addi sp, sp, -16219; RV32IZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill220; RV32IZFINX-NEXT: call fminf221; RV32IZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload222; RV32IZFINX-NEXT: addi sp, sp, 16223; RV32IZFINX-NEXT: ret224;225; RV64IZFINX-LABEL: fmin_s:226; RV64IZFINX: # %bb.0:227; RV64IZFINX-NEXT: addi sp, sp, -16228; RV64IZFINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill229; RV64IZFINX-NEXT: call fminf230; RV64IZFINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload231; RV64IZFINX-NEXT: addi sp, sp, 16232; RV64IZFINX-NEXT: ret233 %1 = call float @llvm.experimental.constrained.minnum.f32(float %a, float %b, metadata !"fpexcept.strict") strictfp234 ret float %1235}236 237define float @fmax_s(float %a, float %b) nounwind strictfp {238; RV32IF-LABEL: fmax_s:239; RV32IF: # %bb.0:240; RV32IF-NEXT: addi sp, sp, -16241; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill242; RV32IF-NEXT: call fmaxf243; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload244; RV32IF-NEXT: addi sp, sp, 16245; RV32IF-NEXT: ret246;247; RV64IF-LABEL: fmax_s:248; RV64IF: # %bb.0:249; RV64IF-NEXT: addi sp, sp, -16250; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill251; RV64IF-NEXT: call fmaxf252; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload253; RV64IF-NEXT: addi sp, sp, 16254; RV64IF-NEXT: ret255;256; RV32I-LABEL: fmax_s:257; RV32I: # %bb.0:258; RV32I-NEXT: addi sp, sp, -16259; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill260; RV32I-NEXT: call fmaxf261; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload262; RV32I-NEXT: addi sp, sp, 16263; RV32I-NEXT: ret264;265; RV64I-LABEL: fmax_s:266; RV64I: # %bb.0:267; RV64I-NEXT: addi sp, sp, -16268; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill269; RV64I-NEXT: call fmaxf270; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload271; RV64I-NEXT: addi sp, sp, 16272; RV64I-NEXT: ret273;274; RV32IZFINX-LABEL: fmax_s:275; RV32IZFINX: # %bb.0:276; RV32IZFINX-NEXT: addi sp, sp, -16277; RV32IZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill278; RV32IZFINX-NEXT: call fmaxf279; RV32IZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload280; RV32IZFINX-NEXT: addi sp, sp, 16281; RV32IZFINX-NEXT: ret282;283; RV64IZFINX-LABEL: fmax_s:284; RV64IZFINX: # %bb.0:285; RV64IZFINX-NEXT: addi sp, sp, -16286; RV64IZFINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill287; RV64IZFINX-NEXT: call fmaxf288; RV64IZFINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload289; RV64IZFINX-NEXT: addi sp, sp, 16290; RV64IZFINX-NEXT: ret291 %1 = call float @llvm.experimental.constrained.maxnum.f32(float %a, float %b, metadata !"fpexcept.strict") strictfp292 ret float %1293}294 295define float @fmadd_s(float %a, float %b, float %c) nounwind strictfp {296; CHECKIF-LABEL: fmadd_s:297; CHECKIF: # %bb.0:298; CHECKIF-NEXT: fmadd.s fa0, fa0, fa1, fa2299; CHECKIF-NEXT: ret300;301; RV32I-LABEL: fmadd_s:302; RV32I: # %bb.0:303; RV32I-NEXT: addi sp, sp, -16304; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill305; RV32I-NEXT: call fmaf306; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload307; RV32I-NEXT: addi sp, sp, 16308; RV32I-NEXT: ret309;310; RV64I-LABEL: fmadd_s:311; RV64I: # %bb.0:312; RV64I-NEXT: addi sp, sp, -16313; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill314; RV64I-NEXT: call fmaf315; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload316; RV64I-NEXT: addi sp, sp, 16317; RV64I-NEXT: ret318;319; CHECKIZFINX-LABEL: fmadd_s:320; CHECKIZFINX: # %bb.0:321; CHECKIZFINX-NEXT: fmadd.s a0, a0, a1, a2322; CHECKIZFINX-NEXT: ret323 %1 = call float @llvm.experimental.constrained.fma.f32(float %a, float %b, float %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp324 ret float %1325}326 327define float @fmsub_s(float %a, float %b, float %c) nounwind strictfp {328; CHECKIF-LABEL: fmsub_s:329; CHECKIF: # %bb.0:330; CHECKIF-NEXT: fmv.w.x fa5, zero331; CHECKIF-NEXT: fadd.s fa5, fa2, fa5332; CHECKIF-NEXT: fmsub.s fa0, fa0, fa1, fa5333; CHECKIF-NEXT: ret334;335; RV32I-LABEL: fmsub_s:336; RV32I: # %bb.0:337; RV32I-NEXT: addi sp, sp, -16338; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill339; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill340; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill341; RV32I-NEXT: mv s0, a1342; RV32I-NEXT: mv s1, a0343; RV32I-NEXT: mv a0, a2344; RV32I-NEXT: li a1, 0345; RV32I-NEXT: call __addsf3346; RV32I-NEXT: lui a2, 524288347; RV32I-NEXT: xor a2, a0, a2348; RV32I-NEXT: mv a0, s1349; RV32I-NEXT: mv a1, s0350; RV32I-NEXT: call fmaf351; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload352; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload353; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload354; RV32I-NEXT: addi sp, sp, 16355; RV32I-NEXT: ret356;357; RV64I-LABEL: fmsub_s:358; RV64I: # %bb.0:359; RV64I-NEXT: addi sp, sp, -32360; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill361; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill362; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill363; RV64I-NEXT: mv s0, a1364; RV64I-NEXT: mv s1, a0365; RV64I-NEXT: mv a0, a2366; RV64I-NEXT: li a1, 0367; RV64I-NEXT: call __addsf3368; RV64I-NEXT: lui a2, 524288369; RV64I-NEXT: xor a2, a0, a2370; RV64I-NEXT: mv a0, s1371; RV64I-NEXT: mv a1, s0372; RV64I-NEXT: call fmaf373; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload374; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload375; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload376; RV64I-NEXT: addi sp, sp, 32377; RV64I-NEXT: ret378;379; CHECKIZFINX-LABEL: fmsub_s:380; CHECKIZFINX: # %bb.0:381; CHECKIZFINX-NEXT: fadd.s a2, a2, zero382; CHECKIZFINX-NEXT: fmsub.s a0, a0, a1, a2383; CHECKIZFINX-NEXT: ret384 %c_ = fadd float 0.0, %c ; avoid negation using xor385 %negc = fneg float %c_386 %1 = call float @llvm.experimental.constrained.fma.f32(float %a, float %b, float %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp387 ret float %1388}389 390define float @fnmadd_s(float %a, float %b, float %c) nounwind strictfp {391; CHECKIF-LABEL: fnmadd_s:392; CHECKIF: # %bb.0:393; CHECKIF-NEXT: fmv.w.x fa5, zero394; CHECKIF-NEXT: fadd.s fa4, fa0, fa5395; CHECKIF-NEXT: fadd.s fa5, fa2, fa5396; CHECKIF-NEXT: fnmadd.s fa0, fa4, fa1, fa5397; CHECKIF-NEXT: ret398;399; RV32I-LABEL: fnmadd_s:400; RV32I: # %bb.0:401; RV32I-NEXT: addi sp, sp, -16402; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill403; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill404; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill405; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill406; RV32I-NEXT: mv s0, a2407; RV32I-NEXT: mv s1, a1408; RV32I-NEXT: li a1, 0409; RV32I-NEXT: call __addsf3410; RV32I-NEXT: mv s2, a0411; RV32I-NEXT: mv a0, s0412; RV32I-NEXT: li a1, 0413; RV32I-NEXT: call __addsf3414; RV32I-NEXT: lui a2, 524288415; RV32I-NEXT: xor a1, s2, a2416; RV32I-NEXT: xor a2, a0, a2417; RV32I-NEXT: mv a0, a1418; RV32I-NEXT: mv a1, s1419; RV32I-NEXT: call fmaf420; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload421; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload422; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload423; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload424; RV32I-NEXT: addi sp, sp, 16425; RV32I-NEXT: ret426;427; RV64I-LABEL: fnmadd_s:428; RV64I: # %bb.0:429; RV64I-NEXT: addi sp, sp, -32430; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill431; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill432; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill433; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill434; RV64I-NEXT: mv s0, a2435; RV64I-NEXT: mv s1, a1436; RV64I-NEXT: li a1, 0437; RV64I-NEXT: call __addsf3438; RV64I-NEXT: mv s2, a0439; RV64I-NEXT: mv a0, s0440; RV64I-NEXT: li a1, 0441; RV64I-NEXT: call __addsf3442; RV64I-NEXT: lui a2, 524288443; RV64I-NEXT: xor a1, s2, a2444; RV64I-NEXT: xor a2, a0, a2445; RV64I-NEXT: mv a0, a1446; RV64I-NEXT: mv a1, s1447; RV64I-NEXT: call fmaf448; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload449; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload450; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload451; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload452; RV64I-NEXT: addi sp, sp, 32453; RV64I-NEXT: ret454;455; CHECKIZFINX-LABEL: fnmadd_s:456; CHECKIZFINX: # %bb.0:457; CHECKIZFINX-NEXT: fadd.s a0, a0, zero458; CHECKIZFINX-NEXT: fadd.s a2, a2, zero459; CHECKIZFINX-NEXT: fnmadd.s a0, a0, a1, a2460; CHECKIZFINX-NEXT: ret461 %a_ = fadd float 0.0, %a462 %c_ = fadd float 0.0, %c463 %nega = fneg float %a_464 %negc = fneg float %c_465 %1 = call float @llvm.experimental.constrained.fma.f32(float %nega, float %b, float %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp466 ret float %1467}468 469define float @fnmadd_s_2(float %a, float %b, float %c) nounwind strictfp {470; CHECKIF-LABEL: fnmadd_s_2:471; CHECKIF: # %bb.0:472; CHECKIF-NEXT: fmv.w.x fa5, zero473; CHECKIF-NEXT: fadd.s fa4, fa1, fa5474; CHECKIF-NEXT: fadd.s fa5, fa2, fa5475; CHECKIF-NEXT: fnmadd.s fa0, fa4, fa0, fa5476; CHECKIF-NEXT: ret477;478; RV32I-LABEL: fnmadd_s_2:479; RV32I: # %bb.0:480; RV32I-NEXT: addi sp, sp, -16481; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill482; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill483; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill484; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill485; RV32I-NEXT: mv s0, a2486; RV32I-NEXT: mv s1, a0487; RV32I-NEXT: mv a0, a1488; RV32I-NEXT: li a1, 0489; RV32I-NEXT: call __addsf3490; RV32I-NEXT: mv s2, a0491; RV32I-NEXT: mv a0, s0492; RV32I-NEXT: li a1, 0493; RV32I-NEXT: call __addsf3494; RV32I-NEXT: lui a2, 524288495; RV32I-NEXT: xor a1, s2, a2496; RV32I-NEXT: xor a2, a0, a2497; RV32I-NEXT: mv a0, s1498; RV32I-NEXT: call fmaf499; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload500; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload501; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload502; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload503; RV32I-NEXT: addi sp, sp, 16504; RV32I-NEXT: ret505;506; RV64I-LABEL: fnmadd_s_2:507; RV64I: # %bb.0:508; RV64I-NEXT: addi sp, sp, -32509; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill510; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill511; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill512; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill513; RV64I-NEXT: mv s0, a2514; RV64I-NEXT: mv s1, a0515; RV64I-NEXT: mv a0, a1516; RV64I-NEXT: li a1, 0517; RV64I-NEXT: call __addsf3518; RV64I-NEXT: mv s2, a0519; RV64I-NEXT: mv a0, s0520; RV64I-NEXT: li a1, 0521; RV64I-NEXT: call __addsf3522; RV64I-NEXT: lui a2, 524288523; RV64I-NEXT: xor a1, s2, a2524; RV64I-NEXT: xor a2, a0, a2525; RV64I-NEXT: mv a0, s1526; RV64I-NEXT: call fmaf527; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload528; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload529; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload530; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload531; RV64I-NEXT: addi sp, sp, 32532; RV64I-NEXT: ret533;534; CHECKIZFINX-LABEL: fnmadd_s_2:535; CHECKIZFINX: # %bb.0:536; CHECKIZFINX-NEXT: fadd.s a1, a1, zero537; CHECKIZFINX-NEXT: fadd.s a2, a2, zero538; CHECKIZFINX-NEXT: fnmadd.s a0, a1, a0, a2539; CHECKIZFINX-NEXT: ret540 %b_ = fadd float 0.0, %b541 %c_ = fadd float 0.0, %c542 %negb = fneg float %b_543 %negc = fneg float %c_544 %1 = call float @llvm.experimental.constrained.fma.f32(float %a, float %negb, float %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp545 ret float %1546}547 548define float @fnmsub_s(float %a, float %b, float %c) nounwind strictfp {549; CHECKIF-LABEL: fnmsub_s:550; CHECKIF: # %bb.0:551; CHECKIF-NEXT: fmv.w.x fa5, zero552; CHECKIF-NEXT: fadd.s fa5, fa0, fa5553; CHECKIF-NEXT: fnmsub.s fa0, fa5, fa1, fa2554; CHECKIF-NEXT: ret555;556; RV32I-LABEL: fnmsub_s:557; RV32I: # %bb.0:558; RV32I-NEXT: addi sp, sp, -16559; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill560; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill561; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill562; RV32I-NEXT: mv s0, a2563; RV32I-NEXT: mv s1, a1564; RV32I-NEXT: li a1, 0565; RV32I-NEXT: call __addsf3566; RV32I-NEXT: lui a1, 524288567; RV32I-NEXT: xor a0, a0, a1568; RV32I-NEXT: mv a1, s1569; RV32I-NEXT: mv a2, s0570; RV32I-NEXT: call fmaf571; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload572; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload573; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload574; RV32I-NEXT: addi sp, sp, 16575; RV32I-NEXT: ret576;577; RV64I-LABEL: fnmsub_s:578; RV64I: # %bb.0:579; RV64I-NEXT: addi sp, sp, -32580; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill581; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill582; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill583; RV64I-NEXT: mv s0, a2584; RV64I-NEXT: mv s1, a1585; RV64I-NEXT: li a1, 0586; RV64I-NEXT: call __addsf3587; RV64I-NEXT: lui a1, 524288588; RV64I-NEXT: xor a0, a0, a1589; RV64I-NEXT: mv a1, s1590; RV64I-NEXT: mv a2, s0591; RV64I-NEXT: call fmaf592; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload593; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload594; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload595; RV64I-NEXT: addi sp, sp, 32596; RV64I-NEXT: ret597;598; CHECKIZFINX-LABEL: fnmsub_s:599; CHECKIZFINX: # %bb.0:600; CHECKIZFINX-NEXT: fadd.s a0, a0, zero601; CHECKIZFINX-NEXT: fnmsub.s a0, a0, a1, a2602; CHECKIZFINX-NEXT: ret603 %a_ = fadd float 0.0, %a604 %nega = fneg float %a_605 %1 = call float @llvm.experimental.constrained.fma.f32(float %nega, float %b, float %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp606 ret float %1607}608 609define float @fnmsub_s_2(float %a, float %b, float %c) nounwind strictfp {610; CHECKIF-LABEL: fnmsub_s_2:611; CHECKIF: # %bb.0:612; CHECKIF-NEXT: fmv.w.x fa5, zero613; CHECKIF-NEXT: fadd.s fa5, fa1, fa5614; CHECKIF-NEXT: fnmsub.s fa0, fa5, fa0, fa2615; CHECKIF-NEXT: ret616;617; RV32I-LABEL: fnmsub_s_2:618; RV32I: # %bb.0:619; RV32I-NEXT: addi sp, sp, -16620; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill621; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill622; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill623; RV32I-NEXT: mv s0, a2624; RV32I-NEXT: mv s1, a0625; RV32I-NEXT: mv a0, a1626; RV32I-NEXT: li a1, 0627; RV32I-NEXT: call __addsf3628; RV32I-NEXT: lui a1, 524288629; RV32I-NEXT: xor a1, a0, a1630; RV32I-NEXT: mv a0, s1631; RV32I-NEXT: mv a2, s0632; RV32I-NEXT: call fmaf633; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload634; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload635; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload636; RV32I-NEXT: addi sp, sp, 16637; RV32I-NEXT: ret638;639; RV64I-LABEL: fnmsub_s_2:640; RV64I: # %bb.0:641; RV64I-NEXT: addi sp, sp, -32642; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill643; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill644; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill645; RV64I-NEXT: mv s0, a2646; RV64I-NEXT: mv s1, a0647; RV64I-NEXT: mv a0, a1648; RV64I-NEXT: li a1, 0649; RV64I-NEXT: call __addsf3650; RV64I-NEXT: lui a1, 524288651; RV64I-NEXT: xor a1, a0, a1652; RV64I-NEXT: mv a0, s1653; RV64I-NEXT: mv a2, s0654; RV64I-NEXT: call fmaf655; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload656; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload657; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload658; RV64I-NEXT: addi sp, sp, 32659; RV64I-NEXT: ret660;661; CHECKIZFINX-LABEL: fnmsub_s_2:662; CHECKIZFINX: # %bb.0:663; CHECKIZFINX-NEXT: fadd.s a1, a1, zero664; CHECKIZFINX-NEXT: fnmsub.s a0, a1, a0, a2665; CHECKIZFINX-NEXT: ret666 %b_ = fadd float 0.0, %b667 %negb = fneg float %b_668 %1 = call float @llvm.experimental.constrained.fma.f32(float %a, float %negb, float %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp669 ret float %1670}671