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