726 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 vfnmacc and vfnmadd 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: vfnmadd.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: vxor.vx v8, v8, a026; ZVFHMIN-NEXT: vxor.vx v10, v10, a027; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v1028; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v829; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v930; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma31; ZVFHMIN-NEXT: vfmadd.vv v12, v10, v1132; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma33; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v1234; ZVFHMIN-NEXT: ret35 %neg = fneg <vscale x 1 x half> %va36 %neg2 = fneg <vscale x 1 x half> %vc37 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")38 ret <vscale x 1 x half> %vd39}40 41define <vscale x 1 x half> @vfnmsub_vf_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, half %c) strictfp {42; ZVFH-LABEL: vfnmsub_vf_nxv1f16:43; ZVFH: # %bb.0:44; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma45; ZVFH-NEXT: vfnmadd.vf v8, fa0, v946; ZVFH-NEXT: ret47;48; ZVFHMIN-LABEL: vfnmsub_vf_nxv1f16:49; ZVFHMIN: # %bb.0:50; ZVFHMIN-NEXT: fmv.x.h a0, fa051; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf4, ta, ma52; ZVFHMIN-NEXT: vmv.v.x v10, a053; ZVFHMIN-NEXT: lui a0, 854; ZVFHMIN-NEXT: vxor.vx v8, v8, a055; ZVFHMIN-NEXT: vxor.vx v9, v9, a056; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v957; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v858; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v1059; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma60; ZVFHMIN-NEXT: vfmadd.vv v12, v9, v1161; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma62; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v1263; ZVFHMIN-NEXT: ret64 %head = insertelement <vscale x 1 x half> poison, half %c, i32 065 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer66 %neg = fneg <vscale x 1 x half> %va67 %neg2 = fneg <vscale x 1 x half> %vb68 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")69 ret <vscale x 1 x half> %vd70}71 72define <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 {73; ZVFH-LABEL: vfnmsub_vv_nxv2f16:74; ZVFH: # %bb.0:75; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma76; ZVFH-NEXT: vfnmadd.vv v8, v10, v977; ZVFH-NEXT: ret78;79; ZVFHMIN-LABEL: vfnmsub_vv_nxv2f16:80; ZVFHMIN: # %bb.0:81; ZVFHMIN-NEXT: lui a0, 882; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf2, ta, ma83; ZVFHMIN-NEXT: vxor.vx v8, v8, a084; ZVFHMIN-NEXT: vxor.vx v9, v9, a085; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v986; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v887; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v1088; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma89; ZVFHMIN-NEXT: vfmadd.vv v12, v9, v1190; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma91; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v1292; ZVFHMIN-NEXT: ret93 %neg = fneg <vscale x 2 x half> %va94 %neg2 = fneg <vscale x 2 x half> %vb95 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")96 ret <vscale x 2 x half> %vd97}98 99define <vscale x 2 x half> @vfnmsub_vf_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, half %c) strictfp {100; ZVFH-LABEL: vfnmsub_vf_nxv2f16:101; ZVFH: # %bb.0:102; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma103; ZVFH-NEXT: vfnmadd.vf v8, fa0, v9104; ZVFH-NEXT: ret105;106; ZVFHMIN-LABEL: vfnmsub_vf_nxv2f16:107; ZVFHMIN: # %bb.0:108; ZVFHMIN-NEXT: fmv.x.h a0, fa0109; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf2, ta, ma110; ZVFHMIN-NEXT: vmv.v.x v10, a0111; ZVFHMIN-NEXT: lui a0, 8112; ZVFHMIN-NEXT: vxor.vx v8, v8, a0113; ZVFHMIN-NEXT: vxor.vx v9, v9, a0114; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9115; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8116; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10117; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma118; ZVFHMIN-NEXT: vfmadd.vv v12, v9, v11119; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma120; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12121; ZVFHMIN-NEXT: ret122 %head = insertelement <vscale x 2 x half> poison, half %c, i32 0123 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer124 %neg = fneg <vscale x 2 x half> %va125 %neg2 = fneg <vscale x 2 x half> %vb126 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")127 ret <vscale x 2 x half> %vd128}129 130define <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 {131; ZVFH-LABEL: vfnmsub_vv_nxv4f16:132; ZVFH: # %bb.0:133; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma134; ZVFH-NEXT: vfnmadd.vv v8, v9, v10135; ZVFH-NEXT: ret136;137; ZVFHMIN-LABEL: vfnmsub_vv_nxv4f16:138; ZVFHMIN: # %bb.0:139; ZVFHMIN-NEXT: lui a0, 8140; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m1, ta, ma141; ZVFHMIN-NEXT: vxor.vx v9, v9, a0142; ZVFHMIN-NEXT: vxor.vx v12, v10, a0143; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v12144; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9145; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v8146; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma147; ZVFHMIN-NEXT: vfmadd.vv v14, v12, v10148; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma149; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v14150; ZVFHMIN-NEXT: ret151 %neg = fneg <vscale x 4 x half> %vb152 %neg2 = fneg <vscale x 4 x half> %vc153 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")154 ret <vscale x 4 x half> %vd155}156 157define <vscale x 4 x half> @vfnmsub_vf_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, half %c) strictfp {158; ZVFH-LABEL: vfnmsub_vf_nxv4f16:159; ZVFH: # %bb.0:160; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma161; ZVFH-NEXT: vfnmadd.vf v8, fa0, v9162; ZVFH-NEXT: ret163;164; ZVFHMIN-LABEL: vfnmsub_vf_nxv4f16:165; ZVFHMIN: # %bb.0:166; ZVFHMIN-NEXT: fmv.x.h a0, fa0167; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m1, ta, ma168; ZVFHMIN-NEXT: vmv.v.x v10, a0169; ZVFHMIN-NEXT: lui a0, 8170; ZVFHMIN-NEXT: vxor.vx v9, v9, a0171; ZVFHMIN-NEXT: vxor.vx v14, v10, a0172; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9173; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v14174; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v8175; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma176; ZVFHMIN-NEXT: vfmadd.vv v14, v12, v10177; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma178; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v14179; ZVFHMIN-NEXT: ret180 %head = insertelement <vscale x 4 x half> poison, half %c, i32 0181 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer182 %neg = fneg <vscale x 4 x half> %splat183 %neg2 = fneg <vscale x 4 x half> %vb184 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")185 ret <vscale x 4 x half> %vd186}187 188define <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 {189; ZVFH-LABEL: vfnmsub_vv_nxv8f16:190; ZVFH: # %bb.0:191; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma192; ZVFH-NEXT: vfnmacc.vv v8, v12, v10193; ZVFH-NEXT: ret194;195; ZVFHMIN-LABEL: vfnmsub_vv_nxv8f16:196; ZVFHMIN: # %bb.0:197; ZVFHMIN-NEXT: lui a0, 8198; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m2, ta, ma199; ZVFHMIN-NEXT: vxor.vx v14, v10, a0200; ZVFHMIN-NEXT: vxor.vx v16, v8, a0201; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v16202; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v14203; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v12204; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma205; ZVFHMIN-NEXT: vfmadd.vv v20, v16, v8206; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma207; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v20208; ZVFHMIN-NEXT: ret209 %neg = fneg <vscale x 8 x half> %vb210 %neg2 = fneg <vscale x 8 x half> %va211 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")212 ret <vscale x 8 x half> %vd213}214 215define <vscale x 8 x half> @vfnmsub_vf_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, half %c) strictfp {216; ZVFH-LABEL: vfnmsub_vf_nxv8f16:217; ZVFH: # %bb.0:218; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma219; ZVFH-NEXT: vfnmacc.vf v8, fa0, v10220; ZVFH-NEXT: ret221;222; ZVFHMIN-LABEL: vfnmsub_vf_nxv8f16:223; ZVFHMIN: # %bb.0:224; ZVFHMIN-NEXT: fmv.x.h a0, fa0225; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m2, ta, ma226; ZVFHMIN-NEXT: vmv.v.x v12, a0227; ZVFHMIN-NEXT: lui a0, 8228; ZVFHMIN-NEXT: vxor.vx v8, v8, a0229; ZVFHMIN-NEXT: vxor.vx v20, v12, a0230; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8231; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v20232; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v10233; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma234; ZVFHMIN-NEXT: vfmadd.vv v20, v16, v12235; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma236; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v20237; ZVFHMIN-NEXT: ret238 %head = insertelement <vscale x 8 x half> poison, half %c, i32 0239 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer240 %neg = fneg <vscale x 8 x half> %splat241 %neg2 = fneg <vscale x 8 x half> %va242 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")243 ret <vscale x 8 x half> %vd244}245 246define <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 {247; ZVFH-LABEL: vfnmsub_vv_nxv16f16:248; ZVFH: # %bb.0:249; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma250; ZVFH-NEXT: vfnmadd.vv v8, v16, v12251; ZVFH-NEXT: ret252;253; ZVFHMIN-LABEL: vfnmsub_vv_nxv16f16:254; ZVFHMIN: # %bb.0:255; ZVFHMIN-NEXT: lui a0, 8256; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma257; ZVFHMIN-NEXT: vxor.vx v4, v16, a0258; ZVFHMIN-NEXT: vxor.vx v12, v12, a0259; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12260; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v4261; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8262; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma263; ZVFHMIN-NEXT: vfmadd.vv v0, v24, v16264; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma265; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v0266; ZVFHMIN-NEXT: ret267 %neg = fneg <vscale x 16 x half> %vc268 %neg2 = fneg <vscale x 16 x half> %vb269 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")270 ret <vscale x 16 x half> %vd271}272 273define <vscale x 16 x half> @vfnmsub_vf_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, half %c) strictfp {274; ZVFH-LABEL: vfnmsub_vf_nxv16f16:275; ZVFH: # %bb.0:276; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma277; ZVFH-NEXT: vfnmadd.vf v8, fa0, v12278; ZVFH-NEXT: ret279;280; ZVFHMIN-LABEL: vfnmsub_vf_nxv16f16:281; ZVFHMIN: # %bb.0:282; ZVFHMIN-NEXT: fmv.x.h a0, fa0283; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma284; ZVFHMIN-NEXT: vmv.v.x v16, a0285; ZVFHMIN-NEXT: lui a0, 8286; ZVFHMIN-NEXT: vxor.vx v12, v12, a0287; ZVFHMIN-NEXT: vxor.vx v4, v16, a0288; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12289; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v4290; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8291; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma292; ZVFHMIN-NEXT: vfmadd.vv v0, v24, v16293; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma294; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v0295; ZVFHMIN-NEXT: ret296 %head = insertelement <vscale x 16 x half> poison, half %c, i32 0297 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer298 %neg = fneg <vscale x 16 x half> %splat299 %neg2 = fneg <vscale x 16 x half> %vb300 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")301 ret <vscale x 16 x half> %vd302}303 304define <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 {305; ZVFH-LABEL: vfnmsub_vv_nxv32f16:306; ZVFH: # %bb.0:307; ZVFH-NEXT: vl8re16.v v24, (a0)308; ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma309; ZVFH-NEXT: vfnmadd.vv v8, v24, v16310; ZVFH-NEXT: ret311;312; ZVFHMIN-LABEL: vfnmsub_vv_nxv32f16:313; ZVFHMIN: # %bb.0:314; ZVFHMIN-NEXT: addi sp, sp, -16315; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16316; ZVFHMIN-NEXT: csrr a1, vlenb317; ZVFHMIN-NEXT: slli a1, a1, 5318; ZVFHMIN-NEXT: sub sp, sp, a1319; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb320; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma321; ZVFHMIN-NEXT: vmv8r.v v0, v16322; ZVFHMIN-NEXT: csrr a1, vlenb323; ZVFHMIN-NEXT: li a2, 24324; ZVFHMIN-NEXT: mul a1, a1, a2325; ZVFHMIN-NEXT: add a1, sp, a1326; ZVFHMIN-NEXT: addi a1, a1, 16327; ZVFHMIN-NEXT: vs8r.v v8, (a1) # vscale x 64-byte Folded Spill328; ZVFHMIN-NEXT: vl8re16.v v16, (a0)329; ZVFHMIN-NEXT: lui a0, 8330; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v8331; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m8, ta, ma332; ZVFHMIN-NEXT: vxor.vx v8, v0, a0333; ZVFHMIN-NEXT: csrr a1, vlenb334; ZVFHMIN-NEXT: slli a1, a1, 4335; ZVFHMIN-NEXT: add a1, sp, a1336; ZVFHMIN-NEXT: addi a1, a1, 16337; ZVFHMIN-NEXT: vs8r.v v8, (a1) # vscale x 64-byte Folded Spill338; ZVFHMIN-NEXT: vxor.vx v16, v16, a0339; ZVFHMIN-NEXT: addi a0, sp, 16340; ZVFHMIN-NEXT: vs8r.v v16, (a0) # vscale x 64-byte Folded Spill341; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma342; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8343; ZVFHMIN-NEXT: csrr a0, vlenb344; ZVFHMIN-NEXT: slli a0, a0, 3345; ZVFHMIN-NEXT: add a0, sp, a0346; ZVFHMIN-NEXT: addi a0, a0, 16347; ZVFHMIN-NEXT: vs8r.v v0, (a0) # vscale x 64-byte Folded Spill348; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v16349; ZVFHMIN-NEXT: csrr a0, vlenb350; ZVFHMIN-NEXT: slli a0, a0, 3351; ZVFHMIN-NEXT: add a0, sp, a0352; ZVFHMIN-NEXT: addi a0, a0, 16353; ZVFHMIN-NEXT: vl8r.v v8, (a0) # vscale x 64-byte Folded Reload354; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma355; ZVFHMIN-NEXT: vfmadd.vv v24, v0, v8356; ZVFHMIN-NEXT: csrr a0, vlenb357; ZVFHMIN-NEXT: li a1, 24358; ZVFHMIN-NEXT: mul a0, a0, a1359; ZVFHMIN-NEXT: add a0, sp, a0360; ZVFHMIN-NEXT: addi a0, a0, 16361; ZVFHMIN-NEXT: vl8r.v v8, (a0) # vscale x 64-byte Folded Reload362; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma363; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v12364; ZVFHMIN-NEXT: csrr a0, vlenb365; ZVFHMIN-NEXT: slli a0, a0, 4366; ZVFHMIN-NEXT: add a0, sp, a0367; ZVFHMIN-NEXT: addi a0, a0, 16368; ZVFHMIN-NEXT: vl8r.v v8, (a0) # vscale x 64-byte Folded Reload369; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12370; ZVFHMIN-NEXT: csrr a0, vlenb371; ZVFHMIN-NEXT: li a1, 24372; ZVFHMIN-NEXT: mul a0, a0, a1373; ZVFHMIN-NEXT: add a0, sp, a0374; ZVFHMIN-NEXT: addi a0, a0, 16375; ZVFHMIN-NEXT: vs8r.v v16, (a0) # vscale x 64-byte Folded Spill376; ZVFHMIN-NEXT: addi a0, sp, 16377; ZVFHMIN-NEXT: vl8r.v v16, (a0) # vscale x 64-byte Folded Reload378; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v20379; ZVFHMIN-NEXT: csrr a0, vlenb380; ZVFHMIN-NEXT: li a1, 24381; ZVFHMIN-NEXT: mul a0, a0, a1382; ZVFHMIN-NEXT: add a0, sp, a0383; ZVFHMIN-NEXT: addi a0, a0, 16384; ZVFHMIN-NEXT: vl8r.v v16, (a0) # vscale x 64-byte Folded Reload385; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma386; ZVFHMIN-NEXT: vfmadd.vv v0, v8, v16387; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma388; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v24389; ZVFHMIN-NEXT: vfncvt.f.f.w v12, v0390; ZVFHMIN-NEXT: csrr a0, vlenb391; ZVFHMIN-NEXT: slli a0, a0, 5392; ZVFHMIN-NEXT: add sp, sp, a0393; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16394; ZVFHMIN-NEXT: addi sp, sp, 16395; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0396; ZVFHMIN-NEXT: ret397 %neg = fneg <vscale x 32 x half> %vc398 %neg2 = fneg <vscale x 32 x half> %vb399 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")400 ret <vscale x 32 x half> %vd401}402 403define <vscale x 32 x half> @vfnmsub_vf_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, half %c) strictfp {404; ZVFH-LABEL: vfnmsub_vf_nxv32f16:405; ZVFH: # %bb.0:406; ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma407; ZVFH-NEXT: vfnmacc.vf v8, fa0, v16408; ZVFH-NEXT: ret409;410; ZVFHMIN-LABEL: vfnmsub_vf_nxv32f16:411; ZVFHMIN: # %bb.0:412; ZVFHMIN-NEXT: addi sp, sp, -16413; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16414; ZVFHMIN-NEXT: csrr a0, vlenb415; ZVFHMIN-NEXT: li a1, 24416; ZVFHMIN-NEXT: mul a0, a0, a1417; ZVFHMIN-NEXT: sub sp, sp, a0418; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 24 * vlenb419; ZVFHMIN-NEXT: csrr a0, vlenb420; ZVFHMIN-NEXT: slli a0, a0, 4421; ZVFHMIN-NEXT: add a0, sp, a0422; ZVFHMIN-NEXT: addi a0, a0, 16423; ZVFHMIN-NEXT: vs8r.v v16, (a0) # vscale x 64-byte Folded Spill424; ZVFHMIN-NEXT: fmv.x.h a0, fa0425; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m8, ta, ma426; ZVFHMIN-NEXT: vmv.v.x v0, a0427; ZVFHMIN-NEXT: lui a0, 8428; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma429; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16430; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m8, ta, ma431; ZVFHMIN-NEXT: vxor.vx v16, v8, a0432; ZVFHMIN-NEXT: vxor.vx v8, v0, a0433; ZVFHMIN-NEXT: csrr a0, vlenb434; ZVFHMIN-NEXT: slli a0, a0, 3435; ZVFHMIN-NEXT: add a0, sp, a0436; ZVFHMIN-NEXT: addi a0, a0, 16437; ZVFHMIN-NEXT: vs8r.v v8, (a0) # vscale x 64-byte Folded Spill438; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma439; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v16440; ZVFHMIN-NEXT: addi a0, sp, 16441; ZVFHMIN-NEXT: vs8r.v v0, (a0) # vscale x 64-byte Folded Spill442; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8443; ZVFHMIN-NEXT: vl8r.v v8, (a0) # vscale x 64-byte Folded Reload444; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma445; ZVFHMIN-NEXT: vfmadd.vv v24, v0, v8446; ZVFHMIN-NEXT: csrr a0, vlenb447; ZVFHMIN-NEXT: slli a0, a0, 4448; ZVFHMIN-NEXT: add a0, sp, a0449; ZVFHMIN-NEXT: addi a0, a0, 16450; ZVFHMIN-NEXT: vl8r.v v8, (a0) # vscale x 64-byte Folded Reload451; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma452; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v12453; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v20454; ZVFHMIN-NEXT: csrr a0, vlenb455; ZVFHMIN-NEXT: slli a0, a0, 4456; ZVFHMIN-NEXT: add a0, sp, a0457; ZVFHMIN-NEXT: addi a0, a0, 16458; ZVFHMIN-NEXT: vs8r.v v8, (a0) # vscale x 64-byte Folded Spill459; ZVFHMIN-NEXT: csrr a0, vlenb460; ZVFHMIN-NEXT: slli a0, a0, 3461; ZVFHMIN-NEXT: add a0, sp, a0462; ZVFHMIN-NEXT: addi a0, a0, 16463; ZVFHMIN-NEXT: vl8r.v v8, (a0) # vscale x 64-byte Folded Reload464; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12465; ZVFHMIN-NEXT: csrr a0, vlenb466; ZVFHMIN-NEXT: slli a0, a0, 4467; ZVFHMIN-NEXT: add a0, sp, a0468; ZVFHMIN-NEXT: addi a0, a0, 16469; ZVFHMIN-NEXT: vl8r.v v8, (a0) # vscale x 64-byte Folded Reload470; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma471; ZVFHMIN-NEXT: vfmadd.vv v0, v16, v8472; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma473; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v24474; ZVFHMIN-NEXT: vfncvt.f.f.w v12, v0475; ZVFHMIN-NEXT: csrr a0, vlenb476; ZVFHMIN-NEXT: li a1, 24477; ZVFHMIN-NEXT: mul a0, a0, a1478; ZVFHMIN-NEXT: add sp, sp, a0479; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16480; ZVFHMIN-NEXT: addi sp, sp, 16481; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0482; ZVFHMIN-NEXT: ret483 %head = insertelement <vscale x 32 x half> poison, half %c, i32 0484 %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer485 %neg = fneg <vscale x 32 x half> %splat486 %neg2 = fneg <vscale x 32 x half> %va487 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")488 ret <vscale x 32 x half> %vd489}490 491define <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 {492; CHECK-LABEL: vfnmsub_vv_nxv1f32:493; CHECK: # %bb.0:494; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma495; CHECK-NEXT: vfnmadd.vv v8, v9, v10496; CHECK-NEXT: ret497 %neg = fneg <vscale x 1 x float> %vb498 %neg2 = fneg <vscale x 1 x float> %vc499 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")500 ret <vscale x 1 x float> %vd501}502 503define <vscale x 1 x float> @vfnmsub_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, float %c) strictfp {504; CHECK-LABEL: vfnmsub_vf_nxv1f32:505; CHECK: # %bb.0:506; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma507; CHECK-NEXT: vfnmadd.vf v8, fa0, v9508; CHECK-NEXT: ret509 %head = insertelement <vscale x 1 x float> poison, float %c, i32 0510 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer511 %neg = fneg <vscale x 1 x float> %va512 %neg2 = fneg <vscale x 1 x float> %vb513 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")514 ret <vscale x 1 x float> %vd515}516 517define <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 {518; CHECK-LABEL: vfnmsub_vv_nxv2f32:519; CHECK: # %bb.0:520; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma521; CHECK-NEXT: vfnmadd.vv v8, v10, v9522; CHECK-NEXT: ret523 %neg = fneg <vscale x 2 x float> %vc524 %neg2 = fneg <vscale x 2 x float> %vb525 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")526 ret <vscale x 2 x float> %vd527}528 529define <vscale x 2 x float> @vfnmsub_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, float %c) strictfp {530; CHECK-LABEL: vfnmsub_vf_nxv2f32:531; CHECK: # %bb.0:532; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma533; CHECK-NEXT: vfnmadd.vf v8, fa0, v9534; CHECK-NEXT: ret535 %head = insertelement <vscale x 2 x float> poison, float %c, i32 0536 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer537 %neg = fneg <vscale x 2 x float> %va538 %neg2 = fneg <vscale x 2 x float> %vb539 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")540 ret <vscale x 2 x float> %vd541}542 543define <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 {544; CHECK-LABEL: vfnmsub_vv_nxv4f32:545; CHECK: # %bb.0:546; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma547; CHECK-NEXT: vfnmadd.vv v8, v10, v12548; CHECK-NEXT: ret549 %neg = fneg <vscale x 4 x float> %va550 %neg2 = fneg <vscale x 4 x float> %vc551 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")552 ret <vscale x 4 x float> %vd553}554 555define <vscale x 4 x float> @vfnmsub_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, float %c) strictfp {556; CHECK-LABEL: vfnmsub_vf_nxv4f32:557; CHECK: # %bb.0:558; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma559; CHECK-NEXT: vfnmadd.vf v8, fa0, v10560; CHECK-NEXT: ret561 %head = insertelement <vscale x 4 x float> poison, float %c, i32 0562 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer563 %neg = fneg <vscale x 4 x float> %splat564 %neg2 = fneg <vscale x 4 x float> %vb565 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")566 ret <vscale x 4 x float> %vd567}568 569define <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 {570; CHECK-LABEL: vfnmsub_vv_nxv8f32:571; CHECK: # %bb.0:572; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma573; CHECK-NEXT: vfnmacc.vv v8, v16, v12574; CHECK-NEXT: ret575 %neg = fneg <vscale x 8 x float> %vc576 %neg2 = fneg <vscale x 8 x float> %va577 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")578 ret <vscale x 8 x float> %vd579}580 581define <vscale x 8 x float> @vfnmsub_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, float %c) strictfp {582; CHECK-LABEL: vfnmsub_vf_nxv8f32:583; CHECK: # %bb.0:584; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma585; CHECK-NEXT: vfnmacc.vf v8, fa0, v12586; CHECK-NEXT: ret587 %head = insertelement <vscale x 8 x float> poison, float %c, i32 0588 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer589 %neg = fneg <vscale x 8 x float> %splat590 %neg2 = fneg <vscale x 8 x float> %va591 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")592 ret <vscale x 8 x float> %vd593}594 595define <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 {596; CHECK-LABEL: vfnmsub_vv_nxv16f32:597; CHECK: # %bb.0:598; CHECK-NEXT: vl8re32.v v24, (a0)599; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma600; CHECK-NEXT: vfnmadd.vv v8, v24, v16601; CHECK-NEXT: ret602 %neg = fneg <vscale x 16 x float> %va603 %neg2 = fneg <vscale x 16 x float> %vb604 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")605 ret <vscale x 16 x float> %vd606}607 608define <vscale x 16 x float> @vfnmsub_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, float %c) strictfp {609; CHECK-LABEL: vfnmsub_vf_nxv16f32:610; CHECK: # %bb.0:611; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma612; CHECK-NEXT: vfnmadd.vf v8, fa0, v16613; CHECK-NEXT: ret614 %head = insertelement <vscale x 16 x float> poison, float %c, i32 0615 %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer616 %neg = fneg <vscale x 16 x float> %splat617 %neg2 = fneg <vscale x 16 x float> %vb618 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")619 ret <vscale x 16 x float> %vd620}621 622define <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 {623; CHECK-LABEL: vfnmsub_vv_nxv1f64:624; CHECK: # %bb.0:625; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma626; CHECK-NEXT: vfnmacc.vv v8, v10, v9627; CHECK-NEXT: ret628 %neg = fneg <vscale x 1 x double> %vb629 %neg2 = fneg <vscale x 1 x double> %va630 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")631 ret <vscale x 1 x double> %vd632}633 634define <vscale x 1 x double> @vfnmsub_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, double %c) strictfp {635; CHECK-LABEL: vfnmsub_vf_nxv1f64:636; CHECK: # %bb.0:637; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma638; CHECK-NEXT: vfnmadd.vf v8, fa0, v9639; CHECK-NEXT: ret640 %head = insertelement <vscale x 1 x double> poison, double %c, i32 0641 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer642 %neg = fneg <vscale x 1 x double> %va643 %neg2 = fneg <vscale x 1 x double> %vb644 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")645 ret <vscale x 1 x double> %vd646}647 648define <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 {649; CHECK-LABEL: vfnmsub_vv_nxv2f64:650; CHECK: # %bb.0:651; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma652; CHECK-NEXT: vfnmadd.vv v8, v12, v10653; CHECK-NEXT: ret654 %neg = fneg <vscale x 2 x double> %va655 %neg2 = fneg <vscale x 2 x double> %vb656 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")657 ret <vscale x 2 x double> %vd658}659 660define <vscale x 2 x double> @vfnmsub_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, double %c) strictfp {661; CHECK-LABEL: vfnmsub_vf_nxv2f64:662; CHECK: # %bb.0:663; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma664; CHECK-NEXT: vfnmadd.vf v8, fa0, v10665; CHECK-NEXT: ret666 %head = insertelement <vscale x 2 x double> poison, double %c, i32 0667 %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer668 %neg = fneg <vscale x 2 x double> %va669 %neg2 = fneg <vscale x 2 x double> %vb670 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")671 ret <vscale x 2 x double> %vd672}673 674define <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 {675; CHECK-LABEL: vfnmsub_vv_nxv4f64:676; CHECK: # %bb.0:677; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma678; CHECK-NEXT: vfnmadd.vv v8, v12, v16679; CHECK-NEXT: ret680 %neg = fneg <vscale x 4 x double> %vb681 %neg2 = fneg <vscale x 4 x double> %vc682 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")683 ret <vscale x 4 x double> %vd684}685 686define <vscale x 4 x double> @vfnmsub_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, double %c) strictfp {687; CHECK-LABEL: vfnmsub_vf_nxv4f64:688; CHECK: # %bb.0:689; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma690; CHECK-NEXT: vfnmadd.vf v8, fa0, v12691; CHECK-NEXT: ret692 %head = insertelement <vscale x 4 x double> poison, double %c, i32 0693 %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer694 %neg = fneg <vscale x 4 x double> %splat695 %neg2 = fneg <vscale x 4 x double> %vb696 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")697 ret <vscale x 4 x double> %vd698}699 700define <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 {701; CHECK-LABEL: vfnmsub_vv_nxv8f64:702; CHECK: # %bb.0:703; CHECK-NEXT: vl8re64.v v24, (a0)704; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma705; CHECK-NEXT: vfnmacc.vv v8, v16, v24706; CHECK-NEXT: ret707 %neg = fneg <vscale x 8 x double> %vb708 %neg2 = fneg <vscale x 8 x double> %va709 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")710 ret <vscale x 8 x double> %vd711}712 713define <vscale x 8 x double> @vfnmsub_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, double %c) strictfp {714; CHECK-LABEL: vfnmsub_vf_nxv8f64:715; CHECK: # %bb.0:716; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma717; CHECK-NEXT: vfnmacc.vf v8, fa0, v16718; CHECK-NEXT: ret719 %head = insertelement <vscale x 8 x double> poison, double %c, i32 0720 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer721 %neg = fneg <vscale x 8 x double> %splat722 %neg2 = fneg <vscale x 8 x double> %va723 %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> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict")724 ret <vscale x 8 x double> %vd725}726