brintos

brintos / llvm-project-archived public Read only

0
0
Text · 31.5 KiB · 68af72d Raw
654 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zvfh,+v -target-abi=ilp32d \3; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH4; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+zvfh,+v -target-abi=lp64d \5; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH6; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zfhmin,+zvfhmin,+v -target-abi=ilp32d \7; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN8; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+zfhmin,+zvfhmin,+v -target-abi=lp64d \9; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN10 11; This tests a mix of vfnmsac and vfnmsub by using different operand orders to12; trigger commuting in TwoAddressInstructionPass.13 14define <vscale x 1 x half> @vfnmsub_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) strictfp {15; ZVFH-LABEL: vfnmsub_vv_nxv1f16:16; ZVFH:       # %bb.0:17; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma18; ZVFH-NEXT:    vfnmsub.vv v8, v9, v1019; ZVFH-NEXT:    ret20;21; ZVFHMIN-LABEL: vfnmsub_vv_nxv1f16:22; ZVFHMIN:       # %bb.0:23; ZVFHMIN-NEXT:    lui a0, 824; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, mf4, ta, ma25; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v1026; ZVFHMIN-NEXT:    vxor.vx v8, v8, a027; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v828; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v929; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma30; ZVFHMIN-NEXT:    vfmadd.vv v12, v10, v1131; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma32; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v1233; ZVFHMIN-NEXT:    ret34  %neg = fneg <vscale x 1 x half> %va35  %vd = call <vscale x 1 x half> @llvm.experimental.constrained.fma.nxv1f16(<vscale x 1 x half> %neg, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")36  ret <vscale x 1 x half> %vd37}38 39define <vscale x 1 x half> @vfnmsub_vf_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, half %c) strictfp {40; ZVFH-LABEL: vfnmsub_vf_nxv1f16:41; ZVFH:       # %bb.0:42; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma43; ZVFH-NEXT:    vfnmsub.vf v8, fa0, v944; ZVFH-NEXT:    ret45;46; ZVFHMIN-LABEL: vfnmsub_vf_nxv1f16:47; ZVFHMIN:       # %bb.0:48; ZVFHMIN-NEXT:    fmv.x.h a0, fa049; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, mf4, ta, ma50; ZVFHMIN-NEXT:    vmv.v.x v10, a051; ZVFHMIN-NEXT:    lui a0, 852; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v953; ZVFHMIN-NEXT:    vxor.vx v8, v8, a054; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v855; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v1056; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma57; ZVFHMIN-NEXT:    vfmadd.vv v12, v9, v1158; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma59; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v1260; ZVFHMIN-NEXT:    ret61  %head = insertelement <vscale x 1 x half> poison, half %c, i32 062  %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer63  %neg = fneg <vscale x 1 x half> %va64  %vd = call <vscale x 1 x half> @llvm.experimental.constrained.fma.nxv1f16(<vscale x 1 x half> %neg, <vscale x 1 x half> %splat, <vscale x 1 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")65  ret <vscale x 1 x half> %vd66}67 68define <vscale x 2 x half> @vfnmsub_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) strictfp {69; ZVFH-LABEL: vfnmsub_vv_nxv2f16:70; ZVFH:       # %bb.0:71; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma72; ZVFH-NEXT:    vfnmsub.vv v8, v10, v973; ZVFH-NEXT:    ret74;75; ZVFHMIN-LABEL: vfnmsub_vv_nxv2f16:76; ZVFHMIN:       # %bb.0:77; ZVFHMIN-NEXT:    lui a0, 878; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma79; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v980; ZVFHMIN-NEXT:    vxor.vx v8, v8, a081; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v882; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v1083; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma84; ZVFHMIN-NEXT:    vfmadd.vv v12, v9, v1185; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma86; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v1287; ZVFHMIN-NEXT:    ret88  %neg = fneg <vscale x 2 x half> %va89  %vd = call <vscale x 2 x half> @llvm.experimental.constrained.fma.nxv2f16(<vscale x 2 x half> %neg, <vscale x 2 x half> %vc, <vscale x 2 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")90  ret <vscale x 2 x half> %vd91}92 93define <vscale x 2 x half> @vfnmsub_vf_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, half %c) strictfp {94; ZVFH-LABEL: vfnmsub_vf_nxv2f16:95; ZVFH:       # %bb.0:96; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma97; ZVFH-NEXT:    vfnmsub.vf v8, fa0, v998; ZVFH-NEXT:    ret99;100; ZVFHMIN-LABEL: vfnmsub_vf_nxv2f16:101; ZVFHMIN:       # %bb.0:102; ZVFHMIN-NEXT:    fmv.x.h a0, fa0103; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma104; ZVFHMIN-NEXT:    vmv.v.x v10, a0105; ZVFHMIN-NEXT:    lui a0, 8106; ZVFHMIN-NEXT:    vfwcvt.f.f.v v11, v9107; ZVFHMIN-NEXT:    vxor.vx v8, v8, a0108; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v8109; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10110; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma111; ZVFHMIN-NEXT:    vfmadd.vv v12, v9, v11112; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma113; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v12114; ZVFHMIN-NEXT:    ret115  %head = insertelement <vscale x 2 x half> poison, half %c, i32 0116  %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer117  %neg = fneg <vscale x 2 x half> %va118  %vd = call <vscale x 2 x half> @llvm.experimental.constrained.fma.nxv2f16(<vscale x 2 x half> %splat, <vscale x 2 x half> %neg, <vscale x 2 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")119  ret <vscale x 2 x half> %vd120}121 122define <vscale x 4 x half> @vfnmsub_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) strictfp {123; ZVFH-LABEL: vfnmsub_vv_nxv4f16:124; ZVFH:       # %bb.0:125; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma126; ZVFH-NEXT:    vfnmsub.vv v8, v9, v10127; ZVFH-NEXT:    ret128;129; ZVFHMIN-LABEL: vfnmsub_vv_nxv4f16:130; ZVFHMIN:       # %bb.0:131; ZVFHMIN-NEXT:    lui a0, 8132; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m1, ta, ma133; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10134; ZVFHMIN-NEXT:    vxor.vx v9, v9, a0135; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9136; ZVFHMIN-NEXT:    vfwcvt.f.f.v v14, v8137; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma138; ZVFHMIN-NEXT:    vfmadd.vv v14, v10, v12139; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m1, ta, ma140; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v14141; ZVFHMIN-NEXT:    ret142  %neg = fneg <vscale x 4 x half> %vb143  %vd = call <vscale x 4 x half> @llvm.experimental.constrained.fma.nxv4f16(<vscale x 4 x half> %neg, <vscale x 4 x half> %va, <vscale x 4 x half> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")144  ret <vscale x 4 x half> %vd145}146 147define <vscale x 4 x half> @vfnmsub_vf_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, half %c) strictfp {148; ZVFH-LABEL: vfnmsub_vf_nxv4f16:149; ZVFH:       # %bb.0:150; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma151; ZVFH-NEXT:    vfnmsub.vf v8, fa0, v9152; ZVFH-NEXT:    ret153;154; ZVFHMIN-LABEL: vfnmsub_vf_nxv4f16:155; ZVFHMIN:       # %bb.0:156; ZVFHMIN-NEXT:    fmv.x.h a0, fa0157; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m1, ta, ma158; ZVFHMIN-NEXT:    vmv.v.x v12, a0159; ZVFHMIN-NEXT:    lui a0, 8160; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v9161; ZVFHMIN-NEXT:    vxor.vx v9, v12, a0162; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v9163; ZVFHMIN-NEXT:    vfwcvt.f.f.v v14, v8164; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma165; ZVFHMIN-NEXT:    vfmadd.vv v14, v12, v10166; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m1, ta, ma167; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v14168; ZVFHMIN-NEXT:    ret169  %head = insertelement <vscale x 4 x half> poison, half %c, i32 0170  %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer171  %neg = fneg <vscale x 4 x half> %splat172  %vd = call <vscale x 4 x half> @llvm.experimental.constrained.fma.nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %neg, <vscale x 4 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")173  ret <vscale x 4 x half> %vd174}175 176define <vscale x 8 x half> @vfnmsub_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) strictfp {177; ZVFH-LABEL: vfnmsub_vv_nxv8f16:178; ZVFH:       # %bb.0:179; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma180; ZVFH-NEXT:    vfnmsac.vv v8, v12, v10181; ZVFH-NEXT:    ret182;183; ZVFHMIN-LABEL: vfnmsub_vv_nxv8f16:184; ZVFHMIN:       # %bb.0:185; ZVFHMIN-NEXT:    lui a0, 8186; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m2, ta, ma187; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8188; ZVFHMIN-NEXT:    vxor.vx v14, v10, a0189; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v14190; ZVFHMIN-NEXT:    vfwcvt.f.f.v v20, v12191; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma192; ZVFHMIN-NEXT:    vfmadd.vv v20, v8, v16193; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m2, ta, ma194; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v20195; ZVFHMIN-NEXT:    ret196  %neg = fneg <vscale x 8 x half> %vb197  %vd = call <vscale x 8 x half> @llvm.experimental.constrained.fma.nxv8f16(<vscale x 8 x half> %neg, <vscale x 8 x half> %vc, <vscale x 8 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")198  ret <vscale x 8 x half> %vd199}200 201define <vscale x 8 x half> @vfnmsub_vf_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, half %c) strictfp {202; ZVFH-LABEL: vfnmsub_vf_nxv8f16:203; ZVFH:       # %bb.0:204; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma205; ZVFH-NEXT:    vfnmsac.vf v8, fa0, v10206; ZVFH-NEXT:    ret207;208; ZVFHMIN-LABEL: vfnmsub_vf_nxv8f16:209; ZVFHMIN:       # %bb.0:210; ZVFHMIN-NEXT:    fmv.x.h a0, fa0211; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m2, ta, ma212; ZVFHMIN-NEXT:    vmv.v.x v16, a0213; ZVFHMIN-NEXT:    lui a0, 8214; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v8215; ZVFHMIN-NEXT:    vxor.vx v8, v16, a0216; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8217; ZVFHMIN-NEXT:    vfwcvt.f.f.v v20, v10218; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma219; ZVFHMIN-NEXT:    vfmadd.vv v20, v16, v12220; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m2, ta, ma221; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v20222; ZVFHMIN-NEXT:    ret223  %head = insertelement <vscale x 8 x half> poison, half %c, i32 0224  %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer225  %neg = fneg <vscale x 8 x half> %splat226  %vd = call <vscale x 8 x half> @llvm.experimental.constrained.fma.nxv8f16(<vscale x 8 x half> %vb, <vscale x 8 x half> %neg, <vscale x 8 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")227  ret <vscale x 8 x half> %vd228}229 230define <vscale x 16 x half> @vfnmsub_vv_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) strictfp {231; ZVFH-LABEL: vfnmsub_vv_nxv16f16:232; ZVFH:       # %bb.0:233; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma234; ZVFH-NEXT:    vfnmsub.vv v8, v16, v12235; ZVFH-NEXT:    ret236;237; ZVFHMIN-LABEL: vfnmsub_vv_nxv16f16:238; ZVFHMIN:       # %bb.0:239; ZVFHMIN-NEXT:    lui a0, 8240; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma241; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v12242; ZVFHMIN-NEXT:    vxor.vx v12, v16, a0243; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12244; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v8245; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma246; ZVFHMIN-NEXT:    vfmadd.vv v0, v16, v24247; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma248; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v0249; ZVFHMIN-NEXT:    ret250  %neg = fneg <vscale x 16 x half> %vc251  %vd = call <vscale x 16 x half> @llvm.experimental.constrained.fma.nxv16f16(<vscale x 16 x half> %neg, <vscale x 16 x half> %va, <vscale x 16 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")252  ret <vscale x 16 x half> %vd253}254 255define <vscale x 16 x half> @vfnmsub_vf_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, half %c) strictfp {256; ZVFH-LABEL: vfnmsub_vf_nxv16f16:257; ZVFH:       # %bb.0:258; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma259; ZVFH-NEXT:    vfnmsub.vf v8, fa0, v12260; ZVFH-NEXT:    ret261;262; ZVFHMIN-LABEL: vfnmsub_vf_nxv16f16:263; ZVFHMIN:       # %bb.0:264; ZVFHMIN-NEXT:    fmv.x.h a0, fa0265; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma266; ZVFHMIN-NEXT:    vmv.v.x v24, a0267; ZVFHMIN-NEXT:    lui a0, 8268; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12269; ZVFHMIN-NEXT:    vxor.vx v12, v24, a0270; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v12271; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v8272; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma273; ZVFHMIN-NEXT:    vfmadd.vv v0, v24, v16274; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma275; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v0276; ZVFHMIN-NEXT:    ret277  %head = insertelement <vscale x 16 x half> poison, half %c, i32 0278  %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer279  %neg = fneg <vscale x 16 x half> %splat280  %vd = call <vscale x 16 x half> @llvm.experimental.constrained.fma.nxv16f16(<vscale x 16 x half> %neg, <vscale x 16 x half> %va, <vscale x 16 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")281  ret <vscale x 16 x half> %vd282}283 284define <vscale x 32 x half> @vfnmsub_vv_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, <vscale x 32 x half> %vc) strictfp {285; ZVFH-LABEL: vfnmsub_vv_nxv32f16:286; ZVFH:       # %bb.0:287; ZVFH-NEXT:    vl8re16.v v24, (a0)288; ZVFH-NEXT:    vsetvli a0, zero, e16, m8, ta, ma289; ZVFH-NEXT:    vfnmsub.vv v8, v24, v16290; ZVFH-NEXT:    ret291;292; ZVFHMIN-LABEL: vfnmsub_vv_nxv32f16:293; ZVFHMIN:       # %bb.0:294; ZVFHMIN-NEXT:    addi sp, sp, -16295; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16296; ZVFHMIN-NEXT:    csrr a1, vlenb297; ZVFHMIN-NEXT:    li a2, 24298; ZVFHMIN-NEXT:    mul a1, a1, a2299; ZVFHMIN-NEXT:    sub sp, sp, a1300; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 24 * vlenb301; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma302; ZVFHMIN-NEXT:    vmv8r.v v0, v16303; ZVFHMIN-NEXT:    csrr a1, vlenb304; ZVFHMIN-NEXT:    slli a1, a1, 4305; ZVFHMIN-NEXT:    add a1, sp, a1306; ZVFHMIN-NEXT:    addi a1, a1, 16307; ZVFHMIN-NEXT:    vs8r.v v16, (a1) # vscale x 64-byte Folded Spill308; ZVFHMIN-NEXT:    csrr a1, vlenb309; ZVFHMIN-NEXT:    slli a1, a1, 3310; ZVFHMIN-NEXT:    add a1, sp, a1311; ZVFHMIN-NEXT:    addi a1, a1, 16312; ZVFHMIN-NEXT:    vs8r.v v8, (a1) # vscale x 64-byte Folded Spill313; ZVFHMIN-NEXT:    vl8re16.v v24, (a0)314; ZVFHMIN-NEXT:    lui a0, 8315; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v0316; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m8, ta, ma317; ZVFHMIN-NEXT:    vxor.vx v0, v24, a0318; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma319; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v8320; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v0321; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma322; ZVFHMIN-NEXT:    vfmadd.vv v24, v8, v16323; ZVFHMIN-NEXT:    csrr a0, vlenb324; ZVFHMIN-NEXT:    slli a0, a0, 4325; ZVFHMIN-NEXT:    add a0, sp, a0326; ZVFHMIN-NEXT:    addi a0, a0, 16327; ZVFHMIN-NEXT:    vl8r.v v8, (a0) # vscale x 64-byte Folded Reload328; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma329; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12330; ZVFHMIN-NEXT:    addi a0, sp, 16331; ZVFHMIN-NEXT:    vs8r.v v16, (a0) # vscale x 64-byte Folded Spill332; ZVFHMIN-NEXT:    csrr a0, vlenb333; ZVFHMIN-NEXT:    slli a0, a0, 3334; ZVFHMIN-NEXT:    add a0, sp, a0335; ZVFHMIN-NEXT:    addi a0, a0, 16336; ZVFHMIN-NEXT:    vl8r.v v8, (a0) # vscale x 64-byte Folded Reload337; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12338; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v4339; ZVFHMIN-NEXT:    addi a0, sp, 16340; ZVFHMIN-NEXT:    vl8r.v v0, (a0) # vscale x 64-byte Folded Reload341; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma342; ZVFHMIN-NEXT:    vfmadd.vv v16, v8, v0343; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma344; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v24345; ZVFHMIN-NEXT:    vfncvt.f.f.w v12, v16346; ZVFHMIN-NEXT:    csrr a0, vlenb347; ZVFHMIN-NEXT:    li a1, 24348; ZVFHMIN-NEXT:    mul a0, a0, a1349; ZVFHMIN-NEXT:    add sp, sp, a0350; ZVFHMIN-NEXT:    .cfi_def_cfa sp, 16351; ZVFHMIN-NEXT:    addi sp, sp, 16352; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 0353; ZVFHMIN-NEXT:    ret354  %neg = fneg <vscale x 32 x half> %vc355  %vd = call <vscale x 32 x half> @llvm.experimental.constrained.fma.nxv32f16(<vscale x 32 x half> %neg, <vscale x 32 x half> %va, <vscale x 32 x half> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")356  ret <vscale x 32 x half> %vd357}358 359define <vscale x 32 x half> @vfnmsub_vf_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, half %c) strictfp {360; ZVFH-LABEL: vfnmsub_vf_nxv32f16:361; ZVFH:       # %bb.0:362; ZVFH-NEXT:    vsetvli a0, zero, e16, m8, ta, ma363; ZVFH-NEXT:    vfnmsac.vf v8, fa0, v16364; ZVFH-NEXT:    ret365;366; ZVFHMIN-LABEL: vfnmsub_vf_nxv32f16:367; ZVFHMIN:       # %bb.0:368; ZVFHMIN-NEXT:    addi sp, sp, -16369; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16370; ZVFHMIN-NEXT:    csrr a0, vlenb371; ZVFHMIN-NEXT:    li a1, 24372; ZVFHMIN-NEXT:    mul a0, a0, a1373; ZVFHMIN-NEXT:    sub sp, sp, a0374; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 24 * vlenb375; ZVFHMIN-NEXT:    csrr a0, vlenb376; ZVFHMIN-NEXT:    slli a0, a0, 3377; ZVFHMIN-NEXT:    add a0, sp, a0378; ZVFHMIN-NEXT:    addi a0, a0, 16379; ZVFHMIN-NEXT:    vs8r.v v16, (a0) # vscale x 64-byte Folded Spill380; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m8, ta, ma381; ZVFHMIN-NEXT:    vmv8r.v v0, v8382; ZVFHMIN-NEXT:    csrr a0, vlenb383; ZVFHMIN-NEXT:    slli a0, a0, 4384; ZVFHMIN-NEXT:    add a0, sp, a0385; ZVFHMIN-NEXT:    addi a0, a0, 16386; ZVFHMIN-NEXT:    vs8r.v v8, (a0) # vscale x 64-byte Folded Spill387; ZVFHMIN-NEXT:    fmv.x.h a0, fa0388; ZVFHMIN-NEXT:    vmv.v.x v24, a0389; ZVFHMIN-NEXT:    lui a0, 8390; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma391; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v0392; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m8, ta, ma393; ZVFHMIN-NEXT:    vxor.vx v0, v24, a0394; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma395; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16396; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v0397; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma398; ZVFHMIN-NEXT:    vfmadd.vv v24, v16, v8399; ZVFHMIN-NEXT:    csrr a0, vlenb400; ZVFHMIN-NEXT:    slli a0, a0, 4401; ZVFHMIN-NEXT:    add a0, sp, a0402; ZVFHMIN-NEXT:    addi a0, a0, 16403; ZVFHMIN-NEXT:    vl8r.v v8, (a0) # vscale x 64-byte Folded Reload404; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma405; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12406; ZVFHMIN-NEXT:    addi a0, sp, 16407; ZVFHMIN-NEXT:    vs8r.v v16, (a0) # vscale x 64-byte Folded Spill408; ZVFHMIN-NEXT:    csrr a0, vlenb409; ZVFHMIN-NEXT:    slli a0, a0, 3410; ZVFHMIN-NEXT:    add a0, sp, a0411; ZVFHMIN-NEXT:    addi a0, a0, 16412; ZVFHMIN-NEXT:    vl8r.v v8, (a0) # vscale x 64-byte Folded Reload413; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12414; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v4415; ZVFHMIN-NEXT:    addi a0, sp, 16416; ZVFHMIN-NEXT:    vl8r.v v0, (a0) # vscale x 64-byte Folded Reload417; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma418; ZVFHMIN-NEXT:    vfmadd.vv v16, v8, v0419; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma420; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v24421; ZVFHMIN-NEXT:    vfncvt.f.f.w v12, v16422; ZVFHMIN-NEXT:    csrr a0, vlenb423; ZVFHMIN-NEXT:    li a1, 24424; ZVFHMIN-NEXT:    mul a0, a0, a1425; ZVFHMIN-NEXT:    add sp, sp, a0426; ZVFHMIN-NEXT:    .cfi_def_cfa sp, 16427; ZVFHMIN-NEXT:    addi sp, sp, 16428; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 0429; ZVFHMIN-NEXT:    ret430  %head = insertelement <vscale x 32 x half> poison, half %c, i32 0431  %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer432  %neg = fneg <vscale x 32 x half> %splat433  %vd = call <vscale x 32 x half> @llvm.experimental.constrained.fma.nxv32f16(<vscale x 32 x half> %neg, <vscale x 32 x half> %vb, <vscale x 32 x half> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")434  ret <vscale x 32 x half> %vd435}436 437define <vscale x 1 x float> @vfnmsub_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) strictfp {438; CHECK-LABEL: vfnmsub_vv_nxv1f32:439; CHECK:       # %bb.0:440; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma441; CHECK-NEXT:    vfnmsub.vv v8, v9, v10442; CHECK-NEXT:    ret443  %neg = fneg <vscale x 1 x float> %vb444  %vd = call <vscale x 1 x float> @llvm.experimental.constrained.fma.nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %neg, <vscale x 1 x float> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")445  ret <vscale x 1 x float> %vd446}447 448define <vscale x 1 x float> @vfnmsub_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, float %c) strictfp {449; CHECK-LABEL: vfnmsub_vf_nxv1f32:450; CHECK:       # %bb.0:451; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma452; CHECK-NEXT:    vfnmsub.vf v8, fa0, v9453; CHECK-NEXT:    ret454  %head = insertelement <vscale x 1 x float> poison, float %c, i32 0455  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer456  %neg = fneg <vscale x 1 x float> %va457  %vd = call <vscale x 1 x float> @llvm.experimental.constrained.fma.nxv1f32(<vscale x 1 x float> %neg, <vscale x 1 x float> %splat, <vscale x 1 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")458  ret <vscale x 1 x float> %vd459}460 461define <vscale x 2 x float> @vfnmsub_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) strictfp {462; CHECK-LABEL: vfnmsub_vv_nxv2f32:463; CHECK:       # %bb.0:464; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma465; CHECK-NEXT:    vfnmsub.vv v8, v10, v9466; CHECK-NEXT:    ret467  %neg = fneg <vscale x 2 x float> %vc468  %vd = call <vscale x 2 x float> @llvm.experimental.constrained.fma.nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %neg, <vscale x 2 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")469  ret <vscale x 2 x float> %vd470}471 472define <vscale x 2 x float> @vfnmsub_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, float %c) strictfp {473; CHECK-LABEL: vfnmsub_vf_nxv2f32:474; CHECK:       # %bb.0:475; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma476; CHECK-NEXT:    vfnmsub.vf v8, fa0, v9477; CHECK-NEXT:    ret478  %head = insertelement <vscale x 2 x float> poison, float %c, i32 0479  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer480  %neg = fneg <vscale x 2 x float> %va481  %vd = call <vscale x 2 x float> @llvm.experimental.constrained.fma.nxv2f32(<vscale x 2 x float> %splat, <vscale x 2 x float> %neg, <vscale x 2 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")482  ret <vscale x 2 x float> %vd483}484 485define <vscale x 4 x float> @vfnmsub_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) strictfp {486; CHECK-LABEL: vfnmsub_vv_nxv4f32:487; CHECK:       # %bb.0:488; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma489; CHECK-NEXT:    vfnmsub.vv v8, v10, v12490; CHECK-NEXT:    ret491  %neg = fneg <vscale x 4 x float> %va492  %vd = call <vscale x 4 x float> @llvm.experimental.constrained.fma.nxv4f32(<vscale x 4 x float> %vb, <vscale x 4 x float> %neg, <vscale x 4 x float> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")493  ret <vscale x 4 x float> %vd494}495 496define <vscale x 4 x float> @vfnmsub_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, float %c) strictfp {497; CHECK-LABEL: vfnmsub_vf_nxv4f32:498; CHECK:       # %bb.0:499; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma500; CHECK-NEXT:    vfnmsub.vf v8, fa0, v10501; CHECK-NEXT:    ret502  %head = insertelement <vscale x 4 x float> poison, float %c, i32 0503  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer504  %neg = fneg <vscale x 4 x float> %splat505  %vd = call <vscale x 4 x float> @llvm.experimental.constrained.fma.nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %neg, <vscale x 4 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")506  ret <vscale x 4 x float> %vd507}508 509define <vscale x 8 x float> @vfnmsub_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) strictfp {510; CHECK-LABEL: vfnmsub_vv_nxv8f32:511; CHECK:       # %bb.0:512; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma513; CHECK-NEXT:    vfnmsac.vv v8, v16, v12514; CHECK-NEXT:    ret515  %neg = fneg <vscale x 8 x float> %vc516  %vd = call <vscale x 8 x float> @llvm.experimental.constrained.fma.nxv8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %neg, <vscale x 8 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")517  ret <vscale x 8 x float> %vd518}519 520define <vscale x 8 x float> @vfnmsub_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, float %c) strictfp {521; CHECK-LABEL: vfnmsub_vf_nxv8f32:522; CHECK:       # %bb.0:523; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma524; CHECK-NEXT:    vfnmsac.vf v8, fa0, v12525; CHECK-NEXT:    ret526  %head = insertelement <vscale x 8 x float> poison, float %c, i32 0527  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer528  %neg = fneg <vscale x 8 x float> %splat529  %vd = call <vscale x 8 x float> @llvm.experimental.constrained.fma.nxv8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %neg, <vscale x 8 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")530  ret <vscale x 8 x float> %vd531}532 533define <vscale x 16 x float> @vfnmsub_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, <vscale x 16 x float> %vc) strictfp {534; CHECK-LABEL: vfnmsub_vv_nxv16f32:535; CHECK:       # %bb.0:536; CHECK-NEXT:    vl8re32.v v24, (a0)537; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma538; CHECK-NEXT:    vfnmsub.vv v8, v24, v16539; CHECK-NEXT:    ret540  %neg = fneg <vscale x 16 x float> %va541  %vd = call <vscale x 16 x float> @llvm.experimental.constrained.fma.nxv16f32(<vscale x 16 x float> %vc, <vscale x 16 x float> %neg, <vscale x 16 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")542  ret <vscale x 16 x float> %vd543}544 545define <vscale x 16 x float> @vfnmsub_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, float %c) strictfp {546; CHECK-LABEL: vfnmsub_vf_nxv16f32:547; CHECK:       # %bb.0:548; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma549; CHECK-NEXT:    vfnmsub.vf v8, fa0, v16550; CHECK-NEXT:    ret551  %head = insertelement <vscale x 16 x float> poison, float %c, i32 0552  %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer553  %neg = fneg <vscale x 16 x float> %splat554  %vd = call <vscale x 16 x float> @llvm.experimental.constrained.fma.nxv16f32(<vscale x 16 x float> %neg, <vscale x 16 x float> %va, <vscale x 16 x float> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")555  ret <vscale x 16 x float> %vd556}557 558define <vscale x 1 x double> @vfnmsub_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x double> %vc) strictfp {559; CHECK-LABEL: vfnmsub_vv_nxv1f64:560; CHECK:       # %bb.0:561; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma562; CHECK-NEXT:    vfnmsac.vv v8, v10, v9563; CHECK-NEXT:    ret564  %neg = fneg <vscale x 1 x double> %vb565  %vd = call <vscale x 1 x double> @llvm.experimental.constrained.fma.nxv1f64(<vscale x 1 x double> %vc, <vscale x 1 x double> %neg, <vscale x 1 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")566  ret <vscale x 1 x double> %vd567}568 569define <vscale x 1 x double> @vfnmsub_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, double %c) strictfp {570; CHECK-LABEL: vfnmsub_vf_nxv1f64:571; CHECK:       # %bb.0:572; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma573; CHECK-NEXT:    vfnmsub.vf v8, fa0, v9574; CHECK-NEXT:    ret575  %head = insertelement <vscale x 1 x double> poison, double %c, i32 0576  %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer577  %neg = fneg <vscale x 1 x double> %va578  %vd = call <vscale x 1 x double> @llvm.experimental.constrained.fma.nxv1f64(<vscale x 1 x double> %neg, <vscale x 1 x double> %splat, <vscale x 1 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")579  ret <vscale x 1 x double> %vd580}581 582define <vscale x 2 x double> @vfnmsub_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, <vscale x 2 x double> %vc) strictfp {583; CHECK-LABEL: vfnmsub_vv_nxv2f64:584; CHECK:       # %bb.0:585; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma586; CHECK-NEXT:    vfnmsub.vv v8, v12, v10587; CHECK-NEXT:    ret588  %neg = fneg <vscale x 2 x double> %va589  %vd = call <vscale x 2 x double> @llvm.experimental.constrained.fma.nxv2f64(<vscale x 2 x double> %neg, <vscale x 2 x double> %vc, <vscale x 2 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")590  ret <vscale x 2 x double> %vd591}592 593define <vscale x 2 x double> @vfnmsub_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, double %c) strictfp {594; CHECK-LABEL: vfnmsub_vf_nxv2f64:595; CHECK:       # %bb.0:596; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma597; CHECK-NEXT:    vfnmsub.vf v8, fa0, v10598; CHECK-NEXT:    ret599  %head = insertelement <vscale x 2 x double> poison, double %c, i32 0600  %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer601  %neg = fneg <vscale x 2 x double> %va602  %vd = call <vscale x 2 x double> @llvm.experimental.constrained.fma.nxv2f64(<vscale x 2 x double> %splat, <vscale x 2 x double> %neg, <vscale x 2 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")603  ret <vscale x 2 x double> %vd604}605 606define <vscale x 4 x double> @vfnmsub_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, <vscale x 4 x double> %vc) strictfp {607; CHECK-LABEL: vfnmsub_vv_nxv4f64:608; CHECK:       # %bb.0:609; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma610; CHECK-NEXT:    vfnmsub.vv v8, v12, v16611; CHECK-NEXT:    ret612  %neg = fneg <vscale x 4 x double> %vb613  %vd = call <vscale x 4 x double> @llvm.experimental.constrained.fma.nxv4f64(<vscale x 4 x double> %neg, <vscale x 4 x double> %va, <vscale x 4 x double> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")614  ret <vscale x 4 x double> %vd615}616 617define <vscale x 4 x double> @vfnmsub_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, double %c) strictfp {618; CHECK-LABEL: vfnmsub_vf_nxv4f64:619; CHECK:       # %bb.0:620; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma621; CHECK-NEXT:    vfnmsub.vf v8, fa0, v12622; CHECK-NEXT:    ret623  %head = insertelement <vscale x 4 x double> poison, double %c, i32 0624  %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer625  %neg = fneg <vscale x 4 x double> %splat626  %vd = call <vscale x 4 x double> @llvm.experimental.constrained.fma.nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %neg, <vscale x 4 x double> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")627  ret <vscale x 4 x double> %vd628}629 630define <vscale x 8 x double> @vfnmsub_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, <vscale x 8 x double> %vc) strictfp {631; CHECK-LABEL: vfnmsub_vv_nxv8f64:632; CHECK:       # %bb.0:633; CHECK-NEXT:    vl8re64.v v24, (a0)634; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma635; CHECK-NEXT:    vfnmsac.vv v8, v16, v24636; CHECK-NEXT:    ret637  %neg = fneg <vscale x 8 x double> %vb638  %vd = call <vscale x 8 x double> @llvm.experimental.constrained.fma.nxv8f64(<vscale x 8 x double> %neg, <vscale x 8 x double> %vc, <vscale x 8 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")639  ret <vscale x 8 x double> %vd640}641 642define <vscale x 8 x double> @vfnmsub_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, double %c) strictfp {643; CHECK-LABEL: vfnmsub_vf_nxv8f64:644; CHECK:       # %bb.0:645; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma646; CHECK-NEXT:    vfnmsac.vf v8, fa0, v16647; CHECK-NEXT:    ret648  %head = insertelement <vscale x 8 x double> poison, double %c, i32 0649  %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer650  %neg = fneg <vscale x 8 x double> %splat651  %vd = call <vscale x 8 x double> @llvm.experimental.constrained.fma.nxv8f64(<vscale x 8 x double> %vb, <vscale x 8 x double> %neg, <vscale x 8 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")652  ret <vscale x 8 x double> %vd653}654