brintos

brintos / llvm-project-archived public Read only

0
0
Text · 32.4 KiB · 5f9dc1a Raw
677 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 vfmsac and vfmsub by using different operand orders to12; trigger commuting in TwoAddressInstructionPass.13 14define <vscale x 1 x half> @vfmsub_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) strictfp {15; ZVFH-LABEL: vfmsub_vv_nxv1f16:16; ZVFH:       # %bb.0:17; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma18; ZVFH-NEXT:    vfmsub.vv v8, v9, v1019; ZVFH-NEXT:    ret20;21; ZVFHMIN-LABEL: vfmsub_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, v926; ZVFHMIN-NEXT:    vxor.vx v9, v10, a027; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v928; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v829; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma30; ZVFHMIN-NEXT:    vfmadd.vv v9, v11, v1031; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma32; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v933; ZVFHMIN-NEXT:    ret34  %neg = fneg <vscale x 1 x half> %vc35  %vd = call <vscale x 1 x half> @llvm.experimental.constrained.fma.nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")36  ret <vscale x 1 x half> %vd37}38 39define <vscale x 1 x half> @vfmsub_vf_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, half %c) strictfp {40; ZVFH-LABEL: vfmsub_vf_nxv1f16:41; ZVFH:       # %bb.0:42; ZVFH-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma43; ZVFH-NEXT:    vfmsub.vf v8, fa0, v944; ZVFH-NEXT:    ret45;46; ZVFHMIN-LABEL: vfmsub_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, v853; ZVFHMIN-NEXT:    vxor.vx v8, v9, 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, v11, v958; 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> %vb64  %vd = call <vscale x 1 x half> @llvm.experimental.constrained.fma.nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %splat, <vscale x 1 x half> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")65  ret <vscale x 1 x half> %vd66}67 68define <vscale x 2 x half> @vfmsub_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) strictfp {69; ZVFH-LABEL: vfmsub_vv_nxv2f16:70; ZVFH:       # %bb.0:71; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma72; ZVFH-NEXT:    vfmsub.vv v8, v10, v973; ZVFH-NEXT:    ret74;75; ZVFHMIN-LABEL: vfmsub_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, v1080; ZVFHMIN-NEXT:    vxor.vx v9, v9, a081; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v982; ZVFHMIN-NEXT:    vfwcvt.f.f.v v9, v883; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m1, ta, ma84; ZVFHMIN-NEXT:    vfmadd.vv v9, v11, v1085; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma86; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v987; ZVFHMIN-NEXT:    ret88  %neg = fneg <vscale x 2 x half> %vb89  %vd = call <vscale x 2 x half> @llvm.experimental.constrained.fma.nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vc, <vscale x 2 x half> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")90  ret <vscale x 2 x half> %vd91}92 93define <vscale x 2 x half> @vfmsub_vf_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, half %c) strictfp {94; ZVFH-LABEL: vfmsub_vf_nxv2f16:95; ZVFH:       # %bb.0:96; ZVFH-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma97; ZVFH-NEXT:    vfmsac.vf v8, fa0, v998; ZVFH-NEXT:    ret99;100; ZVFHMIN-LABEL: vfmsub_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, v11, v9112; 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> %vb, <vscale x 2 x half> %splat, <vscale x 2 x half> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")119  ret <vscale x 2 x half> %vd120}121 122define <vscale x 4 x half> @vfmsub_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) strictfp {123; ZVFH-LABEL: vfmsub_vv_nxv4f16:124; ZVFH:       # %bb.0:125; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma126; ZVFH-NEXT:    vfmsub.vv v8, v9, v10127; ZVFH-NEXT:    ret128;129; ZVFHMIN-LABEL: vfmsub_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, v8134; ZVFHMIN-NEXT:    vxor.vx v8, v10, a0135; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v8136; ZVFHMIN-NEXT:    vfwcvt.f.f.v v14, v9137; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma138; ZVFHMIN-NEXT:    vfmadd.vv v14, v12, v10139; 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> %vc143  %vd = call <vscale x 4 x half> @llvm.experimental.constrained.fma.nxv4f16(<vscale x 4 x half> %vb, <vscale x 4 x half> %va, <vscale x 4 x half> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")144  ret <vscale x 4 x half> %vd145}146 147define <vscale x 4 x half> @vfmsub_vf_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, half %c) strictfp {148; ZVFH-LABEL: vfmsub_vf_nxv4f16:149; ZVFH:       # %bb.0:150; ZVFH-NEXT:    vsetvli a0, zero, e16, m1, ta, ma151; ZVFH-NEXT:    vfmsub.vf v8, fa0, v9152; ZVFH-NEXT:    ret153;154; ZVFHMIN-LABEL: vfmsub_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 v14, a0159; ZVFHMIN-NEXT:    lui a0, 8160; ZVFHMIN-NEXT:    vfwcvt.f.f.v v10, v8161; ZVFHMIN-NEXT:    vxor.vx v12, v9, a0162; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v12163; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v14164; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m2, ta, ma165; ZVFHMIN-NEXT:    vfmadd.vv v12, v10, v8166; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m1, ta, ma167; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v12168; 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> %vb172  %vd = call <vscale x 4 x half> @llvm.experimental.constrained.fma.nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %splat, <vscale x 4 x half> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")173  ret <vscale x 4 x half> %vd174}175 176define <vscale x 8 x half> @vfmsub_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) strictfp {177; ZVFH-LABEL: vfmsub_vv_nxv8f16:178; ZVFH:       # %bb.0:179; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma180; ZVFH-NEXT:    vfmsac.vv v8, v12, v10181; ZVFH-NEXT:    ret182;183; ZVFHMIN-LABEL: vfmsub_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, v12188; ZVFHMIN-NEXT:    vxor.vx v8, v8, a0189; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v8190; ZVFHMIN-NEXT:    vfwcvt.f.f.v v20, v10191; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma192; ZVFHMIN-NEXT:    vfmadd.vv v20, v16, v12193; 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> %va197  %vd = call <vscale x 8 x half> @llvm.experimental.constrained.fma.nxv8f16(<vscale x 8 x half> %vb, <vscale x 8 x half> %vc, <vscale x 8 x half> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")198  ret <vscale x 8 x half> %vd199}200 201define <vscale x 8 x half> @vfmsub_vf_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, half %c) strictfp {202; ZVFH-LABEL: vfmsub_vf_nxv8f16:203; ZVFH:       # %bb.0:204; ZVFH-NEXT:    vsetvli a0, zero, e16, m2, ta, ma205; ZVFH-NEXT:    vfmsac.vf v8, fa0, v10206; ZVFH-NEXT:    ret207;208; ZVFHMIN-LABEL: vfmsub_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 v20, a0213; ZVFHMIN-NEXT:    lui a0, 8214; ZVFHMIN-NEXT:    vfwcvt.f.f.v v12, v10215; ZVFHMIN-NEXT:    vxor.vx v16, v8, a0216; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v16217; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v20218; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m4, ta, ma219; ZVFHMIN-NEXT:    vfmadd.vv v16, v12, v8220; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m2, ta, ma221; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v16222; 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> %va226  %vd = call <vscale x 8 x half> @llvm.experimental.constrained.fma.nxv8f16(<vscale x 8 x half> %vb, <vscale x 8 x half> %splat, <vscale x 8 x half> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")227  ret <vscale x 8 x half> %vd228}229 230define <vscale x 16 x half> @vfmsub_vv_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) strictfp {231; ZVFH-LABEL: vfmsub_vv_nxv16f16:232; ZVFH:       # %bb.0:233; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma234; ZVFH-NEXT:    vfmsub.vv v8, v16, v12235; ZVFH-NEXT:    ret236;237; ZVFHMIN-LABEL: vfmsub_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, v8242; ZVFHMIN-NEXT:    vxor.vx v20, v12, a0243; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v20244; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v16245; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma246; ZVFHMIN-NEXT:    vfmadd.vv v0, v24, v8247; 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> %vb251  %vd = call <vscale x 16 x half> @llvm.experimental.constrained.fma.nxv16f16(<vscale x 16 x half> %vc, <vscale x 16 x half> %va, <vscale x 16 x half> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")252  ret <vscale x 16 x half> %vd253}254 255define <vscale x 16 x half> @vfmsub_vf_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, half %c) strictfp {256; ZVFH-LABEL: vfmsub_vf_nxv16f16:257; ZVFH:       # %bb.0:258; ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma259; ZVFH-NEXT:    vfmsub.vf v8, fa0, v12260; ZVFH-NEXT:    ret261;262; ZVFHMIN-LABEL: vfmsub_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 v4, a0267; ZVFHMIN-NEXT:    lui a0, 8268; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8269; ZVFHMIN-NEXT:    vxor.vx v24, v12, a0270; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v24271; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v4272; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma273; ZVFHMIN-NEXT:    vfmadd.vv v24, v16, v8274; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma275; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v24276; 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> %vb280  %vd = call <vscale x 16 x half> @llvm.experimental.constrained.fma.nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %splat, <vscale x 16 x half> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")281  ret <vscale x 16 x half> %vd282}283 284define <vscale x 32 x half> @vfmsub_vv_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, <vscale x 32 x half> %vc) strictfp {285; ZVFH-LABEL: vfmsub_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:    vfmsac.vv v8, v16, v24290; ZVFH-NEXT:    ret291;292; ZVFHMIN-LABEL: vfmsub_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:    csrr a1, vlenb302; ZVFHMIN-NEXT:    slli a1, a1, 3303; ZVFHMIN-NEXT:    add a1, sp, a1304; ZVFHMIN-NEXT:    addi a1, a1, 16305; ZVFHMIN-NEXT:    vs8r.v v16, (a1) # vscale x 64-byte Folded Spill306; ZVFHMIN-NEXT:    vl8re16.v v24, (a0)307; ZVFHMIN-NEXT:    csrr a0, vlenb308; ZVFHMIN-NEXT:    slli a0, a0, 4309; ZVFHMIN-NEXT:    add a0, sp, a0310; ZVFHMIN-NEXT:    addi a0, a0, 16311; ZVFHMIN-NEXT:    vs8r.v v24, (a0) # vscale x 64-byte Folded Spill312; ZVFHMIN-NEXT:    lui a0, 8313; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma314; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v16315; ZVFHMIN-NEXT:    addi a1, sp, 16316; ZVFHMIN-NEXT:    vs8r.v v24, (a1) # vscale x 64-byte Folded Spill317; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m8, ta, ma318; ZVFHMIN-NEXT:    vxor.vx v8, v8, a0319; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma320; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8321; ZVFHMIN-NEXT:    csrr a0, vlenb322; ZVFHMIN-NEXT:    slli a0, a0, 4323; ZVFHMIN-NEXT:    add a0, sp, a0324; ZVFHMIN-NEXT:    addi a0, a0, 16325; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # vscale x 64-byte Folded Reload326; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v24327; ZVFHMIN-NEXT:    addi a0, sp, 16328; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # vscale x 64-byte Folded Reload329; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma330; ZVFHMIN-NEXT:    vfmadd.vv v0, v24, v16331; ZVFHMIN-NEXT:    csrr a0, vlenb332; ZVFHMIN-NEXT:    slli a0, a0, 3333; ZVFHMIN-NEXT:    add a0, sp, a0334; ZVFHMIN-NEXT:    addi a0, a0, 16335; ZVFHMIN-NEXT:    vl8r.v v16, (a0) # vscale x 64-byte Folded Reload336; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma337; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v20338; ZVFHMIN-NEXT:    addi a0, sp, 16339; ZVFHMIN-NEXT:    vs8r.v v24, (a0) # vscale x 64-byte Folded Spill340; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v12341; ZVFHMIN-NEXT:    csrr a0, vlenb342; ZVFHMIN-NEXT:    slli a0, a0, 4343; ZVFHMIN-NEXT:    add a0, sp, a0344; ZVFHMIN-NEXT:    addi a0, a0, 16345; ZVFHMIN-NEXT:    vl8r.v v8, (a0) # vscale x 64-byte Folded Reload346; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v12347; ZVFHMIN-NEXT:    addi a0, sp, 16348; ZVFHMIN-NEXT:    vl8r.v v8, (a0) # vscale x 64-byte Folded Reload349; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma350; ZVFHMIN-NEXT:    vfmadd.vv v16, v8, v24351; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma352; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v0353; ZVFHMIN-NEXT:    vfncvt.f.f.w v12, v16354; ZVFHMIN-NEXT:    csrr a0, vlenb355; ZVFHMIN-NEXT:    li a1, 24356; ZVFHMIN-NEXT:    mul a0, a0, a1357; ZVFHMIN-NEXT:    add sp, sp, a0358; ZVFHMIN-NEXT:    .cfi_def_cfa sp, 16359; ZVFHMIN-NEXT:    addi sp, sp, 16360; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 0361; ZVFHMIN-NEXT:    ret362  %neg = fneg <vscale x 32 x half> %va363  %vd = call <vscale x 32 x half> @llvm.experimental.constrained.fma.nxv32f16(<vscale x 32 x half> %vc, <vscale x 32 x half> %vb, <vscale x 32 x half> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")364  ret <vscale x 32 x half> %vd365}366 367define <vscale x 32 x half> @vfmsub_vf_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, half %c) strictfp {368; ZVFH-LABEL: vfmsub_vf_nxv32f16:369; ZVFH:       # %bb.0:370; ZVFH-NEXT:    vsetvli a0, zero, e16, m8, ta, ma371; ZVFH-NEXT:    vfmsac.vf v8, fa0, v16372; ZVFH-NEXT:    ret373;374; ZVFHMIN-LABEL: vfmsub_vf_nxv32f16:375; ZVFHMIN:       # %bb.0:376; ZVFHMIN-NEXT:    addi sp, sp, -16377; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 16378; ZVFHMIN-NEXT:    csrr a0, vlenb379; ZVFHMIN-NEXT:    li a1, 24380; ZVFHMIN-NEXT:    mul a0, a0, a1381; ZVFHMIN-NEXT:    sub sp, sp, a0382; ZVFHMIN-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 24 * vlenb383; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m8, ta, ma384; ZVFHMIN-NEXT:    vmv8r.v v24, v16385; ZVFHMIN-NEXT:    csrr a0, vlenb386; ZVFHMIN-NEXT:    slli a0, a0, 3387; ZVFHMIN-NEXT:    add a0, sp, a0388; ZVFHMIN-NEXT:    addi a0, a0, 16389; ZVFHMIN-NEXT:    vs8r.v v16, (a0) # vscale x 64-byte Folded Spill390; ZVFHMIN-NEXT:    fmv.x.h a0, fa0391; ZVFHMIN-NEXT:    vmv.v.x v16, a0392; ZVFHMIN-NEXT:    csrr a0, vlenb393; ZVFHMIN-NEXT:    slli a0, a0, 4394; ZVFHMIN-NEXT:    add a0, sp, a0395; ZVFHMIN-NEXT:    addi a0, a0, 16396; ZVFHMIN-NEXT:    vs8r.v v16, (a0) # vscale x 64-byte Folded Spill397; ZVFHMIN-NEXT:    lui a0, 8398; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma399; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v24400; ZVFHMIN-NEXT:    addi a1, sp, 16401; ZVFHMIN-NEXT:    vs8r.v v16, (a1) # vscale x 64-byte Folded Spill402; ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m8, ta, ma403; ZVFHMIN-NEXT:    vxor.vx v8, v8, a0404; ZVFHMIN-NEXT:    vsetvli a0, zero, e16, m4, ta, ma405; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v8406; ZVFHMIN-NEXT:    csrr a0, vlenb407; ZVFHMIN-NEXT:    slli a0, a0, 4408; ZVFHMIN-NEXT:    add a0, sp, a0409; ZVFHMIN-NEXT:    addi a0, a0, 16410; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # vscale x 64-byte Folded Reload411; ZVFHMIN-NEXT:    vfwcvt.f.f.v v0, v24412; ZVFHMIN-NEXT:    addi a0, sp, 16413; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # vscale x 64-byte Folded Reload414; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma415; ZVFHMIN-NEXT:    vfmadd.vv v0, v24, v16416; ZVFHMIN-NEXT:    csrr a0, vlenb417; ZVFHMIN-NEXT:    slli a0, a0, 3418; ZVFHMIN-NEXT:    add a0, sp, a0419; ZVFHMIN-NEXT:    addi a0, a0, 16420; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # vscale x 64-byte Folded Reload421; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma422; ZVFHMIN-NEXT:    vfwcvt.f.f.v v16, v28423; ZVFHMIN-NEXT:    vfwcvt.f.f.v v24, v12424; ZVFHMIN-NEXT:    csrr a0, vlenb425; ZVFHMIN-NEXT:    slli a0, a0, 3426; ZVFHMIN-NEXT:    add a0, sp, a0427; ZVFHMIN-NEXT:    addi a0, a0, 16428; ZVFHMIN-NEXT:    vs8r.v v24, (a0) # vscale x 64-byte Folded Spill429; ZVFHMIN-NEXT:    csrr a0, vlenb430; ZVFHMIN-NEXT:    slli a0, a0, 4431; ZVFHMIN-NEXT:    add a0, sp, a0432; ZVFHMIN-NEXT:    addi a0, a0, 16433; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # vscale x 64-byte Folded Reload434; ZVFHMIN-NEXT:    vfwcvt.f.f.v v8, v28435; ZVFHMIN-NEXT:    csrr a0, vlenb436; ZVFHMIN-NEXT:    slli a0, a0, 3437; ZVFHMIN-NEXT:    add a0, sp, a0438; ZVFHMIN-NEXT:    addi a0, a0, 16439; ZVFHMIN-NEXT:    vl8r.v v24, (a0) # vscale x 64-byte Folded Reload440; ZVFHMIN-NEXT:    vsetvli zero, zero, e32, m8, ta, ma441; ZVFHMIN-NEXT:    vfmadd.vv v16, v8, v24442; ZVFHMIN-NEXT:    vsetvli zero, zero, e16, m4, ta, ma443; ZVFHMIN-NEXT:    vfncvt.f.f.w v8, v0444; ZVFHMIN-NEXT:    vfncvt.f.f.w v12, v16445; ZVFHMIN-NEXT:    csrr a0, vlenb446; ZVFHMIN-NEXT:    li a1, 24447; ZVFHMIN-NEXT:    mul a0, a0, a1448; ZVFHMIN-NEXT:    add sp, sp, a0449; ZVFHMIN-NEXT:    .cfi_def_cfa sp, 16450; ZVFHMIN-NEXT:    addi sp, sp, 16451; ZVFHMIN-NEXT:    .cfi_def_cfa_offset 0452; ZVFHMIN-NEXT:    ret453  %head = insertelement <vscale x 32 x half> poison, half %c, i32 0454  %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer455  %neg = fneg <vscale x 32 x half> %va456  %vd = call <vscale x 32 x half> @llvm.experimental.constrained.fma.nxv32f16(<vscale x 32 x half> %vb, <vscale x 32 x half> %splat, <vscale x 32 x half> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")457  ret <vscale x 32 x half> %vd458}459 460define <vscale x 1 x float> @vfmsub_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) strictfp {461; CHECK-LABEL: vfmsub_vv_nxv1f32:462; CHECK:       # %bb.0:463; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma464; CHECK-NEXT:    vfmsub.vv v8, v9, v10465; CHECK-NEXT:    ret466  %neg = fneg <vscale x 1 x float> %vc467  %vd = call <vscale x 1 x float> @llvm.experimental.constrained.fma.nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")468  ret <vscale x 1 x float> %vd469}470 471define <vscale x 1 x float> @vfmsub_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, float %c) strictfp {472; CHECK-LABEL: vfmsub_vf_nxv1f32:473; CHECK:       # %bb.0:474; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma475; CHECK-NEXT:    vfmsub.vf v8, fa0, v9476; CHECK-NEXT:    ret477  %head = insertelement <vscale x 1 x float> poison, float %c, i32 0478  %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer479  %neg = fneg <vscale x 1 x float> %vb480  %vd = call <vscale x 1 x float> @llvm.experimental.constrained.fma.nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %splat, <vscale x 1 x float> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")481  ret <vscale x 1 x float> %vd482}483 484define <vscale x 2 x float> @vfmsub_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) strictfp {485; CHECK-LABEL: vfmsub_vv_nxv2f32:486; CHECK:       # %bb.0:487; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma488; CHECK-NEXT:    vfmsub.vv v8, v10, v9489; CHECK-NEXT:    ret490  %neg = fneg <vscale x 2 x float> %vb491  %vd = call <vscale x 2 x float> @llvm.experimental.constrained.fma.nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vc, <vscale x 2 x float> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")492  ret <vscale x 2 x float> %vd493}494 495define <vscale x 2 x float> @vfmsub_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, float %c) strictfp {496; CHECK-LABEL: vfmsub_vf_nxv2f32:497; CHECK:       # %bb.0:498; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma499; CHECK-NEXT:    vfmsac.vf v8, fa0, v9500; CHECK-NEXT:    ret501  %head = insertelement <vscale x 2 x float> poison, float %c, i32 0502  %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer503  %neg = fneg <vscale x 2 x float> %va504  %vd = call <vscale x 2 x float> @llvm.experimental.constrained.fma.nxv2f32(<vscale x 2 x float> %vb, <vscale x 2 x float> %splat, <vscale x 2 x float> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")505  ret <vscale x 2 x float> %vd506}507 508define <vscale x 4 x float> @vfmsub_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) strictfp {509; CHECK-LABEL: vfmsub_vv_nxv4f32:510; CHECK:       # %bb.0:511; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma512; CHECK-NEXT:    vfmsub.vv v8, v10, v12513; CHECK-NEXT:    ret514  %neg = fneg <vscale x 4 x float> %vc515  %vd = call <vscale x 4 x float> @llvm.experimental.constrained.fma.nxv4f32(<vscale x 4 x float> %vb, <vscale x 4 x float> %va, <vscale x 4 x float> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")516  ret <vscale x 4 x float> %vd517}518 519define <vscale x 4 x float> @vfmsub_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, float %c) strictfp {520; CHECK-LABEL: vfmsub_vf_nxv4f32:521; CHECK:       # %bb.0:522; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma523; CHECK-NEXT:    vfmsub.vf v8, fa0, v10524; CHECK-NEXT:    ret525  %head = insertelement <vscale x 4 x float> poison, float %c, i32 0526  %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer527  %neg = fneg <vscale x 4 x float> %vb528  %vd = call <vscale x 4 x float> @llvm.experimental.constrained.fma.nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %splat, <vscale x 4 x float> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")529  ret <vscale x 4 x float> %vd530}531 532define <vscale x 8 x float> @vfmsub_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) strictfp {533; CHECK-LABEL: vfmsub_vv_nxv8f32:534; CHECK:       # %bb.0:535; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma536; CHECK-NEXT:    vfmsac.vv v8, v16, v12537; CHECK-NEXT:    ret538  %neg = fneg <vscale x 8 x float> %va539  %vd = call <vscale x 8 x float> @llvm.experimental.constrained.fma.nxv8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %vc, <vscale x 8 x float> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")540  ret <vscale x 8 x float> %vd541}542 543define <vscale x 8 x float> @vfmsub_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, float %c) strictfp {544; CHECK-LABEL: vfmsub_vf_nxv8f32:545; CHECK:       # %bb.0:546; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma547; CHECK-NEXT:    vfmsac.vf v8, fa0, v12548; CHECK-NEXT:    ret549  %head = insertelement <vscale x 8 x float> poison, float %c, i32 0550  %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer551  %neg = fneg <vscale x 8 x float> %va552  %vd = call <vscale x 8 x float> @llvm.experimental.constrained.fma.nxv8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %splat, <vscale x 8 x float> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")553  ret <vscale x 8 x float> %vd554}555 556define <vscale x 16 x float> @vfmsub_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, <vscale x 16 x float> %vc) strictfp {557; CHECK-LABEL: vfmsub_vv_nxv16f32:558; CHECK:       # %bb.0:559; CHECK-NEXT:    vl8re32.v v24, (a0)560; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma561; CHECK-NEXT:    vfmsub.vv v8, v24, v16562; CHECK-NEXT:    ret563  %neg = fneg <vscale x 16 x float> %vb564  %vd = call <vscale x 16 x float> @llvm.experimental.constrained.fma.nxv16f32(<vscale x 16 x float> %vc, <vscale x 16 x float> %va, <vscale x 16 x float> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")565  ret <vscale x 16 x float> %vd566}567 568define <vscale x 16 x float> @vfmsub_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, float %c) strictfp {569; CHECK-LABEL: vfmsub_vf_nxv16f32:570; CHECK:       # %bb.0:571; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma572; CHECK-NEXT:    vfmsub.vf v8, fa0, v16573; CHECK-NEXT:    ret574  %head = insertelement <vscale x 16 x float> poison, float %c, i32 0575  %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer576  %neg = fneg <vscale x 16 x float> %vb577  %vd = call <vscale x 16 x float> @llvm.experimental.constrained.fma.nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %splat, <vscale x 16 x float> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")578  ret <vscale x 16 x float> %vd579}580 581define <vscale x 1 x double> @vfmsub_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x double> %vc) strictfp {582; CHECK-LABEL: vfmsub_vv_nxv1f64:583; CHECK:       # %bb.0:584; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma585; CHECK-NEXT:    vfmsub.vv v8, v9, v10586; CHECK-NEXT:    ret587  %neg = fneg <vscale x 1 x double> %vc588  %vd = call <vscale x 1 x double> @llvm.experimental.constrained.fma.nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x double> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")589  ret <vscale x 1 x double> %vd590}591 592define <vscale x 1 x double> @vfmsub_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, double %c) strictfp {593; CHECK-LABEL: vfmsub_vf_nxv1f64:594; CHECK:       # %bb.0:595; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma596; CHECK-NEXT:    vfmsub.vf v8, fa0, v9597; CHECK-NEXT:    ret598  %head = insertelement <vscale x 1 x double> poison, double %c, i32 0599  %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer600  %neg = fneg <vscale x 1 x double> %vb601  %vd = call <vscale x 1 x double> @llvm.experimental.constrained.fma.nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %splat, <vscale x 1 x double> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")602  ret <vscale x 1 x double> %vd603}604 605define <vscale x 2 x double> @vfmsub_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, <vscale x 2 x double> %vc) strictfp {606; CHECK-LABEL: vfmsub_vv_nxv2f64:607; CHECK:       # %bb.0:608; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma609; CHECK-NEXT:    vfmsub.vv v8, v12, v10610; CHECK-NEXT:    ret611  %neg = fneg <vscale x 2 x double> %vb612  %vd = call <vscale x 2 x double> @llvm.experimental.constrained.fma.nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vc, <vscale x 2 x double> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")613  ret <vscale x 2 x double> %vd614}615 616define <vscale x 2 x double> @vfmsub_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, double %c) strictfp {617; CHECK-LABEL: vfmsub_vf_nxv2f64:618; CHECK:       # %bb.0:619; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma620; CHECK-NEXT:    vfmsac.vf v8, fa0, v10621; CHECK-NEXT:    ret622  %head = insertelement <vscale x 2 x double> poison, double %c, i32 0623  %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer624  %neg = fneg <vscale x 2 x double> %va625  %vd = call <vscale x 2 x double> @llvm.experimental.constrained.fma.nxv2f64(<vscale x 2 x double> %vb, <vscale x 2 x double> %splat, <vscale x 2 x double> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")626  ret <vscale x 2 x double> %vd627}628 629define <vscale x 4 x double> @vfmsub_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, <vscale x 4 x double> %vc) strictfp {630; CHECK-LABEL: vfmsub_vv_nxv4f64:631; CHECK:       # %bb.0:632; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma633; CHECK-NEXT:    vfmsub.vv v8, v12, v16634; CHECK-NEXT:    ret635  %neg = fneg <vscale x 4 x double> %vc636  %vd = call <vscale x 4 x double> @llvm.experimental.constrained.fma.nxv4f64(<vscale x 4 x double> %vb, <vscale x 4 x double> %va, <vscale x 4 x double> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")637  ret <vscale x 4 x double> %vd638}639 640define <vscale x 4 x double> @vfmsub_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, double %c) strictfp {641; CHECK-LABEL: vfmsub_vf_nxv4f64:642; CHECK:       # %bb.0:643; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma644; CHECK-NEXT:    vfmsub.vf v8, fa0, v12645; CHECK-NEXT:    ret646  %head = insertelement <vscale x 4 x double> poison, double %c, i32 0647  %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer648  %neg = fneg <vscale x 4 x double> %vb649  %vd = call <vscale x 4 x double> @llvm.experimental.constrained.fma.nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %splat, <vscale x 4 x double> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")650  ret <vscale x 4 x double> %vd651}652 653define <vscale x 8 x double> @vfmsub_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, <vscale x 8 x double> %vc) strictfp {654; CHECK-LABEL: vfmsub_vv_nxv8f64:655; CHECK:       # %bb.0:656; CHECK-NEXT:    vl8re64.v v24, (a0)657; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma658; CHECK-NEXT:    vfmsac.vv v8, v16, v24659; CHECK-NEXT:    ret660  %neg = fneg <vscale x 8 x double> %va661  %vd = call <vscale x 8 x double> @llvm.experimental.constrained.fma.nxv8f64(<vscale x 8 x double> %vb, <vscale x 8 x double> %vc, <vscale x 8 x double> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")662  ret <vscale x 8 x double> %vd663}664 665define <vscale x 8 x double> @vfmsub_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, double %c) strictfp {666; CHECK-LABEL: vfmsub_vf_nxv8f64:667; CHECK:       # %bb.0:668; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma669; CHECK-NEXT:    vfmsac.vf v8, fa0, v16670; CHECK-NEXT:    ret671  %head = insertelement <vscale x 8 x double> poison, double %c, i32 0672  %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer673  %neg = fneg <vscale x 8 x double> %va674  %vd = call <vscale x 8 x double> @llvm.experimental.constrained.fma.nxv8f64(<vscale x 8 x double> %vb, <vscale x 8 x double> %splat, <vscale x 8 x double> %neg, metadata !"round.dynamic", metadata !"fpexcept.strict")675  ret <vscale x 8 x double> %vd676}677