499 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+zfh -verify-machineinstrs \3; RUN: -disable-strictnode-mutation -target-abi ilp32f < %s | FileCheck %s4; RUN: llc -mtriple=riscv64 -mattr=+zfh -verify-machineinstrs \5; RUN: -disable-strictnode-mutation -target-abi lp64f < %s | FileCheck %s6; RUN: llc -mtriple=riscv32 -mattr=+zhinx -verify-machineinstrs \7; RUN: -disable-strictnode-mutation -target-abi ilp32 < %s \8; RUN: | FileCheck -check-prefix=CHECK-ZHINX %s9; RUN: llc -mtriple=riscv64 -mattr=+zhinx -verify-machineinstrs \10; RUN: -disable-strictnode-mutation -target-abi lp64 < %s \11; RUN: | FileCheck -check-prefix=CHECK-ZHINX %s12; RUN: llc -mtriple=riscv32 -mattr=+zfhmin -verify-machineinstrs \13; RUN: -disable-strictnode-mutation -target-abi ilp32f < %s \14; RUN: | FileCheck -check-prefixes=CHECK-ZFHMIN %s15; RUN: llc -mtriple=riscv64 -mattr=+zfhmin -verify-machineinstrs \16; RUN: -disable-strictnode-mutation -target-abi lp64f < %s \17; RUN: | FileCheck -check-prefixes=CHECK-ZFHMIN %s18; RUN: llc -mtriple=riscv32 -mattr=+zhinxmin -verify-machineinstrs \19; RUN: -disable-strictnode-mutation -target-abi ilp32 < %s \20; RUN: | FileCheck -check-prefixes=CHECK-ZHINXMIN %s21; RUN: llc -mtriple=riscv64 -mattr=+zhinxmin -verify-machineinstrs \22; RUN: -disable-strictnode-mutation -target-abi lp64 < %s \23; RUN: | FileCheck -check-prefixes=CHECK-ZHINXMIN %s24 25; FIXME: We can't test without Zfh because soft promote legalization isn't26; implemented in SelectionDAG for STRICT nodes.27 28define half @fadd_h(half %a, half %b) nounwind strictfp {29; CHECK-LABEL: fadd_h:30; CHECK: # %bb.0:31; CHECK-NEXT: fadd.h fa0, fa0, fa132; CHECK-NEXT: ret33;34; CHECK-ZHINX-LABEL: fadd_h:35; CHECK-ZHINX: # %bb.0:36; CHECK-ZHINX-NEXT: fadd.h a0, a0, a137; CHECK-ZHINX-NEXT: ret38;39; CHECK-ZFHMIN-LABEL: fadd_h:40; CHECK-ZFHMIN: # %bb.0:41; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa142; CHECK-ZFHMIN-NEXT: fcvt.s.h fa4, fa043; CHECK-ZFHMIN-NEXT: fadd.s fa5, fa4, fa544; CHECK-ZFHMIN-NEXT: fcvt.h.s fa0, fa545; CHECK-ZFHMIN-NEXT: ret46;47; CHECK-ZHINXMIN-LABEL: fadd_h:48; CHECK-ZHINXMIN: # %bb.0:49; CHECK-ZHINXMIN-NEXT: fcvt.s.h a1, a150; CHECK-ZHINXMIN-NEXT: fcvt.s.h a0, a051; CHECK-ZHINXMIN-NEXT: fadd.s a0, a0, a152; CHECK-ZHINXMIN-NEXT: fcvt.h.s a0, a053; CHECK-ZHINXMIN-NEXT: ret54 %1 = call half @llvm.experimental.constrained.fadd.f16(half %a, half %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp55 ret half %156}57 58define half @fsub_h(half %a, half %b) nounwind strictfp {59; CHECK-LABEL: fsub_h:60; CHECK: # %bb.0:61; CHECK-NEXT: fsub.h fa0, fa0, fa162; CHECK-NEXT: ret63;64; CHECK-ZHINX-LABEL: fsub_h:65; CHECK-ZHINX: # %bb.0:66; CHECK-ZHINX-NEXT: fsub.h a0, a0, a167; CHECK-ZHINX-NEXT: ret68;69; CHECK-ZFHMIN-LABEL: fsub_h:70; CHECK-ZFHMIN: # %bb.0:71; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa172; CHECK-ZFHMIN-NEXT: fcvt.s.h fa4, fa073; CHECK-ZFHMIN-NEXT: fsub.s fa5, fa4, fa574; CHECK-ZFHMIN-NEXT: fcvt.h.s fa0, fa575; CHECK-ZFHMIN-NEXT: ret76;77; CHECK-ZHINXMIN-LABEL: fsub_h:78; CHECK-ZHINXMIN: # %bb.0:79; CHECK-ZHINXMIN-NEXT: fcvt.s.h a1, a180; CHECK-ZHINXMIN-NEXT: fcvt.s.h a0, a081; CHECK-ZHINXMIN-NEXT: fsub.s a0, a0, a182; CHECK-ZHINXMIN-NEXT: fcvt.h.s a0, a083; CHECK-ZHINXMIN-NEXT: ret84 %1 = call half @llvm.experimental.constrained.fsub.f16(half %a, half %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp85 ret half %186}87 88define half @fmul_h(half %a, half %b) nounwind strictfp {89; CHECK-LABEL: fmul_h:90; CHECK: # %bb.0:91; CHECK-NEXT: fmul.h fa0, fa0, fa192; CHECK-NEXT: ret93;94; CHECK-ZHINX-LABEL: fmul_h:95; CHECK-ZHINX: # %bb.0:96; CHECK-ZHINX-NEXT: fmul.h a0, a0, a197; CHECK-ZHINX-NEXT: ret98;99; CHECK-ZFHMIN-LABEL: fmul_h:100; CHECK-ZFHMIN: # %bb.0:101; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa1102; CHECK-ZFHMIN-NEXT: fcvt.s.h fa4, fa0103; CHECK-ZFHMIN-NEXT: fmul.s fa5, fa4, fa5104; CHECK-ZFHMIN-NEXT: fcvt.h.s fa0, fa5105; CHECK-ZFHMIN-NEXT: ret106;107; CHECK-ZHINXMIN-LABEL: fmul_h:108; CHECK-ZHINXMIN: # %bb.0:109; CHECK-ZHINXMIN-NEXT: fcvt.s.h a1, a1110; CHECK-ZHINXMIN-NEXT: fcvt.s.h a0, a0111; CHECK-ZHINXMIN-NEXT: fmul.s a0, a0, a1112; CHECK-ZHINXMIN-NEXT: fcvt.h.s a0, a0113; CHECK-ZHINXMIN-NEXT: ret114 %1 = call half @llvm.experimental.constrained.fmul.f16(half %a, half %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp115 ret half %1116}117 118define half @fdiv_h(half %a, half %b) nounwind strictfp {119; CHECK-LABEL: fdiv_h:120; CHECK: # %bb.0:121; CHECK-NEXT: fdiv.h fa0, fa0, fa1122; CHECK-NEXT: ret123;124; CHECK-ZHINX-LABEL: fdiv_h:125; CHECK-ZHINX: # %bb.0:126; CHECK-ZHINX-NEXT: fdiv.h a0, a0, a1127; CHECK-ZHINX-NEXT: ret128;129; CHECK-ZFHMIN-LABEL: fdiv_h:130; CHECK-ZFHMIN: # %bb.0:131; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa1132; CHECK-ZFHMIN-NEXT: fcvt.s.h fa4, fa0133; CHECK-ZFHMIN-NEXT: fdiv.s fa5, fa4, fa5134; CHECK-ZFHMIN-NEXT: fcvt.h.s fa0, fa5135; CHECK-ZFHMIN-NEXT: ret136;137; CHECK-ZHINXMIN-LABEL: fdiv_h:138; CHECK-ZHINXMIN: # %bb.0:139; CHECK-ZHINXMIN-NEXT: fcvt.s.h a1, a1140; CHECK-ZHINXMIN-NEXT: fcvt.s.h a0, a0141; CHECK-ZHINXMIN-NEXT: fdiv.s a0, a0, a1142; CHECK-ZHINXMIN-NEXT: fcvt.h.s a0, a0143; CHECK-ZHINXMIN-NEXT: ret144 %1 = call half @llvm.experimental.constrained.fdiv.f16(half %a, half %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp145 ret half %1146}147 148define half @fsqrt_h(half %a) nounwind strictfp {149; CHECK-LABEL: fsqrt_h:150; CHECK: # %bb.0:151; CHECK-NEXT: fsqrt.h fa0, fa0152; CHECK-NEXT: ret153;154; CHECK-ZHINX-LABEL: fsqrt_h:155; CHECK-ZHINX: # %bb.0:156; CHECK-ZHINX-NEXT: fsqrt.h a0, a0157; CHECK-ZHINX-NEXT: ret158;159; CHECK-ZFHMIN-LABEL: fsqrt_h:160; CHECK-ZFHMIN: # %bb.0:161; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa0162; CHECK-ZFHMIN-NEXT: fsqrt.s fa5, fa5163; CHECK-ZFHMIN-NEXT: fcvt.h.s fa0, fa5164; CHECK-ZFHMIN-NEXT: ret165;166; CHECK-ZHINXMIN-LABEL: fsqrt_h:167; CHECK-ZHINXMIN: # %bb.0:168; CHECK-ZHINXMIN-NEXT: fcvt.s.h a0, a0169; CHECK-ZHINXMIN-NEXT: fsqrt.s a0, a0170; CHECK-ZHINXMIN-NEXT: fcvt.h.s a0, a0171; CHECK-ZHINXMIN-NEXT: ret172 %1 = call half @llvm.experimental.constrained.sqrt.f16(half %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp173 ret half %1174}175 176; FIXME: fminnum/fmaxnum need libcalls to handle SNaN, but we don't have f16177; libcalls and don't support promotion yet.178;define half @fmin_h(half %a, half %b) nounwind strictfp {179; %1 = call half @llvm.experimental.constrained.minnum.f16(half %a, half %b, metadata !"fpexcept.strict") strictfp180; ret half %1181;}182;declare half @llvm.experimental.constrained.minnum.f16(half, half, metadata) strictfp183;184;define half @fmax_h(half %a, half %b) nounwind strictfp {185; %1 = call half @llvm.experimental.constrained.maxnum.f16(half %a, half %b, metadata !"fpexcept.strict") strictfp186; ret half %1187;}188;declare half @llvm.experimental.constrained.maxnum.f16(half, half, metadata) strictfp189 190define half @fmadd_h(half %a, half %b, half %c) nounwind strictfp {191; CHECK-LABEL: fmadd_h:192; CHECK: # %bb.0:193; CHECK-NEXT: fmadd.h fa0, fa0, fa1, fa2194; CHECK-NEXT: ret195;196; CHECK-ZHINX-LABEL: fmadd_h:197; CHECK-ZHINX: # %bb.0:198; CHECK-ZHINX-NEXT: fmadd.h a0, a0, a1, a2199; CHECK-ZHINX-NEXT: ret200;201; CHECK-ZFHMIN-LABEL: fmadd_h:202; CHECK-ZFHMIN: # %bb.0:203; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa2204; CHECK-ZFHMIN-NEXT: fcvt.s.h fa4, fa1205; CHECK-ZFHMIN-NEXT: fcvt.s.h fa3, fa0206; CHECK-ZFHMIN-NEXT: fmadd.s fa5, fa3, fa4, fa5207; CHECK-ZFHMIN-NEXT: fcvt.h.s fa0, fa5208; CHECK-ZFHMIN-NEXT: ret209;210; CHECK-ZHINXMIN-LABEL: fmadd_h:211; CHECK-ZHINXMIN: # %bb.0:212; CHECK-ZHINXMIN-NEXT: fcvt.s.h a2, a2213; CHECK-ZHINXMIN-NEXT: fcvt.s.h a1, a1214; CHECK-ZHINXMIN-NEXT: fcvt.s.h a0, a0215; CHECK-ZHINXMIN-NEXT: fmadd.s a0, a0, a1, a2216; CHECK-ZHINXMIN-NEXT: fcvt.h.s a0, a0217; CHECK-ZHINXMIN-NEXT: ret218 %1 = call half @llvm.experimental.constrained.fma.f16(half %a, half %b, half %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp219 ret half %1220}221 222define half @fmsub_h(half %a, half %b, half %c) nounwind strictfp {223; CHECK-LABEL: fmsub_h:224; CHECK: # %bb.0:225; CHECK-NEXT: fmv.h.x fa5, zero226; CHECK-NEXT: fadd.h fa5, fa2, fa5227; CHECK-NEXT: fmsub.h fa0, fa0, fa1, fa5228; CHECK-NEXT: ret229;230; CHECK-ZHINX-LABEL: fmsub_h:231; CHECK-ZHINX: # %bb.0:232; CHECK-ZHINX-NEXT: fadd.h a2, a2, zero233; CHECK-ZHINX-NEXT: fmsub.h a0, a0, a1, a2234; CHECK-ZHINX-NEXT: ret235;236; CHECK-ZFHMIN-LABEL: fmsub_h:237; CHECK-ZFHMIN: # %bb.0:238; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa2239; CHECK-ZFHMIN-NEXT: fmv.w.x fa4, zero240; CHECK-ZFHMIN-NEXT: lui a0, 1048568241; CHECK-ZFHMIN-NEXT: fcvt.s.h fa3, fa1242; CHECK-ZFHMIN-NEXT: fadd.s fa5, fa5, fa4243; CHECK-ZFHMIN-NEXT: fcvt.h.s fa5, fa5244; CHECK-ZFHMIN-NEXT: fmv.x.h a1, fa5245; CHECK-ZFHMIN-NEXT: xor a0, a1, a0246; CHECK-ZFHMIN-NEXT: fmv.h.x fa5, a0247; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa5248; CHECK-ZFHMIN-NEXT: fcvt.s.h fa4, fa0249; CHECK-ZFHMIN-NEXT: fmadd.s fa5, fa4, fa3, fa5250; CHECK-ZFHMIN-NEXT: fcvt.h.s fa0, fa5251; CHECK-ZFHMIN-NEXT: ret252;253; CHECK-ZHINXMIN-LABEL: fmsub_h:254; CHECK-ZHINXMIN: # %bb.0:255; CHECK-ZHINXMIN-NEXT: fcvt.s.h a2, a2256; CHECK-ZHINXMIN-NEXT: lui a3, 1048568257; CHECK-ZHINXMIN-NEXT: fcvt.s.h a1, a1258; CHECK-ZHINXMIN-NEXT: fadd.s a2, a2, zero259; CHECK-ZHINXMIN-NEXT: fcvt.h.s a2, a2260; CHECK-ZHINXMIN-NEXT: xor a2, a2, a3261; CHECK-ZHINXMIN-NEXT: fcvt.s.h a2, a2262; CHECK-ZHINXMIN-NEXT: fcvt.s.h a0, a0263; CHECK-ZHINXMIN-NEXT: fmadd.s a0, a0, a1, a2264; CHECK-ZHINXMIN-NEXT: fcvt.h.s a0, a0265; CHECK-ZHINXMIN-NEXT: ret266 %c_ = fadd half 0.0, %c ; avoid negation using xor267 %negc = fneg half %c_268 %1 = call half @llvm.experimental.constrained.fma.f16(half %a, half %b, half %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp269 ret half %1270}271 272define half @fnmadd_h(half %a, half %b, half %c) nounwind strictfp {273; CHECK-LABEL: fnmadd_h:274; CHECK: # %bb.0:275; CHECK-NEXT: fmv.h.x fa5, zero276; CHECK-NEXT: fadd.h fa4, fa0, fa5277; CHECK-NEXT: fadd.h fa5, fa2, fa5278; CHECK-NEXT: fnmadd.h fa0, fa4, fa1, fa5279; CHECK-NEXT: ret280;281; CHECK-ZHINX-LABEL: fnmadd_h:282; CHECK-ZHINX: # %bb.0:283; CHECK-ZHINX-NEXT: fadd.h a0, a0, zero284; CHECK-ZHINX-NEXT: fadd.h a2, a2, zero285; CHECK-ZHINX-NEXT: fnmadd.h a0, a0, a1, a2286; CHECK-ZHINX-NEXT: ret287;288; CHECK-ZFHMIN-LABEL: fnmadd_h:289; CHECK-ZFHMIN: # %bb.0:290; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa0291; CHECK-ZFHMIN-NEXT: fmv.w.x fa4, zero292; CHECK-ZFHMIN-NEXT: fcvt.s.h fa3, fa2293; CHECK-ZFHMIN-NEXT: lui a0, 1048568294; CHECK-ZFHMIN-NEXT: fadd.s fa5, fa5, fa4295; CHECK-ZFHMIN-NEXT: fadd.s fa4, fa3, fa4296; CHECK-ZFHMIN-NEXT: fcvt.h.s fa5, fa5297; CHECK-ZFHMIN-NEXT: fcvt.h.s fa4, fa4298; CHECK-ZFHMIN-NEXT: fmv.x.h a1, fa5299; CHECK-ZFHMIN-NEXT: fmv.x.h a2, fa4300; CHECK-ZFHMIN-NEXT: xor a1, a1, a0301; CHECK-ZFHMIN-NEXT: xor a0, a2, a0302; CHECK-ZFHMIN-NEXT: fmv.h.x fa5, a1303; CHECK-ZFHMIN-NEXT: fmv.h.x fa4, a0304; CHECK-ZFHMIN-NEXT: fcvt.s.h fa4, fa4305; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa5306; CHECK-ZFHMIN-NEXT: fcvt.s.h fa3, fa1307; CHECK-ZFHMIN-NEXT: fmadd.s fa5, fa5, fa3, fa4308; CHECK-ZFHMIN-NEXT: fcvt.h.s fa0, fa5309; CHECK-ZFHMIN-NEXT: ret310;311; CHECK-ZHINXMIN-LABEL: fnmadd_h:312; CHECK-ZHINXMIN: # %bb.0:313; CHECK-ZHINXMIN-NEXT: fcvt.s.h a0, a0314; CHECK-ZHINXMIN-NEXT: fcvt.s.h a2, a2315; CHECK-ZHINXMIN-NEXT: lui a3, 1048568316; CHECK-ZHINXMIN-NEXT: fadd.s a0, a0, zero317; CHECK-ZHINXMIN-NEXT: fadd.s a2, a2, zero318; CHECK-ZHINXMIN-NEXT: fcvt.h.s a0, a0319; CHECK-ZHINXMIN-NEXT: fcvt.h.s a2, a2320; CHECK-ZHINXMIN-NEXT: xor a0, a0, a3321; CHECK-ZHINXMIN-NEXT: xor a2, a2, a3322; CHECK-ZHINXMIN-NEXT: fcvt.s.h a2, a2323; CHECK-ZHINXMIN-NEXT: fcvt.s.h a0, a0324; CHECK-ZHINXMIN-NEXT: fcvt.s.h a1, a1325; CHECK-ZHINXMIN-NEXT: fmadd.s a0, a0, a1, a2326; CHECK-ZHINXMIN-NEXT: fcvt.h.s a0, a0327; CHECK-ZHINXMIN-NEXT: ret328 %a_ = fadd half 0.0, %a329 %c_ = fadd half 0.0, %c330 %nega = fneg half %a_331 %negc = fneg half %c_332 %1 = call half @llvm.experimental.constrained.fma.f16(half %nega, half %b, half %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp333 ret half %1334}335 336define half @fnmadd_h_2(half %a, half %b, half %c) nounwind strictfp {337; CHECK-LABEL: fnmadd_h_2:338; CHECK: # %bb.0:339; CHECK-NEXT: fmv.h.x fa5, zero340; CHECK-NEXT: fadd.h fa4, fa1, fa5341; CHECK-NEXT: fadd.h fa5, fa2, fa5342; CHECK-NEXT: fnmadd.h fa0, fa4, fa0, fa5343; CHECK-NEXT: ret344;345; CHECK-ZHINX-LABEL: fnmadd_h_2:346; CHECK-ZHINX: # %bb.0:347; CHECK-ZHINX-NEXT: fadd.h a1, a1, zero348; CHECK-ZHINX-NEXT: fadd.h a2, a2, zero349; CHECK-ZHINX-NEXT: fnmadd.h a0, a1, a0, a2350; CHECK-ZHINX-NEXT: ret351;352; CHECK-ZFHMIN-LABEL: fnmadd_h_2:353; CHECK-ZFHMIN: # %bb.0:354; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa1355; CHECK-ZFHMIN-NEXT: fmv.w.x fa4, zero356; CHECK-ZFHMIN-NEXT: fcvt.s.h fa3, fa2357; CHECK-ZFHMIN-NEXT: lui a0, 1048568358; CHECK-ZFHMIN-NEXT: fadd.s fa5, fa5, fa4359; CHECK-ZFHMIN-NEXT: fadd.s fa4, fa3, fa4360; CHECK-ZFHMIN-NEXT: fcvt.h.s fa5, fa5361; CHECK-ZFHMIN-NEXT: fcvt.h.s fa4, fa4362; CHECK-ZFHMIN-NEXT: fmv.x.h a1, fa5363; CHECK-ZFHMIN-NEXT: fmv.x.h a2, fa4364; CHECK-ZFHMIN-NEXT: xor a1, a1, a0365; CHECK-ZFHMIN-NEXT: xor a0, a2, a0366; CHECK-ZFHMIN-NEXT: fmv.h.x fa5, a1367; CHECK-ZFHMIN-NEXT: fmv.h.x fa4, a0368; CHECK-ZFHMIN-NEXT: fcvt.s.h fa4, fa4369; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa5370; CHECK-ZFHMIN-NEXT: fcvt.s.h fa3, fa0371; CHECK-ZFHMIN-NEXT: fmadd.s fa5, fa3, fa5, fa4372; CHECK-ZFHMIN-NEXT: fcvt.h.s fa0, fa5373; CHECK-ZFHMIN-NEXT: ret374;375; CHECK-ZHINXMIN-LABEL: fnmadd_h_2:376; CHECK-ZHINXMIN: # %bb.0:377; CHECK-ZHINXMIN-NEXT: fcvt.s.h a1, a1378; CHECK-ZHINXMIN-NEXT: fcvt.s.h a2, a2379; CHECK-ZHINXMIN-NEXT: lui a3, 1048568380; CHECK-ZHINXMIN-NEXT: fadd.s a1, a1, zero381; CHECK-ZHINXMIN-NEXT: fadd.s a2, a2, zero382; CHECK-ZHINXMIN-NEXT: fcvt.h.s a1, a1383; CHECK-ZHINXMIN-NEXT: fcvt.h.s a2, a2384; CHECK-ZHINXMIN-NEXT: xor a1, a1, a3385; CHECK-ZHINXMIN-NEXT: xor a2, a2, a3386; CHECK-ZHINXMIN-NEXT: fcvt.s.h a2, a2387; CHECK-ZHINXMIN-NEXT: fcvt.s.h a1, a1388; CHECK-ZHINXMIN-NEXT: fcvt.s.h a0, a0389; CHECK-ZHINXMIN-NEXT: fmadd.s a0, a0, a1, a2390; CHECK-ZHINXMIN-NEXT: fcvt.h.s a0, a0391; CHECK-ZHINXMIN-NEXT: ret392 %b_ = fadd half 0.0, %b393 %c_ = fadd half 0.0, %c394 %negb = fneg half %b_395 %negc = fneg half %c_396 %1 = call half @llvm.experimental.constrained.fma.f16(half %a, half %negb, half %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp397 ret half %1398}399 400define half @fnmsub_h(half %a, half %b, half %c) nounwind strictfp {401; CHECK-LABEL: fnmsub_h:402; CHECK: # %bb.0:403; CHECK-NEXT: fmv.h.x fa5, zero404; CHECK-NEXT: fadd.h fa5, fa0, fa5405; CHECK-NEXT: fnmsub.h fa0, fa5, fa1, fa2406; CHECK-NEXT: ret407;408; CHECK-ZHINX-LABEL: fnmsub_h:409; CHECK-ZHINX: # %bb.0:410; CHECK-ZHINX-NEXT: fadd.h a0, a0, zero411; CHECK-ZHINX-NEXT: fnmsub.h a0, a0, a1, a2412; CHECK-ZHINX-NEXT: ret413;414; CHECK-ZFHMIN-LABEL: fnmsub_h:415; CHECK-ZFHMIN: # %bb.0:416; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa0417; CHECK-ZFHMIN-NEXT: fmv.w.x fa4, zero418; CHECK-ZFHMIN-NEXT: lui a0, 1048568419; CHECK-ZFHMIN-NEXT: fcvt.s.h fa3, fa2420; CHECK-ZFHMIN-NEXT: fadd.s fa5, fa5, fa4421; CHECK-ZFHMIN-NEXT: fcvt.h.s fa5, fa5422; CHECK-ZFHMIN-NEXT: fmv.x.h a1, fa5423; CHECK-ZFHMIN-NEXT: xor a0, a1, a0424; CHECK-ZFHMIN-NEXT: fmv.h.x fa5, a0425; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa5426; CHECK-ZFHMIN-NEXT: fcvt.s.h fa4, fa1427; CHECK-ZFHMIN-NEXT: fmadd.s fa5, fa5, fa4, fa3428; CHECK-ZFHMIN-NEXT: fcvt.h.s fa0, fa5429; CHECK-ZFHMIN-NEXT: ret430;431; CHECK-ZHINXMIN-LABEL: fnmsub_h:432; CHECK-ZHINXMIN: # %bb.0:433; CHECK-ZHINXMIN-NEXT: fcvt.s.h a0, a0434; CHECK-ZHINXMIN-NEXT: lui a3, 1048568435; CHECK-ZHINXMIN-NEXT: fcvt.s.h a2, a2436; CHECK-ZHINXMIN-NEXT: fadd.s a0, a0, zero437; CHECK-ZHINXMIN-NEXT: fcvt.h.s a0, a0438; CHECK-ZHINXMIN-NEXT: xor a0, a0, a3439; CHECK-ZHINXMIN-NEXT: fcvt.s.h a0, a0440; CHECK-ZHINXMIN-NEXT: fcvt.s.h a1, a1441; CHECK-ZHINXMIN-NEXT: fmadd.s a0, a0, a1, a2442; CHECK-ZHINXMIN-NEXT: fcvt.h.s a0, a0443; CHECK-ZHINXMIN-NEXT: ret444 %a_ = fadd half 0.0, %a445 %nega = fneg half %a_446 %1 = call half @llvm.experimental.constrained.fma.f16(half %nega, half %b, half %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp447 ret half %1448}449 450define half @fnmsub_h_2(half %a, half %b, half %c) nounwind strictfp {451; CHECK-LABEL: fnmsub_h_2:452; CHECK: # %bb.0:453; CHECK-NEXT: fmv.h.x fa5, zero454; CHECK-NEXT: fadd.h fa5, fa1, fa5455; CHECK-NEXT: fnmsub.h fa0, fa5, fa0, fa2456; CHECK-NEXT: ret457;458; CHECK-ZHINX-LABEL: fnmsub_h_2:459; CHECK-ZHINX: # %bb.0:460; CHECK-ZHINX-NEXT: fadd.h a1, a1, zero461; CHECK-ZHINX-NEXT: fnmsub.h a0, a1, a0, a2462; CHECK-ZHINX-NEXT: ret463;464; CHECK-ZFHMIN-LABEL: fnmsub_h_2:465; CHECK-ZFHMIN: # %bb.0:466; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa1467; CHECK-ZFHMIN-NEXT: fmv.w.x fa4, zero468; CHECK-ZFHMIN-NEXT: lui a0, 1048568469; CHECK-ZFHMIN-NEXT: fcvt.s.h fa3, fa2470; CHECK-ZFHMIN-NEXT: fadd.s fa5, fa5, fa4471; CHECK-ZFHMIN-NEXT: fcvt.h.s fa5, fa5472; CHECK-ZFHMIN-NEXT: fmv.x.h a1, fa5473; CHECK-ZFHMIN-NEXT: xor a0, a1, a0474; CHECK-ZFHMIN-NEXT: fmv.h.x fa5, a0475; CHECK-ZFHMIN-NEXT: fcvt.s.h fa5, fa5476; CHECK-ZFHMIN-NEXT: fcvt.s.h fa4, fa0477; CHECK-ZFHMIN-NEXT: fmadd.s fa5, fa4, fa5, fa3478; CHECK-ZFHMIN-NEXT: fcvt.h.s fa0, fa5479; CHECK-ZFHMIN-NEXT: ret480;481; CHECK-ZHINXMIN-LABEL: fnmsub_h_2:482; CHECK-ZHINXMIN: # %bb.0:483; CHECK-ZHINXMIN-NEXT: fcvt.s.h a1, a1484; CHECK-ZHINXMIN-NEXT: lui a3, 1048568485; CHECK-ZHINXMIN-NEXT: fcvt.s.h a2, a2486; CHECK-ZHINXMIN-NEXT: fadd.s a1, a1, zero487; CHECK-ZHINXMIN-NEXT: fcvt.h.s a1, a1488; CHECK-ZHINXMIN-NEXT: xor a1, a1, a3489; CHECK-ZHINXMIN-NEXT: fcvt.s.h a1, a1490; CHECK-ZHINXMIN-NEXT: fcvt.s.h a0, a0491; CHECK-ZHINXMIN-NEXT: fmadd.s a0, a0, a1, a2492; CHECK-ZHINXMIN-NEXT: fcvt.h.s a0, a0493; CHECK-ZHINXMIN-NEXT: ret494 %b_ = fadd half 0.0, %b495 %negb = fneg half %b_496 %1 = call half @llvm.experimental.constrained.fma.f16(half %a, half %negb, half %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp497 ret half %1498}499