1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=ilp32d \ 3; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH 4; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=lp64d \ 5; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH 6; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfhmin,+v,+m -target-abi=ilp32d \ 7; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN 8; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfhmin,+v,+m -target-abi=lp64d \ 9; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN 10 11declare <vscale x 1 x float> @llvm.vp.fma.nxv1f32(<vscale x 1 x float>, <vscale x 1 x float>, <vscale x 1 x float>, <vscale x 1 x i1>, i32) 12declare <vscale x 1 x float> @llvm.vp.fneg.nxv1f32(<vscale x 1 x float>, <vscale x 1 x i1>, i32) 13declare <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half>, <vscale x 1 x i1>, i32) 14 15define <vscale x 1 x float> @vfnmsac_vv_nxv1f32(<vscale x 1 x half> %a, <vscale x 1 x half> %b, <vscale x 1 x float> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 16; ZVFH-LABEL: vfnmsac_vv_nxv1f32: 17; ZVFH: # %bb.0: 18; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 19; ZVFH-NEXT: vfwnmsac.vv v10, v8, v9, v0.t 20; ZVFH-NEXT: vmv1r.v v8, v10 21; ZVFH-NEXT: ret 22; 23; ZVFHMIN-LABEL: vfnmsac_vv_nxv1f32: 24; ZVFHMIN: # %bb.0: 25; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 26; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8, v0.t 27; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9, v0.t 28; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 29; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v10, v0.t 30; ZVFHMIN-NEXT: ret 31 %aext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %a, <vscale x 1 x i1> %m, i32 %evl) 32 %bext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %b, <vscale x 1 x i1> %m, i32 %evl) 33 %nega = call <vscale x 1 x float> @llvm.vp.fneg.nxv1f32(<vscale x 1 x float> %aext, <vscale x 1 x i1> %m, i32 %evl) 34 %v = call <vscale x 1 x float> @llvm.vp.fma.nxv1f32(<vscale x 1 x float> %nega, <vscale x 1 x float> %bext, <vscale x 1 x float> %c, <vscale x 1 x i1> %m, i32 %evl) 35 ret <vscale x 1 x float> %v 36} 37 38define <vscale x 1 x float> @vfnmsac_vv_nxv1f32_unmasked(<vscale x 1 x half> %a, <vscale x 1 x half> %b, <vscale x 1 x float> %c, i32 zeroext %evl) { 39; ZVFH-LABEL: vfnmsac_vv_nxv1f32_unmasked: 40; ZVFH: # %bb.0: 41; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 42; ZVFH-NEXT: vfwnmsac.vv v10, v8, v9 43; ZVFH-NEXT: vmv1r.v v8, v10 44; ZVFH-NEXT: ret 45; 46; ZVFHMIN-LABEL: vfnmsac_vv_nxv1f32_unmasked: 47; ZVFHMIN: # %bb.0: 48; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 49; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8 50; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9 51; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 52; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v10 53; ZVFHMIN-NEXT: ret 54 %aext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %a, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 55 %bext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %b, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 56 %nega = call <vscale x 1 x float> @llvm.vp.fneg.nxv1f32(<vscale x 1 x float> %aext, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 57 %v = call <vscale x 1 x float> @llvm.vp.fma.nxv1f32(<vscale x 1 x float> %nega, <vscale x 1 x float> %bext, <vscale x 1 x float> %c, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 58 ret <vscale x 1 x float> %v 59} 60 61define <vscale x 1 x float> @vfnmsac_vf_nxv1f32(<vscale x 1 x half> %a, half %b, <vscale x 1 x float> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 62; ZVFH-LABEL: vfnmsac_vf_nxv1f32: 63; ZVFH: # %bb.0: 64; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 65; ZVFH-NEXT: vfwnmsac.vf v9, fa0, v8, v0.t 66; ZVFH-NEXT: vmv1r.v v8, v9 67; ZVFH-NEXT: ret 68; 69; ZVFHMIN-LABEL: vfnmsac_vf_nxv1f32: 70; ZVFHMIN: # %bb.0: 71; ZVFHMIN-NEXT: fmv.x.h a1, fa0 72; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 73; ZVFHMIN-NEXT: vmv.v.x v10, a1 74; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8, v0.t 75; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v10, v0.t 76; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 77; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v9, v0.t 78; ZVFHMIN-NEXT: ret 79 %elt.head = insertelement <vscale x 1 x half> poison, half %b, i32 0 80 %vb = shufflevector <vscale x 1 x half> %elt.head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 81 %aext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %a, <vscale x 1 x i1> %m, i32 %evl) 82 %vbext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %vb, <vscale x 1 x i1> %m, i32 %evl) 83 %nega = call <vscale x 1 x float> @llvm.vp.fneg.nxv1f32(<vscale x 1 x float> %aext, <vscale x 1 x i1> %m, i32 %evl) 84 %v = call <vscale x 1 x float> @llvm.vp.fma.nxv1f32(<vscale x 1 x float> %nega, <vscale x 1 x float> %vbext, <vscale x 1 x float> %c, <vscale x 1 x i1> %m, i32 %evl) 85 ret <vscale x 1 x float> %v 86} 87 88define <vscale x 1 x float> @vfnmsac_vf_nxv1f32_commute(<vscale x 1 x half> %a, half %b, <vscale x 1 x float> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 89; ZVFH-LABEL: vfnmsac_vf_nxv1f32_commute: 90; ZVFH: # %bb.0: 91; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 92; ZVFH-NEXT: vfwnmsac.vf v9, fa0, v8, v0.t 93; ZVFH-NEXT: vmv1r.v v8, v9 94; ZVFH-NEXT: ret 95; 96; ZVFHMIN-LABEL: vfnmsac_vf_nxv1f32_commute: 97; ZVFHMIN: # %bb.0: 98; ZVFHMIN-NEXT: fmv.x.h a1, fa0 99; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 100; ZVFHMIN-NEXT: vmv.v.x v11, a1 101; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8, v0.t 102; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v11, v0.t 103; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 104; ZVFHMIN-NEXT: vfnmsub.vv v10, v8, v9, v0.t 105; ZVFHMIN-NEXT: vmv1r.v v8, v10 106; ZVFHMIN-NEXT: ret 107 %elt.head = insertelement <vscale x 1 x half> poison, half %b, i32 0 108 %vb = shufflevector <vscale x 1 x half> %elt.head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 109 %aext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %a, <vscale x 1 x i1> %m, i32 %evl) 110 %vbext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %vb, <vscale x 1 x i1> %m, i32 %evl) 111 %nega = call <vscale x 1 x float> @llvm.vp.fneg.nxv1f32(<vscale x 1 x float> %aext, <vscale x 1 x i1> %m, i32 %evl) 112 %v = call <vscale x 1 x float> @llvm.vp.fma.nxv1f32(<vscale x 1 x float> %vbext, <vscale x 1 x float> %nega, <vscale x 1 x float> %c, <vscale x 1 x i1> %m, i32 %evl) 113 ret <vscale x 1 x float> %v 114} 115 116define <vscale x 1 x float> @vfnmsac_vf_nxv1f32_unmasked(<vscale x 1 x half> %a, half %b, <vscale x 1 x float> %c, i32 zeroext %evl) { 117; ZVFH-LABEL: vfnmsac_vf_nxv1f32_unmasked: 118; ZVFH: # %bb.0: 119; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 120; ZVFH-NEXT: vfwnmsac.vf v9, fa0, v8 121; ZVFH-NEXT: vmv1r.v v8, v9 122; ZVFH-NEXT: ret 123; 124; ZVFHMIN-LABEL: vfnmsac_vf_nxv1f32_unmasked: 125; ZVFHMIN: # %bb.0: 126; ZVFHMIN-NEXT: fmv.x.h a1, fa0 127; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 128; ZVFHMIN-NEXT: vmv.v.x v10, a1 129; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8 130; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v10 131; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 132; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v9 133; ZVFHMIN-NEXT: ret 134 %elt.head = insertelement <vscale x 1 x half> poison, half %b, i32 0 135 %vb = shufflevector <vscale x 1 x half> %elt.head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 136 %aext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %a, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 137 %vbext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %vb, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 138 %nega = call <vscale x 1 x float> @llvm.vp.fneg.nxv1f32(<vscale x 1 x float> %aext, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 139 %v = call <vscale x 1 x float> @llvm.vp.fma.nxv1f32(<vscale x 1 x float> %nega, <vscale x 1 x float> %vbext, <vscale x 1 x float> %c, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 140 ret <vscale x 1 x float> %v 141} 142 143declare <vscale x 2 x float> @llvm.vp.fma.nxv2f32(<vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x i1>, i32) 144declare <vscale x 2 x float> @llvm.vp.fneg.nxv2f32(<vscale x 2 x float>, <vscale x 2 x i1>, i32) 145declare <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half>, <vscale x 2 x i1>, i32) 146 147define <vscale x 2 x float> @vfnmsac_vv_nxv2f32(<vscale x 2 x half> %a, <vscale x 2 x half> %b, <vscale x 2 x float> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) { 148; ZVFH-LABEL: vfnmsac_vv_nxv2f32: 149; ZVFH: # %bb.0: 150; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 151; ZVFH-NEXT: vfwnmsac.vv v10, v8, v9, v0.t 152; ZVFH-NEXT: vmv1r.v v8, v10 153; ZVFH-NEXT: ret 154; 155; ZVFHMIN-LABEL: vfnmsac_vv_nxv2f32: 156; ZVFHMIN: # %bb.0: 157; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 158; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8, v0.t 159; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9, v0.t 160; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 161; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v10, v0.t 162; ZVFHMIN-NEXT: ret 163 %aext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x i1> %m, i32 %evl) 164 %bext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %b, <vscale x 2 x i1> %m, i32 %evl) 165 %nega = call <vscale x 2 x float> @llvm.vp.fneg.nxv2f32(<vscale x 2 x float> %aext, <vscale x 2 x i1> %m, i32 %evl) 166 %v = call <vscale x 2 x float> @llvm.vp.fma.nxv2f32(<vscale x 2 x float> %nega, <vscale x 2 x float> %bext, <vscale x 2 x float> %c, <vscale x 2 x i1> %m, i32 %evl) 167 ret <vscale x 2 x float> %v 168} 169 170define <vscale x 2 x float> @vfnmsac_vv_nxv2f32_unmasked(<vscale x 2 x half> %a, <vscale x 2 x half> %b, <vscale x 2 x float> %c, i32 zeroext %evl) { 171; ZVFH-LABEL: vfnmsac_vv_nxv2f32_unmasked: 172; ZVFH: # %bb.0: 173; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 174; ZVFH-NEXT: vfwnmsac.vv v10, v8, v9 175; ZVFH-NEXT: vmv1r.v v8, v10 176; ZVFH-NEXT: ret 177; 178; ZVFHMIN-LABEL: vfnmsac_vv_nxv2f32_unmasked: 179; ZVFHMIN: # %bb.0: 180; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 181; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8 182; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9 183; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 184; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v10 185; ZVFHMIN-NEXT: ret 186 %aext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 187 %bext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %b, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 188 %nega = call <vscale x 2 x float> @llvm.vp.fneg.nxv2f32(<vscale x 2 x float> %aext, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 189 %v = call <vscale x 2 x float> @llvm.vp.fma.nxv2f32(<vscale x 2 x float> %nega, <vscale x 2 x float> %bext, <vscale x 2 x float> %c, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 190 ret <vscale x 2 x float> %v 191} 192 193define <vscale x 2 x float> @vfnmsac_vf_nxv2f32(<vscale x 2 x half> %a, half %b, <vscale x 2 x float> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) { 194; ZVFH-LABEL: vfnmsac_vf_nxv2f32: 195; ZVFH: # %bb.0: 196; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 197; ZVFH-NEXT: vfwnmsac.vf v9, fa0, v8, v0.t 198; ZVFH-NEXT: vmv1r.v v8, v9 199; ZVFH-NEXT: ret 200; 201; ZVFHMIN-LABEL: vfnmsac_vf_nxv2f32: 202; ZVFHMIN: # %bb.0: 203; ZVFHMIN-NEXT: fmv.x.h a1, fa0 204; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 205; ZVFHMIN-NEXT: vmv.v.x v10, a1 206; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8, v0.t 207; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v10, v0.t 208; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 209; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v9, v0.t 210; ZVFHMIN-NEXT: ret 211 %elt.head = insertelement <vscale x 2 x half> poison, half %b, i32 0 212 %vb = shufflevector <vscale x 2 x half> %elt.head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 213 %aext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x i1> %m, i32 %evl) 214 %vbext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %vb, <vscale x 2 x i1> %m, i32 %evl) 215 %nega = call <vscale x 2 x float> @llvm.vp.fneg.nxv2f32(<vscale x 2 x float> %aext, <vscale x 2 x i1> %m, i32 %evl) 216 %v = call <vscale x 2 x float> @llvm.vp.fma.nxv2f32(<vscale x 2 x float> %nega, <vscale x 2 x float> %vbext, <vscale x 2 x float> %c, <vscale x 2 x i1> %m, i32 %evl) 217 ret <vscale x 2 x float> %v 218} 219 220define <vscale x 2 x float> @vfnmsac_vf_nxv2f32_commute(<vscale x 2 x half> %a, half %b, <vscale x 2 x float> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) { 221; ZVFH-LABEL: vfnmsac_vf_nxv2f32_commute: 222; ZVFH: # %bb.0: 223; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 224; ZVFH-NEXT: vfwnmsac.vf v9, fa0, v8, v0.t 225; ZVFH-NEXT: vmv1r.v v8, v9 226; ZVFH-NEXT: ret 227; 228; ZVFHMIN-LABEL: vfnmsac_vf_nxv2f32_commute: 229; ZVFHMIN: # %bb.0: 230; ZVFHMIN-NEXT: fmv.x.h a1, fa0 231; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 232; ZVFHMIN-NEXT: vmv.v.x v11, a1 233; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8, v0.t 234; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v11, v0.t 235; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 236; ZVFHMIN-NEXT: vfnmsub.vv v10, v8, v9, v0.t 237; ZVFHMIN-NEXT: vmv.v.v v8, v10 238; ZVFHMIN-NEXT: ret 239 %elt.head = insertelement <vscale x 2 x half> poison, half %b, i32 0 240 %vb = shufflevector <vscale x 2 x half> %elt.head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 241 %aext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x i1> %m, i32 %evl) 242 %vbext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %vb, <vscale x 2 x i1> %m, i32 %evl) 243 %nega = call <vscale x 2 x float> @llvm.vp.fneg.nxv2f32(<vscale x 2 x float> %aext, <vscale x 2 x i1> %m, i32 %evl) 244 %v = call <vscale x 2 x float> @llvm.vp.fma.nxv2f32(<vscale x 2 x float> %vbext, <vscale x 2 x float> %nega, <vscale x 2 x float> %c, <vscale x 2 x i1> %m, i32 %evl) 245 ret <vscale x 2 x float> %v 246} 247 248define <vscale x 2 x float> @vfnmsac_vf_nxv2f32_unmasked(<vscale x 2 x half> %a, half %b, <vscale x 2 x float> %c, i32 zeroext %evl) { 249; ZVFH-LABEL: vfnmsac_vf_nxv2f32_unmasked: 250; ZVFH: # %bb.0: 251; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 252; ZVFH-NEXT: vfwnmsac.vf v9, fa0, v8 253; ZVFH-NEXT: vmv1r.v v8, v9 254; ZVFH-NEXT: ret 255; 256; ZVFHMIN-LABEL: vfnmsac_vf_nxv2f32_unmasked: 257; ZVFHMIN: # %bb.0: 258; ZVFHMIN-NEXT: fmv.x.h a1, fa0 259; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 260; ZVFHMIN-NEXT: vmv.v.x v10, a1 261; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8 262; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v10 263; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 264; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v9 265; ZVFHMIN-NEXT: ret 266 %elt.head = insertelement <vscale x 2 x half> poison, half %b, i32 0 267 %vb = shufflevector <vscale x 2 x half> %elt.head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 268 %aext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 269 %vbext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %vb, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 270 %nega = call <vscale x 2 x float> @llvm.vp.fneg.nxv2f32(<vscale x 2 x float> %aext, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 271 %v = call <vscale x 2 x float> @llvm.vp.fma.nxv2f32(<vscale x 2 x float> %nega, <vscale x 2 x float> %vbext, <vscale x 2 x float> %c, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 272 ret <vscale x 2 x float> %v 273} 274 275declare <vscale x 4 x float> @llvm.vp.fma.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x i1>, i32) 276declare <vscale x 4 x float> @llvm.vp.fneg.nxv4f32(<vscale x 4 x float>, <vscale x 4 x i1>, i32) 277declare <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half>, <vscale x 4 x i1>, i32) 278 279define <vscale x 4 x float> @vfnmsac_vv_nxv4f32(<vscale x 4 x half> %a, <vscale x 4 x half> %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) { 280; ZVFH-LABEL: vfnmsac_vv_nxv4f32: 281; ZVFH: # %bb.0: 282; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma 283; ZVFH-NEXT: vfwnmsac.vv v10, v8, v9, v0.t 284; ZVFH-NEXT: vmv2r.v v8, v10 285; ZVFH-NEXT: ret 286; 287; ZVFHMIN-LABEL: vfnmsac_vv_nxv4f32: 288; ZVFHMIN: # %bb.0: 289; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma 290; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v8, v0.t 291; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9, v0.t 292; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 293; ZVFHMIN-NEXT: vfnmsub.vv v12, v14, v10, v0.t 294; ZVFHMIN-NEXT: vmv.v.v v8, v12 295; ZVFHMIN-NEXT: ret 296 %aext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x i1> %m, i32 %evl) 297 %bext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %b, <vscale x 4 x i1> %m, i32 %evl) 298 %nega = call <vscale x 4 x float> @llvm.vp.fneg.nxv4f32(<vscale x 4 x float> %aext, <vscale x 4 x i1> %m, i32 %evl) 299 %v = call <vscale x 4 x float> @llvm.vp.fma.nxv4f32(<vscale x 4 x float> %nega, <vscale x 4 x float> %bext, <vscale x 4 x float> %c, <vscale x 4 x i1> %m, i32 %evl) 300 ret <vscale x 4 x float> %v 301} 302 303define <vscale x 4 x float> @vfnmsac_vv_nxv4f32_unmasked(<vscale x 4 x half> %a, <vscale x 4 x half> %b, <vscale x 4 x float> %c, i32 zeroext %evl) { 304; ZVFH-LABEL: vfnmsac_vv_nxv4f32_unmasked: 305; ZVFH: # %bb.0: 306; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma 307; ZVFH-NEXT: vfwnmsac.vv v10, v8, v9 308; ZVFH-NEXT: vmv2r.v v8, v10 309; ZVFH-NEXT: ret 310; 311; ZVFHMIN-LABEL: vfnmsac_vv_nxv4f32_unmasked: 312; ZVFHMIN: # %bb.0: 313; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma 314; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v8 315; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9 316; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 317; ZVFHMIN-NEXT: vfnmsub.vv v12, v14, v10 318; ZVFHMIN-NEXT: vmv.v.v v8, v12 319; ZVFHMIN-NEXT: ret 320 %aext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 321 %bext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %b, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 322 %nega = call <vscale x 4 x float> @llvm.vp.fneg.nxv4f32(<vscale x 4 x float> %aext, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 323 %v = call <vscale x 4 x float> @llvm.vp.fma.nxv4f32(<vscale x 4 x float> %nega, <vscale x 4 x float> %bext, <vscale x 4 x float> %c, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 324 ret <vscale x 4 x float> %v 325} 326 327define <vscale x 4 x float> @vfnmsac_vf_nxv4f32(<vscale x 4 x half> %a, half %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) { 328; ZVFH-LABEL: vfnmsac_vf_nxv4f32: 329; ZVFH: # %bb.0: 330; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma 331; ZVFH-NEXT: vfwnmsac.vf v10, fa0, v8, v0.t 332; ZVFH-NEXT: vmv2r.v v8, v10 333; ZVFH-NEXT: ret 334; 335; ZVFHMIN-LABEL: vfnmsac_vf_nxv4f32: 336; ZVFHMIN: # %bb.0: 337; ZVFHMIN-NEXT: fmv.x.h a1, fa0 338; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma 339; ZVFHMIN-NEXT: vmv.v.x v12, a1 340; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v8, v0.t 341; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v12, v0.t 342; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 343; ZVFHMIN-NEXT: vfnmsub.vv v8, v14, v10, v0.t 344; ZVFHMIN-NEXT: ret 345 %elt.head = insertelement <vscale x 4 x half> poison, half %b, i32 0 346 %vb = shufflevector <vscale x 4 x half> %elt.head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 347 %aext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x i1> %m, i32 %evl) 348 %vbext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %vb, <vscale x 4 x i1> %m, i32 %evl) 349 %nega = call <vscale x 4 x float> @llvm.vp.fneg.nxv4f32(<vscale x 4 x float> %aext, <vscale x 4 x i1> %m, i32 %evl) 350 %v = call <vscale x 4 x float> @llvm.vp.fma.nxv4f32(<vscale x 4 x float> %nega, <vscale x 4 x float> %vbext, <vscale x 4 x float> %c, <vscale x 4 x i1> %m, i32 %evl) 351 ret <vscale x 4 x float> %v 352} 353 354define <vscale x 4 x float> @vfnmsac_vf_nxv4f32_commute(<vscale x 4 x half> %a, half %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) { 355; ZVFH-LABEL: vfnmsac_vf_nxv4f32_commute: 356; ZVFH: # %bb.0: 357; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma 358; ZVFH-NEXT: vfwnmsac.vf v10, fa0, v8, v0.t 359; ZVFH-NEXT: vmv2r.v v8, v10 360; ZVFH-NEXT: ret 361; 362; ZVFHMIN-LABEL: vfnmsac_vf_nxv4f32_commute: 363; ZVFHMIN: # %bb.0: 364; ZVFHMIN-NEXT: fmv.x.h a1, fa0 365; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma 366; ZVFHMIN-NEXT: vmv.v.x v9, a1 367; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8, v0.t 368; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v9, v0.t 369; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 370; ZVFHMIN-NEXT: vfnmsub.vv v12, v14, v10, v0.t 371; ZVFHMIN-NEXT: vmv.v.v v8, v12 372; ZVFHMIN-NEXT: ret 373 %elt.head = insertelement <vscale x 4 x half> poison, half %b, i32 0 374 %vb = shufflevector <vscale x 4 x half> %elt.head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 375 %aext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x i1> %m, i32 %evl) 376 %vbext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %vb, <vscale x 4 x i1> %m, i32 %evl) 377 %nega = call <vscale x 4 x float> @llvm.vp.fneg.nxv4f32(<vscale x 4 x float> %aext, <vscale x 4 x i1> %m, i32 %evl) 378 %v = call <vscale x 4 x float> @llvm.vp.fma.nxv4f32(<vscale x 4 x float> %vbext, <vscale x 4 x float> %nega, <vscale x 4 x float> %c, <vscale x 4 x i1> %m, i32 %evl) 379 ret <vscale x 4 x float> %v 380} 381 382define <vscale x 4 x float> @vfnmsac_vf_nxv4f32_unmasked(<vscale x 4 x half> %a, half %b, <vscale x 4 x float> %c, i32 zeroext %evl) { 383; ZVFH-LABEL: vfnmsac_vf_nxv4f32_unmasked: 384; ZVFH: # %bb.0: 385; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma 386; ZVFH-NEXT: vfwnmsac.vf v10, fa0, v8 387; ZVFH-NEXT: vmv2r.v v8, v10 388; ZVFH-NEXT: ret 389; 390; ZVFHMIN-LABEL: vfnmsac_vf_nxv4f32_unmasked: 391; ZVFHMIN: # %bb.0: 392; ZVFHMIN-NEXT: fmv.x.h a1, fa0 393; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma 394; ZVFHMIN-NEXT: vmv.v.x v12, a1 395; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v8 396; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v12 397; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 398; ZVFHMIN-NEXT: vfnmsub.vv v8, v14, v10 399; ZVFHMIN-NEXT: ret 400 %elt.head = insertelement <vscale x 4 x half> poison, half %b, i32 0 401 %vb = shufflevector <vscale x 4 x half> %elt.head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 402 %aext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 403 %vbext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %vb, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 404 %nega = call <vscale x 4 x float> @llvm.vp.fneg.nxv4f32(<vscale x 4 x float> %aext, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 405 %v = call <vscale x 4 x float> @llvm.vp.fma.nxv4f32(<vscale x 4 x float> %nega, <vscale x 4 x float> %vbext, <vscale x 4 x float> %c, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 406 ret <vscale x 4 x float> %v 407} 408 409declare <vscale x 8 x float> @llvm.vp.fma.nxv8f32(<vscale x 8 x float>, <vscale x 8 x float>, <vscale x 8 x float>, <vscale x 8 x i1>, i32) 410declare <vscale x 8 x float> @llvm.vp.fneg.nxv8f32(<vscale x 8 x float>, <vscale x 8 x i1>, i32) 411declare <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half>, <vscale x 8 x i1>, i32) 412 413define <vscale x 8 x float> @vfnmsac_vv_nxv8f32(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x float> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) { 414; ZVFH-LABEL: vfnmsac_vv_nxv8f32: 415; ZVFH: # %bb.0: 416; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma 417; ZVFH-NEXT: vfwnmsac.vv v12, v8, v10, v0.t 418; ZVFH-NEXT: vmv4r.v v8, v12 419; ZVFH-NEXT: ret 420; 421; ZVFHMIN-LABEL: vfnmsac_vv_nxv8f32: 422; ZVFHMIN: # %bb.0: 423; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma 424; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v8, v0.t 425; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v10, v0.t 426; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 427; ZVFHMIN-NEXT: vfnmsub.vv v16, v20, v12, v0.t 428; ZVFHMIN-NEXT: vmv.v.v v8, v16 429; ZVFHMIN-NEXT: ret 430 %aext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x i1> %m, i32 %evl) 431 %bext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %b, <vscale x 8 x i1> %m, i32 %evl) 432 %nega = call <vscale x 8 x float> @llvm.vp.fneg.nxv8f32(<vscale x 8 x float> %aext, <vscale x 8 x i1> %m, i32 %evl) 433 %v = call <vscale x 8 x float> @llvm.vp.fma.nxv8f32(<vscale x 8 x float> %nega, <vscale x 8 x float> %bext, <vscale x 8 x float> %c, <vscale x 8 x i1> %m, i32 %evl) 434 ret <vscale x 8 x float> %v 435} 436 437define <vscale x 8 x float> @vfnmsac_vv_nxv8f32_unmasked(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x float> %c, i32 zeroext %evl) { 438; ZVFH-LABEL: vfnmsac_vv_nxv8f32_unmasked: 439; ZVFH: # %bb.0: 440; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma 441; ZVFH-NEXT: vfwnmsac.vv v12, v8, v10 442; ZVFH-NEXT: vmv4r.v v8, v12 443; ZVFH-NEXT: ret 444; 445; ZVFHMIN-LABEL: vfnmsac_vv_nxv8f32_unmasked: 446; ZVFHMIN: # %bb.0: 447; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma 448; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v8 449; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v10 450; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 451; ZVFHMIN-NEXT: vfnmsub.vv v16, v20, v12 452; ZVFHMIN-NEXT: vmv.v.v v8, v16 453; ZVFHMIN-NEXT: ret 454 %aext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 455 %bext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %b, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 456 %nega = call <vscale x 8 x float> @llvm.vp.fneg.nxv8f32(<vscale x 8 x float> %aext, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 457 %v = call <vscale x 8 x float> @llvm.vp.fma.nxv8f32(<vscale x 8 x float> %nega, <vscale x 8 x float> %bext, <vscale x 8 x float> %c, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 458 ret <vscale x 8 x float> %v 459} 460 461define <vscale x 8 x float> @vfnmsac_vf_nxv8f32(<vscale x 8 x half> %a, half %b, <vscale x 8 x float> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) { 462; ZVFH-LABEL: vfnmsac_vf_nxv8f32: 463; ZVFH: # %bb.0: 464; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma 465; ZVFH-NEXT: vfwnmsac.vf v12, fa0, v8, v0.t 466; ZVFH-NEXT: vmv4r.v v8, v12 467; ZVFH-NEXT: ret 468; 469; ZVFHMIN-LABEL: vfnmsac_vf_nxv8f32: 470; ZVFHMIN: # %bb.0: 471; ZVFHMIN-NEXT: fmv.x.h a1, fa0 472; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma 473; ZVFHMIN-NEXT: vmv.v.x v16, a1 474; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v8, v0.t 475; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v16, v0.t 476; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 477; ZVFHMIN-NEXT: vfnmsub.vv v8, v20, v12, v0.t 478; ZVFHMIN-NEXT: ret 479 %elt.head = insertelement <vscale x 8 x half> poison, half %b, i32 0 480 %vb = shufflevector <vscale x 8 x half> %elt.head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 481 %aext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x i1> %m, i32 %evl) 482 %vbext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %vb, <vscale x 8 x i1> %m, i32 %evl) 483 %nega = call <vscale x 8 x float> @llvm.vp.fneg.nxv8f32(<vscale x 8 x float> %aext, <vscale x 8 x i1> %m, i32 %evl) 484 %v = call <vscale x 8 x float> @llvm.vp.fma.nxv8f32(<vscale x 8 x float> %nega, <vscale x 8 x float> %vbext, <vscale x 8 x float> %c, <vscale x 8 x i1> %m, i32 %evl) 485 ret <vscale x 8 x float> %v 486} 487 488define <vscale x 8 x float> @vfnmsac_vf_nxv8f32_commute(<vscale x 8 x half> %a, half %b, <vscale x 8 x float> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) { 489; ZVFH-LABEL: vfnmsac_vf_nxv8f32_commute: 490; ZVFH: # %bb.0: 491; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma 492; ZVFH-NEXT: vfwnmsac.vf v12, fa0, v8, v0.t 493; ZVFH-NEXT: vmv4r.v v8, v12 494; ZVFH-NEXT: ret 495; 496; ZVFHMIN-LABEL: vfnmsac_vf_nxv8f32_commute: 497; ZVFHMIN: # %bb.0: 498; ZVFHMIN-NEXT: fmv.x.h a1, fa0 499; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma 500; ZVFHMIN-NEXT: vmv.v.x v10, a1 501; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8, v0.t 502; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v10, v0.t 503; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 504; ZVFHMIN-NEXT: vfnmsub.vv v16, v20, v12, v0.t 505; ZVFHMIN-NEXT: vmv.v.v v8, v16 506; ZVFHMIN-NEXT: ret 507 %elt.head = insertelement <vscale x 8 x half> poison, half %b, i32 0 508 %vb = shufflevector <vscale x 8 x half> %elt.head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 509 %aext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x i1> %m, i32 %evl) 510 %vbext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %vb, <vscale x 8 x i1> %m, i32 %evl) 511 %nega = call <vscale x 8 x float> @llvm.vp.fneg.nxv8f32(<vscale x 8 x float> %aext, <vscale x 8 x i1> %m, i32 %evl) 512 %v = call <vscale x 8 x float> @llvm.vp.fma.nxv8f32(<vscale x 8 x float> %vbext, <vscale x 8 x float> %nega, <vscale x 8 x float> %c, <vscale x 8 x i1> %m, i32 %evl) 513 ret <vscale x 8 x float> %v 514} 515 516define <vscale x 8 x float> @vfnmsac_vf_nxv8f32_unmasked(<vscale x 8 x half> %a, half %b, <vscale x 8 x float> %c, i32 zeroext %evl) { 517; ZVFH-LABEL: vfnmsac_vf_nxv8f32_unmasked: 518; ZVFH: # %bb.0: 519; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma 520; ZVFH-NEXT: vfwnmsac.vf v12, fa0, v8 521; ZVFH-NEXT: vmv4r.v v8, v12 522; ZVFH-NEXT: ret 523; 524; ZVFHMIN-LABEL: vfnmsac_vf_nxv8f32_unmasked: 525; ZVFHMIN: # %bb.0: 526; ZVFHMIN-NEXT: fmv.x.h a1, fa0 527; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma 528; ZVFHMIN-NEXT: vmv.v.x v16, a1 529; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v8 530; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v16 531; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 532; ZVFHMIN-NEXT: vfnmsub.vv v8, v20, v12 533; ZVFHMIN-NEXT: ret 534 %elt.head = insertelement <vscale x 8 x half> poison, half %b, i32 0 535 %vb = shufflevector <vscale x 8 x half> %elt.head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 536 %aext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 537 %vbext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %vb, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 538 %nega = call <vscale x 8 x float> @llvm.vp.fneg.nxv8f32(<vscale x 8 x float> %aext, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 539 %v = call <vscale x 8 x float> @llvm.vp.fma.nxv8f32(<vscale x 8 x float> %nega, <vscale x 8 x float> %vbext, <vscale x 8 x float> %c, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 540 ret <vscale x 8 x float> %v 541} 542 543declare <vscale x 16 x float> @llvm.vp.fma.nxv16f32(<vscale x 16 x float>, <vscale x 16 x float>, <vscale x 16 x float>, <vscale x 16 x i1>, i32) 544declare <vscale x 16 x float> @llvm.vp.fneg.nxv16f32(<vscale x 16 x float>, <vscale x 16 x i1>, i32) 545declare <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half>, <vscale x 16 x i1>, i32) 546 547define <vscale x 16 x float> @vfnmsac_vv_nxv16f32(<vscale x 16 x half> %a, <vscale x 16 x half> %b, <vscale x 16 x float> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) { 548; ZVFH-LABEL: vfnmsac_vv_nxv16f32: 549; ZVFH: # %bb.0: 550; ZVFH-NEXT: vsetvli zero, a0, e16, m4, ta, ma 551; ZVFH-NEXT: vfwnmsac.vv v16, v8, v12, v0.t 552; ZVFH-NEXT: vmv8r.v v8, v16 553; ZVFH-NEXT: ret 554; 555; ZVFHMIN-LABEL: vfnmsac_vv_nxv16f32: 556; ZVFHMIN: # %bb.0: 557; ZVFHMIN-NEXT: addi sp, sp, -16 558; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16 559; ZVFHMIN-NEXT: csrr a1, vlenb 560; ZVFHMIN-NEXT: slli a1, a1, 3 561; ZVFHMIN-NEXT: sub sp, sp, a1 562; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 563; ZVFHMIN-NEXT: addi a1, sp, 16 564; ZVFHMIN-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill 565; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma 566; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8, v0.t 567; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12, v0.t 568; ZVFHMIN-NEXT: addi a0, sp, 16 569; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 570; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 571; ZVFHMIN-NEXT: vfnmsub.vv v24, v16, v8, v0.t 572; ZVFHMIN-NEXT: vmv.v.v v8, v24 573; ZVFHMIN-NEXT: csrr a0, vlenb 574; ZVFHMIN-NEXT: slli a0, a0, 3 575; ZVFHMIN-NEXT: add sp, sp, a0 576; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16 577; ZVFHMIN-NEXT: addi sp, sp, 16 578; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0 579; ZVFHMIN-NEXT: ret 580 %aext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %a, <vscale x 16 x i1> %m, i32 %evl) 581 %bext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %b, <vscale x 16 x i1> %m, i32 %evl) 582 %nega = call <vscale x 16 x float> @llvm.vp.fneg.nxv16f32(<vscale x 16 x float> %aext, <vscale x 16 x i1> %m, i32 %evl) 583 %v = call <vscale x 16 x float> @llvm.vp.fma.nxv16f32(<vscale x 16 x float> %nega, <vscale x 16 x float> %bext, <vscale x 16 x float> %c, <vscale x 16 x i1> %m, i32 %evl) 584 ret <vscale x 16 x float> %v 585} 586 587define <vscale x 16 x float> @vfnmsac_vv_nxv16f32_unmasked(<vscale x 16 x half> %a, <vscale x 16 x half> %b, <vscale x 16 x float> %c, i32 zeroext %evl) { 588; ZVFH-LABEL: vfnmsac_vv_nxv16f32_unmasked: 589; ZVFH: # %bb.0: 590; ZVFH-NEXT: vsetvli zero, a0, e16, m4, ta, ma 591; ZVFH-NEXT: vfwnmsac.vv v16, v8, v12 592; ZVFH-NEXT: vmv8r.v v8, v16 593; ZVFH-NEXT: ret 594; 595; ZVFHMIN-LABEL: vfnmsac_vv_nxv16f32_unmasked: 596; ZVFHMIN: # %bb.0: 597; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma 598; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8 599; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12 600; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 601; ZVFHMIN-NEXT: vfnmsub.vv v24, v0, v16 602; ZVFHMIN-NEXT: vmv.v.v v8, v24 603; ZVFHMIN-NEXT: ret 604 %aext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %a, <vscale x 16 x i1> splat (i1 -1), i32 %evl) 605 %bext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %b, <vscale x 16 x i1> splat (i1 -1), i32 %evl) 606 %nega = call <vscale x 16 x float> @llvm.vp.fneg.nxv16f32(<vscale x 16 x float> %aext, <vscale x 16 x i1> splat (i1 -1), i32 %evl) 607 %v = call <vscale x 16 x float> @llvm.vp.fma.nxv16f32(<vscale x 16 x float> %nega, <vscale x 16 x float> %bext, <vscale x 16 x float> %c, <vscale x 16 x i1> splat (i1 -1), i32 %evl) 608 ret <vscale x 16 x float> %v 609} 610 611define <vscale x 16 x float> @vfnmsac_vf_nxv16f32(<vscale x 16 x half> %a, half %b, <vscale x 16 x float> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) { 612; ZVFH-LABEL: vfnmsac_vf_nxv16f32: 613; ZVFH: # %bb.0: 614; ZVFH-NEXT: vsetvli zero, a0, e16, m4, ta, ma 615; ZVFH-NEXT: vfwnmsac.vf v16, fa0, v8, v0.t 616; ZVFH-NEXT: vmv8r.v v8, v16 617; ZVFH-NEXT: ret 618; 619; ZVFHMIN-LABEL: vfnmsac_vf_nxv16f32: 620; ZVFHMIN: # %bb.0: 621; ZVFHMIN-NEXT: fmv.x.h a1, fa0 622; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma 623; ZVFHMIN-NEXT: vmv.v.x v4, a1 624; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v8, v0.t 625; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v4, v0.t 626; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 627; ZVFHMIN-NEXT: vfnmsub.vv v8, v24, v16, v0.t 628; ZVFHMIN-NEXT: ret 629 %elt.head = insertelement <vscale x 16 x half> poison, half %b, i32 0 630 %vb = shufflevector <vscale x 16 x half> %elt.head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 631 %aext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %a, <vscale x 16 x i1> %m, i32 %evl) 632 %vbext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %vb, <vscale x 16 x i1> %m, i32 %evl) 633 %nega = call <vscale x 16 x float> @llvm.vp.fneg.nxv16f32(<vscale x 16 x float> %aext, <vscale x 16 x i1> %m, i32 %evl) 634 %v = call <vscale x 16 x float> @llvm.vp.fma.nxv16f32(<vscale x 16 x float> %nega, <vscale x 16 x float> %vbext, <vscale x 16 x float> %c, <vscale x 16 x i1> %m, i32 %evl) 635 ret <vscale x 16 x float> %v 636} 637 638define <vscale x 16 x float> @vfnmsac_vf_nxv16f32_commute(<vscale x 16 x half> %a, half %b, <vscale x 16 x float> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) { 639; ZVFH-LABEL: vfnmsac_vf_nxv16f32_commute: 640; ZVFH: # %bb.0: 641; ZVFH-NEXT: vsetvli zero, a0, e16, m4, ta, ma 642; ZVFH-NEXT: vfwnmsac.vf v16, fa0, v8, v0.t 643; ZVFH-NEXT: vmv8r.v v8, v16 644; ZVFH-NEXT: ret 645; 646; ZVFHMIN-LABEL: vfnmsac_vf_nxv16f32_commute: 647; ZVFHMIN: # %bb.0: 648; ZVFHMIN-NEXT: fmv.x.h a1, fa0 649; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma 650; ZVFHMIN-NEXT: vmv.v.x v4, a1 651; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v8, v0.t 652; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v4, v0.t 653; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 654; ZVFHMIN-NEXT: vfnmsub.vv v24, v8, v16, v0.t 655; ZVFHMIN-NEXT: vmv.v.v v8, v24 656; ZVFHMIN-NEXT: ret 657 %elt.head = insertelement <vscale x 16 x half> poison, half %b, i32 0 658 %vb = shufflevector <vscale x 16 x half> %elt.head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 659 %aext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %a, <vscale x 16 x i1> %m, i32 %evl) 660 %vbext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %vb, <vscale x 16 x i1> %m, i32 %evl) 661 %nega = call <vscale x 16 x float> @llvm.vp.fneg.nxv16f32(<vscale x 16 x float> %aext, <vscale x 16 x i1> %m, i32 %evl) 662 %v = call <vscale x 16 x float> @llvm.vp.fma.nxv16f32(<vscale x 16 x float> %vbext, <vscale x 16 x float> %nega, <vscale x 16 x float> %c, <vscale x 16 x i1> %m, i32 %evl) 663 ret <vscale x 16 x float> %v 664} 665 666define <vscale x 16 x float> @vfnmsac_vf_nxv16f32_unmasked(<vscale x 16 x half> %a, half %b, <vscale x 16 x float> %c, i32 zeroext %evl) { 667; ZVFH-LABEL: vfnmsac_vf_nxv16f32_unmasked: 668; ZVFH: # %bb.0: 669; ZVFH-NEXT: vsetvli zero, a0, e16, m4, ta, ma 670; ZVFH-NEXT: vfwnmsac.vf v16, fa0, v8 671; ZVFH-NEXT: vmv8r.v v8, v16 672; ZVFH-NEXT: ret 673; 674; ZVFHMIN-LABEL: vfnmsac_vf_nxv16f32_unmasked: 675; ZVFHMIN: # %bb.0: 676; ZVFHMIN-NEXT: fmv.x.h a1, fa0 677; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma 678; ZVFHMIN-NEXT: vmv.v.x v24, a1 679; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8 680; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v24 681; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 682; ZVFHMIN-NEXT: vfnmsub.vv v8, v0, v16 683; ZVFHMIN-NEXT: ret 684 %elt.head = insertelement <vscale x 16 x half> poison, half %b, i32 0 685 %vb = shufflevector <vscale x 16 x half> %elt.head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 686 %aext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %a, <vscale x 16 x i1> splat (i1 -1), i32 %evl) 687 %vbext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %vb, <vscale x 16 x i1> splat (i1 -1), i32 %evl) 688 %nega = call <vscale x 16 x float> @llvm.vp.fneg.nxv16f32(<vscale x 16 x float> %aext, <vscale x 16 x i1> splat (i1 -1), i32 %evl) 689 %v = call <vscale x 16 x float> @llvm.vp.fma.nxv16f32(<vscale x 16 x float> %nega, <vscale x 16 x float> %vbext, <vscale x 16 x float> %c, <vscale x 16 x i1> splat (i1 -1), i32 %evl) 690 ret <vscale x 16 x float> %v 691} 692 693declare <vscale x 1 x double> @llvm.vp.fma.nxv1f64(<vscale x 1 x double>, <vscale x 1 x double>, <vscale x 1 x double>, <vscale x 1 x i1>, i32) 694declare <vscale x 1 x double> @llvm.vp.fneg.nxv1f64(<vscale x 1 x double>, <vscale x 1 x i1>, i32) 695declare <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float>, <vscale x 1 x i1>, i32) 696 697define <vscale x 1 x double> @vfnmsac_vv_nxv1f64(<vscale x 1 x float> %a, <vscale x 1 x float> %b, <vscale x 1 x double> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 698; CHECK-LABEL: vfnmsac_vv_nxv1f64: 699; CHECK: # %bb.0: 700; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 701; CHECK-NEXT: vfwnmsac.vv v10, v8, v9, v0.t 702; CHECK-NEXT: vmv1r.v v8, v10 703; CHECK-NEXT: ret 704 %aext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %a, <vscale x 1 x i1> %m, i32 %evl) 705 %bext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %b, <vscale x 1 x i1> %m, i32 %evl) 706 %nega = call <vscale x 1 x double> @llvm.vp.fneg.nxv1f64(<vscale x 1 x double> %aext, <vscale x 1 x i1> %m, i32 %evl) 707 %v = call <vscale x 1 x double> @llvm.vp.fma.nxv1f64(<vscale x 1 x double> %nega, <vscale x 1 x double> %bext, <vscale x 1 x double> %c, <vscale x 1 x i1> %m, i32 %evl) 708 ret <vscale x 1 x double> %v 709} 710 711define <vscale x 1 x double> @vfnmsac_vv_nxv1f64_unmasked(<vscale x 1 x float> %a, <vscale x 1 x float> %b, <vscale x 1 x double> %c, i32 zeroext %evl) { 712; CHECK-LABEL: vfnmsac_vv_nxv1f64_unmasked: 713; CHECK: # %bb.0: 714; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 715; CHECK-NEXT: vfwnmsac.vv v10, v8, v9 716; CHECK-NEXT: vmv1r.v v8, v10 717; CHECK-NEXT: ret 718 %aext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %a, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 719 %bext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %b, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 720 %nega = call <vscale x 1 x double> @llvm.vp.fneg.nxv1f64(<vscale x 1 x double> %aext, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 721 %v = call <vscale x 1 x double> @llvm.vp.fma.nxv1f64(<vscale x 1 x double> %nega, <vscale x 1 x double> %bext, <vscale x 1 x double> %c, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 722 ret <vscale x 1 x double> %v 723} 724 725define <vscale x 1 x double> @vfnmsac_vf_nxv1f64(<vscale x 1 x float> %a, float %b, <vscale x 1 x double> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 726; CHECK-LABEL: vfnmsac_vf_nxv1f64: 727; CHECK: # %bb.0: 728; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 729; CHECK-NEXT: vfwnmsac.vf v9, fa0, v8, v0.t 730; CHECK-NEXT: vmv1r.v v8, v9 731; CHECK-NEXT: ret 732 %elt.head = insertelement <vscale x 1 x float> poison, float %b, i32 0 733 %vb = shufflevector <vscale x 1 x float> %elt.head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 734 %aext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %a, <vscale x 1 x i1> %m, i32 %evl) 735 %vbext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %vb, <vscale x 1 x i1> %m, i32 %evl) 736 %nega = call <vscale x 1 x double> @llvm.vp.fneg.nxv1f64(<vscale x 1 x double> %aext, <vscale x 1 x i1> %m, i32 %evl) 737 %v = call <vscale x 1 x double> @llvm.vp.fma.nxv1f64(<vscale x 1 x double> %nega, <vscale x 1 x double> %vbext, <vscale x 1 x double> %c, <vscale x 1 x i1> %m, i32 %evl) 738 ret <vscale x 1 x double> %v 739} 740 741define <vscale x 1 x double> @vfnmsac_vf_nxv1f64_commute(<vscale x 1 x float> %a, float %b, <vscale x 1 x double> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) { 742; CHECK-LABEL: vfnmsac_vf_nxv1f64_commute: 743; CHECK: # %bb.0: 744; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 745; CHECK-NEXT: vfwnmsac.vf v9, fa0, v8, v0.t 746; CHECK-NEXT: vmv1r.v v8, v9 747; CHECK-NEXT: ret 748 %elt.head = insertelement <vscale x 1 x float> poison, float %b, i32 0 749 %vb = shufflevector <vscale x 1 x float> %elt.head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 750 %aext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %a, <vscale x 1 x i1> %m, i32 %evl) 751 %vbext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %vb, <vscale x 1 x i1> %m, i32 %evl) 752 %nega = call <vscale x 1 x double> @llvm.vp.fneg.nxv1f64(<vscale x 1 x double> %aext, <vscale x 1 x i1> %m, i32 %evl) 753 %v = call <vscale x 1 x double> @llvm.vp.fma.nxv1f64(<vscale x 1 x double> %vbext, <vscale x 1 x double> %nega, <vscale x 1 x double> %c, <vscale x 1 x i1> %m, i32 %evl) 754 ret <vscale x 1 x double> %v 755} 756 757define <vscale x 1 x double> @vfnmsac_vf_nxv1f64_unmasked(<vscale x 1 x float> %a, float %b, <vscale x 1 x double> %c, i32 zeroext %evl) { 758; CHECK-LABEL: vfnmsac_vf_nxv1f64_unmasked: 759; CHECK: # %bb.0: 760; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 761; CHECK-NEXT: vfwnmsac.vf v9, fa0, v8 762; CHECK-NEXT: vmv1r.v v8, v9 763; CHECK-NEXT: ret 764 %elt.head = insertelement <vscale x 1 x float> poison, float %b, i32 0 765 %vb = shufflevector <vscale x 1 x float> %elt.head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 766 %aext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %a, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 767 %vbext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %vb, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 768 %nega = call <vscale x 1 x double> @llvm.vp.fneg.nxv1f64(<vscale x 1 x double> %aext, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 769 %v = call <vscale x 1 x double> @llvm.vp.fma.nxv1f64(<vscale x 1 x double> %nega, <vscale x 1 x double> %vbext, <vscale x 1 x double> %c, <vscale x 1 x i1> splat (i1 -1), i32 %evl) 770 ret <vscale x 1 x double> %v 771} 772 773declare <vscale x 2 x double> @llvm.vp.fma.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x i1>, i32) 774declare <vscale x 2 x double> @llvm.vp.fneg.nxv2f64(<vscale x 2 x double>, <vscale x 2 x i1>, i32) 775declare <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float>, <vscale x 2 x i1>, i32) 776 777define <vscale x 2 x double> @vfnmsac_vv_nxv2f64(<vscale x 2 x float> %a, <vscale x 2 x float> %b, <vscale x 2 x double> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) { 778; CHECK-LABEL: vfnmsac_vv_nxv2f64: 779; CHECK: # %bb.0: 780; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 781; CHECK-NEXT: vfwnmsac.vv v10, v8, v9, v0.t 782; CHECK-NEXT: vmv2r.v v8, v10 783; CHECK-NEXT: ret 784 %aext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x i1> %m, i32 %evl) 785 %bext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %b, <vscale x 2 x i1> %m, i32 %evl) 786 %nega = call <vscale x 2 x double> @llvm.vp.fneg.nxv2f64(<vscale x 2 x double> %aext, <vscale x 2 x i1> %m, i32 %evl) 787 %v = call <vscale x 2 x double> @llvm.vp.fma.nxv2f64(<vscale x 2 x double> %nega, <vscale x 2 x double> %bext, <vscale x 2 x double> %c, <vscale x 2 x i1> %m, i32 %evl) 788 ret <vscale x 2 x double> %v 789} 790 791define <vscale x 2 x double> @vfnmsac_vv_nxv2f64_unmasked(<vscale x 2 x float> %a, <vscale x 2 x float> %b, <vscale x 2 x double> %c, i32 zeroext %evl) { 792; CHECK-LABEL: vfnmsac_vv_nxv2f64_unmasked: 793; CHECK: # %bb.0: 794; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 795; CHECK-NEXT: vfwnmsac.vv v10, v8, v9 796; CHECK-NEXT: vmv2r.v v8, v10 797; CHECK-NEXT: ret 798 %aext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 799 %bext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %b, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 800 %nega = call <vscale x 2 x double> @llvm.vp.fneg.nxv2f64(<vscale x 2 x double> %aext, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 801 %v = call <vscale x 2 x double> @llvm.vp.fma.nxv2f64(<vscale x 2 x double> %nega, <vscale x 2 x double> %bext, <vscale x 2 x double> %c, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 802 ret <vscale x 2 x double> %v 803} 804 805define <vscale x 2 x double> @vfnmsac_vf_nxv2f64(<vscale x 2 x float> %a, float %b, <vscale x 2 x double> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) { 806; CHECK-LABEL: vfnmsac_vf_nxv2f64: 807; CHECK: # %bb.0: 808; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 809; CHECK-NEXT: vfwnmsac.vf v10, fa0, v8, v0.t 810; CHECK-NEXT: vmv2r.v v8, v10 811; CHECK-NEXT: ret 812 %elt.head = insertelement <vscale x 2 x float> poison, float %b, i32 0 813 %vb = shufflevector <vscale x 2 x float> %elt.head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 814 %aext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x i1> %m, i32 %evl) 815 %vbext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %vb, <vscale x 2 x i1> %m, i32 %evl) 816 %nega = call <vscale x 2 x double> @llvm.vp.fneg.nxv2f64(<vscale x 2 x double> %aext, <vscale x 2 x i1> %m, i32 %evl) 817 %v = call <vscale x 2 x double> @llvm.vp.fma.nxv2f64(<vscale x 2 x double> %nega, <vscale x 2 x double> %vbext, <vscale x 2 x double> %c, <vscale x 2 x i1> %m, i32 %evl) 818 ret <vscale x 2 x double> %v 819} 820 821define <vscale x 2 x double> @vfnmsac_vf_nxv2f64_commute(<vscale x 2 x float> %a, float %b, <vscale x 2 x double> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) { 822; CHECK-LABEL: vfnmsac_vf_nxv2f64_commute: 823; CHECK: # %bb.0: 824; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 825; CHECK-NEXT: vfwnmsac.vf v10, fa0, v8, v0.t 826; CHECK-NEXT: vmv2r.v v8, v10 827; CHECK-NEXT: ret 828 %elt.head = insertelement <vscale x 2 x float> poison, float %b, i32 0 829 %vb = shufflevector <vscale x 2 x float> %elt.head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 830 %aext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x i1> %m, i32 %evl) 831 %vbext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %vb, <vscale x 2 x i1> %m, i32 %evl) 832 %nega = call <vscale x 2 x double> @llvm.vp.fneg.nxv2f64(<vscale x 2 x double> %aext, <vscale x 2 x i1> %m, i32 %evl) 833 %v = call <vscale x 2 x double> @llvm.vp.fma.nxv2f64(<vscale x 2 x double> %vbext, <vscale x 2 x double> %nega, <vscale x 2 x double> %c, <vscale x 2 x i1> %m, i32 %evl) 834 ret <vscale x 2 x double> %v 835} 836 837define <vscale x 2 x double> @vfnmsac_vf_nxv2f64_unmasked(<vscale x 2 x float> %a, float %b, <vscale x 2 x double> %c, i32 zeroext %evl) { 838; CHECK-LABEL: vfnmsac_vf_nxv2f64_unmasked: 839; CHECK: # %bb.0: 840; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 841; CHECK-NEXT: vfwnmsac.vf v10, fa0, v8 842; CHECK-NEXT: vmv2r.v v8, v10 843; CHECK-NEXT: ret 844 %elt.head = insertelement <vscale x 2 x float> poison, float %b, i32 0 845 %vb = shufflevector <vscale x 2 x float> %elt.head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 846 %aext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 847 %vbext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %vb, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 848 %nega = call <vscale x 2 x double> @llvm.vp.fneg.nxv2f64(<vscale x 2 x double> %aext, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 849 %v = call <vscale x 2 x double> @llvm.vp.fma.nxv2f64(<vscale x 2 x double> %nega, <vscale x 2 x double> %vbext, <vscale x 2 x double> %c, <vscale x 2 x i1> splat (i1 -1), i32 %evl) 850 ret <vscale x 2 x double> %v 851} 852 853declare <vscale x 4 x double> @llvm.vp.fma.nxv4f64(<vscale x 4 x double>, <vscale x 4 x double>, <vscale x 4 x double>, <vscale x 4 x i1>, i32) 854declare <vscale x 4 x double> @llvm.vp.fneg.nxv4f64(<vscale x 4 x double>, <vscale x 4 x i1>, i32) 855declare <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float>, <vscale x 4 x i1>, i32) 856 857define <vscale x 4 x double> @vfnmsac_vv_nxv4f64(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x double> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) { 858; CHECK-LABEL: vfnmsac_vv_nxv4f64: 859; CHECK: # %bb.0: 860; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 861; CHECK-NEXT: vfwnmsac.vv v12, v8, v10, v0.t 862; CHECK-NEXT: vmv4r.v v8, v12 863; CHECK-NEXT: ret 864 %aext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x i1> %m, i32 %evl) 865 %bext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %b, <vscale x 4 x i1> %m, i32 %evl) 866 %nega = call <vscale x 4 x double> @llvm.vp.fneg.nxv4f64(<vscale x 4 x double> %aext, <vscale x 4 x i1> %m, i32 %evl) 867 %v = call <vscale x 4 x double> @llvm.vp.fma.nxv4f64(<vscale x 4 x double> %nega, <vscale x 4 x double> %bext, <vscale x 4 x double> %c, <vscale x 4 x i1> %m, i32 %evl) 868 ret <vscale x 4 x double> %v 869} 870 871define <vscale x 4 x double> @vfnmsac_vv_nxv4f64_unmasked(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x double> %c, i32 zeroext %evl) { 872; CHECK-LABEL: vfnmsac_vv_nxv4f64_unmasked: 873; CHECK: # %bb.0: 874; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 875; CHECK-NEXT: vfwnmsac.vv v12, v8, v10 876; CHECK-NEXT: vmv4r.v v8, v12 877; CHECK-NEXT: ret 878 %aext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 879 %bext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %b, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 880 %nega = call <vscale x 4 x double> @llvm.vp.fneg.nxv4f64(<vscale x 4 x double> %aext, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 881 %v = call <vscale x 4 x double> @llvm.vp.fma.nxv4f64(<vscale x 4 x double> %nega, <vscale x 4 x double> %bext, <vscale x 4 x double> %c, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 882 ret <vscale x 4 x double> %v 883} 884 885define <vscale x 4 x double> @vfnmsac_vf_nxv4f64(<vscale x 4 x float> %a, float %b, <vscale x 4 x double> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) { 886; CHECK-LABEL: vfnmsac_vf_nxv4f64: 887; CHECK: # %bb.0: 888; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 889; CHECK-NEXT: vfwnmsac.vf v12, fa0, v8, v0.t 890; CHECK-NEXT: vmv4r.v v8, v12 891; CHECK-NEXT: ret 892 %elt.head = insertelement <vscale x 4 x float> poison, float %b, i32 0 893 %vb = shufflevector <vscale x 4 x float> %elt.head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 894 %aext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x i1> %m, i32 %evl) 895 %vbext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %vb, <vscale x 4 x i1> %m, i32 %evl) 896 %nega = call <vscale x 4 x double> @llvm.vp.fneg.nxv4f64(<vscale x 4 x double> %aext, <vscale x 4 x i1> %m, i32 %evl) 897 %v = call <vscale x 4 x double> @llvm.vp.fma.nxv4f64(<vscale x 4 x double> %nega, <vscale x 4 x double> %vbext, <vscale x 4 x double> %c, <vscale x 4 x i1> %m, i32 %evl) 898 ret <vscale x 4 x double> %v 899} 900 901define <vscale x 4 x double> @vfnmsac_vf_nxv4f64_commute(<vscale x 4 x float> %a, float %b, <vscale x 4 x double> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) { 902; CHECK-LABEL: vfnmsac_vf_nxv4f64_commute: 903; CHECK: # %bb.0: 904; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 905; CHECK-NEXT: vfwnmsac.vf v12, fa0, v8, v0.t 906; CHECK-NEXT: vmv4r.v v8, v12 907; CHECK-NEXT: ret 908 %elt.head = insertelement <vscale x 4 x float> poison, float %b, i32 0 909 %vb = shufflevector <vscale x 4 x float> %elt.head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 910 %aext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x i1> %m, i32 %evl) 911 %vbext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %vb, <vscale x 4 x i1> %m, i32 %evl) 912 %nega = call <vscale x 4 x double> @llvm.vp.fneg.nxv4f64(<vscale x 4 x double> %aext, <vscale x 4 x i1> %m, i32 %evl) 913 %v = call <vscale x 4 x double> @llvm.vp.fma.nxv4f64(<vscale x 4 x double> %vbext, <vscale x 4 x double> %nega, <vscale x 4 x double> %c, <vscale x 4 x i1> %m, i32 %evl) 914 ret <vscale x 4 x double> %v 915} 916 917define <vscale x 4 x double> @vfnmsac_vf_nxv4f64_unmasked(<vscale x 4 x float> %a, float %b, <vscale x 4 x double> %c, i32 zeroext %evl) { 918; CHECK-LABEL: vfnmsac_vf_nxv4f64_unmasked: 919; CHECK: # %bb.0: 920; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 921; CHECK-NEXT: vfwnmsac.vf v12, fa0, v8 922; CHECK-NEXT: vmv4r.v v8, v12 923; CHECK-NEXT: ret 924 %elt.head = insertelement <vscale x 4 x float> poison, float %b, i32 0 925 %vb = shufflevector <vscale x 4 x float> %elt.head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 926 %aext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 927 %vbext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %vb, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 928 %nega = call <vscale x 4 x double> @llvm.vp.fneg.nxv4f64(<vscale x 4 x double> %aext, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 929 %v = call <vscale x 4 x double> @llvm.vp.fma.nxv4f64(<vscale x 4 x double> %nega, <vscale x 4 x double> %vbext, <vscale x 4 x double> %c, <vscale x 4 x i1> splat (i1 -1), i32 %evl) 930 ret <vscale x 4 x double> %v 931} 932 933declare <vscale x 8 x double> @llvm.vp.fma.nxv8f64(<vscale x 8 x double>, <vscale x 8 x double>, <vscale x 8 x double>, <vscale x 8 x i1>, i32) 934declare <vscale x 8 x double> @llvm.vp.fneg.nxv8f64(<vscale x 8 x double>, <vscale x 8 x i1>, i32) 935declare <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float>, <vscale x 8 x i1>, i32) 936 937define <vscale x 8 x double> @vfnmsac_vv_nxv8f64(<vscale x 8 x float> %a, <vscale x 8 x float> %b, <vscale x 8 x double> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) { 938; CHECK-LABEL: vfnmsac_vv_nxv8f64: 939; CHECK: # %bb.0: 940; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 941; CHECK-NEXT: vfwnmsac.vv v16, v8, v12, v0.t 942; CHECK-NEXT: vmv8r.v v8, v16 943; CHECK-NEXT: ret 944 %aext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %a, <vscale x 8 x i1> %m, i32 %evl) 945 %bext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %b, <vscale x 8 x i1> %m, i32 %evl) 946 %nega = call <vscale x 8 x double> @llvm.vp.fneg.nxv8f64(<vscale x 8 x double> %aext, <vscale x 8 x i1> %m, i32 %evl) 947 %v = call <vscale x 8 x double> @llvm.vp.fma.nxv8f64(<vscale x 8 x double> %nega, <vscale x 8 x double> %bext, <vscale x 8 x double> %c, <vscale x 8 x i1> %m, i32 %evl) 948 ret <vscale x 8 x double> %v 949} 950 951define <vscale x 8 x double> @vfnmsac_vv_nxv8f64_unmasked(<vscale x 8 x float> %a, <vscale x 8 x float> %b, <vscale x 8 x double> %c, i32 zeroext %evl) { 952; CHECK-LABEL: vfnmsac_vv_nxv8f64_unmasked: 953; CHECK: # %bb.0: 954; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 955; CHECK-NEXT: vfwnmsac.vv v16, v8, v12 956; CHECK-NEXT: vmv8r.v v8, v16 957; CHECK-NEXT: ret 958 %aext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %a, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 959 %bext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %b, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 960 %nega = call <vscale x 8 x double> @llvm.vp.fneg.nxv8f64(<vscale x 8 x double> %aext, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 961 %v = call <vscale x 8 x double> @llvm.vp.fma.nxv8f64(<vscale x 8 x double> %nega, <vscale x 8 x double> %bext, <vscale x 8 x double> %c, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 962 ret <vscale x 8 x double> %v 963} 964 965define <vscale x 8 x double> @vfnmsac_vf_nxv8f64(<vscale x 8 x float> %a, float %b, <vscale x 8 x double> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) { 966; CHECK-LABEL: vfnmsac_vf_nxv8f64: 967; CHECK: # %bb.0: 968; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 969; CHECK-NEXT: vfwnmsac.vf v16, fa0, v8, v0.t 970; CHECK-NEXT: vmv8r.v v8, v16 971; CHECK-NEXT: ret 972 %elt.head = insertelement <vscale x 8 x float> poison, float %b, i32 0 973 %vb = shufflevector <vscale x 8 x float> %elt.head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 974 %aext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %a, <vscale x 8 x i1> %m, i32 %evl) 975 %vbext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %vb, <vscale x 8 x i1> %m, i32 %evl) 976 %nega = call <vscale x 8 x double> @llvm.vp.fneg.nxv8f64(<vscale x 8 x double> %aext, <vscale x 8 x i1> %m, i32 %evl) 977 %v = call <vscale x 8 x double> @llvm.vp.fma.nxv8f64(<vscale x 8 x double> %nega, <vscale x 8 x double> %vbext, <vscale x 8 x double> %c, <vscale x 8 x i1> %m, i32 %evl) 978 ret <vscale x 8 x double> %v 979} 980 981define <vscale x 8 x double> @vfnmsac_vf_nxv8f64_commute(<vscale x 8 x float> %a, float %b, <vscale x 8 x double> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) { 982; CHECK-LABEL: vfnmsac_vf_nxv8f64_commute: 983; CHECK: # %bb.0: 984; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 985; CHECK-NEXT: vfwnmsac.vf v16, fa0, v8, v0.t 986; CHECK-NEXT: vmv8r.v v8, v16 987; CHECK-NEXT: ret 988 %elt.head = insertelement <vscale x 8 x float> poison, float %b, i32 0 989 %vb = shufflevector <vscale x 8 x float> %elt.head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 990 %aext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %a, <vscale x 8 x i1> %m, i32 %evl) 991 %vbext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %vb, <vscale x 8 x i1> %m, i32 %evl) 992 %nega = call <vscale x 8 x double> @llvm.vp.fneg.nxv8f64(<vscale x 8 x double> %aext, <vscale x 8 x i1> %m, i32 %evl) 993 %v = call <vscale x 8 x double> @llvm.vp.fma.nxv8f64(<vscale x 8 x double> %vbext, <vscale x 8 x double> %nega, <vscale x 8 x double> %c, <vscale x 8 x i1> %m, i32 %evl) 994 ret <vscale x 8 x double> %v 995} 996 997define <vscale x 8 x double> @vfnmsac_vf_nxv8f64_unmasked(<vscale x 8 x float> %a, float %b, <vscale x 8 x double> %c, i32 zeroext %evl) { 998; CHECK-LABEL: vfnmsac_vf_nxv8f64_unmasked: 999; CHECK: # %bb.0: 1000; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 1001; CHECK-NEXT: vfwnmsac.vf v16, fa0, v8 1002; CHECK-NEXT: vmv8r.v v8, v16 1003; CHECK-NEXT: ret 1004 %elt.head = insertelement <vscale x 8 x float> poison, float %b, i32 0 1005 %vb = shufflevector <vscale x 8 x float> %elt.head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 1006 %aext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %a, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 1007 %vbext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %vb, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 1008 %nega = call <vscale x 8 x double> @llvm.vp.fneg.nxv8f64(<vscale x 8 x double> %aext, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 1009 %v = call <vscale x 8 x double> @llvm.vp.fma.nxv8f64(<vscale x 8 x double> %nega, <vscale x 8 x double> %vbext, <vscale x 8 x double> %c, <vscale x 8 x i1> splat (i1 -1), i32 %evl) 1010 ret <vscale x 8 x double> %v 1011} 1012