1038 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zvfh,+zfbfmin,+zvfbfmin,+v \3; RUN: -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \4; RUN: --check-prefixes=CHECK,ZVFH5; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+zvfh,+zfbfmin,+zvfbfmin,+v \6; RUN: -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \7; RUN: --check-prefixes=CHECK,ZVFH8; RUN: llc -mtriple=riscv32 \9; RUN: -mattr=+m,+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \10; RUN: -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \11; RUN: --check-prefixes=CHECK,ZVFHMIN12; RUN: llc -mtriple=riscv64 \13; RUN: -mattr=+m,+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \14; RUN: -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \15; RUN: --check-prefixes=CHECK,ZVFHMIN16 17; This tests a mix of vfmacc and vfmadd by using different operand orders to18; trigger commuting in TwoAddressInstructionPass.19 20define <vscale x 1 x bfloat> @vfmadd_vv_nxv1bf16(<vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %vb, <vscale x 1 x bfloat> %vc) strictfp {21; CHECK-LABEL: vfmadd_vv_nxv1bf16:22; CHECK: # %bb.0:23; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma24; CHECK-NEXT: vfwcvtbf16.f.f.v v11, v1025; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v926; CHECK-NEXT: vfwcvtbf16.f.f.v v9, v827; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma28; CHECK-NEXT: vfmadd.vv v9, v10, v1129; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma30; CHECK-NEXT: vfncvtbf16.f.f.w v8, v931; CHECK-NEXT: ret32 %vd = call <vscale x 1 x bfloat> @llvm.experimental.constrained.fma.nxv1bf16(<vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %vb, <vscale x 1 x bfloat> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")33 ret <vscale x 1 x bfloat> %vd34}35 36define <vscale x 1 x bfloat> @vfmadd_vf_nxv1bf16(<vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %vb, bfloat %c) strictfp {37; CHECK-LABEL: vfmadd_vf_nxv1bf16:38; CHECK: # %bb.0:39; CHECK-NEXT: fmv.x.h a0, fa040; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma41; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v942; CHECK-NEXT: vmv.v.x v9, a043; CHECK-NEXT: vfwcvtbf16.f.f.v v11, v844; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v945; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma46; CHECK-NEXT: vfmadd.vv v12, v11, v1047; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma48; CHECK-NEXT: vfncvtbf16.f.f.w v8, v1249; CHECK-NEXT: ret50 %head = insertelement <vscale x 1 x bfloat> poison, bfloat %c, i32 051 %splat = shufflevector <vscale x 1 x bfloat> %head, <vscale x 1 x bfloat> poison, <vscale x 1 x i32> zeroinitializer52 %vd = call <vscale x 1 x bfloat> @llvm.experimental.constrained.fma.nxv1bf16(<vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %splat, <vscale x 1 x bfloat> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")53 ret <vscale x 1 x bfloat> %vd54}55 56define <vscale x 2 x bfloat> @vfmadd_vv_nxv2bf16(<vscale x 2 x bfloat> %va, <vscale x 2 x bfloat> %vb, <vscale x 2 x bfloat> %vc) strictfp {57; CHECK-LABEL: vfmadd_vv_nxv2bf16:58; CHECK: # %bb.0:59; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma60; CHECK-NEXT: vfwcvtbf16.f.f.v v11, v961; CHECK-NEXT: vfwcvtbf16.f.f.v v9, v1062; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v863; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma64; CHECK-NEXT: vfmadd.vv v10, v9, v1165; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma66; CHECK-NEXT: vfncvtbf16.f.f.w v8, v1067; CHECK-NEXT: ret68 %vd = call <vscale x 2 x bfloat> @llvm.experimental.constrained.fma.nxv2bf16(<vscale x 2 x bfloat> %va, <vscale x 2 x bfloat> %vc, <vscale x 2 x bfloat> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")69 ret <vscale x 2 x bfloat> %vd70}71 72define <vscale x 2 x bfloat> @vfmadd_vf_nxv2bf16(<vscale x 2 x bfloat> %va, <vscale x 2 x bfloat> %vb, bfloat %c) strictfp {73; CHECK-LABEL: vfmadd_vf_nxv2bf16:74; CHECK: # %bb.0:75; CHECK-NEXT: fmv.x.h a0, fa076; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma77; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v878; CHECK-NEXT: vmv.v.x v8, a079; CHECK-NEXT: vfwcvtbf16.f.f.v v11, v980; CHECK-NEXT: vfwcvtbf16.f.f.v v9, v881; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma82; CHECK-NEXT: vfmadd.vv v9, v11, v1083; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma84; CHECK-NEXT: vfncvtbf16.f.f.w v8, v985; CHECK-NEXT: ret86 %head = insertelement <vscale x 2 x bfloat> poison, bfloat %c, i32 087 %splat = shufflevector <vscale x 2 x bfloat> %head, <vscale x 2 x bfloat> poison, <vscale x 2 x i32> zeroinitializer88 %vd = call <vscale x 2 x bfloat> @llvm.experimental.constrained.fma.nxv2bf16(<vscale x 2 x bfloat> %vb, <vscale x 2 x bfloat> %splat, <vscale x 2 x bfloat> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")89 ret <vscale x 2 x bfloat> %vd90}91 92define <vscale x 4 x bfloat> @vfmadd_vv_nxv4bf16(<vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %vb, <vscale x 4 x bfloat> %vc) strictfp {93; CHECK-LABEL: vfmadd_vv_nxv4bf16:94; CHECK: # %bb.0:95; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma96; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v1097; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v898; CHECK-NEXT: vfwcvtbf16.f.f.v v14, v999; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma100; CHECK-NEXT: vfmadd.vv v14, v10, v12101; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma102; CHECK-NEXT: vfncvtbf16.f.f.w v8, v14103; CHECK-NEXT: ret104 %vd = call <vscale x 4 x bfloat> @llvm.experimental.constrained.fma.nxv4bf16(<vscale x 4 x bfloat> %vb, <vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")105 ret <vscale x 4 x bfloat> %vd106}107 108define <vscale x 4 x bfloat> @vfmadd_vf_nxv4bf16(<vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %vb, bfloat %c) strictfp {109; CHECK-LABEL: vfmadd_vf_nxv4bf16:110; CHECK: # %bb.0:111; CHECK-NEXT: fmv.x.h a0, fa0112; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma113; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v9114; CHECK-NEXT: vmv.v.x v9, a0115; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v8116; CHECK-NEXT: vfwcvtbf16.f.f.v v14, v9117; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma118; CHECK-NEXT: vfmadd.vv v14, v12, v10119; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma120; CHECK-NEXT: vfncvtbf16.f.f.w v8, v14121; CHECK-NEXT: ret122 %head = insertelement <vscale x 4 x bfloat> poison, bfloat %c, i32 0123 %splat = shufflevector <vscale x 4 x bfloat> %head, <vscale x 4 x bfloat> poison, <vscale x 4 x i32> zeroinitializer124 %vd = call <vscale x 4 x bfloat> @llvm.experimental.constrained.fma.nxv4bf16(<vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %splat, <vscale x 4 x bfloat> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")125 ret <vscale x 4 x bfloat> %vd126}127 128define <vscale x 8 x bfloat> @vfmadd_vv_nxv8bf16(<vscale x 8 x bfloat> %va, <vscale x 8 x bfloat> %vb, <vscale x 8 x bfloat> %vc) strictfp {129; CHECK-LABEL: vfmadd_vv_nxv8bf16:130; CHECK: # %bb.0:131; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma132; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v8133; CHECK-NEXT: vfwcvtbf16.f.f.v v20, v12134; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v10135; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma136; CHECK-NEXT: vfmadd.vv v12, v20, v16137; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma138; CHECK-NEXT: vfncvtbf16.f.f.w v8, v12139; CHECK-NEXT: ret140 %vd = call <vscale x 8 x bfloat> @llvm.experimental.constrained.fma.nxv8bf16(<vscale x 8 x bfloat> %vb, <vscale x 8 x bfloat> %vc, <vscale x 8 x bfloat> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")141 ret <vscale x 8 x bfloat> %vd142}143 144define <vscale x 8 x bfloat> @vfmadd_vf_nxv8bf16(<vscale x 8 x bfloat> %va, <vscale x 8 x bfloat> %vb, bfloat %c) strictfp {145; CHECK-LABEL: vfmadd_vf_nxv8bf16:146; CHECK: # %bb.0:147; CHECK-NEXT: fmv.x.h a0, fa0148; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma149; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v8150; CHECK-NEXT: vmv.v.x v8, a0151; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v10152; CHECK-NEXT: vfwcvtbf16.f.f.v v20, v8153; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma154; CHECK-NEXT: vfmadd.vv v20, v16, v12155; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma156; CHECK-NEXT: vfncvtbf16.f.f.w v8, v20157; CHECK-NEXT: ret158 %head = insertelement <vscale x 8 x bfloat> poison, bfloat %c, i32 0159 %splat = shufflevector <vscale x 8 x bfloat> %head, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer160 %vd = call <vscale x 8 x bfloat> @llvm.experimental.constrained.fma.nxv8bf16(<vscale x 8 x bfloat> %vb, <vscale x 8 x bfloat> %splat, <vscale x 8 x bfloat> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")161 ret <vscale x 8 x bfloat> %vd162}163 164define <vscale x 16 x bfloat> @vfmadd_vv_nxv16bf16(<vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %vb, <vscale x 16 x bfloat> %vc) strictfp {165; CHECK-LABEL: vfmadd_vv_nxv16bf16:166; CHECK: # %bb.0:167; CHECK-NEXT: addi sp, sp, -16168; CHECK-NEXT: .cfi_def_cfa_offset 16169; CHECK-NEXT: csrr a0, vlenb170; CHECK-NEXT: slli a0, a0, 2171; CHECK-NEXT: sub sp, sp, a0172; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x04, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 4 * vlenb173; CHECK-NEXT: addi a0, sp, 16174; CHECK-NEXT: vs4r.v v16, (a0) # vscale x 32-byte Folded Spill175; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma176; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v12177; CHECK-NEXT: vfwcvtbf16.f.f.v v0, v8178; CHECK-NEXT: addi a0, sp, 16179; CHECK-NEXT: vl4r.v v8, (a0) # vscale x 32-byte Folded Reload180; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v8181; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma182; CHECK-NEXT: vfmadd.vv v24, v0, v16183; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma184; CHECK-NEXT: vfncvtbf16.f.f.w v8, v24185; CHECK-NEXT: csrr a0, vlenb186; CHECK-NEXT: slli a0, a0, 2187; CHECK-NEXT: add sp, sp, a0188; CHECK-NEXT: .cfi_def_cfa sp, 16189; CHECK-NEXT: addi sp, sp, 16190; CHECK-NEXT: .cfi_def_cfa_offset 0191; CHECK-NEXT: ret192 %vd = call <vscale x 16 x bfloat> @llvm.experimental.constrained.fma.nxv16bf16(<vscale x 16 x bfloat> %vc, <vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")193 ret <vscale x 16 x bfloat> %vd194}195 196define <vscale x 16 x bfloat> @vfmadd_vf_nxv16bf16(<vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %vb, bfloat %c) strictfp {197; CHECK-LABEL: vfmadd_vf_nxv16bf16:198; CHECK: # %bb.0:199; CHECK-NEXT: fmv.x.h a0, fa0200; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma201; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v12202; CHECK-NEXT: vmv.v.x v12, a0203; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v8204; CHECK-NEXT: vfwcvtbf16.f.f.v v0, v12205; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma206; CHECK-NEXT: vfmadd.vv v0, v24, v16207; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma208; CHECK-NEXT: vfncvtbf16.f.f.w v8, v0209; CHECK-NEXT: ret210 %head = insertelement <vscale x 16 x bfloat> poison, bfloat %c, i32 0211 %splat = shufflevector <vscale x 16 x bfloat> %head, <vscale x 16 x bfloat> poison, <vscale x 16 x i32> zeroinitializer212 %vd = call <vscale x 16 x bfloat> @llvm.experimental.constrained.fma.nxv16bf16(<vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %splat, <vscale x 16 x bfloat> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")213 ret <vscale x 16 x bfloat> %vd214}215 216define <vscale x 32 x bfloat> @vfmadd_vv_nxv32bf16(<vscale x 32 x bfloat> %va, <vscale x 32 x bfloat> %vb, <vscale x 32 x bfloat> %vc) strictfp {217; CHECK-LABEL: vfmadd_vv_nxv32bf16:218; CHECK: # %bb.0:219; CHECK-NEXT: addi sp, sp, -16220; CHECK-NEXT: .cfi_def_cfa_offset 16221; CHECK-NEXT: csrr a1, vlenb222; CHECK-NEXT: slli a1, a1, 5223; CHECK-NEXT: sub sp, sp, a1224; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb225; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma226; CHECK-NEXT: vmv8r.v v0, v16227; CHECK-NEXT: csrr a1, vlenb228; CHECK-NEXT: slli a1, a1, 3229; CHECK-NEXT: add a1, sp, a1230; CHECK-NEXT: addi a1, a1, 16231; CHECK-NEXT: vs8r.v v16, (a1) # vscale x 64-byte Folded Spill232; CHECK-NEXT: vl8re16.v v16, (a0)233; CHECK-NEXT: csrr a0, vlenb234; CHECK-NEXT: li a1, 24235; CHECK-NEXT: mul a0, a0, a1236; CHECK-NEXT: add a0, sp, a0237; CHECK-NEXT: addi a0, a0, 16238; CHECK-NEXT: vs8r.v v16, (a0) # vscale x 64-byte Folded Spill239; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v8240; CHECK-NEXT: csrr a0, vlenb241; CHECK-NEXT: slli a0, a0, 4242; CHECK-NEXT: add a0, sp, a0243; CHECK-NEXT: addi a0, a0, 16244; CHECK-NEXT: vs8r.v v24, (a0) # vscale x 64-byte Folded Spill245; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v0246; CHECK-NEXT: addi a0, sp, 16247; CHECK-NEXT: vs8r.v v16, (a0) # vscale x 64-byte Folded Spill248; CHECK-NEXT: csrr a0, vlenb249; CHECK-NEXT: li a1, 24250; CHECK-NEXT: mul a0, a0, a1251; CHECK-NEXT: add a0, sp, a0252; CHECK-NEXT: addi a0, a0, 16253; CHECK-NEXT: vl8r.v v16, (a0) # vscale x 64-byte Folded Reload254; CHECK-NEXT: vfwcvtbf16.f.f.v v0, v16255; CHECK-NEXT: csrr a0, vlenb256; CHECK-NEXT: slli a0, a0, 4257; CHECK-NEXT: add a0, sp, a0258; CHECK-NEXT: addi a0, a0, 16259; CHECK-NEXT: vl8r.v v24, (a0) # vscale x 64-byte Folded Reload260; CHECK-NEXT: addi a0, sp, 16261; CHECK-NEXT: vl8r.v v16, (a0) # vscale x 64-byte Folded Reload262; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma263; CHECK-NEXT: vfmadd.vv v0, v16, v24264; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma265; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v12266; CHECK-NEXT: csrr a0, vlenb267; CHECK-NEXT: slli a0, a0, 4268; CHECK-NEXT: add a0, sp, a0269; CHECK-NEXT: addi a0, a0, 16270; CHECK-NEXT: vs8r.v v24, (a0) # vscale x 64-byte Folded Spill271; CHECK-NEXT: csrr a0, vlenb272; CHECK-NEXT: slli a0, a0, 3273; CHECK-NEXT: add a0, sp, a0274; CHECK-NEXT: addi a0, a0, 16275; CHECK-NEXT: vl8r.v v24, (a0) # vscale x 64-byte Folded Reload276; CHECK-NEXT: vfwcvtbf16.f.f.v v8, v28277; CHECK-NEXT: csrr a0, vlenb278; CHECK-NEXT: li a1, 24279; CHECK-NEXT: mul a0, a0, a1280; CHECK-NEXT: add a0, sp, a0281; CHECK-NEXT: addi a0, a0, 16282; CHECK-NEXT: vl8r.v v24, (a0) # vscale x 64-byte Folded Reload283; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v28284; CHECK-NEXT: csrr a0, vlenb285; CHECK-NEXT: slli a0, a0, 4286; CHECK-NEXT: add a0, sp, a0287; CHECK-NEXT: addi a0, a0, 16288; CHECK-NEXT: vl8r.v v24, (a0) # vscale x 64-byte Folded Reload289; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma290; CHECK-NEXT: vfmadd.vv v16, v8, v24291; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma292; CHECK-NEXT: vfncvtbf16.f.f.w v8, v0293; CHECK-NEXT: vfncvtbf16.f.f.w v12, v16294; CHECK-NEXT: csrr a0, vlenb295; CHECK-NEXT: slli a0, a0, 5296; CHECK-NEXT: add sp, sp, a0297; CHECK-NEXT: .cfi_def_cfa sp, 16298; CHECK-NEXT: addi sp, sp, 16299; CHECK-NEXT: .cfi_def_cfa_offset 0300; CHECK-NEXT: ret301 %vd = call <vscale x 32 x bfloat> @llvm.experimental.constrained.fma.nxv32bf16(<vscale x 32 x bfloat> %vc, <vscale x 32 x bfloat> %vb, <vscale x 32 x bfloat> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")302 ret <vscale x 32 x bfloat> %vd303}304 305define <vscale x 32 x bfloat> @vfmadd_vf_nxv32bf16(<vscale x 32 x bfloat> %va, <vscale x 32 x bfloat> %vb, bfloat %c) strictfp {306; CHECK-LABEL: vfmadd_vf_nxv32bf16:307; CHECK: # %bb.0:308; CHECK-NEXT: addi sp, sp, -16309; CHECK-NEXT: .cfi_def_cfa_offset 16310; CHECK-NEXT: csrr a0, vlenb311; CHECK-NEXT: slli a0, a0, 5312; CHECK-NEXT: sub sp, sp, a0313; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb314; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma315; CHECK-NEXT: vmv8r.v v24, v16316; CHECK-NEXT: csrr a0, vlenb317; CHECK-NEXT: li a1, 24318; CHECK-NEXT: mul a0, a0, a1319; CHECK-NEXT: add a0, sp, a0320; CHECK-NEXT: addi a0, a0, 16321; CHECK-NEXT: vs8r.v v16, (a0) # vscale x 64-byte Folded Spill322; CHECK-NEXT: fmv.x.h a0, fa0323; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v8324; CHECK-NEXT: csrr a1, vlenb325; CHECK-NEXT: slli a1, a1, 4326; CHECK-NEXT: add a1, sp, a1327; CHECK-NEXT: addi a1, a1, 16328; CHECK-NEXT: vs8r.v v16, (a1) # vscale x 64-byte Folded Spill329; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v24330; CHECK-NEXT: csrr a1, vlenb331; CHECK-NEXT: slli a1, a1, 3332; CHECK-NEXT: add a1, sp, a1333; CHECK-NEXT: addi a1, a1, 16334; CHECK-NEXT: vs8r.v v16, (a1) # vscale x 64-byte Folded Spill335; CHECK-NEXT: vsetvli a1, zero, e16, m8, ta, ma336; CHECK-NEXT: vmv.v.x v16, a0337; CHECK-NEXT: addi a0, sp, 16338; CHECK-NEXT: vs8r.v v16, (a0) # vscale x 64-byte Folded Spill339; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma340; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v16341; CHECK-NEXT: csrr a0, vlenb342; CHECK-NEXT: slli a0, a0, 4343; CHECK-NEXT: add a0, sp, a0344; CHECK-NEXT: addi a0, a0, 16345; CHECK-NEXT: vl8r.v v16, (a0) # vscale x 64-byte Folded Reload346; CHECK-NEXT: csrr a0, vlenb347; CHECK-NEXT: slli a0, a0, 3348; CHECK-NEXT: add a0, sp, a0349; CHECK-NEXT: addi a0, a0, 16350; CHECK-NEXT: vl8r.v v0, (a0) # vscale x 64-byte Folded Reload351; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma352; CHECK-NEXT: vfmadd.vv v24, v0, v16353; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma354; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v12355; CHECK-NEXT: csrr a0, vlenb356; CHECK-NEXT: slli a0, a0, 4357; CHECK-NEXT: add a0, sp, a0358; CHECK-NEXT: addi a0, a0, 16359; CHECK-NEXT: vs8r.v v16, (a0) # vscale x 64-byte Folded Spill360; CHECK-NEXT: csrr a0, vlenb361; CHECK-NEXT: li a1, 24362; CHECK-NEXT: mul a0, a0, a1363; CHECK-NEXT: add a0, sp, a0364; CHECK-NEXT: addi a0, a0, 16365; CHECK-NEXT: vl8r.v v8, (a0) # vscale x 64-byte Folded Reload366; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v12367; CHECK-NEXT: addi a0, sp, 16368; CHECK-NEXT: vl8r.v v0, (a0) # vscale x 64-byte Folded Reload369; CHECK-NEXT: vfwcvtbf16.f.f.v v8, v4370; CHECK-NEXT: csrr a0, vlenb371; CHECK-NEXT: slli a0, a0, 4372; CHECK-NEXT: add a0, sp, a0373; CHECK-NEXT: addi a0, a0, 16374; CHECK-NEXT: vl8r.v v0, (a0) # vscale x 64-byte Folded Reload375; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma376; CHECK-NEXT: vfmadd.vv v16, v8, v0377; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma378; CHECK-NEXT: vfncvtbf16.f.f.w v8, v24379; CHECK-NEXT: vfncvtbf16.f.f.w v12, v16380; CHECK-NEXT: csrr a0, vlenb381; CHECK-NEXT: slli a0, a0, 5382; CHECK-NEXT: add sp, sp, a0383; CHECK-NEXT: .cfi_def_cfa sp, 16384; CHECK-NEXT: addi sp, sp, 16385; CHECK-NEXT: .cfi_def_cfa_offset 0386; CHECK-NEXT: ret387 %head = insertelement <vscale x 32 x bfloat> poison, bfloat %c, i32 0388 %splat = shufflevector <vscale x 32 x bfloat> %head, <vscale x 32 x bfloat> poison, <vscale x 32 x i32> zeroinitializer389 %vd = call <vscale x 32 x bfloat> @llvm.experimental.constrained.fma.nxv32bf16(<vscale x 32 x bfloat> %vb, <vscale x 32 x bfloat> %splat, <vscale x 32 x bfloat> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")390 ret <vscale x 32 x bfloat> %vd391}392 393define <vscale x 1 x half> @vfmadd_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) strictfp {394; ZVFH-LABEL: vfmadd_vv_nxv1f16:395; ZVFH: # %bb.0:396; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma397; ZVFH-NEXT: vfmadd.vv v8, v9, v10398; ZVFH-NEXT: ret399;400; ZVFHMIN-LABEL: vfmadd_vv_nxv1f16:401; ZVFHMIN: # %bb.0:402; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma403; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v10404; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9405; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8406; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma407; ZVFHMIN-NEXT: vfmadd.vv v9, v10, v11408; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma409; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9410; ZVFHMIN-NEXT: ret411 %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> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")412 ret <vscale x 1 x half> %vd413}414 415define <vscale x 1 x half> @vfmadd_vf_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, half %c) strictfp {416; ZVFH-LABEL: vfmadd_vf_nxv1f16:417; ZVFH: # %bb.0:418; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma419; ZVFH-NEXT: vfmadd.vf v8, fa0, v9420; ZVFH-NEXT: ret421;422; ZVFHMIN-LABEL: vfmadd_vf_nxv1f16:423; ZVFHMIN: # %bb.0:424; ZVFHMIN-NEXT: fmv.x.h a0, fa0425; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf4, ta, ma426; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9427; ZVFHMIN-NEXT: vmv.v.x v9, a0428; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8429; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9430; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma431; ZVFHMIN-NEXT: vfmadd.vv v12, v11, v10432; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma433; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12434; ZVFHMIN-NEXT: ret435 %head = insertelement <vscale x 1 x half> poison, half %c, i32 0436 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer437 %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> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")438 ret <vscale x 1 x half> %vd439}440 441define <vscale x 2 x half> @vfmadd_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) strictfp {442; ZVFH-LABEL: vfmadd_vv_nxv2f16:443; ZVFH: # %bb.0:444; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma445; ZVFH-NEXT: vfmadd.vv v8, v10, v9446; ZVFH-NEXT: ret447;448; ZVFHMIN-LABEL: vfmadd_vv_nxv2f16:449; ZVFHMIN: # %bb.0:450; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma451; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9452; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v10453; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8454; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma455; ZVFHMIN-NEXT: vfmadd.vv v10, v9, v11456; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma457; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10458; ZVFHMIN-NEXT: ret459 %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> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")460 ret <vscale x 2 x half> %vd461}462 463define <vscale x 2 x half> @vfmadd_vf_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, half %c) strictfp {464; ZVFH-LABEL: vfmadd_vf_nxv2f16:465; ZVFH: # %bb.0:466; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma467; ZVFH-NEXT: vfmacc.vf v8, fa0, v9468; ZVFH-NEXT: ret469;470; ZVFHMIN-LABEL: vfmadd_vf_nxv2f16:471; ZVFHMIN: # %bb.0:472; ZVFHMIN-NEXT: fmv.x.h a0, fa0473; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf2, ta, ma474; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8475; ZVFHMIN-NEXT: vmv.v.x v8, a0476; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9477; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8478; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma479; ZVFHMIN-NEXT: vfmadd.vv v9, v11, v10480; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma481; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9482; ZVFHMIN-NEXT: ret483 %head = insertelement <vscale x 2 x half> poison, half %c, i32 0484 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer485 %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> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")486 ret <vscale x 2 x half> %vd487}488 489define <vscale x 4 x half> @vfmadd_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) strictfp {490; ZVFH-LABEL: vfmadd_vv_nxv4f16:491; ZVFH: # %bb.0:492; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma493; ZVFH-NEXT: vfmadd.vv v8, v9, v10494; ZVFH-NEXT: ret495;496; ZVFHMIN-LABEL: vfmadd_vv_nxv4f16:497; ZVFHMIN: # %bb.0:498; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma499; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10500; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8501; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v9502; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma503; ZVFHMIN-NEXT: vfmadd.vv v14, v10, v12504; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma505; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v14506; ZVFHMIN-NEXT: ret507 %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> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")508 ret <vscale x 4 x half> %vd509}510 511define <vscale x 4 x half> @vfmadd_vf_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, half %c) strictfp {512; ZVFH-LABEL: vfmadd_vf_nxv4f16:513; ZVFH: # %bb.0:514; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma515; ZVFH-NEXT: vfmadd.vf v8, fa0, v9516; ZVFH-NEXT: ret517;518; ZVFHMIN-LABEL: vfmadd_vf_nxv4f16:519; ZVFHMIN: # %bb.0:520; ZVFHMIN-NEXT: fmv.x.h a0, fa0521; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m1, ta, ma522; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9523; ZVFHMIN-NEXT: vmv.v.x v9, a0524; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8525; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v9526; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma527; ZVFHMIN-NEXT: vfmadd.vv v14, v12, v10528; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma529; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v14530; ZVFHMIN-NEXT: ret531 %head = insertelement <vscale x 4 x half> poison, half %c, i32 0532 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer533 %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> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")534 ret <vscale x 4 x half> %vd535}536 537define <vscale x 8 x half> @vfmadd_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) strictfp {538; ZVFH-LABEL: vfmadd_vv_nxv8f16:539; ZVFH: # %bb.0:540; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma541; ZVFH-NEXT: vfmacc.vv v8, v12, v10542; ZVFH-NEXT: ret543;544; ZVFHMIN-LABEL: vfmadd_vv_nxv8f16:545; ZVFHMIN: # %bb.0:546; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma547; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8548; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v12549; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10550; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma551; ZVFHMIN-NEXT: vfmadd.vv v12, v20, v16552; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma553; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12554; ZVFHMIN-NEXT: ret555 %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> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")556 ret <vscale x 8 x half> %vd557}558 559define <vscale x 8 x half> @vfmadd_vf_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, half %c) strictfp {560; ZVFH-LABEL: vfmadd_vf_nxv8f16:561; ZVFH: # %bb.0:562; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma563; ZVFH-NEXT: vfmacc.vf v8, fa0, v10564; ZVFH-NEXT: ret565;566; ZVFHMIN-LABEL: vfmadd_vf_nxv8f16:567; ZVFHMIN: # %bb.0:568; ZVFHMIN-NEXT: fmv.x.h a0, fa0569; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m2, ta, ma570; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8571; ZVFHMIN-NEXT: vmv.v.x v8, a0572; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v10573; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v8574; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma575; ZVFHMIN-NEXT: vfmadd.vv v20, v16, v12576; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma577; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v20578; ZVFHMIN-NEXT: ret579 %head = insertelement <vscale x 8 x half> poison, half %c, i32 0580 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer581 %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> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")582 ret <vscale x 8 x half> %vd583}584 585define <vscale x 16 x half> @vfmadd_vv_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) strictfp {586; ZVFH-LABEL: vfmadd_vv_nxv16f16:587; ZVFH: # %bb.0:588; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma589; ZVFH-NEXT: vfmadd.vv v8, v16, v12590; ZVFH-NEXT: ret591;592; ZVFHMIN-LABEL: vfmadd_vv_nxv16f16:593; ZVFHMIN: # %bb.0:594; ZVFHMIN-NEXT: addi sp, sp, -16595; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16596; ZVFHMIN-NEXT: csrr a0, vlenb597; ZVFHMIN-NEXT: slli a0, a0, 2598; ZVFHMIN-NEXT: sub sp, sp, a0599; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x04, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 4 * vlenb600; ZVFHMIN-NEXT: addi a0, sp, 16601; ZVFHMIN-NEXT: vs4r.v v16, (a0) # vscale x 32-byte Folded Spill602; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma603; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12604; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8605; ZVFHMIN-NEXT: addi a0, sp, 16606; ZVFHMIN-NEXT: vl4r.v v8, (a0) # vscale x 32-byte Folded Reload607; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v8608; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma609; ZVFHMIN-NEXT: vfmadd.vv v24, v0, v16610; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma611; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v24612; ZVFHMIN-NEXT: csrr a0, vlenb613; ZVFHMIN-NEXT: slli a0, a0, 2614; ZVFHMIN-NEXT: add sp, sp, a0615; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16616; ZVFHMIN-NEXT: addi sp, sp, 16617; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0618; ZVFHMIN-NEXT: ret619 %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> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")620 ret <vscale x 16 x half> %vd621}622 623define <vscale x 16 x half> @vfmadd_vf_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, half %c) strictfp {624; ZVFH-LABEL: vfmadd_vf_nxv16f16:625; ZVFH: # %bb.0:626; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma627; ZVFH-NEXT: vfmadd.vf v8, fa0, v12628; ZVFH-NEXT: ret629;630; ZVFHMIN-LABEL: vfmadd_vf_nxv16f16:631; ZVFHMIN: # %bb.0:632; ZVFHMIN-NEXT: fmv.x.h a0, fa0633; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma634; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12635; ZVFHMIN-NEXT: vmv.v.x v12, a0636; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v8637; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v12638; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma639; ZVFHMIN-NEXT: vfmadd.vv v0, v24, v16640; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma641; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v0642; ZVFHMIN-NEXT: ret643 %head = insertelement <vscale x 16 x half> poison, half %c, i32 0644 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer645 %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> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")646 ret <vscale x 16 x half> %vd647}648 649define <vscale x 32 x half> @vfmadd_vv_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, <vscale x 32 x half> %vc) strictfp {650; ZVFH-LABEL: vfmadd_vv_nxv32f16:651; ZVFH: # %bb.0:652; ZVFH-NEXT: vl8re16.v v24, (a0)653; ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma654; ZVFH-NEXT: vfmacc.vv v8, v16, v24655; ZVFH-NEXT: ret656;657; ZVFHMIN-LABEL: vfmadd_vv_nxv32f16:658; ZVFHMIN: # %bb.0:659; ZVFHMIN-NEXT: addi sp, sp, -16660; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16661; ZVFHMIN-NEXT: csrr a1, vlenb662; ZVFHMIN-NEXT: slli a1, a1, 5663; ZVFHMIN-NEXT: sub sp, sp, a1664; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb665; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma666; ZVFHMIN-NEXT: vmv8r.v v0, v16667; ZVFHMIN-NEXT: csrr a1, vlenb668; ZVFHMIN-NEXT: slli a1, a1, 3669; ZVFHMIN-NEXT: add a1, sp, a1670; ZVFHMIN-NEXT: addi a1, a1, 16671; ZVFHMIN-NEXT: vs8r.v v16, (a1) # vscale x 64-byte Folded Spill672; ZVFHMIN-NEXT: vl8re16.v v16, (a0)673; ZVFHMIN-NEXT: csrr a0, vlenb674; ZVFHMIN-NEXT: li a1, 24675; ZVFHMIN-NEXT: mul a0, a0, a1676; ZVFHMIN-NEXT: add a0, sp, a0677; ZVFHMIN-NEXT: addi a0, a0, 16678; ZVFHMIN-NEXT: vs8r.v v16, (a0) # vscale x 64-byte Folded Spill679; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v8680; ZVFHMIN-NEXT: csrr a0, vlenb681; ZVFHMIN-NEXT: slli a0, a0, 4682; ZVFHMIN-NEXT: add a0, sp, a0683; ZVFHMIN-NEXT: addi a0, a0, 16684; ZVFHMIN-NEXT: vs8r.v v24, (a0) # vscale x 64-byte Folded Spill685; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v0686; ZVFHMIN-NEXT: addi a0, sp, 16687; ZVFHMIN-NEXT: vs8r.v v16, (a0) # vscale x 64-byte Folded Spill688; ZVFHMIN-NEXT: csrr a0, vlenb689; ZVFHMIN-NEXT: li a1, 24690; ZVFHMIN-NEXT: mul a0, a0, a1691; ZVFHMIN-NEXT: add a0, sp, a0692; ZVFHMIN-NEXT: addi a0, a0, 16693; ZVFHMIN-NEXT: vl8r.v v16, (a0) # vscale x 64-byte Folded Reload694; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v16695; ZVFHMIN-NEXT: csrr a0, vlenb696; ZVFHMIN-NEXT: slli a0, a0, 4697; ZVFHMIN-NEXT: add a0, sp, a0698; ZVFHMIN-NEXT: addi a0, a0, 16699; ZVFHMIN-NEXT: vl8r.v v24, (a0) # vscale x 64-byte Folded Reload700; ZVFHMIN-NEXT: addi a0, sp, 16701; ZVFHMIN-NEXT: vl8r.v v16, (a0) # vscale x 64-byte Folded Reload702; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma703; ZVFHMIN-NEXT: vfmadd.vv v0, v16, v24704; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma705; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12706; ZVFHMIN-NEXT: csrr a0, vlenb707; ZVFHMIN-NEXT: slli a0, a0, 4708; ZVFHMIN-NEXT: add a0, sp, a0709; ZVFHMIN-NEXT: addi a0, a0, 16710; ZVFHMIN-NEXT: vs8r.v v24, (a0) # vscale x 64-byte Folded Spill711; ZVFHMIN-NEXT: csrr a0, vlenb712; ZVFHMIN-NEXT: slli a0, a0, 3713; ZVFHMIN-NEXT: add a0, sp, a0714; ZVFHMIN-NEXT: addi a0, a0, 16715; ZVFHMIN-NEXT: vl8r.v v24, (a0) # vscale x 64-byte Folded Reload716; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v28717; ZVFHMIN-NEXT: csrr a0, vlenb718; ZVFHMIN-NEXT: li a1, 24719; ZVFHMIN-NEXT: mul a0, a0, a1720; ZVFHMIN-NEXT: add a0, sp, a0721; ZVFHMIN-NEXT: addi a0, a0, 16722; ZVFHMIN-NEXT: vl8r.v v24, (a0) # vscale x 64-byte Folded Reload723; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v28724; ZVFHMIN-NEXT: csrr a0, vlenb725; ZVFHMIN-NEXT: slli a0, a0, 4726; ZVFHMIN-NEXT: add a0, sp, a0727; ZVFHMIN-NEXT: addi a0, a0, 16728; ZVFHMIN-NEXT: vl8r.v v24, (a0) # vscale x 64-byte Folded Reload729; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma730; ZVFHMIN-NEXT: vfmadd.vv v16, v8, v24731; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma732; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v0733; ZVFHMIN-NEXT: vfncvt.f.f.w v12, v16734; ZVFHMIN-NEXT: csrr a0, vlenb735; ZVFHMIN-NEXT: slli a0, a0, 5736; ZVFHMIN-NEXT: add sp, sp, a0737; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16738; ZVFHMIN-NEXT: addi sp, sp, 16739; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0740; ZVFHMIN-NEXT: ret741 %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> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")742 ret <vscale x 32 x half> %vd743}744 745define <vscale x 32 x half> @vfmadd_vf_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, half %c) strictfp {746; ZVFH-LABEL: vfmadd_vf_nxv32f16:747; ZVFH: # %bb.0:748; ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma749; ZVFH-NEXT: vfmacc.vf v8, fa0, v16750; ZVFH-NEXT: ret751;752; ZVFHMIN-LABEL: vfmadd_vf_nxv32f16:753; ZVFHMIN: # %bb.0:754; ZVFHMIN-NEXT: addi sp, sp, -16755; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16756; ZVFHMIN-NEXT: csrr a0, vlenb757; ZVFHMIN-NEXT: slli a0, a0, 5758; ZVFHMIN-NEXT: sub sp, sp, a0759; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb760; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma761; ZVFHMIN-NEXT: vmv8r.v v24, v16762; ZVFHMIN-NEXT: csrr a0, vlenb763; ZVFHMIN-NEXT: li a1, 24764; ZVFHMIN-NEXT: mul a0, a0, a1765; ZVFHMIN-NEXT: add a0, sp, a0766; ZVFHMIN-NEXT: addi a0, a0, 16767; ZVFHMIN-NEXT: vs8r.v v16, (a0) # vscale x 64-byte Folded Spill768; ZVFHMIN-NEXT: fmv.x.h a0, fa0769; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8770; ZVFHMIN-NEXT: csrr a1, vlenb771; ZVFHMIN-NEXT: slli a1, a1, 4772; ZVFHMIN-NEXT: add a1, sp, a1773; ZVFHMIN-NEXT: addi a1, a1, 16774; ZVFHMIN-NEXT: vs8r.v v16, (a1) # vscale x 64-byte Folded Spill775; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v24776; ZVFHMIN-NEXT: csrr a1, vlenb777; ZVFHMIN-NEXT: slli a1, a1, 3778; ZVFHMIN-NEXT: add a1, sp, a1779; ZVFHMIN-NEXT: addi a1, a1, 16780; ZVFHMIN-NEXT: vs8r.v v16, (a1) # vscale x 64-byte Folded Spill781; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m8, ta, ma782; ZVFHMIN-NEXT: vmv.v.x v16, a0783; ZVFHMIN-NEXT: addi a0, sp, 16784; ZVFHMIN-NEXT: vs8r.v v16, (a0) # vscale x 64-byte Folded Spill785; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma786; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16787; ZVFHMIN-NEXT: csrr a0, vlenb788; ZVFHMIN-NEXT: slli a0, a0, 4789; ZVFHMIN-NEXT: add a0, sp, a0790; ZVFHMIN-NEXT: addi a0, a0, 16791; ZVFHMIN-NEXT: vl8r.v v16, (a0) # vscale x 64-byte Folded Reload792; ZVFHMIN-NEXT: csrr a0, vlenb793; ZVFHMIN-NEXT: slli a0, a0, 3794; ZVFHMIN-NEXT: add a0, sp, a0795; ZVFHMIN-NEXT: addi a0, a0, 16796; ZVFHMIN-NEXT: vl8r.v v0, (a0) # vscale x 64-byte Folded Reload797; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma798; ZVFHMIN-NEXT: vfmadd.vv v24, v0, v16799; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma800; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12801; ZVFHMIN-NEXT: csrr a0, vlenb802; ZVFHMIN-NEXT: slli a0, a0, 4803; ZVFHMIN-NEXT: add a0, sp, a0804; ZVFHMIN-NEXT: addi a0, a0, 16805; ZVFHMIN-NEXT: vs8r.v v16, (a0) # vscale x 64-byte Folded Spill806; ZVFHMIN-NEXT: csrr a0, vlenb807; ZVFHMIN-NEXT: li a1, 24808; ZVFHMIN-NEXT: mul a0, a0, a1809; ZVFHMIN-NEXT: add a0, sp, a0810; ZVFHMIN-NEXT: addi a0, a0, 16811; ZVFHMIN-NEXT: vl8r.v v8, (a0) # vscale x 64-byte Folded Reload812; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12813; ZVFHMIN-NEXT: addi a0, sp, 16814; ZVFHMIN-NEXT: vl8r.v v0, (a0) # vscale x 64-byte Folded Reload815; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v4816; ZVFHMIN-NEXT: csrr a0, vlenb817; ZVFHMIN-NEXT: slli a0, a0, 4818; ZVFHMIN-NEXT: add a0, sp, a0819; ZVFHMIN-NEXT: addi a0, a0, 16820; ZVFHMIN-NEXT: vl8r.v v0, (a0) # vscale x 64-byte Folded Reload821; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma822; ZVFHMIN-NEXT: vfmadd.vv v16, v8, v0823; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma824; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v24825; ZVFHMIN-NEXT: vfncvt.f.f.w v12, v16826; ZVFHMIN-NEXT: csrr a0, vlenb827; ZVFHMIN-NEXT: slli a0, a0, 5828; ZVFHMIN-NEXT: add sp, sp, a0829; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16830; ZVFHMIN-NEXT: addi sp, sp, 16831; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0832; ZVFHMIN-NEXT: ret833 %head = insertelement <vscale x 32 x half> poison, half %c, i32 0834 %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer835 %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> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")836 ret <vscale x 32 x half> %vd837}838 839define <vscale x 1 x float> @vfmadd_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) strictfp {840; CHECK-LABEL: vfmadd_vv_nxv1f32:841; CHECK: # %bb.0:842; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma843; CHECK-NEXT: vfmadd.vv v8, v9, v10844; CHECK-NEXT: ret845 %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> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")846 ret <vscale x 1 x float> %vd847}848 849define <vscale x 1 x float> @vfmadd_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, float %c) strictfp {850; CHECK-LABEL: vfmadd_vf_nxv1f32:851; CHECK: # %bb.0:852; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma853; CHECK-NEXT: vfmadd.vf v8, fa0, v9854; CHECK-NEXT: ret855 %head = insertelement <vscale x 1 x float> poison, float %c, i32 0856 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer857 %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> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")858 ret <vscale x 1 x float> %vd859}860 861define <vscale x 2 x float> @vfmadd_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) strictfp {862; CHECK-LABEL: vfmadd_vv_nxv2f32:863; CHECK: # %bb.0:864; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma865; CHECK-NEXT: vfmadd.vv v8, v10, v9866; CHECK-NEXT: ret867 %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> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")868 ret <vscale x 2 x float> %vd869}870 871define <vscale x 2 x float> @vfmadd_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, float %c) strictfp {872; CHECK-LABEL: vfmadd_vf_nxv2f32:873; CHECK: # %bb.0:874; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma875; CHECK-NEXT: vfmacc.vf v8, fa0, v9876; CHECK-NEXT: ret877 %head = insertelement <vscale x 2 x float> poison, float %c, i32 0878 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer879 %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> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")880 ret <vscale x 2 x float> %vd881}882 883define <vscale x 4 x float> @vfmadd_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) strictfp {884; CHECK-LABEL: vfmadd_vv_nxv4f32:885; CHECK: # %bb.0:886; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma887; CHECK-NEXT: vfmadd.vv v8, v10, v12888; CHECK-NEXT: ret889 %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> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")890 ret <vscale x 4 x float> %vd891}892 893define <vscale x 4 x float> @vfmadd_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, float %c) strictfp {894; CHECK-LABEL: vfmadd_vf_nxv4f32:895; CHECK: # %bb.0:896; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma897; CHECK-NEXT: vfmadd.vf v8, fa0, v10898; CHECK-NEXT: ret899 %head = insertelement <vscale x 4 x float> poison, float %c, i32 0900 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer901 %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> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")902 ret <vscale x 4 x float> %vd903}904 905define <vscale x 8 x float> @vfmadd_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) strictfp {906; CHECK-LABEL: vfmadd_vv_nxv8f32:907; CHECK: # %bb.0:908; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma909; CHECK-NEXT: vfmacc.vv v8, v16, v12910; CHECK-NEXT: ret911 %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> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")912 ret <vscale x 8 x float> %vd913}914 915define <vscale x 8 x float> @vfmadd_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, float %c) strictfp {916; CHECK-LABEL: vfmadd_vf_nxv8f32:917; CHECK: # %bb.0:918; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma919; CHECK-NEXT: vfmacc.vf v8, fa0, v12920; CHECK-NEXT: ret921 %head = insertelement <vscale x 8 x float> poison, float %c, i32 0922 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer923 %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> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")924 ret <vscale x 8 x float> %vd925}926 927define <vscale x 16 x float> @vfmadd_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, <vscale x 16 x float> %vc) strictfp {928; CHECK-LABEL: vfmadd_vv_nxv16f32:929; CHECK: # %bb.0:930; CHECK-NEXT: vl8re32.v v24, (a0)931; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma932; CHECK-NEXT: vfmadd.vv v8, v24, v16933; CHECK-NEXT: ret934 %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> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")935 ret <vscale x 16 x float> %vd936}937 938define <vscale x 16 x float> @vfmadd_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, float %c) strictfp {939; CHECK-LABEL: vfmadd_vf_nxv16f32:940; CHECK: # %bb.0:941; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma942; CHECK-NEXT: vfmadd.vf v8, fa0, v16943; CHECK-NEXT: ret944 %head = insertelement <vscale x 16 x float> poison, float %c, i32 0945 %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer946 %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> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")947 ret <vscale x 16 x float> %vd948}949 950define <vscale x 1 x double> @vfmadd_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x double> %vc) strictfp {951; CHECK-LABEL: vfmadd_vv_nxv1f64:952; CHECK: # %bb.0:953; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma954; CHECK-NEXT: vfmadd.vv v8, v9, v10955; CHECK-NEXT: ret956 %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> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")957 ret <vscale x 1 x double> %vd958}959 960define <vscale x 1 x double> @vfmadd_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, double %c) strictfp {961; CHECK-LABEL: vfmadd_vf_nxv1f64:962; CHECK: # %bb.0:963; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma964; CHECK-NEXT: vfmadd.vf v8, fa0, v9965; CHECK-NEXT: ret966 %head = insertelement <vscale x 1 x double> poison, double %c, i32 0967 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer968 %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> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")969 ret <vscale x 1 x double> %vd970}971 972define <vscale x 2 x double> @vfmadd_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, <vscale x 2 x double> %vc) strictfp {973; CHECK-LABEL: vfmadd_vv_nxv2f64:974; CHECK: # %bb.0:975; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma976; CHECK-NEXT: vfmadd.vv v8, v12, v10977; CHECK-NEXT: ret978 %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> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")979 ret <vscale x 2 x double> %vd980}981 982define <vscale x 2 x double> @vfmadd_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, double %c) strictfp {983; CHECK-LABEL: vfmadd_vf_nxv2f64:984; CHECK: # %bb.0:985; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma986; CHECK-NEXT: vfmacc.vf v8, fa0, v10987; CHECK-NEXT: ret988 %head = insertelement <vscale x 2 x double> poison, double %c, i32 0989 %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer990 %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> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")991 ret <vscale x 2 x double> %vd992}993 994define <vscale x 4 x double> @vfmadd_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, <vscale x 4 x double> %vc) strictfp {995; CHECK-LABEL: vfmadd_vv_nxv4f64:996; CHECK: # %bb.0:997; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma998; CHECK-NEXT: vfmadd.vv v8, v12, v16999; CHECK-NEXT: ret1000 %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> %vc, metadata !"round.dynamic", metadata !"fpexcept.strict")1001 ret <vscale x 4 x double> %vd1002}1003 1004define <vscale x 4 x double> @vfmadd_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, double %c) strictfp {1005; CHECK-LABEL: vfmadd_vf_nxv4f64:1006; CHECK: # %bb.0:1007; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma1008; CHECK-NEXT: vfmadd.vf v8, fa0, v121009; CHECK-NEXT: ret1010 %head = insertelement <vscale x 4 x double> poison, double %c, i32 01011 %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer1012 %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> %vb, metadata !"round.dynamic", metadata !"fpexcept.strict")1013 ret <vscale x 4 x double> %vd1014}1015 1016define <vscale x 8 x double> @vfmadd_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, <vscale x 8 x double> %vc) strictfp {1017; CHECK-LABEL: vfmadd_vv_nxv8f64:1018; CHECK: # %bb.0:1019; CHECK-NEXT: vl8re64.v v24, (a0)1020; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma1021; CHECK-NEXT: vfmacc.vv v8, v16, v241022; CHECK-NEXT: ret1023 %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> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")1024 ret <vscale x 8 x double> %vd1025}1026 1027define <vscale x 8 x double> @vfmadd_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, double %c) strictfp {1028; CHECK-LABEL: vfmadd_vf_nxv8f64:1029; CHECK: # %bb.0:1030; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma1031; CHECK-NEXT: vfmacc.vf v8, fa0, v161032; CHECK-NEXT: ret1033 %head = insertelement <vscale x 8 x double> poison, double %c, i32 01034 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer1035 %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> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")1036 ret <vscale x 8 x double> %vd1037}1038