brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.0 KiB · 91e7014 Raw
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