1374 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+v,+m -target-abi=ilp32d \3; RUN: -verify-machineinstrs < %s | FileCheck %s4; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v,+m -target-abi=lp64d \5; RUN: -verify-machineinstrs < %s | FileCheck %s6 7define <2 x half> @vfmsac_vv_v2f16(<2 x half> %a, <2 x half> %b, <2 x half> %c, <2 x i1> %m, i32 zeroext %evl) {8; CHECK-LABEL: vfmsac_vv_v2f16:9; CHECK: # %bb.0:10; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, mu11; CHECK-NEXT: vfmsac.vv v10, v8, v9, v0.t12; CHECK-NEXT: vmv1r.v v8, v1013; CHECK-NEXT: ret14 %negc = call <2 x half> @llvm.vp.fneg.v2f16(<2 x half> %c, <2 x i1> splat (i1 -1), i32 %evl)15 %v = call <2 x half> @llvm.vp.fma.v2f16(<2 x half> %a, <2 x half> %b, <2 x half> %negc, <2 x i1> splat (i1 -1), i32 %evl)16 %u = call <2 x half> @llvm.vp.merge.v2f16(<2 x i1> %m, <2 x half> %v, <2 x half> %c, i32 %evl)17 ret <2 x half> %u18}19 20define <2 x half> @vfmsac_vv_v2f16_unmasked(<2 x half> %a, <2 x half> %b, <2 x half> %c, <2 x i1> %m, i32 zeroext %evl) {21; CHECK-LABEL: vfmsac_vv_v2f16_unmasked:22; CHECK: # %bb.0:23; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, ma24; CHECK-NEXT: vfmsac.vv v10, v8, v925; CHECK-NEXT: vmv1r.v v8, v1026; CHECK-NEXT: ret27 %negc = call <2 x half> @llvm.vp.fneg.v2f16(<2 x half> %c, <2 x i1> splat (i1 -1), i32 %evl)28 %v = call <2 x half> @llvm.vp.fma.v2f16(<2 x half> %a, <2 x half> %b, <2 x half> %negc, <2 x i1> splat (i1 -1), i32 %evl)29 %u = call <2 x half> @llvm.vp.merge.v2f16(<2 x i1> splat (i1 -1), <2 x half> %v, <2 x half> %c, i32 %evl)30 ret <2 x half> %u31}32 33define <2 x half> @vfmsac_vf_v2f16(<2 x half> %a, half %b, <2 x half> %c, <2 x i1> %m, i32 zeroext %evl) {34; CHECK-LABEL: vfmsac_vf_v2f16:35; CHECK: # %bb.0:36; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, mu37; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t38; CHECK-NEXT: vmv1r.v v8, v939; CHECK-NEXT: ret40 %elt.head = insertelement <2 x half> poison, half %b, i32 041 %vb = shufflevector <2 x half> %elt.head, <2 x half> poison, <2 x i32> zeroinitializer42 %negc = call <2 x half> @llvm.vp.fneg.v2f16(<2 x half> %c, <2 x i1> splat (i1 -1), i32 %evl)43 %v = call <2 x half> @llvm.vp.fma.v2f16(<2 x half> %a, <2 x half> %vb, <2 x half> %negc, <2 x i1> splat (i1 -1), i32 %evl)44 %u = call <2 x half> @llvm.vp.merge.v2f16(<2 x i1> %m, <2 x half> %v, <2 x half> %c, i32 %evl)45 ret <2 x half> %u46}47 48define <2 x half> @vfmsac_vf_v2f16_commute(<2 x half> %a, half %b, <2 x half> %c, <2 x i1> %m, i32 zeroext %evl) {49; CHECK-LABEL: vfmsac_vf_v2f16_commute:50; CHECK: # %bb.0:51; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, mu52; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t53; CHECK-NEXT: vmv1r.v v8, v954; CHECK-NEXT: ret55 %elt.head = insertelement <2 x half> poison, half %b, i32 056 %vb = shufflevector <2 x half> %elt.head, <2 x half> poison, <2 x i32> zeroinitializer57 %negc = call <2 x half> @llvm.vp.fneg.v2f16(<2 x half> %c, <2 x i1> splat (i1 -1), i32 %evl)58 %v = call <2 x half> @llvm.vp.fma.v2f16(<2 x half> %vb, <2 x half> %a, <2 x half> %negc, <2 x i1> splat (i1 -1), i32 %evl)59 %u = call <2 x half> @llvm.vp.merge.v2f16(<2 x i1> %m, <2 x half> %v, <2 x half> %c, i32 %evl)60 ret <2 x half> %u61}62 63define <2 x half> @vfmsac_vf_v2f16_unmasked(<2 x half> %a, half %b, <2 x half> %c, i32 zeroext %evl) {64; CHECK-LABEL: vfmsac_vf_v2f16_unmasked:65; CHECK: # %bb.0:66; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, ma67; CHECK-NEXT: vfmsac.vf v9, fa0, v868; CHECK-NEXT: vmv1r.v v8, v969; CHECK-NEXT: ret70 %elt.head = insertelement <2 x half> poison, half %b, i32 071 %vb = shufflevector <2 x half> %elt.head, <2 x half> poison, <2 x i32> zeroinitializer72 %negc = call <2 x half> @llvm.vp.fneg.v2f16(<2 x half> %c, <2 x i1> splat (i1 -1), i32 %evl)73 %v = call <2 x half> @llvm.vp.fma.v2f16(<2 x half> %a, <2 x half> %vb, <2 x half> %negc, <2 x i1> splat (i1 -1), i32 %evl)74 %u = call <2 x half> @llvm.vp.merge.v2f16(<2 x i1> splat (i1 -1), <2 x half> %v, <2 x half> %c, i32 %evl)75 ret <2 x half> %u76}77 78define <2 x half> @vfmsac_vv_v2f16_ta(<2 x half> %a, <2 x half> %b, <2 x half> %c, <2 x i1> %m, i32 zeroext %evl) {79; CHECK-LABEL: vfmsac_vv_v2f16_ta:80; CHECK: # %bb.0:81; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, mu82; CHECK-NEXT: vfmsac.vv v10, v8, v9, v0.t83; CHECK-NEXT: vmv1r.v v8, v1084; CHECK-NEXT: ret85 %negc = call <2 x half> @llvm.vp.fneg.v2f16(<2 x half> %c, <2 x i1> splat (i1 -1), i32 %evl)86 %v = call <2 x half> @llvm.vp.fma.v2f16(<2 x half> %a, <2 x half> %b, <2 x half> %negc, <2 x i1> splat (i1 -1), i32 %evl)87 %u = call <2 x half> @llvm.vp.select.v2f16(<2 x i1> %m, <2 x half> %v, <2 x half> %c, i32 %evl)88 ret <2 x half> %u89}90 91define <2 x half> @vfmsac_vf_v2f16_ta(<2 x half> %a, half %b, <2 x half> %c, <2 x i1> %m, i32 zeroext %evl) {92; CHECK-LABEL: vfmsac_vf_v2f16_ta:93; CHECK: # %bb.0:94; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, mu95; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t96; CHECK-NEXT: vmv1r.v v8, v997; CHECK-NEXT: ret98 %elt.head = insertelement <2 x half> poison, half %b, i32 099 %vb = shufflevector <2 x half> %elt.head, <2 x half> poison, <2 x i32> zeroinitializer100 %negc = call <2 x half> @llvm.vp.fneg.v2f16(<2 x half> %c, <2 x i1> splat (i1 -1), i32 %evl)101 %v = call <2 x half> @llvm.vp.fma.v2f16(<2 x half> %a, <2 x half> %vb, <2 x half> %negc, <2 x i1> splat (i1 -1), i32 %evl)102 %u = call <2 x half> @llvm.vp.select.v2f16(<2 x i1> %m, <2 x half> %v, <2 x half> %c, i32 %evl)103 ret <2 x half> %u104}105 106define <2 x half> @vfmsac_vf_v2f16_commute_ta(<2 x half> %a, half %b, <2 x half> %c, <2 x i1> %m, i32 zeroext %evl) {107; CHECK-LABEL: vfmsac_vf_v2f16_commute_ta:108; CHECK: # %bb.0:109; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, mu110; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t111; CHECK-NEXT: vmv1r.v v8, v9112; CHECK-NEXT: ret113 %elt.head = insertelement <2 x half> poison, half %b, i32 0114 %vb = shufflevector <2 x half> %elt.head, <2 x half> poison, <2 x i32> zeroinitializer115 %negc = call <2 x half> @llvm.vp.fneg.v2f16(<2 x half> %c, <2 x i1> splat (i1 -1), i32 %evl)116 %v = call <2 x half> @llvm.vp.fma.v2f16(<2 x half> %vb, <2 x half> %a, <2 x half> %negc, <2 x i1> splat (i1 -1), i32 %evl)117 %u = call <2 x half> @llvm.vp.select.v2f16(<2 x i1> %m, <2 x half> %v, <2 x half> %c, i32 %evl)118 ret <2 x half> %u119}120 121define <4 x half> @vfmsac_vv_v4f16(<4 x half> %a, <4 x half> %b, <4 x half> %c, <4 x i1> %m, i32 zeroext %evl) {122; CHECK-LABEL: vfmsac_vv_v4f16:123; CHECK: # %bb.0:124; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, mu125; CHECK-NEXT: vfmsac.vv v10, v8, v9, v0.t126; CHECK-NEXT: vmv1r.v v8, v10127; CHECK-NEXT: ret128 %negc = call <4 x half> @llvm.vp.fneg.v4f16(<4 x half> %c, <4 x i1> splat (i1 -1), i32 %evl)129 %v = call <4 x half> @llvm.vp.fma.v4f16(<4 x half> %a, <4 x half> %b, <4 x half> %negc, <4 x i1> splat (i1 -1), i32 %evl)130 %u = call <4 x half> @llvm.vp.merge.v4f16(<4 x i1> %m, <4 x half> %v, <4 x half> %c, i32 %evl)131 ret <4 x half> %u132}133 134define <4 x half> @vfmsac_vv_v4f16_unmasked(<4 x half> %a, <4 x half> %b, <4 x half> %c, <4 x i1> %m, i32 zeroext %evl) {135; CHECK-LABEL: vfmsac_vv_v4f16_unmasked:136; CHECK: # %bb.0:137; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, ma138; CHECK-NEXT: vfmsac.vv v10, v8, v9139; CHECK-NEXT: vmv1r.v v8, v10140; CHECK-NEXT: ret141 %negc = call <4 x half> @llvm.vp.fneg.v4f16(<4 x half> %c, <4 x i1> splat (i1 -1), i32 %evl)142 %v = call <4 x half> @llvm.vp.fma.v4f16(<4 x half> %a, <4 x half> %b, <4 x half> %negc, <4 x i1> splat (i1 -1), i32 %evl)143 %u = call <4 x half> @llvm.vp.merge.v4f16(<4 x i1> splat (i1 -1), <4 x half> %v, <4 x half> %c, i32 %evl)144 ret <4 x half> %u145}146 147define <4 x half> @vfmsac_vf_v4f16(<4 x half> %a, half %b, <4 x half> %c, <4 x i1> %m, i32 zeroext %evl) {148; CHECK-LABEL: vfmsac_vf_v4f16:149; CHECK: # %bb.0:150; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, mu151; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t152; CHECK-NEXT: vmv1r.v v8, v9153; CHECK-NEXT: ret154 %elt.head = insertelement <4 x half> poison, half %b, i32 0155 %vb = shufflevector <4 x half> %elt.head, <4 x half> poison, <4 x i32> zeroinitializer156 %negc = call <4 x half> @llvm.vp.fneg.v4f16(<4 x half> %c, <4 x i1> splat (i1 -1), i32 %evl)157 %v = call <4 x half> @llvm.vp.fma.v4f16(<4 x half> %a, <4 x half> %vb, <4 x half> %negc, <4 x i1> splat (i1 -1), i32 %evl)158 %u = call <4 x half> @llvm.vp.merge.v4f16(<4 x i1> %m, <4 x half> %v, <4 x half> %c, i32 %evl)159 ret <4 x half> %u160}161 162define <4 x half> @vfmsac_vf_v4f16_commute(<4 x half> %a, half %b, <4 x half> %c, <4 x i1> %m, i32 zeroext %evl) {163; CHECK-LABEL: vfmsac_vf_v4f16_commute:164; CHECK: # %bb.0:165; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, mu166; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t167; CHECK-NEXT: vmv1r.v v8, v9168; CHECK-NEXT: ret169 %elt.head = insertelement <4 x half> poison, half %b, i32 0170 %vb = shufflevector <4 x half> %elt.head, <4 x half> poison, <4 x i32> zeroinitializer171 %negc = call <4 x half> @llvm.vp.fneg.v4f16(<4 x half> %c, <4 x i1> splat (i1 -1), i32 %evl)172 %v = call <4 x half> @llvm.vp.fma.v4f16(<4 x half> %vb, <4 x half> %a, <4 x half> %negc, <4 x i1> splat (i1 -1), i32 %evl)173 %u = call <4 x half> @llvm.vp.merge.v4f16(<4 x i1> %m, <4 x half> %v, <4 x half> %c, i32 %evl)174 ret <4 x half> %u175}176 177define <4 x half> @vfmsac_vf_v4f16_unmasked(<4 x half> %a, half %b, <4 x half> %c, i32 zeroext %evl) {178; CHECK-LABEL: vfmsac_vf_v4f16_unmasked:179; CHECK: # %bb.0:180; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, ma181; CHECK-NEXT: vfmsac.vf v9, fa0, v8182; CHECK-NEXT: vmv1r.v v8, v9183; CHECK-NEXT: ret184 %elt.head = insertelement <4 x half> poison, half %b, i32 0185 %vb = shufflevector <4 x half> %elt.head, <4 x half> poison, <4 x i32> zeroinitializer186 %negc = call <4 x half> @llvm.vp.fneg.v4f16(<4 x half> %c, <4 x i1> splat (i1 -1), i32 %evl)187 %v = call <4 x half> @llvm.vp.fma.v4f16(<4 x half> %a, <4 x half> %vb, <4 x half> %negc, <4 x i1> splat (i1 -1), i32 %evl)188 %u = call <4 x half> @llvm.vp.merge.v4f16(<4 x i1> splat (i1 -1), <4 x half> %v, <4 x half> %c, i32 %evl)189 ret <4 x half> %u190}191 192define <4 x half> @vfmsac_vv_v4f16_ta(<4 x half> %a, <4 x half> %b, <4 x half> %c, <4 x i1> %m, i32 zeroext %evl) {193; CHECK-LABEL: vfmsac_vv_v4f16_ta:194; CHECK: # %bb.0:195; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, mu196; CHECK-NEXT: vfmsac.vv v10, v8, v9, v0.t197; CHECK-NEXT: vmv1r.v v8, v10198; CHECK-NEXT: ret199 %negc = call <4 x half> @llvm.vp.fneg.v4f16(<4 x half> %c, <4 x i1> splat (i1 -1), i32 %evl)200 %v = call <4 x half> @llvm.vp.fma.v4f16(<4 x half> %a, <4 x half> %b, <4 x half> %negc, <4 x i1> splat (i1 -1), i32 %evl)201 %u = call <4 x half> @llvm.vp.select.v4f16(<4 x i1> %m, <4 x half> %v, <4 x half> %c, i32 %evl)202 ret <4 x half> %u203}204 205define <4 x half> @vfmsac_vf_v4f16_ta(<4 x half> %a, half %b, <4 x half> %c, <4 x i1> %m, i32 zeroext %evl) {206; CHECK-LABEL: vfmsac_vf_v4f16_ta:207; CHECK: # %bb.0:208; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, mu209; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t210; CHECK-NEXT: vmv1r.v v8, v9211; CHECK-NEXT: ret212 %elt.head = insertelement <4 x half> poison, half %b, i32 0213 %vb = shufflevector <4 x half> %elt.head, <4 x half> poison, <4 x i32> zeroinitializer214 %negc = call <4 x half> @llvm.vp.fneg.v4f16(<4 x half> %c, <4 x i1> splat (i1 -1), i32 %evl)215 %v = call <4 x half> @llvm.vp.fma.v4f16(<4 x half> %a, <4 x half> %vb, <4 x half> %negc, <4 x i1> splat (i1 -1), i32 %evl)216 %u = call <4 x half> @llvm.vp.select.v4f16(<4 x i1> %m, <4 x half> %v, <4 x half> %c, i32 %evl)217 ret <4 x half> %u218}219 220define <4 x half> @vfmsac_vf_v4f16_commute_ta(<4 x half> %a, half %b, <4 x half> %c, <4 x i1> %m, i32 zeroext %evl) {221; CHECK-LABEL: vfmsac_vf_v4f16_commute_ta:222; CHECK: # %bb.0:223; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, mu224; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t225; CHECK-NEXT: vmv1r.v v8, v9226; CHECK-NEXT: ret227 %elt.head = insertelement <4 x half> poison, half %b, i32 0228 %vb = shufflevector <4 x half> %elt.head, <4 x half> poison, <4 x i32> zeroinitializer229 %negc = call <4 x half> @llvm.vp.fneg.v4f16(<4 x half> %c, <4 x i1> splat (i1 -1), i32 %evl)230 %v = call <4 x half> @llvm.vp.fma.v4f16(<4 x half> %vb, <4 x half> %a, <4 x half> %negc, <4 x i1> splat (i1 -1), i32 %evl)231 %u = call <4 x half> @llvm.vp.select.v4f16(<4 x i1> %m, <4 x half> %v, <4 x half> %c, i32 %evl)232 ret <4 x half> %u233}234 235define <8 x half> @vfmsac_vv_v8f16(<8 x half> %a, <8 x half> %b, <8 x half> %c, <8 x i1> %m, i32 zeroext %evl) {236; CHECK-LABEL: vfmsac_vv_v8f16:237; CHECK: # %bb.0:238; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, mu239; CHECK-NEXT: vfmsac.vv v10, v8, v9, v0.t240; CHECK-NEXT: vmv1r.v v8, v10241; CHECK-NEXT: ret242 %negc = call <8 x half> @llvm.vp.fneg.v8f16(<8 x half> %c, <8 x i1> splat (i1 -1), i32 %evl)243 %v = call <8 x half> @llvm.vp.fma.v8f16(<8 x half> %a, <8 x half> %b, <8 x half> %negc, <8 x i1> splat (i1 -1), i32 %evl)244 %u = call <8 x half> @llvm.vp.merge.v8f16(<8 x i1> %m, <8 x half> %v, <8 x half> %c, i32 %evl)245 ret <8 x half> %u246}247 248define <8 x half> @vfmsac_vv_v8f16_unmasked(<8 x half> %a, <8 x half> %b, <8 x half> %c, <8 x i1> %m, i32 zeroext %evl) {249; CHECK-LABEL: vfmsac_vv_v8f16_unmasked:250; CHECK: # %bb.0:251; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, ma252; CHECK-NEXT: vfmsac.vv v10, v8, v9253; CHECK-NEXT: vmv1r.v v8, v10254; CHECK-NEXT: ret255 %negc = call <8 x half> @llvm.vp.fneg.v8f16(<8 x half> %c, <8 x i1> splat (i1 -1), i32 %evl)256 %v = call <8 x half> @llvm.vp.fma.v8f16(<8 x half> %a, <8 x half> %b, <8 x half> %negc, <8 x i1> splat (i1 -1), i32 %evl)257 %u = call <8 x half> @llvm.vp.merge.v8f16(<8 x i1> splat (i1 -1), <8 x half> %v, <8 x half> %c, i32 %evl)258 ret <8 x half> %u259}260 261define <8 x half> @vfmsac_vf_v8f16(<8 x half> %a, half %b, <8 x half> %c, <8 x i1> %m, i32 zeroext %evl) {262; CHECK-LABEL: vfmsac_vf_v8f16:263; CHECK: # %bb.0:264; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, mu265; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t266; CHECK-NEXT: vmv1r.v v8, v9267; CHECK-NEXT: ret268 %elt.head = insertelement <8 x half> poison, half %b, i32 0269 %vb = shufflevector <8 x half> %elt.head, <8 x half> poison, <8 x i32> zeroinitializer270 %negc = call <8 x half> @llvm.vp.fneg.v8f16(<8 x half> %c, <8 x i1> splat (i1 -1), i32 %evl)271 %v = call <8 x half> @llvm.vp.fma.v8f16(<8 x half> %a, <8 x half> %vb, <8 x half> %negc, <8 x i1> splat (i1 -1), i32 %evl)272 %u = call <8 x half> @llvm.vp.merge.v8f16(<8 x i1> %m, <8 x half> %v, <8 x half> %c, i32 %evl)273 ret <8 x half> %u274}275 276define <8 x half> @vfmsac_vf_v8f16_commute(<8 x half> %a, half %b, <8 x half> %c, <8 x i1> %m, i32 zeroext %evl) {277; CHECK-LABEL: vfmsac_vf_v8f16_commute:278; CHECK: # %bb.0:279; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, mu280; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t281; CHECK-NEXT: vmv1r.v v8, v9282; CHECK-NEXT: ret283 %elt.head = insertelement <8 x half> poison, half %b, i32 0284 %vb = shufflevector <8 x half> %elt.head, <8 x half> poison, <8 x i32> zeroinitializer285 %negc = call <8 x half> @llvm.vp.fneg.v8f16(<8 x half> %c, <8 x i1> splat (i1 -1), i32 %evl)286 %v = call <8 x half> @llvm.vp.fma.v8f16(<8 x half> %vb, <8 x half> %a, <8 x half> %negc, <8 x i1> splat (i1 -1), i32 %evl)287 %u = call <8 x half> @llvm.vp.merge.v8f16(<8 x i1> %m, <8 x half> %v, <8 x half> %c, i32 %evl)288 ret <8 x half> %u289}290 291define <8 x half> @vfmsac_vf_v8f16_unmasked(<8 x half> %a, half %b, <8 x half> %c, i32 zeroext %evl) {292; CHECK-LABEL: vfmsac_vf_v8f16_unmasked:293; CHECK: # %bb.0:294; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, ma295; CHECK-NEXT: vfmsac.vf v9, fa0, v8296; CHECK-NEXT: vmv1r.v v8, v9297; CHECK-NEXT: ret298 %elt.head = insertelement <8 x half> poison, half %b, i32 0299 %vb = shufflevector <8 x half> %elt.head, <8 x half> poison, <8 x i32> zeroinitializer300 %negc = call <8 x half> @llvm.vp.fneg.v8f16(<8 x half> %c, <8 x i1> splat (i1 -1), i32 %evl)301 %v = call <8 x half> @llvm.vp.fma.v8f16(<8 x half> %a, <8 x half> %vb, <8 x half> %negc, <8 x i1> splat (i1 -1), i32 %evl)302 %u = call <8 x half> @llvm.vp.merge.v8f16(<8 x i1> splat (i1 -1), <8 x half> %v, <8 x half> %c, i32 %evl)303 ret <8 x half> %u304}305 306define <8 x half> @vfmsac_vv_v8f16_ta(<8 x half> %a, <8 x half> %b, <8 x half> %c, <8 x i1> %m, i32 zeroext %evl) {307; CHECK-LABEL: vfmsac_vv_v8f16_ta:308; CHECK: # %bb.0:309; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, mu310; CHECK-NEXT: vfmsac.vv v10, v8, v9, v0.t311; CHECK-NEXT: vmv.v.v v8, v10312; CHECK-NEXT: ret313 %negc = call <8 x half> @llvm.vp.fneg.v8f16(<8 x half> %c, <8 x i1> splat (i1 -1), i32 %evl)314 %v = call <8 x half> @llvm.vp.fma.v8f16(<8 x half> %a, <8 x half> %b, <8 x half> %negc, <8 x i1> splat (i1 -1), i32 %evl)315 %u = call <8 x half> @llvm.vp.select.v8f16(<8 x i1> %m, <8 x half> %v, <8 x half> %c, i32 %evl)316 ret <8 x half> %u317}318 319define <8 x half> @vfmsac_vf_v8f16_ta(<8 x half> %a, half %b, <8 x half> %c, <8 x i1> %m, i32 zeroext %evl) {320; CHECK-LABEL: vfmsac_vf_v8f16_ta:321; CHECK: # %bb.0:322; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, mu323; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t324; CHECK-NEXT: vmv.v.v v8, v9325; CHECK-NEXT: ret326 %elt.head = insertelement <8 x half> poison, half %b, i32 0327 %vb = shufflevector <8 x half> %elt.head, <8 x half> poison, <8 x i32> zeroinitializer328 %negc = call <8 x half> @llvm.vp.fneg.v8f16(<8 x half> %c, <8 x i1> splat (i1 -1), i32 %evl)329 %v = call <8 x half> @llvm.vp.fma.v8f16(<8 x half> %a, <8 x half> %vb, <8 x half> %negc, <8 x i1> splat (i1 -1), i32 %evl)330 %u = call <8 x half> @llvm.vp.select.v8f16(<8 x i1> %m, <8 x half> %v, <8 x half> %c, i32 %evl)331 ret <8 x half> %u332}333 334define <8 x half> @vfmsac_vf_v8f16_commute_ta(<8 x half> %a, half %b, <8 x half> %c, <8 x i1> %m, i32 zeroext %evl) {335; CHECK-LABEL: vfmsac_vf_v8f16_commute_ta:336; CHECK: # %bb.0:337; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, mu338; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t339; CHECK-NEXT: vmv.v.v v8, v9340; CHECK-NEXT: ret341 %elt.head = insertelement <8 x half> poison, half %b, i32 0342 %vb = shufflevector <8 x half> %elt.head, <8 x half> poison, <8 x i32> zeroinitializer343 %negc = call <8 x half> @llvm.vp.fneg.v8f16(<8 x half> %c, <8 x i1> splat (i1 -1), i32 %evl)344 %v = call <8 x half> @llvm.vp.fma.v8f16(<8 x half> %vb, <8 x half> %a, <8 x half> %negc, <8 x i1> splat (i1 -1), i32 %evl)345 %u = call <8 x half> @llvm.vp.select.v8f16(<8 x i1> %m, <8 x half> %v, <8 x half> %c, i32 %evl)346 ret <8 x half> %u347}348 349define <16 x half> @vfmsac_vv_v16f16(<16 x half> %a, <16 x half> %b, <16 x half> %c, <16 x i1> %m, i32 zeroext %evl) {350; CHECK-LABEL: vfmsac_vv_v16f16:351; CHECK: # %bb.0:352; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, mu353; CHECK-NEXT: vfmsac.vv v12, v8, v10, v0.t354; CHECK-NEXT: vmv2r.v v8, v12355; CHECK-NEXT: ret356 %negc = call <16 x half> @llvm.vp.fneg.v16f16(<16 x half> %c, <16 x i1> splat (i1 -1), i32 %evl)357 %v = call <16 x half> @llvm.vp.fma.v16f16(<16 x half> %a, <16 x half> %b, <16 x half> %negc, <16 x i1> splat (i1 -1), i32 %evl)358 %u = call <16 x half> @llvm.vp.merge.v16f16(<16 x i1> %m, <16 x half> %v, <16 x half> %c, i32 %evl)359 ret <16 x half> %u360}361 362define <16 x half> @vfmsac_vv_v16f16_unmasked(<16 x half> %a, <16 x half> %b, <16 x half> %c, <16 x i1> %m, i32 zeroext %evl) {363; CHECK-LABEL: vfmsac_vv_v16f16_unmasked:364; CHECK: # %bb.0:365; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, ma366; CHECK-NEXT: vfmsac.vv v12, v8, v10367; CHECK-NEXT: vmv2r.v v8, v12368; CHECK-NEXT: ret369 %negc = call <16 x half> @llvm.vp.fneg.v16f16(<16 x half> %c, <16 x i1> splat (i1 -1), i32 %evl)370 %v = call <16 x half> @llvm.vp.fma.v16f16(<16 x half> %a, <16 x half> %b, <16 x half> %negc, <16 x i1> splat (i1 -1), i32 %evl)371 %u = call <16 x half> @llvm.vp.merge.v16f16(<16 x i1> splat (i1 -1), <16 x half> %v, <16 x half> %c, i32 %evl)372 ret <16 x half> %u373}374 375define <16 x half> @vfmsac_vf_v16f16(<16 x half> %a, half %b, <16 x half> %c, <16 x i1> %m, i32 zeroext %evl) {376; CHECK-LABEL: vfmsac_vf_v16f16:377; CHECK: # %bb.0:378; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, mu379; CHECK-NEXT: vfmsac.vf v10, fa0, v8, v0.t380; CHECK-NEXT: vmv2r.v v8, v10381; CHECK-NEXT: ret382 %elt.head = insertelement <16 x half> poison, half %b, i32 0383 %vb = shufflevector <16 x half> %elt.head, <16 x half> poison, <16 x i32> zeroinitializer384 %negc = call <16 x half> @llvm.vp.fneg.v16f16(<16 x half> %c, <16 x i1> splat (i1 -1), i32 %evl)385 %v = call <16 x half> @llvm.vp.fma.v16f16(<16 x half> %a, <16 x half> %vb, <16 x half> %negc, <16 x i1> splat (i1 -1), i32 %evl)386 %u = call <16 x half> @llvm.vp.merge.v16f16(<16 x i1> %m, <16 x half> %v, <16 x half> %c, i32 %evl)387 ret <16 x half> %u388}389 390define <16 x half> @vfmsac_vf_v16f16_commute(<16 x half> %a, half %b, <16 x half> %c, <16 x i1> %m, i32 zeroext %evl) {391; CHECK-LABEL: vfmsac_vf_v16f16_commute:392; CHECK: # %bb.0:393; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, mu394; CHECK-NEXT: vfmsac.vf v10, fa0, v8, v0.t395; CHECK-NEXT: vmv2r.v v8, v10396; CHECK-NEXT: ret397 %elt.head = insertelement <16 x half> poison, half %b, i32 0398 %vb = shufflevector <16 x half> %elt.head, <16 x half> poison, <16 x i32> zeroinitializer399 %negc = call <16 x half> @llvm.vp.fneg.v16f16(<16 x half> %c, <16 x i1> splat (i1 -1), i32 %evl)400 %v = call <16 x half> @llvm.vp.fma.v16f16(<16 x half> %vb, <16 x half> %a, <16 x half> %negc, <16 x i1> splat (i1 -1), i32 %evl)401 %u = call <16 x half> @llvm.vp.merge.v16f16(<16 x i1> %m, <16 x half> %v, <16 x half> %c, i32 %evl)402 ret <16 x half> %u403}404 405define <16 x half> @vfmsac_vf_v16f16_unmasked(<16 x half> %a, half %b, <16 x half> %c, i32 zeroext %evl) {406; CHECK-LABEL: vfmsac_vf_v16f16_unmasked:407; CHECK: # %bb.0:408; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, ma409; CHECK-NEXT: vfmsac.vf v10, fa0, v8410; CHECK-NEXT: vmv2r.v v8, v10411; CHECK-NEXT: ret412 %elt.head = insertelement <16 x half> poison, half %b, i32 0413 %vb = shufflevector <16 x half> %elt.head, <16 x half> poison, <16 x i32> zeroinitializer414 %negc = call <16 x half> @llvm.vp.fneg.v16f16(<16 x half> %c, <16 x i1> splat (i1 -1), i32 %evl)415 %v = call <16 x half> @llvm.vp.fma.v16f16(<16 x half> %a, <16 x half> %vb, <16 x half> %negc, <16 x i1> splat (i1 -1), i32 %evl)416 %u = call <16 x half> @llvm.vp.merge.v16f16(<16 x i1> splat (i1 -1), <16 x half> %v, <16 x half> %c, i32 %evl)417 ret <16 x half> %u418}419 420define <16 x half> @vfmsac_vv_v16f16_ta(<16 x half> %a, <16 x half> %b, <16 x half> %c, <16 x i1> %m, i32 zeroext %evl) {421; CHECK-LABEL: vfmsac_vv_v16f16_ta:422; CHECK: # %bb.0:423; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, mu424; CHECK-NEXT: vfmsac.vv v12, v8, v10, v0.t425; CHECK-NEXT: vmv.v.v v8, v12426; CHECK-NEXT: ret427 %negc = call <16 x half> @llvm.vp.fneg.v16f16(<16 x half> %c, <16 x i1> splat (i1 -1), i32 %evl)428 %v = call <16 x half> @llvm.vp.fma.v16f16(<16 x half> %a, <16 x half> %b, <16 x half> %negc, <16 x i1> splat (i1 -1), i32 %evl)429 %u = call <16 x half> @llvm.vp.select.v16f16(<16 x i1> %m, <16 x half> %v, <16 x half> %c, i32 %evl)430 ret <16 x half> %u431}432 433define <16 x half> @vfmsac_vf_v16f16_ta(<16 x half> %a, half %b, <16 x half> %c, <16 x i1> %m, i32 zeroext %evl) {434; CHECK-LABEL: vfmsac_vf_v16f16_ta:435; CHECK: # %bb.0:436; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, mu437; CHECK-NEXT: vfmsac.vf v10, fa0, v8, v0.t438; CHECK-NEXT: vmv.v.v v8, v10439; CHECK-NEXT: ret440 %elt.head = insertelement <16 x half> poison, half %b, i32 0441 %vb = shufflevector <16 x half> %elt.head, <16 x half> poison, <16 x i32> zeroinitializer442 %negc = call <16 x half> @llvm.vp.fneg.v16f16(<16 x half> %c, <16 x i1> splat (i1 -1), i32 %evl)443 %v = call <16 x half> @llvm.vp.fma.v16f16(<16 x half> %a, <16 x half> %vb, <16 x half> %negc, <16 x i1> splat (i1 -1), i32 %evl)444 %u = call <16 x half> @llvm.vp.select.v16f16(<16 x i1> %m, <16 x half> %v, <16 x half> %c, i32 %evl)445 ret <16 x half> %u446}447 448define <16 x half> @vfmsac_vf_v16f16_commute_ta(<16 x half> %a, half %b, <16 x half> %c, <16 x i1> %m, i32 zeroext %evl) {449; CHECK-LABEL: vfmsac_vf_v16f16_commute_ta:450; CHECK: # %bb.0:451; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, mu452; CHECK-NEXT: vfmsac.vf v10, fa0, v8, v0.t453; CHECK-NEXT: vmv.v.v v8, v10454; CHECK-NEXT: ret455 %elt.head = insertelement <16 x half> poison, half %b, i32 0456 %vb = shufflevector <16 x half> %elt.head, <16 x half> poison, <16 x i32> zeroinitializer457 %negc = call <16 x half> @llvm.vp.fneg.v16f16(<16 x half> %c, <16 x i1> splat (i1 -1), i32 %evl)458 %v = call <16 x half> @llvm.vp.fma.v16f16(<16 x half> %vb, <16 x half> %a, <16 x half> %negc, <16 x i1> splat (i1 -1), i32 %evl)459 %u = call <16 x half> @llvm.vp.select.v16f16(<16 x i1> %m, <16 x half> %v, <16 x half> %c, i32 %evl)460 ret <16 x half> %u461}462 463define <32 x half> @vfmsac_vv_v32f16(<32 x half> %a, <32 x half> %b, <32 x half> %c, <32 x i1> %m, i32 zeroext %evl) {464; CHECK-LABEL: vfmsac_vv_v32f16:465; CHECK: # %bb.0:466; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, mu467; CHECK-NEXT: vfmsac.vv v16, v8, v12, v0.t468; CHECK-NEXT: vmv4r.v v8, v16469; CHECK-NEXT: ret470 %negc = call <32 x half> @llvm.vp.fneg.v32f16(<32 x half> %c, <32 x i1> splat (i1 -1), i32 %evl)471 %v = call <32 x half> @llvm.vp.fma.v32f16(<32 x half> %a, <32 x half> %b, <32 x half> %negc, <32 x i1> splat (i1 -1), i32 %evl)472 %u = call <32 x half> @llvm.vp.merge.v32f16(<32 x i1> %m, <32 x half> %v, <32 x half> %c, i32 %evl)473 ret <32 x half> %u474}475 476define <32 x half> @vfmsac_vv_v32f16_unmasked(<32 x half> %a, <32 x half> %b, <32 x half> %c, <32 x i1> %m, i32 zeroext %evl) {477; CHECK-LABEL: vfmsac_vv_v32f16_unmasked:478; CHECK: # %bb.0:479; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, ma480; CHECK-NEXT: vfmsac.vv v16, v8, v12481; CHECK-NEXT: vmv4r.v v8, v16482; CHECK-NEXT: ret483 %negc = call <32 x half> @llvm.vp.fneg.v32f16(<32 x half> %c, <32 x i1> splat (i1 -1), i32 %evl)484 %v = call <32 x half> @llvm.vp.fma.v32f16(<32 x half> %a, <32 x half> %b, <32 x half> %negc, <32 x i1> splat (i1 -1), i32 %evl)485 %u = call <32 x half> @llvm.vp.merge.v32f16(<32 x i1> splat (i1 -1), <32 x half> %v, <32 x half> %c, i32 %evl)486 ret <32 x half> %u487}488 489define <32 x half> @vfmsac_vf_v32f16(<32 x half> %a, half %b, <32 x half> %c, <32 x i1> %m, i32 zeroext %evl) {490; CHECK-LABEL: vfmsac_vf_v32f16:491; CHECK: # %bb.0:492; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, mu493; CHECK-NEXT: vfmsac.vf v12, fa0, v8, v0.t494; CHECK-NEXT: vmv4r.v v8, v12495; CHECK-NEXT: ret496 %elt.head = insertelement <32 x half> poison, half %b, i32 0497 %vb = shufflevector <32 x half> %elt.head, <32 x half> poison, <32 x i32> zeroinitializer498 %negc = call <32 x half> @llvm.vp.fneg.v32f16(<32 x half> %c, <32 x i1> splat (i1 -1), i32 %evl)499 %v = call <32 x half> @llvm.vp.fma.v32f16(<32 x half> %a, <32 x half> %vb, <32 x half> %negc, <32 x i1> splat (i1 -1), i32 %evl)500 %u = call <32 x half> @llvm.vp.merge.v32f16(<32 x i1> %m, <32 x half> %v, <32 x half> %c, i32 %evl)501 ret <32 x half> %u502}503 504define <32 x half> @vfmsac_vf_v32f16_commute(<32 x half> %a, half %b, <32 x half> %c, <32 x i1> %m, i32 zeroext %evl) {505; CHECK-LABEL: vfmsac_vf_v32f16_commute:506; CHECK: # %bb.0:507; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, mu508; CHECK-NEXT: vfmsac.vf v12, fa0, v8, v0.t509; CHECK-NEXT: vmv4r.v v8, v12510; CHECK-NEXT: ret511 %elt.head = insertelement <32 x half> poison, half %b, i32 0512 %vb = shufflevector <32 x half> %elt.head, <32 x half> poison, <32 x i32> zeroinitializer513 %negc = call <32 x half> @llvm.vp.fneg.v32f16(<32 x half> %c, <32 x i1> splat (i1 -1), i32 %evl)514 %v = call <32 x half> @llvm.vp.fma.v32f16(<32 x half> %vb, <32 x half> %a, <32 x half> %negc, <32 x i1> splat (i1 -1), i32 %evl)515 %u = call <32 x half> @llvm.vp.merge.v32f16(<32 x i1> %m, <32 x half> %v, <32 x half> %c, i32 %evl)516 ret <32 x half> %u517}518 519define <32 x half> @vfmsac_vf_v32f16_unmasked(<32 x half> %a, half %b, <32 x half> %c, i32 zeroext %evl) {520; CHECK-LABEL: vfmsac_vf_v32f16_unmasked:521; CHECK: # %bb.0:522; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, ma523; CHECK-NEXT: vfmsac.vf v12, fa0, v8524; CHECK-NEXT: vmv4r.v v8, v12525; CHECK-NEXT: ret526 %elt.head = insertelement <32 x half> poison, half %b, i32 0527 %vb = shufflevector <32 x half> %elt.head, <32 x half> poison, <32 x i32> zeroinitializer528 %negc = call <32 x half> @llvm.vp.fneg.v32f16(<32 x half> %c, <32 x i1> splat (i1 -1), i32 %evl)529 %v = call <32 x half> @llvm.vp.fma.v32f16(<32 x half> %a, <32 x half> %vb, <32 x half> %negc, <32 x i1> splat (i1 -1), i32 %evl)530 %u = call <32 x half> @llvm.vp.merge.v32f16(<32 x i1> splat (i1 -1), <32 x half> %v, <32 x half> %c, i32 %evl)531 ret <32 x half> %u532}533 534define <32 x half> @vfmsac_vv_v32f16_ta(<32 x half> %a, <32 x half> %b, <32 x half> %c, <32 x i1> %m, i32 zeroext %evl) {535; CHECK-LABEL: vfmsac_vv_v32f16_ta:536; CHECK: # %bb.0:537; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, mu538; CHECK-NEXT: vfmsac.vv v16, v8, v12, v0.t539; CHECK-NEXT: vmv.v.v v8, v16540; CHECK-NEXT: ret541 %negc = call <32 x half> @llvm.vp.fneg.v32f16(<32 x half> %c, <32 x i1> splat (i1 -1), i32 %evl)542 %v = call <32 x half> @llvm.vp.fma.v32f16(<32 x half> %a, <32 x half> %b, <32 x half> %negc, <32 x i1> splat (i1 -1), i32 %evl)543 %u = call <32 x half> @llvm.vp.select.v32f16(<32 x i1> %m, <32 x half> %v, <32 x half> %c, i32 %evl)544 ret <32 x half> %u545}546 547define <32 x half> @vfmsac_vf_v32f16_ta(<32 x half> %a, half %b, <32 x half> %c, <32 x i1> %m, i32 zeroext %evl) {548; CHECK-LABEL: vfmsac_vf_v32f16_ta:549; CHECK: # %bb.0:550; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, mu551; CHECK-NEXT: vfmsac.vf v12, fa0, v8, v0.t552; CHECK-NEXT: vmv.v.v v8, v12553; CHECK-NEXT: ret554 %elt.head = insertelement <32 x half> poison, half %b, i32 0555 %vb = shufflevector <32 x half> %elt.head, <32 x half> poison, <32 x i32> zeroinitializer556 %negc = call <32 x half> @llvm.vp.fneg.v32f16(<32 x half> %c, <32 x i1> splat (i1 -1), i32 %evl)557 %v = call <32 x half> @llvm.vp.fma.v32f16(<32 x half> %a, <32 x half> %vb, <32 x half> %negc, <32 x i1> splat (i1 -1), i32 %evl)558 %u = call <32 x half> @llvm.vp.select.v32f16(<32 x i1> %m, <32 x half> %v, <32 x half> %c, i32 %evl)559 ret <32 x half> %u560}561 562define <32 x half> @vfmsac_vf_v32f16_commute_ta(<32 x half> %a, half %b, <32 x half> %c, <32 x i1> %m, i32 zeroext %evl) {563; CHECK-LABEL: vfmsac_vf_v32f16_commute_ta:564; CHECK: # %bb.0:565; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, mu566; CHECK-NEXT: vfmsac.vf v12, fa0, v8, v0.t567; CHECK-NEXT: vmv.v.v v8, v12568; CHECK-NEXT: ret569 %elt.head = insertelement <32 x half> poison, half %b, i32 0570 %vb = shufflevector <32 x half> %elt.head, <32 x half> poison, <32 x i32> zeroinitializer571 %negc = call <32 x half> @llvm.vp.fneg.v32f16(<32 x half> %c, <32 x i1> splat (i1 -1), i32 %evl)572 %v = call <32 x half> @llvm.vp.fma.v32f16(<32 x half> %vb, <32 x half> %a, <32 x half> %negc, <32 x i1> splat (i1 -1), i32 %evl)573 %u = call <32 x half> @llvm.vp.select.v32f16(<32 x i1> %m, <32 x half> %v, <32 x half> %c, i32 %evl)574 ret <32 x half> %u575}576 577define <2 x float> @vfmsac_vv_v2f32(<2 x float> %a, <2 x float> %b, <2 x float> %c, <2 x i1> %m, i32 zeroext %evl) {578; CHECK-LABEL: vfmsac_vv_v2f32:579; CHECK: # %bb.0:580; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, mu581; CHECK-NEXT: vfmsac.vv v10, v8, v9, v0.t582; CHECK-NEXT: vmv1r.v v8, v10583; CHECK-NEXT: ret584 %negc = call <2 x float> @llvm.vp.fneg.v2f32(<2 x float> %c, <2 x i1> splat (i1 -1), i32 %evl)585 %v = call <2 x float> @llvm.vp.fma.v2f32(<2 x float> %a, <2 x float> %b, <2 x float> %negc, <2 x i1> splat (i1 -1), i32 %evl)586 %u = call <2 x float> @llvm.vp.merge.v2f32(<2 x i1> %m, <2 x float> %v, <2 x float> %c, i32 %evl)587 ret <2 x float> %u588}589 590define <2 x float> @vfmsac_vv_v2f32_unmasked(<2 x float> %a, <2 x float> %b, <2 x float> %c, <2 x i1> %m, i32 zeroext %evl) {591; CHECK-LABEL: vfmsac_vv_v2f32_unmasked:592; CHECK: # %bb.0:593; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, ma594; CHECK-NEXT: vfmsac.vv v10, v8, v9595; CHECK-NEXT: vmv1r.v v8, v10596; CHECK-NEXT: ret597 %negc = call <2 x float> @llvm.vp.fneg.v2f32(<2 x float> %c, <2 x i1> splat (i1 -1), i32 %evl)598 %v = call <2 x float> @llvm.vp.fma.v2f32(<2 x float> %a, <2 x float> %b, <2 x float> %negc, <2 x i1> splat (i1 -1), i32 %evl)599 %u = call <2 x float> @llvm.vp.merge.v2f32(<2 x i1> splat (i1 -1), <2 x float> %v, <2 x float> %c, i32 %evl)600 ret <2 x float> %u601}602 603define <2 x float> @vfmsac_vf_v2f32(<2 x float> %a, float %b, <2 x float> %c, <2 x i1> %m, i32 zeroext %evl) {604; CHECK-LABEL: vfmsac_vf_v2f32:605; CHECK: # %bb.0:606; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, mu607; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t608; CHECK-NEXT: vmv1r.v v8, v9609; CHECK-NEXT: ret610 %elt.head = insertelement <2 x float> poison, float %b, i32 0611 %vb = shufflevector <2 x float> %elt.head, <2 x float> poison, <2 x i32> zeroinitializer612 %negc = call <2 x float> @llvm.vp.fneg.v2f32(<2 x float> %c, <2 x i1> splat (i1 -1), i32 %evl)613 %v = call <2 x float> @llvm.vp.fma.v2f32(<2 x float> %a, <2 x float> %vb, <2 x float> %negc, <2 x i1> splat (i1 -1), i32 %evl)614 %u = call <2 x float> @llvm.vp.merge.v2f32(<2 x i1> %m, <2 x float> %v, <2 x float> %c, i32 %evl)615 ret <2 x float> %u616}617 618define <2 x float> @vfmsac_vf_v2f32_commute(<2 x float> %a, float %b, <2 x float> %c, <2 x i1> %m, i32 zeroext %evl) {619; CHECK-LABEL: vfmsac_vf_v2f32_commute:620; CHECK: # %bb.0:621; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, mu622; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t623; CHECK-NEXT: vmv1r.v v8, v9624; CHECK-NEXT: ret625 %elt.head = insertelement <2 x float> poison, float %b, i32 0626 %vb = shufflevector <2 x float> %elt.head, <2 x float> poison, <2 x i32> zeroinitializer627 %negc = call <2 x float> @llvm.vp.fneg.v2f32(<2 x float> %c, <2 x i1> splat (i1 -1), i32 %evl)628 %v = call <2 x float> @llvm.vp.fma.v2f32(<2 x float> %vb, <2 x float> %a, <2 x float> %negc, <2 x i1> splat (i1 -1), i32 %evl)629 %u = call <2 x float> @llvm.vp.merge.v2f32(<2 x i1> %m, <2 x float> %v, <2 x float> %c, i32 %evl)630 ret <2 x float> %u631}632 633define <2 x float> @vfmsac_vf_v2f32_unmasked(<2 x float> %a, float %b, <2 x float> %c, i32 zeroext %evl) {634; CHECK-LABEL: vfmsac_vf_v2f32_unmasked:635; CHECK: # %bb.0:636; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, ma637; CHECK-NEXT: vfmsac.vf v9, fa0, v8638; CHECK-NEXT: vmv1r.v v8, v9639; CHECK-NEXT: ret640 %elt.head = insertelement <2 x float> poison, float %b, i32 0641 %vb = shufflevector <2 x float> %elt.head, <2 x float> poison, <2 x i32> zeroinitializer642 %negc = call <2 x float> @llvm.vp.fneg.v2f32(<2 x float> %c, <2 x i1> splat (i1 -1), i32 %evl)643 %v = call <2 x float> @llvm.vp.fma.v2f32(<2 x float> %a, <2 x float> %vb, <2 x float> %negc, <2 x i1> splat (i1 -1), i32 %evl)644 %u = call <2 x float> @llvm.vp.merge.v2f32(<2 x i1> splat (i1 -1), <2 x float> %v, <2 x float> %c, i32 %evl)645 ret <2 x float> %u646}647 648define <2 x float> @vfmsac_vv_v2f32_ta(<2 x float> %a, <2 x float> %b, <2 x float> %c, <2 x i1> %m, i32 zeroext %evl) {649; CHECK-LABEL: vfmsac_vv_v2f32_ta:650; CHECK: # %bb.0:651; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, mu652; CHECK-NEXT: vfmsac.vv v10, v8, v9, v0.t653; CHECK-NEXT: vmv1r.v v8, v10654; CHECK-NEXT: ret655 %negc = call <2 x float> @llvm.vp.fneg.v2f32(<2 x float> %c, <2 x i1> splat (i1 -1), i32 %evl)656 %v = call <2 x float> @llvm.vp.fma.v2f32(<2 x float> %a, <2 x float> %b, <2 x float> %negc, <2 x i1> splat (i1 -1), i32 %evl)657 %u = call <2 x float> @llvm.vp.select.v2f32(<2 x i1> %m, <2 x float> %v, <2 x float> %c, i32 %evl)658 ret <2 x float> %u659}660 661define <2 x float> @vfmsac_vf_v2f32_ta(<2 x float> %a, float %b, <2 x float> %c, <2 x i1> %m, i32 zeroext %evl) {662; CHECK-LABEL: vfmsac_vf_v2f32_ta:663; CHECK: # %bb.0:664; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, mu665; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t666; CHECK-NEXT: vmv1r.v v8, v9667; CHECK-NEXT: ret668 %elt.head = insertelement <2 x float> poison, float %b, i32 0669 %vb = shufflevector <2 x float> %elt.head, <2 x float> poison, <2 x i32> zeroinitializer670 %negc = call <2 x float> @llvm.vp.fneg.v2f32(<2 x float> %c, <2 x i1> splat (i1 -1), i32 %evl)671 %v = call <2 x float> @llvm.vp.fma.v2f32(<2 x float> %a, <2 x float> %vb, <2 x float> %negc, <2 x i1> splat (i1 -1), i32 %evl)672 %u = call <2 x float> @llvm.vp.select.v2f32(<2 x i1> %m, <2 x float> %v, <2 x float> %c, i32 %evl)673 ret <2 x float> %u674}675 676define <2 x float> @vfmsac_vf_v2f32_commute_ta(<2 x float> %a, float %b, <2 x float> %c, <2 x i1> %m, i32 zeroext %evl) {677; CHECK-LABEL: vfmsac_vf_v2f32_commute_ta:678; CHECK: # %bb.0:679; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, mu680; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t681; CHECK-NEXT: vmv1r.v v8, v9682; CHECK-NEXT: ret683 %elt.head = insertelement <2 x float> poison, float %b, i32 0684 %vb = shufflevector <2 x float> %elt.head, <2 x float> poison, <2 x i32> zeroinitializer685 %negc = call <2 x float> @llvm.vp.fneg.v2f32(<2 x float> %c, <2 x i1> splat (i1 -1), i32 %evl)686 %v = call <2 x float> @llvm.vp.fma.v2f32(<2 x float> %vb, <2 x float> %a, <2 x float> %negc, <2 x i1> splat (i1 -1), i32 %evl)687 %u = call <2 x float> @llvm.vp.select.v2f32(<2 x i1> %m, <2 x float> %v, <2 x float> %c, i32 %evl)688 ret <2 x float> %u689}690 691define <4 x float> @vfmsac_vv_v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x i1> %m, i32 zeroext %evl) {692; CHECK-LABEL: vfmsac_vv_v4f32:693; CHECK: # %bb.0:694; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, mu695; CHECK-NEXT: vfmsac.vv v10, v8, v9, v0.t696; CHECK-NEXT: vmv1r.v v8, v10697; CHECK-NEXT: ret698 %negc = call <4 x float> @llvm.vp.fneg.v4f32(<4 x float> %c, <4 x i1> splat (i1 -1), i32 %evl)699 %v = call <4 x float> @llvm.vp.fma.v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %negc, <4 x i1> splat (i1 -1), i32 %evl)700 %u = call <4 x float> @llvm.vp.merge.v4f32(<4 x i1> %m, <4 x float> %v, <4 x float> %c, i32 %evl)701 ret <4 x float> %u702}703 704define <4 x float> @vfmsac_vv_v4f32_unmasked(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x i1> %m, i32 zeroext %evl) {705; CHECK-LABEL: vfmsac_vv_v4f32_unmasked:706; CHECK: # %bb.0:707; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma708; CHECK-NEXT: vfmsac.vv v10, v8, v9709; CHECK-NEXT: vmv1r.v v8, v10710; CHECK-NEXT: ret711 %negc = call <4 x float> @llvm.vp.fneg.v4f32(<4 x float> %c, <4 x i1> splat (i1 -1), i32 %evl)712 %v = call <4 x float> @llvm.vp.fma.v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %negc, <4 x i1> splat (i1 -1), i32 %evl)713 %u = call <4 x float> @llvm.vp.merge.v4f32(<4 x i1> splat (i1 -1), <4 x float> %v, <4 x float> %c, i32 %evl)714 ret <4 x float> %u715}716 717define <4 x float> @vfmsac_vf_v4f32(<4 x float> %a, float %b, <4 x float> %c, <4 x i1> %m, i32 zeroext %evl) {718; CHECK-LABEL: vfmsac_vf_v4f32:719; CHECK: # %bb.0:720; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, mu721; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t722; CHECK-NEXT: vmv1r.v v8, v9723; CHECK-NEXT: ret724 %elt.head = insertelement <4 x float> poison, float %b, i32 0725 %vb = shufflevector <4 x float> %elt.head, <4 x float> poison, <4 x i32> zeroinitializer726 %negc = call <4 x float> @llvm.vp.fneg.v4f32(<4 x float> %c, <4 x i1> splat (i1 -1), i32 %evl)727 %v = call <4 x float> @llvm.vp.fma.v4f32(<4 x float> %a, <4 x float> %vb, <4 x float> %negc, <4 x i1> splat (i1 -1), i32 %evl)728 %u = call <4 x float> @llvm.vp.merge.v4f32(<4 x i1> %m, <4 x float> %v, <4 x float> %c, i32 %evl)729 ret <4 x float> %u730}731 732define <4 x float> @vfmsac_vf_v4f32_commute(<4 x float> %a, float %b, <4 x float> %c, <4 x i1> %m, i32 zeroext %evl) {733; CHECK-LABEL: vfmsac_vf_v4f32_commute:734; CHECK: # %bb.0:735; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, mu736; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t737; CHECK-NEXT: vmv1r.v v8, v9738; CHECK-NEXT: ret739 %elt.head = insertelement <4 x float> poison, float %b, i32 0740 %vb = shufflevector <4 x float> %elt.head, <4 x float> poison, <4 x i32> zeroinitializer741 %negc = call <4 x float> @llvm.vp.fneg.v4f32(<4 x float> %c, <4 x i1> splat (i1 -1), i32 %evl)742 %v = call <4 x float> @llvm.vp.fma.v4f32(<4 x float> %vb, <4 x float> %a, <4 x float> %negc, <4 x i1> splat (i1 -1), i32 %evl)743 %u = call <4 x float> @llvm.vp.merge.v4f32(<4 x i1> %m, <4 x float> %v, <4 x float> %c, i32 %evl)744 ret <4 x float> %u745}746 747define <4 x float> @vfmsac_vf_v4f32_unmasked(<4 x float> %a, float %b, <4 x float> %c, i32 zeroext %evl) {748; CHECK-LABEL: vfmsac_vf_v4f32_unmasked:749; CHECK: # %bb.0:750; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma751; CHECK-NEXT: vfmsac.vf v9, fa0, v8752; CHECK-NEXT: vmv1r.v v8, v9753; CHECK-NEXT: ret754 %elt.head = insertelement <4 x float> poison, float %b, i32 0755 %vb = shufflevector <4 x float> %elt.head, <4 x float> poison, <4 x i32> zeroinitializer756 %negc = call <4 x float> @llvm.vp.fneg.v4f32(<4 x float> %c, <4 x i1> splat (i1 -1), i32 %evl)757 %v = call <4 x float> @llvm.vp.fma.v4f32(<4 x float> %a, <4 x float> %vb, <4 x float> %negc, <4 x i1> splat (i1 -1), i32 %evl)758 %u = call <4 x float> @llvm.vp.merge.v4f32(<4 x i1> splat (i1 -1), <4 x float> %v, <4 x float> %c, i32 %evl)759 ret <4 x float> %u760}761 762define <4 x float> @vfmsac_vv_v4f32_ta(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x i1> %m, i32 zeroext %evl) {763; CHECK-LABEL: vfmsac_vv_v4f32_ta:764; CHECK: # %bb.0:765; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, mu766; CHECK-NEXT: vfmsac.vv v10, v8, v9, v0.t767; CHECK-NEXT: vmv.v.v v8, v10768; CHECK-NEXT: ret769 %negc = call <4 x float> @llvm.vp.fneg.v4f32(<4 x float> %c, <4 x i1> splat (i1 -1), i32 %evl)770 %v = call <4 x float> @llvm.vp.fma.v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %negc, <4 x i1> splat (i1 -1), i32 %evl)771 %u = call <4 x float> @llvm.vp.select.v4f32(<4 x i1> %m, <4 x float> %v, <4 x float> %c, i32 %evl)772 ret <4 x float> %u773}774 775define <4 x float> @vfmsac_vf_v4f32_ta(<4 x float> %a, float %b, <4 x float> %c, <4 x i1> %m, i32 zeroext %evl) {776; CHECK-LABEL: vfmsac_vf_v4f32_ta:777; CHECK: # %bb.0:778; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, mu779; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t780; CHECK-NEXT: vmv.v.v v8, v9781; CHECK-NEXT: ret782 %elt.head = insertelement <4 x float> poison, float %b, i32 0783 %vb = shufflevector <4 x float> %elt.head, <4 x float> poison, <4 x i32> zeroinitializer784 %negc = call <4 x float> @llvm.vp.fneg.v4f32(<4 x float> %c, <4 x i1> splat (i1 -1), i32 %evl)785 %v = call <4 x float> @llvm.vp.fma.v4f32(<4 x float> %a, <4 x float> %vb, <4 x float> %negc, <4 x i1> splat (i1 -1), i32 %evl)786 %u = call <4 x float> @llvm.vp.select.v4f32(<4 x i1> %m, <4 x float> %v, <4 x float> %c, i32 %evl)787 ret <4 x float> %u788}789 790define <4 x float> @vfmsac_vf_v4f32_commute_ta(<4 x float> %a, float %b, <4 x float> %c, <4 x i1> %m, i32 zeroext %evl) {791; CHECK-LABEL: vfmsac_vf_v4f32_commute_ta:792; CHECK: # %bb.0:793; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, mu794; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t795; CHECK-NEXT: vmv.v.v v8, v9796; CHECK-NEXT: ret797 %elt.head = insertelement <4 x float> poison, float %b, i32 0798 %vb = shufflevector <4 x float> %elt.head, <4 x float> poison, <4 x i32> zeroinitializer799 %negc = call <4 x float> @llvm.vp.fneg.v4f32(<4 x float> %c, <4 x i1> splat (i1 -1), i32 %evl)800 %v = call <4 x float> @llvm.vp.fma.v4f32(<4 x float> %vb, <4 x float> %a, <4 x float> %negc, <4 x i1> splat (i1 -1), i32 %evl)801 %u = call <4 x float> @llvm.vp.select.v4f32(<4 x i1> %m, <4 x float> %v, <4 x float> %c, i32 %evl)802 ret <4 x float> %u803}804 805define <8 x float> @vfmsac_vv_v8f32(<8 x float> %a, <8 x float> %b, <8 x float> %c, <8 x i1> %m, i32 zeroext %evl) {806; CHECK-LABEL: vfmsac_vv_v8f32:807; CHECK: # %bb.0:808; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, mu809; CHECK-NEXT: vfmsac.vv v12, v8, v10, v0.t810; CHECK-NEXT: vmv2r.v v8, v12811; CHECK-NEXT: ret812 %negc = call <8 x float> @llvm.vp.fneg.v8f32(<8 x float> %c, <8 x i1> splat (i1 -1), i32 %evl)813 %v = call <8 x float> @llvm.vp.fma.v8f32(<8 x float> %a, <8 x float> %b, <8 x float> %negc, <8 x i1> splat (i1 -1), i32 %evl)814 %u = call <8 x float> @llvm.vp.merge.v8f32(<8 x i1> %m, <8 x float> %v, <8 x float> %c, i32 %evl)815 ret <8 x float> %u816}817 818define <8 x float> @vfmsac_vv_v8f32_unmasked(<8 x float> %a, <8 x float> %b, <8 x float> %c, <8 x i1> %m, i32 zeroext %evl) {819; CHECK-LABEL: vfmsac_vv_v8f32_unmasked:820; CHECK: # %bb.0:821; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma822; CHECK-NEXT: vfmsac.vv v12, v8, v10823; CHECK-NEXT: vmv2r.v v8, v12824; CHECK-NEXT: ret825 %negc = call <8 x float> @llvm.vp.fneg.v8f32(<8 x float> %c, <8 x i1> splat (i1 -1), i32 %evl)826 %v = call <8 x float> @llvm.vp.fma.v8f32(<8 x float> %a, <8 x float> %b, <8 x float> %negc, <8 x i1> splat (i1 -1), i32 %evl)827 %u = call <8 x float> @llvm.vp.merge.v8f32(<8 x i1> splat (i1 -1), <8 x float> %v, <8 x float> %c, i32 %evl)828 ret <8 x float> %u829}830 831define <8 x float> @vfmsac_vf_v8f32(<8 x float> %a, float %b, <8 x float> %c, <8 x i1> %m, i32 zeroext %evl) {832; CHECK-LABEL: vfmsac_vf_v8f32:833; CHECK: # %bb.0:834; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, mu835; CHECK-NEXT: vfmsac.vf v10, fa0, v8, v0.t836; CHECK-NEXT: vmv2r.v v8, v10837; CHECK-NEXT: ret838 %elt.head = insertelement <8 x float> poison, float %b, i32 0839 %vb = shufflevector <8 x float> %elt.head, <8 x float> poison, <8 x i32> zeroinitializer840 %negc = call <8 x float> @llvm.vp.fneg.v8f32(<8 x float> %c, <8 x i1> splat (i1 -1), i32 %evl)841 %v = call <8 x float> @llvm.vp.fma.v8f32(<8 x float> %a, <8 x float> %vb, <8 x float> %negc, <8 x i1> splat (i1 -1), i32 %evl)842 %u = call <8 x float> @llvm.vp.merge.v8f32(<8 x i1> %m, <8 x float> %v, <8 x float> %c, i32 %evl)843 ret <8 x float> %u844}845 846define <8 x float> @vfmsac_vf_v8f32_commute(<8 x float> %a, float %b, <8 x float> %c, <8 x i1> %m, i32 zeroext %evl) {847; CHECK-LABEL: vfmsac_vf_v8f32_commute:848; CHECK: # %bb.0:849; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, mu850; CHECK-NEXT: vfmsac.vf v10, fa0, v8, v0.t851; CHECK-NEXT: vmv2r.v v8, v10852; CHECK-NEXT: ret853 %elt.head = insertelement <8 x float> poison, float %b, i32 0854 %vb = shufflevector <8 x float> %elt.head, <8 x float> poison, <8 x i32> zeroinitializer855 %negc = call <8 x float> @llvm.vp.fneg.v8f32(<8 x float> %c, <8 x i1> splat (i1 -1), i32 %evl)856 %v = call <8 x float> @llvm.vp.fma.v8f32(<8 x float> %vb, <8 x float> %a, <8 x float> %negc, <8 x i1> splat (i1 -1), i32 %evl)857 %u = call <8 x float> @llvm.vp.merge.v8f32(<8 x i1> %m, <8 x float> %v, <8 x float> %c, i32 %evl)858 ret <8 x float> %u859}860 861define <8 x float> @vfmsac_vf_v8f32_unmasked(<8 x float> %a, float %b, <8 x float> %c, i32 zeroext %evl) {862; CHECK-LABEL: vfmsac_vf_v8f32_unmasked:863; CHECK: # %bb.0:864; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma865; CHECK-NEXT: vfmsac.vf v10, fa0, v8866; CHECK-NEXT: vmv2r.v v8, v10867; CHECK-NEXT: ret868 %elt.head = insertelement <8 x float> poison, float %b, i32 0869 %vb = shufflevector <8 x float> %elt.head, <8 x float> poison, <8 x i32> zeroinitializer870 %negc = call <8 x float> @llvm.vp.fneg.v8f32(<8 x float> %c, <8 x i1> splat (i1 -1), i32 %evl)871 %v = call <8 x float> @llvm.vp.fma.v8f32(<8 x float> %a, <8 x float> %vb, <8 x float> %negc, <8 x i1> splat (i1 -1), i32 %evl)872 %u = call <8 x float> @llvm.vp.merge.v8f32(<8 x i1> splat (i1 -1), <8 x float> %v, <8 x float> %c, i32 %evl)873 ret <8 x float> %u874}875 876define <8 x float> @vfmsac_vv_v8f32_ta(<8 x float> %a, <8 x float> %b, <8 x float> %c, <8 x i1> %m, i32 zeroext %evl) {877; CHECK-LABEL: vfmsac_vv_v8f32_ta:878; CHECK: # %bb.0:879; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, mu880; CHECK-NEXT: vfmsac.vv v12, v8, v10, v0.t881; CHECK-NEXT: vmv.v.v v8, v12882; CHECK-NEXT: ret883 %negc = call <8 x float> @llvm.vp.fneg.v8f32(<8 x float> %c, <8 x i1> splat (i1 -1), i32 %evl)884 %v = call <8 x float> @llvm.vp.fma.v8f32(<8 x float> %a, <8 x float> %b, <8 x float> %negc, <8 x i1> splat (i1 -1), i32 %evl)885 %u = call <8 x float> @llvm.vp.select.v8f32(<8 x i1> %m, <8 x float> %v, <8 x float> %c, i32 %evl)886 ret <8 x float> %u887}888 889define <8 x float> @vfmsac_vf_v8f32_ta(<8 x float> %a, float %b, <8 x float> %c, <8 x i1> %m, i32 zeroext %evl) {890; CHECK-LABEL: vfmsac_vf_v8f32_ta:891; CHECK: # %bb.0:892; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, mu893; CHECK-NEXT: vfmsac.vf v10, fa0, v8, v0.t894; CHECK-NEXT: vmv.v.v v8, v10895; CHECK-NEXT: ret896 %elt.head = insertelement <8 x float> poison, float %b, i32 0897 %vb = shufflevector <8 x float> %elt.head, <8 x float> poison, <8 x i32> zeroinitializer898 %negc = call <8 x float> @llvm.vp.fneg.v8f32(<8 x float> %c, <8 x i1> splat (i1 -1), i32 %evl)899 %v = call <8 x float> @llvm.vp.fma.v8f32(<8 x float> %a, <8 x float> %vb, <8 x float> %negc, <8 x i1> splat (i1 -1), i32 %evl)900 %u = call <8 x float> @llvm.vp.select.v8f32(<8 x i1> %m, <8 x float> %v, <8 x float> %c, i32 %evl)901 ret <8 x float> %u902}903 904define <8 x float> @vfmsac_vf_v8f32_commute_ta(<8 x float> %a, float %b, <8 x float> %c, <8 x i1> %m, i32 zeroext %evl) {905; CHECK-LABEL: vfmsac_vf_v8f32_commute_ta:906; CHECK: # %bb.0:907; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, mu908; CHECK-NEXT: vfmsac.vf v10, fa0, v8, v0.t909; CHECK-NEXT: vmv.v.v v8, v10910; CHECK-NEXT: ret911 %elt.head = insertelement <8 x float> poison, float %b, i32 0912 %vb = shufflevector <8 x float> %elt.head, <8 x float> poison, <8 x i32> zeroinitializer913 %negc = call <8 x float> @llvm.vp.fneg.v8f32(<8 x float> %c, <8 x i1> splat (i1 -1), i32 %evl)914 %v = call <8 x float> @llvm.vp.fma.v8f32(<8 x float> %vb, <8 x float> %a, <8 x float> %negc, <8 x i1> splat (i1 -1), i32 %evl)915 %u = call <8 x float> @llvm.vp.select.v8f32(<8 x i1> %m, <8 x float> %v, <8 x float> %c, i32 %evl)916 ret <8 x float> %u917}918 919define <16 x float> @vfmsac_vv_v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %c, <16 x i1> %m, i32 zeroext %evl) {920; CHECK-LABEL: vfmsac_vv_v16f32:921; CHECK: # %bb.0:922; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, mu923; CHECK-NEXT: vfmsac.vv v16, v8, v12, v0.t924; CHECK-NEXT: vmv4r.v v8, v16925; CHECK-NEXT: ret926 %negc = call <16 x float> @llvm.vp.fneg.v16f32(<16 x float> %c, <16 x i1> splat (i1 -1), i32 %evl)927 %v = call <16 x float> @llvm.vp.fma.v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %negc, <16 x i1> splat (i1 -1), i32 %evl)928 %u = call <16 x float> @llvm.vp.merge.v16f32(<16 x i1> %m, <16 x float> %v, <16 x float> %c, i32 %evl)929 ret <16 x float> %u930}931 932define <16 x float> @vfmsac_vv_v16f32_unmasked(<16 x float> %a, <16 x float> %b, <16 x float> %c, <16 x i1> %m, i32 zeroext %evl) {933; CHECK-LABEL: vfmsac_vv_v16f32_unmasked:934; CHECK: # %bb.0:935; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, ma936; CHECK-NEXT: vfmsac.vv v16, v8, v12937; CHECK-NEXT: vmv4r.v v8, v16938; CHECK-NEXT: ret939 %negc = call <16 x float> @llvm.vp.fneg.v16f32(<16 x float> %c, <16 x i1> splat (i1 -1), i32 %evl)940 %v = call <16 x float> @llvm.vp.fma.v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %negc, <16 x i1> splat (i1 -1), i32 %evl)941 %u = call <16 x float> @llvm.vp.merge.v16f32(<16 x i1> splat (i1 -1), <16 x float> %v, <16 x float> %c, i32 %evl)942 ret <16 x float> %u943}944 945define <16 x float> @vfmsac_vf_v16f32(<16 x float> %a, float %b, <16 x float> %c, <16 x i1> %m, i32 zeroext %evl) {946; CHECK-LABEL: vfmsac_vf_v16f32:947; CHECK: # %bb.0:948; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, mu949; CHECK-NEXT: vfmsac.vf v12, fa0, v8, v0.t950; CHECK-NEXT: vmv4r.v v8, v12951; CHECK-NEXT: ret952 %elt.head = insertelement <16 x float> poison, float %b, i32 0953 %vb = shufflevector <16 x float> %elt.head, <16 x float> poison, <16 x i32> zeroinitializer954 %negc = call <16 x float> @llvm.vp.fneg.v16f32(<16 x float> %c, <16 x i1> splat (i1 -1), i32 %evl)955 %v = call <16 x float> @llvm.vp.fma.v16f32(<16 x float> %a, <16 x float> %vb, <16 x float> %negc, <16 x i1> splat (i1 -1), i32 %evl)956 %u = call <16 x float> @llvm.vp.merge.v16f32(<16 x i1> %m, <16 x float> %v, <16 x float> %c, i32 %evl)957 ret <16 x float> %u958}959 960define <16 x float> @vfmsac_vf_v16f32_commute(<16 x float> %a, float %b, <16 x float> %c, <16 x i1> %m, i32 zeroext %evl) {961; CHECK-LABEL: vfmsac_vf_v16f32_commute:962; CHECK: # %bb.0:963; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, mu964; CHECK-NEXT: vfmsac.vf v12, fa0, v8, v0.t965; CHECK-NEXT: vmv4r.v v8, v12966; CHECK-NEXT: ret967 %elt.head = insertelement <16 x float> poison, float %b, i32 0968 %vb = shufflevector <16 x float> %elt.head, <16 x float> poison, <16 x i32> zeroinitializer969 %negc = call <16 x float> @llvm.vp.fneg.v16f32(<16 x float> %c, <16 x i1> splat (i1 -1), i32 %evl)970 %v = call <16 x float> @llvm.vp.fma.v16f32(<16 x float> %vb, <16 x float> %a, <16 x float> %negc, <16 x i1> splat (i1 -1), i32 %evl)971 %u = call <16 x float> @llvm.vp.merge.v16f32(<16 x i1> %m, <16 x float> %v, <16 x float> %c, i32 %evl)972 ret <16 x float> %u973}974 975define <16 x float> @vfmsac_vf_v16f32_unmasked(<16 x float> %a, float %b, <16 x float> %c, i32 zeroext %evl) {976; CHECK-LABEL: vfmsac_vf_v16f32_unmasked:977; CHECK: # %bb.0:978; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, ma979; CHECK-NEXT: vfmsac.vf v12, fa0, v8980; CHECK-NEXT: vmv4r.v v8, v12981; CHECK-NEXT: ret982 %elt.head = insertelement <16 x float> poison, float %b, i32 0983 %vb = shufflevector <16 x float> %elt.head, <16 x float> poison, <16 x i32> zeroinitializer984 %negc = call <16 x float> @llvm.vp.fneg.v16f32(<16 x float> %c, <16 x i1> splat (i1 -1), i32 %evl)985 %v = call <16 x float> @llvm.vp.fma.v16f32(<16 x float> %a, <16 x float> %vb, <16 x float> %negc, <16 x i1> splat (i1 -1), i32 %evl)986 %u = call <16 x float> @llvm.vp.merge.v16f32(<16 x i1> splat (i1 -1), <16 x float> %v, <16 x float> %c, i32 %evl)987 ret <16 x float> %u988}989 990define <16 x float> @vfmsac_vv_v16f32_ta(<16 x float> %a, <16 x float> %b, <16 x float> %c, <16 x i1> %m, i32 zeroext %evl) {991; CHECK-LABEL: vfmsac_vv_v16f32_ta:992; CHECK: # %bb.0:993; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, mu994; CHECK-NEXT: vfmsac.vv v16, v8, v12, v0.t995; CHECK-NEXT: vmv.v.v v8, v16996; CHECK-NEXT: ret997 %negc = call <16 x float> @llvm.vp.fneg.v16f32(<16 x float> %c, <16 x i1> splat (i1 -1), i32 %evl)998 %v = call <16 x float> @llvm.vp.fma.v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %negc, <16 x i1> splat (i1 -1), i32 %evl)999 %u = call <16 x float> @llvm.vp.select.v16f32(<16 x i1> %m, <16 x float> %v, <16 x float> %c, i32 %evl)1000 ret <16 x float> %u1001}1002 1003define <16 x float> @vfmsac_vf_v16f32_ta(<16 x float> %a, float %b, <16 x float> %c, <16 x i1> %m, i32 zeroext %evl) {1004; CHECK-LABEL: vfmsac_vf_v16f32_ta:1005; CHECK: # %bb.0:1006; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, mu1007; CHECK-NEXT: vfmsac.vf v12, fa0, v8, v0.t1008; CHECK-NEXT: vmv.v.v v8, v121009; CHECK-NEXT: ret1010 %elt.head = insertelement <16 x float> poison, float %b, i32 01011 %vb = shufflevector <16 x float> %elt.head, <16 x float> poison, <16 x i32> zeroinitializer1012 %negc = call <16 x float> @llvm.vp.fneg.v16f32(<16 x float> %c, <16 x i1> splat (i1 -1), i32 %evl)1013 %v = call <16 x float> @llvm.vp.fma.v16f32(<16 x float> %a, <16 x float> %vb, <16 x float> %negc, <16 x i1> splat (i1 -1), i32 %evl)1014 %u = call <16 x float> @llvm.vp.select.v16f32(<16 x i1> %m, <16 x float> %v, <16 x float> %c, i32 %evl)1015 ret <16 x float> %u1016}1017 1018define <16 x float> @vfmsac_vf_v16f32_commute_ta(<16 x float> %a, float %b, <16 x float> %c, <16 x i1> %m, i32 zeroext %evl) {1019; CHECK-LABEL: vfmsac_vf_v16f32_commute_ta:1020; CHECK: # %bb.0:1021; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, mu1022; CHECK-NEXT: vfmsac.vf v12, fa0, v8, v0.t1023; CHECK-NEXT: vmv.v.v v8, v121024; CHECK-NEXT: ret1025 %elt.head = insertelement <16 x float> poison, float %b, i32 01026 %vb = shufflevector <16 x float> %elt.head, <16 x float> poison, <16 x i32> zeroinitializer1027 %negc = call <16 x float> @llvm.vp.fneg.v16f32(<16 x float> %c, <16 x i1> splat (i1 -1), i32 %evl)1028 %v = call <16 x float> @llvm.vp.fma.v16f32(<16 x float> %vb, <16 x float> %a, <16 x float> %negc, <16 x i1> splat (i1 -1), i32 %evl)1029 %u = call <16 x float> @llvm.vp.select.v16f32(<16 x i1> %m, <16 x float> %v, <16 x float> %c, i32 %evl)1030 ret <16 x float> %u1031}1032 1033define <2 x double> @vfmsac_vv_v2f64(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x i1> %m, i32 zeroext %evl) {1034; CHECK-LABEL: vfmsac_vv_v2f64:1035; CHECK: # %bb.0:1036; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, mu1037; CHECK-NEXT: vfmsac.vv v10, v8, v9, v0.t1038; CHECK-NEXT: vmv1r.v v8, v101039; CHECK-NEXT: ret1040 %negc = call <2 x double> @llvm.vp.fneg.v2f64(<2 x double> %c, <2 x i1> splat (i1 -1), i32 %evl)1041 %v = call <2 x double> @llvm.vp.fma.v2f64(<2 x double> %a, <2 x double> %b, <2 x double> %negc, <2 x i1> splat (i1 -1), i32 %evl)1042 %u = call <2 x double> @llvm.vp.merge.v2f64(<2 x i1> %m, <2 x double> %v, <2 x double> %c, i32 %evl)1043 ret <2 x double> %u1044}1045 1046define <2 x double> @vfmsac_vv_v2f64_unmasked(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x i1> %m, i32 zeroext %evl) {1047; CHECK-LABEL: vfmsac_vv_v2f64_unmasked:1048; CHECK: # %bb.0:1049; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, ma1050; CHECK-NEXT: vfmsac.vv v10, v8, v91051; CHECK-NEXT: vmv1r.v v8, v101052; CHECK-NEXT: ret1053 %negc = call <2 x double> @llvm.vp.fneg.v2f64(<2 x double> %c, <2 x i1> splat (i1 -1), i32 %evl)1054 %v = call <2 x double> @llvm.vp.fma.v2f64(<2 x double> %a, <2 x double> %b, <2 x double> %negc, <2 x i1> splat (i1 -1), i32 %evl)1055 %u = call <2 x double> @llvm.vp.merge.v2f64(<2 x i1> splat (i1 -1), <2 x double> %v, <2 x double> %c, i32 %evl)1056 ret <2 x double> %u1057}1058 1059define <2 x double> @vfmsac_vf_v2f64(<2 x double> %a, double %b, <2 x double> %c, <2 x i1> %m, i32 zeroext %evl) {1060; CHECK-LABEL: vfmsac_vf_v2f64:1061; CHECK: # %bb.0:1062; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, mu1063; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t1064; CHECK-NEXT: vmv1r.v v8, v91065; CHECK-NEXT: ret1066 %elt.head = insertelement <2 x double> poison, double %b, i32 01067 %vb = shufflevector <2 x double> %elt.head, <2 x double> poison, <2 x i32> zeroinitializer1068 %negc = call <2 x double> @llvm.vp.fneg.v2f64(<2 x double> %c, <2 x i1> splat (i1 -1), i32 %evl)1069 %v = call <2 x double> @llvm.vp.fma.v2f64(<2 x double> %a, <2 x double> %vb, <2 x double> %negc, <2 x i1> splat (i1 -1), i32 %evl)1070 %u = call <2 x double> @llvm.vp.merge.v2f64(<2 x i1> %m, <2 x double> %v, <2 x double> %c, i32 %evl)1071 ret <2 x double> %u1072}1073 1074define <2 x double> @vfmsac_vf_v2f64_commute(<2 x double> %a, double %b, <2 x double> %c, <2 x i1> %m, i32 zeroext %evl) {1075; CHECK-LABEL: vfmsac_vf_v2f64_commute:1076; CHECK: # %bb.0:1077; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, mu1078; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t1079; CHECK-NEXT: vmv1r.v v8, v91080; CHECK-NEXT: ret1081 %elt.head = insertelement <2 x double> poison, double %b, i32 01082 %vb = shufflevector <2 x double> %elt.head, <2 x double> poison, <2 x i32> zeroinitializer1083 %negc = call <2 x double> @llvm.vp.fneg.v2f64(<2 x double> %c, <2 x i1> splat (i1 -1), i32 %evl)1084 %v = call <2 x double> @llvm.vp.fma.v2f64(<2 x double> %vb, <2 x double> %a, <2 x double> %negc, <2 x i1> splat (i1 -1), i32 %evl)1085 %u = call <2 x double> @llvm.vp.merge.v2f64(<2 x i1> %m, <2 x double> %v, <2 x double> %c, i32 %evl)1086 ret <2 x double> %u1087}1088 1089define <2 x double> @vfmsac_vf_v2f64_unmasked(<2 x double> %a, double %b, <2 x double> %c, i32 zeroext %evl) {1090; CHECK-LABEL: vfmsac_vf_v2f64_unmasked:1091; CHECK: # %bb.0:1092; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, ma1093; CHECK-NEXT: vfmsac.vf v9, fa0, v81094; CHECK-NEXT: vmv1r.v v8, v91095; CHECK-NEXT: ret1096 %elt.head = insertelement <2 x double> poison, double %b, i32 01097 %vb = shufflevector <2 x double> %elt.head, <2 x double> poison, <2 x i32> zeroinitializer1098 %negc = call <2 x double> @llvm.vp.fneg.v2f64(<2 x double> %c, <2 x i1> splat (i1 -1), i32 %evl)1099 %v = call <2 x double> @llvm.vp.fma.v2f64(<2 x double> %a, <2 x double> %vb, <2 x double> %negc, <2 x i1> splat (i1 -1), i32 %evl)1100 %u = call <2 x double> @llvm.vp.merge.v2f64(<2 x i1> splat (i1 -1), <2 x double> %v, <2 x double> %c, i32 %evl)1101 ret <2 x double> %u1102}1103 1104define <2 x double> @vfmsac_vv_v2f64_ta(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x i1> %m, i32 zeroext %evl) {1105; CHECK-LABEL: vfmsac_vv_v2f64_ta:1106; CHECK: # %bb.0:1107; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, mu1108; CHECK-NEXT: vfmsac.vv v10, v8, v9, v0.t1109; CHECK-NEXT: vmv.v.v v8, v101110; CHECK-NEXT: ret1111 %negc = call <2 x double> @llvm.vp.fneg.v2f64(<2 x double> %c, <2 x i1> splat (i1 -1), i32 %evl)1112 %v = call <2 x double> @llvm.vp.fma.v2f64(<2 x double> %a, <2 x double> %b, <2 x double> %negc, <2 x i1> splat (i1 -1), i32 %evl)1113 %u = call <2 x double> @llvm.vp.select.v2f64(<2 x i1> %m, <2 x double> %v, <2 x double> %c, i32 %evl)1114 ret <2 x double> %u1115}1116 1117define <2 x double> @vfmsac_vf_v2f64_ta(<2 x double> %a, double %b, <2 x double> %c, <2 x i1> %m, i32 zeroext %evl) {1118; CHECK-LABEL: vfmsac_vf_v2f64_ta:1119; CHECK: # %bb.0:1120; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, mu1121; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t1122; CHECK-NEXT: vmv.v.v v8, v91123; CHECK-NEXT: ret1124 %elt.head = insertelement <2 x double> poison, double %b, i32 01125 %vb = shufflevector <2 x double> %elt.head, <2 x double> poison, <2 x i32> zeroinitializer1126 %negc = call <2 x double> @llvm.vp.fneg.v2f64(<2 x double> %c, <2 x i1> splat (i1 -1), i32 %evl)1127 %v = call <2 x double> @llvm.vp.fma.v2f64(<2 x double> %a, <2 x double> %vb, <2 x double> %negc, <2 x i1> splat (i1 -1), i32 %evl)1128 %u = call <2 x double> @llvm.vp.select.v2f64(<2 x i1> %m, <2 x double> %v, <2 x double> %c, i32 %evl)1129 ret <2 x double> %u1130}1131 1132define <2 x double> @vfmsac_vf_v2f64_commute_ta(<2 x double> %a, double %b, <2 x double> %c, <2 x i1> %m, i32 zeroext %evl) {1133; CHECK-LABEL: vfmsac_vf_v2f64_commute_ta:1134; CHECK: # %bb.0:1135; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, mu1136; CHECK-NEXT: vfmsac.vf v9, fa0, v8, v0.t1137; CHECK-NEXT: vmv.v.v v8, v91138; CHECK-NEXT: ret1139 %elt.head = insertelement <2 x double> poison, double %b, i32 01140 %vb = shufflevector <2 x double> %elt.head, <2 x double> poison, <2 x i32> zeroinitializer1141 %negc = call <2 x double> @llvm.vp.fneg.v2f64(<2 x double> %c, <2 x i1> splat (i1 -1), i32 %evl)1142 %v = call <2 x double> @llvm.vp.fma.v2f64(<2 x double> %vb, <2 x double> %a, <2 x double> %negc, <2 x i1> splat (i1 -1), i32 %evl)1143 %u = call <2 x double> @llvm.vp.select.v2f64(<2 x i1> %m, <2 x double> %v, <2 x double> %c, i32 %evl)1144 ret <2 x double> %u1145}1146 1147define <4 x double> @vfmsac_vv_v4f64(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x i1> %m, i32 zeroext %evl) {1148; CHECK-LABEL: vfmsac_vv_v4f64:1149; CHECK: # %bb.0:1150; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, mu1151; CHECK-NEXT: vfmsac.vv v12, v8, v10, v0.t1152; CHECK-NEXT: vmv2r.v v8, v121153; CHECK-NEXT: ret1154 %negc = call <4 x double> @llvm.vp.fneg.v4f64(<4 x double> %c, <4 x i1> splat (i1 -1), i32 %evl)1155 %v = call <4 x double> @llvm.vp.fma.v4f64(<4 x double> %a, <4 x double> %b, <4 x double> %negc, <4 x i1> splat (i1 -1), i32 %evl)1156 %u = call <4 x double> @llvm.vp.merge.v4f64(<4 x i1> %m, <4 x double> %v, <4 x double> %c, i32 %evl)1157 ret <4 x double> %u1158}1159 1160define <4 x double> @vfmsac_vv_v4f64_unmasked(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x i1> %m, i32 zeroext %evl) {1161; CHECK-LABEL: vfmsac_vv_v4f64_unmasked:1162; CHECK: # %bb.0:1163; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, ma1164; CHECK-NEXT: vfmsac.vv v12, v8, v101165; CHECK-NEXT: vmv2r.v v8, v121166; CHECK-NEXT: ret1167 %negc = call <4 x double> @llvm.vp.fneg.v4f64(<4 x double> %c, <4 x i1> splat (i1 -1), i32 %evl)1168 %v = call <4 x double> @llvm.vp.fma.v4f64(<4 x double> %a, <4 x double> %b, <4 x double> %negc, <4 x i1> splat (i1 -1), i32 %evl)1169 %u = call <4 x double> @llvm.vp.merge.v4f64(<4 x i1> splat (i1 -1), <4 x double> %v, <4 x double> %c, i32 %evl)1170 ret <4 x double> %u1171}1172 1173define <4 x double> @vfmsac_vf_v4f64(<4 x double> %a, double %b, <4 x double> %c, <4 x i1> %m, i32 zeroext %evl) {1174; CHECK-LABEL: vfmsac_vf_v4f64:1175; CHECK: # %bb.0:1176; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, mu1177; CHECK-NEXT: vfmsac.vf v10, fa0, v8, v0.t1178; CHECK-NEXT: vmv2r.v v8, v101179; CHECK-NEXT: ret1180 %elt.head = insertelement <4 x double> poison, double %b, i32 01181 %vb = shufflevector <4 x double> %elt.head, <4 x double> poison, <4 x i32> zeroinitializer1182 %negc = call <4 x double> @llvm.vp.fneg.v4f64(<4 x double> %c, <4 x i1> splat (i1 -1), i32 %evl)1183 %v = call <4 x double> @llvm.vp.fma.v4f64(<4 x double> %a, <4 x double> %vb, <4 x double> %negc, <4 x i1> splat (i1 -1), i32 %evl)1184 %u = call <4 x double> @llvm.vp.merge.v4f64(<4 x i1> %m, <4 x double> %v, <4 x double> %c, i32 %evl)1185 ret <4 x double> %u1186}1187 1188define <4 x double> @vfmsac_vf_v4f64_commute(<4 x double> %a, double %b, <4 x double> %c, <4 x i1> %m, i32 zeroext %evl) {1189; CHECK-LABEL: vfmsac_vf_v4f64_commute:1190; CHECK: # %bb.0:1191; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, mu1192; CHECK-NEXT: vfmsac.vf v10, fa0, v8, v0.t1193; CHECK-NEXT: vmv2r.v v8, v101194; CHECK-NEXT: ret1195 %elt.head = insertelement <4 x double> poison, double %b, i32 01196 %vb = shufflevector <4 x double> %elt.head, <4 x double> poison, <4 x i32> zeroinitializer1197 %negc = call <4 x double> @llvm.vp.fneg.v4f64(<4 x double> %c, <4 x i1> splat (i1 -1), i32 %evl)1198 %v = call <4 x double> @llvm.vp.fma.v4f64(<4 x double> %vb, <4 x double> %a, <4 x double> %negc, <4 x i1> splat (i1 -1), i32 %evl)1199 %u = call <4 x double> @llvm.vp.merge.v4f64(<4 x i1> %m, <4 x double> %v, <4 x double> %c, i32 %evl)1200 ret <4 x double> %u1201}1202 1203define <4 x double> @vfmsac_vf_v4f64_unmasked(<4 x double> %a, double %b, <4 x double> %c, i32 zeroext %evl) {1204; CHECK-LABEL: vfmsac_vf_v4f64_unmasked:1205; CHECK: # %bb.0:1206; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, ma1207; CHECK-NEXT: vfmsac.vf v10, fa0, v81208; CHECK-NEXT: vmv2r.v v8, v101209; CHECK-NEXT: ret1210 %elt.head = insertelement <4 x double> poison, double %b, i32 01211 %vb = shufflevector <4 x double> %elt.head, <4 x double> poison, <4 x i32> zeroinitializer1212 %negc = call <4 x double> @llvm.vp.fneg.v4f64(<4 x double> %c, <4 x i1> splat (i1 -1), i32 %evl)1213 %v = call <4 x double> @llvm.vp.fma.v4f64(<4 x double> %a, <4 x double> %vb, <4 x double> %negc, <4 x i1> splat (i1 -1), i32 %evl)1214 %u = call <4 x double> @llvm.vp.merge.v4f64(<4 x i1> splat (i1 -1), <4 x double> %v, <4 x double> %c, i32 %evl)1215 ret <4 x double> %u1216}1217 1218define <4 x double> @vfmsac_vv_v4f64_ta(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x i1> %m, i32 zeroext %evl) {1219; CHECK-LABEL: vfmsac_vv_v4f64_ta:1220; CHECK: # %bb.0:1221; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, mu1222; CHECK-NEXT: vfmsac.vv v12, v8, v10, v0.t1223; CHECK-NEXT: vmv.v.v v8, v121224; CHECK-NEXT: ret1225 %negc = call <4 x double> @llvm.vp.fneg.v4f64(<4 x double> %c, <4 x i1> splat (i1 -1), i32 %evl)1226 %v = call <4 x double> @llvm.vp.fma.v4f64(<4 x double> %a, <4 x double> %b, <4 x double> %negc, <4 x i1> splat (i1 -1), i32 %evl)1227 %u = call <4 x double> @llvm.vp.select.v4f64(<4 x i1> %m, <4 x double> %v, <4 x double> %c, i32 %evl)1228 ret <4 x double> %u1229}1230 1231define <4 x double> @vfmsac_vf_v4f64_ta(<4 x double> %a, double %b, <4 x double> %c, <4 x i1> %m, i32 zeroext %evl) {1232; CHECK-LABEL: vfmsac_vf_v4f64_ta:1233; CHECK: # %bb.0:1234; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, mu1235; CHECK-NEXT: vfmsac.vf v10, fa0, v8, v0.t1236; CHECK-NEXT: vmv.v.v v8, v101237; CHECK-NEXT: ret1238 %elt.head = insertelement <4 x double> poison, double %b, i32 01239 %vb = shufflevector <4 x double> %elt.head, <4 x double> poison, <4 x i32> zeroinitializer1240 %negc = call <4 x double> @llvm.vp.fneg.v4f64(<4 x double> %c, <4 x i1> splat (i1 -1), i32 %evl)1241 %v = call <4 x double> @llvm.vp.fma.v4f64(<4 x double> %a, <4 x double> %vb, <4 x double> %negc, <4 x i1> splat (i1 -1), i32 %evl)1242 %u = call <4 x double> @llvm.vp.select.v4f64(<4 x i1> %m, <4 x double> %v, <4 x double> %c, i32 %evl)1243 ret <4 x double> %u1244}1245 1246define <4 x double> @vfmsac_vf_v4f64_commute_ta(<4 x double> %a, double %b, <4 x double> %c, <4 x i1> %m, i32 zeroext %evl) {1247; CHECK-LABEL: vfmsac_vf_v4f64_commute_ta:1248; CHECK: # %bb.0:1249; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, mu1250; CHECK-NEXT: vfmsac.vf v10, fa0, v8, v0.t1251; CHECK-NEXT: vmv.v.v v8, v101252; CHECK-NEXT: ret1253 %elt.head = insertelement <4 x double> poison, double %b, i32 01254 %vb = shufflevector <4 x double> %elt.head, <4 x double> poison, <4 x i32> zeroinitializer1255 %negc = call <4 x double> @llvm.vp.fneg.v4f64(<4 x double> %c, <4 x i1> splat (i1 -1), i32 %evl)1256 %v = call <4 x double> @llvm.vp.fma.v4f64(<4 x double> %vb, <4 x double> %a, <4 x double> %negc, <4 x i1> splat (i1 -1), i32 %evl)1257 %u = call <4 x double> @llvm.vp.select.v4f64(<4 x i1> %m, <4 x double> %v, <4 x double> %c, i32 %evl)1258 ret <4 x double> %u1259}1260 1261define <8 x double> @vfmsac_vv_v8f64(<8 x double> %a, <8 x double> %b, <8 x double> %c, <8 x i1> %m, i32 zeroext %evl) {1262; CHECK-LABEL: vfmsac_vv_v8f64:1263; CHECK: # %bb.0:1264; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, mu1265; CHECK-NEXT: vfmsac.vv v16, v8, v12, v0.t1266; CHECK-NEXT: vmv4r.v v8, v161267; CHECK-NEXT: ret1268 %negc = call <8 x double> @llvm.vp.fneg.v8f64(<8 x double> %c, <8 x i1> splat (i1 -1), i32 %evl)1269 %v = call <8 x double> @llvm.vp.fma.v8f64(<8 x double> %a, <8 x double> %b, <8 x double> %negc, <8 x i1> splat (i1 -1), i32 %evl)1270 %u = call <8 x double> @llvm.vp.merge.v8f64(<8 x i1> %m, <8 x double> %v, <8 x double> %c, i32 %evl)1271 ret <8 x double> %u1272}1273 1274define <8 x double> @vfmsac_vv_v8f64_unmasked(<8 x double> %a, <8 x double> %b, <8 x double> %c, <8 x i1> %m, i32 zeroext %evl) {1275; CHECK-LABEL: vfmsac_vv_v8f64_unmasked:1276; CHECK: # %bb.0:1277; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, ma1278; CHECK-NEXT: vfmsac.vv v16, v8, v121279; CHECK-NEXT: vmv4r.v v8, v161280; CHECK-NEXT: ret1281 %negc = call <8 x double> @llvm.vp.fneg.v8f64(<8 x double> %c, <8 x i1> splat (i1 -1), i32 %evl)1282 %v = call <8 x double> @llvm.vp.fma.v8f64(<8 x double> %a, <8 x double> %b, <8 x double> %negc, <8 x i1> splat (i1 -1), i32 %evl)1283 %u = call <8 x double> @llvm.vp.merge.v8f64(<8 x i1> splat (i1 -1), <8 x double> %v, <8 x double> %c, i32 %evl)1284 ret <8 x double> %u1285}1286 1287define <8 x double> @vfmsac_vf_v8f64(<8 x double> %a, double %b, <8 x double> %c, <8 x i1> %m, i32 zeroext %evl) {1288; CHECK-LABEL: vfmsac_vf_v8f64:1289; CHECK: # %bb.0:1290; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, mu1291; CHECK-NEXT: vfmsac.vf v12, fa0, v8, v0.t1292; CHECK-NEXT: vmv4r.v v8, v121293; CHECK-NEXT: ret1294 %elt.head = insertelement <8 x double> poison, double %b, i32 01295 %vb = shufflevector <8 x double> %elt.head, <8 x double> poison, <8 x i32> zeroinitializer1296 %negc = call <8 x double> @llvm.vp.fneg.v8f64(<8 x double> %c, <8 x i1> splat (i1 -1), i32 %evl)1297 %v = call <8 x double> @llvm.vp.fma.v8f64(<8 x double> %a, <8 x double> %vb, <8 x double> %negc, <8 x i1> splat (i1 -1), i32 %evl)1298 %u = call <8 x double> @llvm.vp.merge.v8f64(<8 x i1> %m, <8 x double> %v, <8 x double> %c, i32 %evl)1299 ret <8 x double> %u1300}1301 1302define <8 x double> @vfmsac_vf_v8f64_commute(<8 x double> %a, double %b, <8 x double> %c, <8 x i1> %m, i32 zeroext %evl) {1303; CHECK-LABEL: vfmsac_vf_v8f64_commute:1304; CHECK: # %bb.0:1305; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, mu1306; CHECK-NEXT: vfmsac.vf v12, fa0, v8, v0.t1307; CHECK-NEXT: vmv4r.v v8, v121308; CHECK-NEXT: ret1309 %elt.head = insertelement <8 x double> poison, double %b, i32 01310 %vb = shufflevector <8 x double> %elt.head, <8 x double> poison, <8 x i32> zeroinitializer1311 %negc = call <8 x double> @llvm.vp.fneg.v8f64(<8 x double> %c, <8 x i1> splat (i1 -1), i32 %evl)1312 %v = call <8 x double> @llvm.vp.fma.v8f64(<8 x double> %vb, <8 x double> %a, <8 x double> %negc, <8 x i1> splat (i1 -1), i32 %evl)1313 %u = call <8 x double> @llvm.vp.merge.v8f64(<8 x i1> %m, <8 x double> %v, <8 x double> %c, i32 %evl)1314 ret <8 x double> %u1315}1316 1317define <8 x double> @vfmsac_vf_v8f64_unmasked(<8 x double> %a, double %b, <8 x double> %c, i32 zeroext %evl) {1318; CHECK-LABEL: vfmsac_vf_v8f64_unmasked:1319; CHECK: # %bb.0:1320; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, ma1321; CHECK-NEXT: vfmsac.vf v12, fa0, v81322; CHECK-NEXT: vmv4r.v v8, v121323; CHECK-NEXT: ret1324 %elt.head = insertelement <8 x double> poison, double %b, i32 01325 %vb = shufflevector <8 x double> %elt.head, <8 x double> poison, <8 x i32> zeroinitializer1326 %negc = call <8 x double> @llvm.vp.fneg.v8f64(<8 x double> %c, <8 x i1> splat (i1 -1), i32 %evl)1327 %v = call <8 x double> @llvm.vp.fma.v8f64(<8 x double> %a, <8 x double> %vb, <8 x double> %negc, <8 x i1> splat (i1 -1), i32 %evl)1328 %u = call <8 x double> @llvm.vp.merge.v8f64(<8 x i1> splat (i1 -1), <8 x double> %v, <8 x double> %c, i32 %evl)1329 ret <8 x double> %u1330}1331 1332define <8 x double> @vfmsac_vv_v8f64_ta(<8 x double> %a, <8 x double> %b, <8 x double> %c, <8 x i1> %m, i32 zeroext %evl) {1333; CHECK-LABEL: vfmsac_vv_v8f64_ta:1334; CHECK: # %bb.0:1335; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, mu1336; CHECK-NEXT: vfmsac.vv v16, v8, v12, v0.t1337; CHECK-NEXT: vmv.v.v v8, v161338; CHECK-NEXT: ret1339 %negc = call <8 x double> @llvm.vp.fneg.v8f64(<8 x double> %c, <8 x i1> splat (i1 -1), i32 %evl)1340 %v = call <8 x double> @llvm.vp.fma.v8f64(<8 x double> %a, <8 x double> %b, <8 x double> %negc, <8 x i1> splat (i1 -1), i32 %evl)1341 %u = call <8 x double> @llvm.vp.select.v8f64(<8 x i1> %m, <8 x double> %v, <8 x double> %c, i32 %evl)1342 ret <8 x double> %u1343}1344 1345define <8 x double> @vfmsac_vf_v8f64_ta(<8 x double> %a, double %b, <8 x double> %c, <8 x i1> %m, i32 zeroext %evl) {1346; CHECK-LABEL: vfmsac_vf_v8f64_ta:1347; CHECK: # %bb.0:1348; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, mu1349; CHECK-NEXT: vfmsac.vf v12, fa0, v8, v0.t1350; CHECK-NEXT: vmv.v.v v8, v121351; CHECK-NEXT: ret1352 %elt.head = insertelement <8 x double> poison, double %b, i32 01353 %vb = shufflevector <8 x double> %elt.head, <8 x double> poison, <8 x i32> zeroinitializer1354 %negc = call <8 x double> @llvm.vp.fneg.v8f64(<8 x double> %c, <8 x i1> splat (i1 -1), i32 %evl)1355 %v = call <8 x double> @llvm.vp.fma.v8f64(<8 x double> %a, <8 x double> %vb, <8 x double> %negc, <8 x i1> splat (i1 -1), i32 %evl)1356 %u = call <8 x double> @llvm.vp.select.v8f64(<8 x i1> %m, <8 x double> %v, <8 x double> %c, i32 %evl)1357 ret <8 x double> %u1358}1359 1360define <8 x double> @vfmsac_vf_v8f64_commute_ta(<8 x double> %a, double %b, <8 x double> %c, <8 x i1> %m, i32 zeroext %evl) {1361; CHECK-LABEL: vfmsac_vf_v8f64_commute_ta:1362; CHECK: # %bb.0:1363; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, mu1364; CHECK-NEXT: vfmsac.vf v12, fa0, v8, v0.t1365; CHECK-NEXT: vmv.v.v v8, v121366; CHECK-NEXT: ret1367 %elt.head = insertelement <8 x double> poison, double %b, i32 01368 %vb = shufflevector <8 x double> %elt.head, <8 x double> poison, <8 x i32> zeroinitializer1369 %negc = call <8 x double> @llvm.vp.fneg.v8f64(<8 x double> %c, <8 x i1> splat (i1 -1), i32 %evl)1370 %v = call <8 x double> @llvm.vp.fma.v8f64(<8 x double> %vb, <8 x double> %a, <8 x double> %negc, <8 x i1> splat (i1 -1), i32 %evl)1371 %u = call <8 x double> @llvm.vp.select.v8f64(<8 x i1> %m, <8 x double> %v, <8 x double> %c, i32 %evl)1372 ret <8 x double> %u1373}1374