963 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zfh,+zvfh,+v -target-abi=ilp32d \3; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH4; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+zfh,+zvfh,+v -target-abi=lp64d \5; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH6; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zfh,+zvfhmin,+v -target-abi=ilp32d \7; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN8; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+zfh,+zvfhmin,+v -target-abi=lp64d \9; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN10 11define <2 x half> @vfma_vv_v2f16(<2 x half> %va, <2 x half> %b, <2 x half> %c, <2 x i1> %m, i32 zeroext %evl) {12; ZVFH-LABEL: vfma_vv_v2f16:13; ZVFH: # %bb.0:14; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma15; ZVFH-NEXT: vfmadd.vv v9, v8, v10, v0.t16; ZVFH-NEXT: vmv1r.v v8, v917; ZVFH-NEXT: ret18;19; ZVFHMIN-LABEL: vfma_vv_v2f16:20; ZVFHMIN: # %bb.0:21; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma22; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v10, v0.t23; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8, v0.t24; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9, v0.t25; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma26; ZVFHMIN-NEXT: vfmadd.vv v12, v10, v11, v0.t27; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma28; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12, v0.t29; ZVFHMIN-NEXT: ret30 %v = call <2 x half> @llvm.vp.fma.v2f16(<2 x half> %va, <2 x half> %b, <2 x half> %c, <2 x i1> %m, i32 %evl)31 ret <2 x half> %v32}33 34define <2 x half> @vfma_vv_v2f16_unmasked(<2 x half> %va, <2 x half> %b, <2 x half> %c, i32 zeroext %evl) {35; ZVFH-LABEL: vfma_vv_v2f16_unmasked:36; ZVFH: # %bb.0:37; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma38; ZVFH-NEXT: vfmadd.vv v8, v9, v1039; ZVFH-NEXT: ret40;41; ZVFHMIN-LABEL: vfma_vv_v2f16_unmasked:42; ZVFHMIN: # %bb.0:43; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma44; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v1045; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v846; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v947; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma48; ZVFHMIN-NEXT: vfmadd.vv v12, v10, v1149; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma50; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v1251; ZVFHMIN-NEXT: ret52 %v = call <2 x half> @llvm.vp.fma.v2f16(<2 x half> %va, <2 x half> %b, <2 x half> %c, <2 x i1> splat (i1 true), i32 %evl)53 ret <2 x half> %v54}55 56define <2 x half> @vfma_vf_v2f16(<2 x half> %va, half %b, <2 x half> %vc, <2 x i1> %m, i32 zeroext %evl) {57; ZVFH-LABEL: vfma_vf_v2f16:58; ZVFH: # %bb.0:59; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma60; ZVFH-NEXT: vfmadd.vf v8, fa0, v9, v0.t61; ZVFH-NEXT: ret62;63; ZVFHMIN-LABEL: vfma_vf_v2f16:64; ZVFHMIN: # %bb.0:65; ZVFHMIN-NEXT: fmv.x.h a1, fa066; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma67; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9, v0.t68; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma69; ZVFHMIN-NEXT: vmv.v.x v9, a170; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma71; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8, v0.t72; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9, v0.t73; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma74; ZVFHMIN-NEXT: vfmadd.vv v12, v11, v10, v0.t75; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma76; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12, v0.t77; ZVFHMIN-NEXT: ret78 %elt.head = insertelement <2 x half> poison, half %b, i32 079 %vb = shufflevector <2 x half> %elt.head, <2 x half> poison, <2 x i32> zeroinitializer80 %v = call <2 x half> @llvm.vp.fma.v2f16(<2 x half> %va, <2 x half> %vb, <2 x half> %vc, <2 x i1> %m, i32 %evl)81 ret <2 x half> %v82}83 84define <2 x half> @vfma_vf_v2f16_unmasked(<2 x half> %va, half %b, <2 x half> %vc, i32 zeroext %evl) {85; ZVFH-LABEL: vfma_vf_v2f16_unmasked:86; ZVFH: # %bb.0:87; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma88; ZVFH-NEXT: vfmadd.vf v8, fa0, v989; ZVFH-NEXT: ret90;91; ZVFHMIN-LABEL: vfma_vf_v2f16_unmasked:92; ZVFHMIN: # %bb.0:93; ZVFHMIN-NEXT: fmv.x.h a1, fa094; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma95; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v996; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma97; ZVFHMIN-NEXT: vmv.v.x v9, a198; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma99; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8100; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9101; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma102; ZVFHMIN-NEXT: vfmadd.vv v12, v11, v10103; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma104; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12105; ZVFHMIN-NEXT: ret106 %elt.head = insertelement <2 x half> poison, half %b, i32 0107 %vb = shufflevector <2 x half> %elt.head, <2 x half> poison, <2 x i32> zeroinitializer108 %v = call <2 x half> @llvm.vp.fma.v2f16(<2 x half> %va, <2 x half> %vb, <2 x half> %vc, <2 x i1> splat (i1 true), i32 %evl)109 ret <2 x half> %v110}111 112define <4 x half> @vfma_vv_v4f16(<4 x half> %va, <4 x half> %b, <4 x half> %c, <4 x i1> %m, i32 zeroext %evl) {113; ZVFH-LABEL: vfma_vv_v4f16:114; ZVFH: # %bb.0:115; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma116; ZVFH-NEXT: vfmadd.vv v9, v8, v10, v0.t117; ZVFH-NEXT: vmv1r.v v8, v9118; ZVFH-NEXT: ret119;120; ZVFHMIN-LABEL: vfma_vv_v4f16:121; ZVFHMIN: # %bb.0:122; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma123; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v10, v0.t124; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8, v0.t125; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9, v0.t126; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma127; ZVFHMIN-NEXT: vfmadd.vv v12, v10, v11, v0.t128; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma129; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12, v0.t130; ZVFHMIN-NEXT: ret131 %v = call <4 x half> @llvm.vp.fma.v4f16(<4 x half> %va, <4 x half> %b, <4 x half> %c, <4 x i1> %m, i32 %evl)132 ret <4 x half> %v133}134 135define <4 x half> @vfma_vv_v4f16_unmasked(<4 x half> %va, <4 x half> %b, <4 x half> %c, i32 zeroext %evl) {136; ZVFH-LABEL: vfma_vv_v4f16_unmasked:137; ZVFH: # %bb.0:138; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma139; ZVFH-NEXT: vfmadd.vv v8, v9, v10140; ZVFH-NEXT: ret141;142; ZVFHMIN-LABEL: vfma_vv_v4f16_unmasked:143; ZVFHMIN: # %bb.0:144; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma145; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v10146; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8147; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9148; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma149; ZVFHMIN-NEXT: vfmadd.vv v12, v10, v11150; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma151; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12152; ZVFHMIN-NEXT: ret153 %v = call <4 x half> @llvm.vp.fma.v4f16(<4 x half> %va, <4 x half> %b, <4 x half> %c, <4 x i1> splat (i1 true), i32 %evl)154 ret <4 x half> %v155}156 157define <4 x half> @vfma_vf_v4f16(<4 x half> %va, half %b, <4 x half> %vc, <4 x i1> %m, i32 zeroext %evl) {158; ZVFH-LABEL: vfma_vf_v4f16:159; ZVFH: # %bb.0:160; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma161; ZVFH-NEXT: vfmadd.vf v8, fa0, v9, v0.t162; ZVFH-NEXT: ret163;164; ZVFHMIN-LABEL: vfma_vf_v4f16:165; ZVFHMIN: # %bb.0:166; ZVFHMIN-NEXT: fmv.x.h a1, fa0167; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma168; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9, v0.t169; ZVFHMIN-NEXT: vsetivli zero, 4, e16, mf2, ta, ma170; ZVFHMIN-NEXT: vmv.v.x v9, a1171; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma172; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8, v0.t173; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9, v0.t174; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma175; ZVFHMIN-NEXT: vfmadd.vv v12, v11, v10, v0.t176; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma177; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12, v0.t178; ZVFHMIN-NEXT: ret179 %elt.head = insertelement <4 x half> poison, half %b, i32 0180 %vb = shufflevector <4 x half> %elt.head, <4 x half> poison, <4 x i32> zeroinitializer181 %v = call <4 x half> @llvm.vp.fma.v4f16(<4 x half> %va, <4 x half> %vb, <4 x half> %vc, <4 x i1> %m, i32 %evl)182 ret <4 x half> %v183}184 185define <4 x half> @vfma_vf_v4f16_unmasked(<4 x half> %va, half %b, <4 x half> %vc, i32 zeroext %evl) {186; ZVFH-LABEL: vfma_vf_v4f16_unmasked:187; ZVFH: # %bb.0:188; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma189; ZVFH-NEXT: vfmadd.vf v8, fa0, v9190; ZVFH-NEXT: ret191;192; ZVFHMIN-LABEL: vfma_vf_v4f16_unmasked:193; ZVFHMIN: # %bb.0:194; ZVFHMIN-NEXT: fmv.x.h a1, fa0195; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma196; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9197; ZVFHMIN-NEXT: vsetivli zero, 4, e16, mf2, ta, ma198; ZVFHMIN-NEXT: vmv.v.x v9, a1199; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma200; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8201; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9202; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma203; ZVFHMIN-NEXT: vfmadd.vv v12, v11, v10204; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma205; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12206; ZVFHMIN-NEXT: ret207 %elt.head = insertelement <4 x half> poison, half %b, i32 0208 %vb = shufflevector <4 x half> %elt.head, <4 x half> poison, <4 x i32> zeroinitializer209 %v = call <4 x half> @llvm.vp.fma.v4f16(<4 x half> %va, <4 x half> %vb, <4 x half> %vc, <4 x i1> splat (i1 true), i32 %evl)210 ret <4 x half> %v211}212 213define <8 x half> @vfma_vv_v8f16(<8 x half> %va, <8 x half> %b, <8 x half> %c, <8 x i1> %m, i32 zeroext %evl) {214; ZVFH-LABEL: vfma_vv_v8f16:215; ZVFH: # %bb.0:216; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma217; ZVFH-NEXT: vfmadd.vv v9, v8, v10, v0.t218; ZVFH-NEXT: vmv.v.v v8, v9219; ZVFH-NEXT: ret220;221; ZVFHMIN-LABEL: vfma_vv_v8f16:222; ZVFHMIN: # %bb.0:223; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma224; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10, v0.t225; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8, v0.t226; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v9, v0.t227; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma228; ZVFHMIN-NEXT: vfmadd.vv v14, v10, v12, v0.t229; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma230; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v14, v0.t231; ZVFHMIN-NEXT: ret232 %v = call <8 x half> @llvm.vp.fma.v8f16(<8 x half> %va, <8 x half> %b, <8 x half> %c, <8 x i1> %m, i32 %evl)233 ret <8 x half> %v234}235 236define <8 x half> @vfma_vv_v8f16_unmasked(<8 x half> %va, <8 x half> %b, <8 x half> %c, i32 zeroext %evl) {237; ZVFH-LABEL: vfma_vv_v8f16_unmasked:238; ZVFH: # %bb.0:239; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma240; ZVFH-NEXT: vfmadd.vv v8, v9, v10241; ZVFH-NEXT: ret242;243; ZVFHMIN-LABEL: vfma_vv_v8f16_unmasked:244; ZVFHMIN: # %bb.0:245; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma246; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10247; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8248; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v9249; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma250; ZVFHMIN-NEXT: vfmadd.vv v14, v10, v12251; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma252; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v14253; ZVFHMIN-NEXT: ret254 %v = call <8 x half> @llvm.vp.fma.v8f16(<8 x half> %va, <8 x half> %b, <8 x half> %c, <8 x i1> splat (i1 true), i32 %evl)255 ret <8 x half> %v256}257 258define <8 x half> @vfma_vf_v8f16(<8 x half> %va, half %b, <8 x half> %vc, <8 x i1> %m, i32 zeroext %evl) {259; ZVFH-LABEL: vfma_vf_v8f16:260; ZVFH: # %bb.0:261; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma262; ZVFH-NEXT: vfmadd.vf v8, fa0, v9, v0.t263; ZVFH-NEXT: ret264;265; ZVFHMIN-LABEL: vfma_vf_v8f16:266; ZVFHMIN: # %bb.0:267; ZVFHMIN-NEXT: fmv.x.h a1, fa0268; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma269; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9, v0.t270; ZVFHMIN-NEXT: vsetivli zero, 8, e16, m1, ta, ma271; ZVFHMIN-NEXT: vmv.v.x v9, a1272; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma273; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8, v0.t274; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v9, v0.t275; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma276; ZVFHMIN-NEXT: vfmadd.vv v14, v12, v10, v0.t277; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma278; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v14, v0.t279; ZVFHMIN-NEXT: ret280 %elt.head = insertelement <8 x half> poison, half %b, i32 0281 %vb = shufflevector <8 x half> %elt.head, <8 x half> poison, <8 x i32> zeroinitializer282 %v = call <8 x half> @llvm.vp.fma.v8f16(<8 x half> %va, <8 x half> %vb, <8 x half> %vc, <8 x i1> %m, i32 %evl)283 ret <8 x half> %v284}285 286define <8 x half> @vfma_vf_v8f16_unmasked(<8 x half> %va, half %b, <8 x half> %vc, i32 zeroext %evl) {287; ZVFH-LABEL: vfma_vf_v8f16_unmasked:288; ZVFH: # %bb.0:289; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma290; ZVFH-NEXT: vfmadd.vf v8, fa0, v9291; ZVFH-NEXT: ret292;293; ZVFHMIN-LABEL: vfma_vf_v8f16_unmasked:294; ZVFHMIN: # %bb.0:295; ZVFHMIN-NEXT: fmv.x.h a1, fa0296; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma297; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9298; ZVFHMIN-NEXT: vsetivli zero, 8, e16, m1, ta, ma299; ZVFHMIN-NEXT: vmv.v.x v9, a1300; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma301; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8302; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v9303; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma304; ZVFHMIN-NEXT: vfmadd.vv v14, v12, v10305; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma306; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v14307; ZVFHMIN-NEXT: ret308 %elt.head = insertelement <8 x half> poison, half %b, i32 0309 %vb = shufflevector <8 x half> %elt.head, <8 x half> poison, <8 x i32> zeroinitializer310 %v = call <8 x half> @llvm.vp.fma.v8f16(<8 x half> %va, <8 x half> %vb, <8 x half> %vc, <8 x i1> splat (i1 true), i32 %evl)311 ret <8 x half> %v312}313 314define <16 x half> @vfma_vv_v16f16(<16 x half> %va, <16 x half> %b, <16 x half> %c, <16 x i1> %m, i32 zeroext %evl) {315; ZVFH-LABEL: vfma_vv_v16f16:316; ZVFH: # %bb.0:317; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma318; ZVFH-NEXT: vfmadd.vv v10, v8, v12, v0.t319; ZVFH-NEXT: vmv.v.v v8, v10320; ZVFH-NEXT: ret321;322; ZVFHMIN-LABEL: vfma_vv_v16f16:323; ZVFHMIN: # %bb.0:324; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma325; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12, v0.t326; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8, v0.t327; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v10, v0.t328; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma329; ZVFHMIN-NEXT: vfmadd.vv v20, v12, v16, v0.t330; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma331; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v20, v0.t332; ZVFHMIN-NEXT: ret333 %v = call <16 x half> @llvm.vp.fma.v16f16(<16 x half> %va, <16 x half> %b, <16 x half> %c, <16 x i1> %m, i32 %evl)334 ret <16 x half> %v335}336 337define <16 x half> @vfma_vv_v16f16_unmasked(<16 x half> %va, <16 x half> %b, <16 x half> %c, i32 zeroext %evl) {338; ZVFH-LABEL: vfma_vv_v16f16_unmasked:339; ZVFH: # %bb.0:340; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma341; ZVFH-NEXT: vfmadd.vv v8, v10, v12342; ZVFH-NEXT: ret343;344; ZVFHMIN-LABEL: vfma_vv_v16f16_unmasked:345; ZVFHMIN: # %bb.0:346; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma347; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12348; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8349; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v10350; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma351; ZVFHMIN-NEXT: vfmadd.vv v20, v12, v16352; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma353; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v20354; ZVFHMIN-NEXT: ret355 %v = call <16 x half> @llvm.vp.fma.v16f16(<16 x half> %va, <16 x half> %b, <16 x half> %c, <16 x i1> splat (i1 true), i32 %evl)356 ret <16 x half> %v357}358 359define <16 x half> @vfma_vf_v16f16(<16 x half> %va, half %b, <16 x half> %vc, <16 x i1> %m, i32 zeroext %evl) {360; ZVFH-LABEL: vfma_vf_v16f16:361; ZVFH: # %bb.0:362; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma363; ZVFH-NEXT: vfmadd.vf v8, fa0, v10, v0.t364; ZVFH-NEXT: ret365;366; ZVFHMIN-LABEL: vfma_vf_v16f16:367; ZVFHMIN: # %bb.0:368; ZVFHMIN-NEXT: fmv.x.h a1, fa0369; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma370; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10, v0.t371; ZVFHMIN-NEXT: vsetivli zero, 16, e16, m2, ta, ma372; ZVFHMIN-NEXT: vmv.v.x v10, a1373; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma374; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8, v0.t375; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v10, v0.t376; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma377; ZVFHMIN-NEXT: vfmadd.vv v20, v16, v12, v0.t378; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma379; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v20, v0.t380; ZVFHMIN-NEXT: ret381 %elt.head = insertelement <16 x half> poison, half %b, i32 0382 %vb = shufflevector <16 x half> %elt.head, <16 x half> poison, <16 x i32> zeroinitializer383 %v = call <16 x half> @llvm.vp.fma.v16f16(<16 x half> %va, <16 x half> %vb, <16 x half> %vc, <16 x i1> %m, i32 %evl)384 ret <16 x half> %v385}386 387define <16 x half> @vfma_vf_v16f16_unmasked(<16 x half> %va, half %b, <16 x half> %vc, i32 zeroext %evl) {388; ZVFH-LABEL: vfma_vf_v16f16_unmasked:389; ZVFH: # %bb.0:390; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma391; ZVFH-NEXT: vfmadd.vf v8, fa0, v10392; ZVFH-NEXT: ret393;394; ZVFHMIN-LABEL: vfma_vf_v16f16_unmasked:395; ZVFHMIN: # %bb.0:396; ZVFHMIN-NEXT: fmv.x.h a1, fa0397; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma398; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10399; ZVFHMIN-NEXT: vsetivli zero, 16, e16, m2, ta, ma400; ZVFHMIN-NEXT: vmv.v.x v10, a1401; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma402; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8403; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v10404; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma405; ZVFHMIN-NEXT: vfmadd.vv v20, v16, v12406; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma407; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v20408; ZVFHMIN-NEXT: ret409 %elt.head = insertelement <16 x half> poison, half %b, i32 0410 %vb = shufflevector <16 x half> %elt.head, <16 x half> poison, <16 x i32> zeroinitializer411 %v = call <16 x half> @llvm.vp.fma.v16f16(<16 x half> %va, <16 x half> %vb, <16 x half> %vc, <16 x i1> splat (i1 true), i32 %evl)412 ret <16 x half> %v413}414 415define <2 x float> @vfma_vv_v2f32(<2 x float> %va, <2 x float> %b, <2 x float> %c, <2 x i1> %m, i32 zeroext %evl) {416; CHECK-LABEL: vfma_vv_v2f32:417; CHECK: # %bb.0:418; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma419; CHECK-NEXT: vfmadd.vv v9, v8, v10, v0.t420; CHECK-NEXT: vmv1r.v v8, v9421; CHECK-NEXT: ret422 %v = call <2 x float> @llvm.vp.fma.v2f32(<2 x float> %va, <2 x float> %b, <2 x float> %c, <2 x i1> %m, i32 %evl)423 ret <2 x float> %v424}425 426define <2 x float> @vfma_vv_v2f32_unmasked(<2 x float> %va, <2 x float> %b, <2 x float> %c, i32 zeroext %evl) {427; CHECK-LABEL: vfma_vv_v2f32_unmasked:428; CHECK: # %bb.0:429; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma430; CHECK-NEXT: vfmadd.vv v8, v9, v10431; CHECK-NEXT: ret432 %v = call <2 x float> @llvm.vp.fma.v2f32(<2 x float> %va, <2 x float> %b, <2 x float> %c, <2 x i1> splat (i1 true), i32 %evl)433 ret <2 x float> %v434}435 436define <2 x float> @vfma_vf_v2f32(<2 x float> %va, float %b, <2 x float> %vc, <2 x i1> %m, i32 zeroext %evl) {437; CHECK-LABEL: vfma_vf_v2f32:438; CHECK: # %bb.0:439; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma440; CHECK-NEXT: vfmadd.vf v8, fa0, v9, v0.t441; CHECK-NEXT: ret442 %elt.head = insertelement <2 x float> poison, float %b, i32 0443 %vb = shufflevector <2 x float> %elt.head, <2 x float> poison, <2 x i32> zeroinitializer444 %v = call <2 x float> @llvm.vp.fma.v2f32(<2 x float> %va, <2 x float> %vb, <2 x float> %vc, <2 x i1> %m, i32 %evl)445 ret <2 x float> %v446}447 448define <2 x float> @vfma_vf_v2f32_unmasked(<2 x float> %va, float %b, <2 x float> %vc, i32 zeroext %evl) {449; CHECK-LABEL: vfma_vf_v2f32_unmasked:450; CHECK: # %bb.0:451; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma452; CHECK-NEXT: vfmadd.vf v8, fa0, v9453; CHECK-NEXT: ret454 %elt.head = insertelement <2 x float> poison, float %b, i32 0455 %vb = shufflevector <2 x float> %elt.head, <2 x float> poison, <2 x i32> zeroinitializer456 %v = call <2 x float> @llvm.vp.fma.v2f32(<2 x float> %va, <2 x float> %vb, <2 x float> %vc, <2 x i1> splat (i1 true), i32 %evl)457 ret <2 x float> %v458}459 460define <4 x float> @vfma_vv_v4f32(<4 x float> %va, <4 x float> %b, <4 x float> %c, <4 x i1> %m, i32 zeroext %evl) {461; CHECK-LABEL: vfma_vv_v4f32:462; CHECK: # %bb.0:463; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma464; CHECK-NEXT: vfmadd.vv v9, v8, v10, v0.t465; CHECK-NEXT: vmv.v.v v8, v9466; CHECK-NEXT: ret467 %v = call <4 x float> @llvm.vp.fma.v4f32(<4 x float> %va, <4 x float> %b, <4 x float> %c, <4 x i1> %m, i32 %evl)468 ret <4 x float> %v469}470 471define <4 x float> @vfma_vv_v4f32_unmasked(<4 x float> %va, <4 x float> %b, <4 x float> %c, i32 zeroext %evl) {472; CHECK-LABEL: vfma_vv_v4f32_unmasked:473; CHECK: # %bb.0:474; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma475; CHECK-NEXT: vfmadd.vv v8, v9, v10476; CHECK-NEXT: ret477 %v = call <4 x float> @llvm.vp.fma.v4f32(<4 x float> %va, <4 x float> %b, <4 x float> %c, <4 x i1> splat (i1 true), i32 %evl)478 ret <4 x float> %v479}480 481define <4 x float> @vfma_vf_v4f32(<4 x float> %va, float %b, <4 x float> %vc, <4 x i1> %m, i32 zeroext %evl) {482; CHECK-LABEL: vfma_vf_v4f32:483; CHECK: # %bb.0:484; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma485; CHECK-NEXT: vfmadd.vf v8, fa0, v9, v0.t486; CHECK-NEXT: ret487 %elt.head = insertelement <4 x float> poison, float %b, i32 0488 %vb = shufflevector <4 x float> %elt.head, <4 x float> poison, <4 x i32> zeroinitializer489 %v = call <4 x float> @llvm.vp.fma.v4f32(<4 x float> %va, <4 x float> %vb, <4 x float> %vc, <4 x i1> %m, i32 %evl)490 ret <4 x float> %v491}492 493define <4 x float> @vfma_vf_v4f32_unmasked(<4 x float> %va, float %b, <4 x float> %vc, i32 zeroext %evl) {494; CHECK-LABEL: vfma_vf_v4f32_unmasked:495; CHECK: # %bb.0:496; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma497; CHECK-NEXT: vfmadd.vf v8, fa0, v9498; CHECK-NEXT: ret499 %elt.head = insertelement <4 x float> poison, float %b, i32 0500 %vb = shufflevector <4 x float> %elt.head, <4 x float> poison, <4 x i32> zeroinitializer501 %v = call <4 x float> @llvm.vp.fma.v4f32(<4 x float> %va, <4 x float> %vb, <4 x float> %vc, <4 x i1> splat (i1 true), i32 %evl)502 ret <4 x float> %v503}504 505define <8 x float> @vfma_vv_v8f32(<8 x float> %va, <8 x float> %b, <8 x float> %c, <8 x i1> %m, i32 zeroext %evl) {506; CHECK-LABEL: vfma_vv_v8f32:507; CHECK: # %bb.0:508; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma509; CHECK-NEXT: vfmadd.vv v10, v8, v12, v0.t510; CHECK-NEXT: vmv.v.v v8, v10511; CHECK-NEXT: ret512 %v = call <8 x float> @llvm.vp.fma.v8f32(<8 x float> %va, <8 x float> %b, <8 x float> %c, <8 x i1> %m, i32 %evl)513 ret <8 x float> %v514}515 516define <8 x float> @vfma_vv_v8f32_unmasked(<8 x float> %va, <8 x float> %b, <8 x float> %c, i32 zeroext %evl) {517; CHECK-LABEL: vfma_vv_v8f32_unmasked:518; CHECK: # %bb.0:519; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma520; CHECK-NEXT: vfmadd.vv v8, v10, v12521; CHECK-NEXT: ret522 %v = call <8 x float> @llvm.vp.fma.v8f32(<8 x float> %va, <8 x float> %b, <8 x float> %c, <8 x i1> splat (i1 true), i32 %evl)523 ret <8 x float> %v524}525 526define <8 x float> @vfma_vf_v8f32(<8 x float> %va, float %b, <8 x float> %vc, <8 x i1> %m, i32 zeroext %evl) {527; CHECK-LABEL: vfma_vf_v8f32:528; CHECK: # %bb.0:529; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma530; CHECK-NEXT: vfmadd.vf v8, fa0, v10, v0.t531; CHECK-NEXT: ret532 %elt.head = insertelement <8 x float> poison, float %b, i32 0533 %vb = shufflevector <8 x float> %elt.head, <8 x float> poison, <8 x i32> zeroinitializer534 %v = call <8 x float> @llvm.vp.fma.v8f32(<8 x float> %va, <8 x float> %vb, <8 x float> %vc, <8 x i1> %m, i32 %evl)535 ret <8 x float> %v536}537 538define <8 x float> @vfma_vf_v8f32_unmasked(<8 x float> %va, float %b, <8 x float> %vc, i32 zeroext %evl) {539; CHECK-LABEL: vfma_vf_v8f32_unmasked:540; CHECK: # %bb.0:541; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma542; CHECK-NEXT: vfmadd.vf v8, fa0, v10543; CHECK-NEXT: ret544 %elt.head = insertelement <8 x float> poison, float %b, i32 0545 %vb = shufflevector <8 x float> %elt.head, <8 x float> poison, <8 x i32> zeroinitializer546 %v = call <8 x float> @llvm.vp.fma.v8f32(<8 x float> %va, <8 x float> %vb, <8 x float> %vc, <8 x i1> splat (i1 true), i32 %evl)547 ret <8 x float> %v548}549 550define <16 x float> @vfma_vv_v16f32(<16 x float> %va, <16 x float> %b, <16 x float> %c, <16 x i1> %m, i32 zeroext %evl) {551; CHECK-LABEL: vfma_vv_v16f32:552; CHECK: # %bb.0:553; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma554; CHECK-NEXT: vfmadd.vv v12, v8, v16, v0.t555; CHECK-NEXT: vmv.v.v v8, v12556; CHECK-NEXT: ret557 %v = call <16 x float> @llvm.vp.fma.v16f32(<16 x float> %va, <16 x float> %b, <16 x float> %c, <16 x i1> %m, i32 %evl)558 ret <16 x float> %v559}560 561define <16 x float> @vfma_vv_v16f32_unmasked(<16 x float> %va, <16 x float> %b, <16 x float> %c, i32 zeroext %evl) {562; CHECK-LABEL: vfma_vv_v16f32_unmasked:563; CHECK: # %bb.0:564; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma565; CHECK-NEXT: vfmadd.vv v8, v12, v16566; CHECK-NEXT: ret567 %v = call <16 x float> @llvm.vp.fma.v16f32(<16 x float> %va, <16 x float> %b, <16 x float> %c, <16 x i1> splat (i1 true), i32 %evl)568 ret <16 x float> %v569}570 571define <16 x float> @vfma_vf_v16f32(<16 x float> %va, float %b, <16 x float> %vc, <16 x i1> %m, i32 zeroext %evl) {572; CHECK-LABEL: vfma_vf_v16f32:573; CHECK: # %bb.0:574; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma575; CHECK-NEXT: vfmadd.vf v8, fa0, v12, v0.t576; CHECK-NEXT: ret577 %elt.head = insertelement <16 x float> poison, float %b, i32 0578 %vb = shufflevector <16 x float> %elt.head, <16 x float> poison, <16 x i32> zeroinitializer579 %v = call <16 x float> @llvm.vp.fma.v16f32(<16 x float> %va, <16 x float> %vb, <16 x float> %vc, <16 x i1> %m, i32 %evl)580 ret <16 x float> %v581}582 583define <16 x float> @vfma_vf_v16f32_unmasked(<16 x float> %va, float %b, <16 x float> %vc, i32 zeroext %evl) {584; CHECK-LABEL: vfma_vf_v16f32_unmasked:585; CHECK: # %bb.0:586; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma587; CHECK-NEXT: vfmadd.vf v8, fa0, v12588; CHECK-NEXT: ret589 %elt.head = insertelement <16 x float> poison, float %b, i32 0590 %vb = shufflevector <16 x float> %elt.head, <16 x float> poison, <16 x i32> zeroinitializer591 %v = call <16 x float> @llvm.vp.fma.v16f32(<16 x float> %va, <16 x float> %vb, <16 x float> %vc, <16 x i1> splat (i1 true), i32 %evl)592 ret <16 x float> %v593}594 595define <2 x double> @vfma_vv_v2f64(<2 x double> %va, <2 x double> %b, <2 x double> %c, <2 x i1> %m, i32 zeroext %evl) {596; CHECK-LABEL: vfma_vv_v2f64:597; CHECK: # %bb.0:598; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma599; CHECK-NEXT: vfmadd.vv v9, v8, v10, v0.t600; CHECK-NEXT: vmv.v.v v8, v9601; CHECK-NEXT: ret602 %v = call <2 x double> @llvm.vp.fma.v2f64(<2 x double> %va, <2 x double> %b, <2 x double> %c, <2 x i1> %m, i32 %evl)603 ret <2 x double> %v604}605 606define <2 x double> @vfma_vv_v2f64_unmasked(<2 x double> %va, <2 x double> %b, <2 x double> %c, i32 zeroext %evl) {607; CHECK-LABEL: vfma_vv_v2f64_unmasked:608; CHECK: # %bb.0:609; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma610; CHECK-NEXT: vfmadd.vv v8, v9, v10611; CHECK-NEXT: ret612 %v = call <2 x double> @llvm.vp.fma.v2f64(<2 x double> %va, <2 x double> %b, <2 x double> %c, <2 x i1> splat (i1 true), i32 %evl)613 ret <2 x double> %v614}615 616define <2 x double> @vfma_vf_v2f64(<2 x double> %va, double %b, <2 x double> %vc, <2 x i1> %m, i32 zeroext %evl) {617; CHECK-LABEL: vfma_vf_v2f64:618; CHECK: # %bb.0:619; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma620; CHECK-NEXT: vfmadd.vf v8, fa0, v9, v0.t621; CHECK-NEXT: ret622 %elt.head = insertelement <2 x double> poison, double %b, i32 0623 %vb = shufflevector <2 x double> %elt.head, <2 x double> poison, <2 x i32> zeroinitializer624 %v = call <2 x double> @llvm.vp.fma.v2f64(<2 x double> %va, <2 x double> %vb, <2 x double> %vc, <2 x i1> %m, i32 %evl)625 ret <2 x double> %v626}627 628define <2 x double> @vfma_vf_v2f64_unmasked(<2 x double> %va, double %b, <2 x double> %vc, i32 zeroext %evl) {629; CHECK-LABEL: vfma_vf_v2f64_unmasked:630; CHECK: # %bb.0:631; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma632; CHECK-NEXT: vfmadd.vf v8, fa0, v9633; CHECK-NEXT: ret634 %elt.head = insertelement <2 x double> poison, double %b, i32 0635 %vb = shufflevector <2 x double> %elt.head, <2 x double> poison, <2 x i32> zeroinitializer636 %v = call <2 x double> @llvm.vp.fma.v2f64(<2 x double> %va, <2 x double> %vb, <2 x double> %vc, <2 x i1> splat (i1 true), i32 %evl)637 ret <2 x double> %v638}639 640define <4 x double> @vfma_vv_v4f64(<4 x double> %va, <4 x double> %b, <4 x double> %c, <4 x i1> %m, i32 zeroext %evl) {641; CHECK-LABEL: vfma_vv_v4f64:642; CHECK: # %bb.0:643; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma644; CHECK-NEXT: vfmadd.vv v10, v8, v12, v0.t645; CHECK-NEXT: vmv.v.v v8, v10646; CHECK-NEXT: ret647 %v = call <4 x double> @llvm.vp.fma.v4f64(<4 x double> %va, <4 x double> %b, <4 x double> %c, <4 x i1> %m, i32 %evl)648 ret <4 x double> %v649}650 651define <4 x double> @vfma_vv_v4f64_unmasked(<4 x double> %va, <4 x double> %b, <4 x double> %c, i32 zeroext %evl) {652; CHECK-LABEL: vfma_vv_v4f64_unmasked:653; CHECK: # %bb.0:654; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma655; CHECK-NEXT: vfmadd.vv v8, v10, v12656; CHECK-NEXT: ret657 %v = call <4 x double> @llvm.vp.fma.v4f64(<4 x double> %va, <4 x double> %b, <4 x double> %c, <4 x i1> splat (i1 true), i32 %evl)658 ret <4 x double> %v659}660 661define <4 x double> @vfma_vf_v4f64(<4 x double> %va, double %b, <4 x double> %vc, <4 x i1> %m, i32 zeroext %evl) {662; CHECK-LABEL: vfma_vf_v4f64:663; CHECK: # %bb.0:664; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma665; CHECK-NEXT: vfmadd.vf v8, fa0, v10, v0.t666; CHECK-NEXT: ret667 %elt.head = insertelement <4 x double> poison, double %b, i32 0668 %vb = shufflevector <4 x double> %elt.head, <4 x double> poison, <4 x i32> zeroinitializer669 %v = call <4 x double> @llvm.vp.fma.v4f64(<4 x double> %va, <4 x double> %vb, <4 x double> %vc, <4 x i1> %m, i32 %evl)670 ret <4 x double> %v671}672 673define <4 x double> @vfma_vf_v4f64_unmasked(<4 x double> %va, double %b, <4 x double> %vc, i32 zeroext %evl) {674; CHECK-LABEL: vfma_vf_v4f64_unmasked:675; CHECK: # %bb.0:676; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma677; CHECK-NEXT: vfmadd.vf v8, fa0, v10678; CHECK-NEXT: ret679 %elt.head = insertelement <4 x double> poison, double %b, i32 0680 %vb = shufflevector <4 x double> %elt.head, <4 x double> poison, <4 x i32> zeroinitializer681 %v = call <4 x double> @llvm.vp.fma.v4f64(<4 x double> %va, <4 x double> %vb, <4 x double> %vc, <4 x i1> splat (i1 true), i32 %evl)682 ret <4 x double> %v683}684 685define <8 x double> @vfma_vv_v8f64(<8 x double> %va, <8 x double> %b, <8 x double> %c, <8 x i1> %m, i32 zeroext %evl) {686; CHECK-LABEL: vfma_vv_v8f64:687; CHECK: # %bb.0:688; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma689; CHECK-NEXT: vfmadd.vv v12, v8, v16, v0.t690; CHECK-NEXT: vmv.v.v v8, v12691; CHECK-NEXT: ret692 %v = call <8 x double> @llvm.vp.fma.v8f64(<8 x double> %va, <8 x double> %b, <8 x double> %c, <8 x i1> %m, i32 %evl)693 ret <8 x double> %v694}695 696define <8 x double> @vfma_vv_v8f64_unmasked(<8 x double> %va, <8 x double> %b, <8 x double> %c, i32 zeroext %evl) {697; CHECK-LABEL: vfma_vv_v8f64_unmasked:698; CHECK: # %bb.0:699; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma700; CHECK-NEXT: vfmadd.vv v8, v12, v16701; CHECK-NEXT: ret702 %v = call <8 x double> @llvm.vp.fma.v8f64(<8 x double> %va, <8 x double> %b, <8 x double> %c, <8 x i1> splat (i1 true), i32 %evl)703 ret <8 x double> %v704}705 706define <8 x double> @vfma_vf_v8f64(<8 x double> %va, double %b, <8 x double> %vc, <8 x i1> %m, i32 zeroext %evl) {707; CHECK-LABEL: vfma_vf_v8f64:708; CHECK: # %bb.0:709; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma710; CHECK-NEXT: vfmadd.vf v8, fa0, v12, v0.t711; CHECK-NEXT: ret712 %elt.head = insertelement <8 x double> poison, double %b, i32 0713 %vb = shufflevector <8 x double> %elt.head, <8 x double> poison, <8 x i32> zeroinitializer714 %v = call <8 x double> @llvm.vp.fma.v8f64(<8 x double> %va, <8 x double> %vb, <8 x double> %vc, <8 x i1> %m, i32 %evl)715 ret <8 x double> %v716}717 718define <8 x double> @vfma_vf_v8f64_unmasked(<8 x double> %va, double %b, <8 x double> %vc, i32 zeroext %evl) {719; CHECK-LABEL: vfma_vf_v8f64_unmasked:720; CHECK: # %bb.0:721; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma722; CHECK-NEXT: vfmadd.vf v8, fa0, v12723; CHECK-NEXT: ret724 %elt.head = insertelement <8 x double> poison, double %b, i32 0725 %vb = shufflevector <8 x double> %elt.head, <8 x double> poison, <8 x i32> zeroinitializer726 %v = call <8 x double> @llvm.vp.fma.v8f64(<8 x double> %va, <8 x double> %vb, <8 x double> %vc, <8 x i1> splat (i1 true), i32 %evl)727 ret <8 x double> %v728}729 730define <15 x double> @vfma_vv_v15f64(<15 x double> %va, <15 x double> %b, <15 x double> %c, <15 x i1> %m, i32 zeroext %evl) {731; CHECK-LABEL: vfma_vv_v15f64:732; CHECK: # %bb.0:733; CHECK-NEXT: vsetivli zero, 16, e64, m8, ta, ma734; CHECK-NEXT: vle64.v v24, (a0)735; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, ma736; CHECK-NEXT: vfmadd.vv v16, v8, v24, v0.t737; CHECK-NEXT: vmv.v.v v8, v16738; CHECK-NEXT: ret739 %v = call <15 x double> @llvm.vp.fma.v15f64(<15 x double> %va, <15 x double> %b, <15 x double> %c, <15 x i1> %m, i32 %evl)740 ret <15 x double> %v741}742 743define <15 x double> @vfma_vv_v15f64_unmasked(<15 x double> %va, <15 x double> %b, <15 x double> %c, i32 zeroext %evl) {744; CHECK-LABEL: vfma_vv_v15f64_unmasked:745; CHECK: # %bb.0:746; CHECK-NEXT: vsetivli zero, 16, e64, m8, ta, ma747; CHECK-NEXT: vle64.v v24, (a0)748; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, ma749; CHECK-NEXT: vfmadd.vv v8, v16, v24750; CHECK-NEXT: ret751 %v = call <15 x double> @llvm.vp.fma.v15f64(<15 x double> %va, <15 x double> %b, <15 x double> %c, <15 x i1> splat (i1 true), i32 %evl)752 ret <15 x double> %v753}754 755define <16 x double> @vfma_vv_v16f64(<16 x double> %va, <16 x double> %b, <16 x double> %c, <16 x i1> %m, i32 zeroext %evl) {756; CHECK-LABEL: vfma_vv_v16f64:757; CHECK: # %bb.0:758; CHECK-NEXT: vsetivli zero, 16, e64, m8, ta, ma759; CHECK-NEXT: vle64.v v24, (a0)760; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, ma761; CHECK-NEXT: vfmadd.vv v16, v8, v24, v0.t762; CHECK-NEXT: vmv.v.v v8, v16763; CHECK-NEXT: ret764 %v = call <16 x double> @llvm.vp.fma.v16f64(<16 x double> %va, <16 x double> %b, <16 x double> %c, <16 x i1> %m, i32 %evl)765 ret <16 x double> %v766}767 768define <16 x double> @vfma_vv_v16f64_unmasked(<16 x double> %va, <16 x double> %b, <16 x double> %c, i32 zeroext %evl) {769; CHECK-LABEL: vfma_vv_v16f64_unmasked:770; CHECK: # %bb.0:771; CHECK-NEXT: vsetivli zero, 16, e64, m8, ta, ma772; CHECK-NEXT: vle64.v v24, (a0)773; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, ma774; CHECK-NEXT: vfmadd.vv v8, v16, v24775; CHECK-NEXT: ret776 %v = call <16 x double> @llvm.vp.fma.v16f64(<16 x double> %va, <16 x double> %b, <16 x double> %c, <16 x i1> splat (i1 true), i32 %evl)777 ret <16 x double> %v778}779 780define <16 x double> @vfma_vf_v16f64(<16 x double> %va, double %b, <16 x double> %vc, <16 x i1> %m, i32 zeroext %evl) {781; CHECK-LABEL: vfma_vf_v16f64:782; CHECK: # %bb.0:783; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma784; CHECK-NEXT: vfmadd.vf v8, fa0, v16, v0.t785; CHECK-NEXT: ret786 %elt.head = insertelement <16 x double> poison, double %b, i32 0787 %vb = shufflevector <16 x double> %elt.head, <16 x double> poison, <16 x i32> zeroinitializer788 %v = call <16 x double> @llvm.vp.fma.v16f64(<16 x double> %va, <16 x double> %vb, <16 x double> %vc, <16 x i1> %m, i32 %evl)789 ret <16 x double> %v790}791 792define <16 x double> @vfma_vf_v16f64_unmasked(<16 x double> %va, double %b, <16 x double> %vc, i32 zeroext %evl) {793; CHECK-LABEL: vfma_vf_v16f64_unmasked:794; CHECK: # %bb.0:795; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma796; CHECK-NEXT: vfmadd.vf v8, fa0, v16797; CHECK-NEXT: ret798 %elt.head = insertelement <16 x double> poison, double %b, i32 0799 %vb = shufflevector <16 x double> %elt.head, <16 x double> poison, <16 x i32> zeroinitializer800 %v = call <16 x double> @llvm.vp.fma.v16f64(<16 x double> %va, <16 x double> %vb, <16 x double> %vc, <16 x i1> splat (i1 true), i32 %evl)801 ret <16 x double> %v802}803 804define <32 x double> @vfma_vv_v32f64(<32 x double> %va, <32 x double> %b, <32 x double> %c, <32 x i1> %m, i32 zeroext %evl) {805; CHECK-LABEL: vfma_vv_v32f64:806; CHECK: # %bb.0:807; CHECK-NEXT: addi sp, sp, -16808; CHECK-NEXT: .cfi_def_cfa_offset 16809; CHECK-NEXT: csrr a1, vlenb810; CHECK-NEXT: slli a1, a1, 5811; CHECK-NEXT: sub sp, sp, a1812; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb813; CHECK-NEXT: csrr a1, vlenb814; CHECK-NEXT: li a3, 24815; CHECK-NEXT: mul a1, a1, a3816; CHECK-NEXT: add a1, sp, a1817; CHECK-NEXT: addi a1, a1, 16818; CHECK-NEXT: vs8r.v v16, (a1) # vscale x 64-byte Folded Spill819; CHECK-NEXT: csrr a1, vlenb820; CHECK-NEXT: slli a1, a1, 4821; CHECK-NEXT: add a1, sp, a1822; CHECK-NEXT: addi a1, a1, 16823; CHECK-NEXT: vs8r.v v8, (a1) # vscale x 64-byte Folded Spill824; CHECK-NEXT: addi a1, a2, 128825; CHECK-NEXT: vsetivli zero, 16, e64, m8, ta, ma826; CHECK-NEXT: vle64.v v24, (a2)827; CHECK-NEXT: addi a2, a0, 128828; CHECK-NEXT: vle64.v v8, (a1)829; CHECK-NEXT: csrr a1, vlenb830; CHECK-NEXT: slli a1, a1, 3831; CHECK-NEXT: add a1, sp, a1832; CHECK-NEXT: addi a1, a1, 16833; CHECK-NEXT: vs8r.v v8, (a1) # vscale x 64-byte Folded Spill834; CHECK-NEXT: vle64.v v8, (a2)835; CHECK-NEXT: addi a1, sp, 16836; CHECK-NEXT: vs8r.v v8, (a1) # vscale x 64-byte Folded Spill837; CHECK-NEXT: vle64.v v8, (a0)838; CHECK-NEXT: li a1, 16839; CHECK-NEXT: mv a0, a4840; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, ma841; CHECK-NEXT: vslidedown.vi v7, v0, 2842; CHECK-NEXT: bltu a4, a1, .LBB50_2843; CHECK-NEXT: # %bb.1:844; CHECK-NEXT: li a0, 16845; CHECK-NEXT: .LBB50_2:846; CHECK-NEXT: csrr a1, vlenb847; CHECK-NEXT: slli a1, a1, 4848; CHECK-NEXT: add a1, sp, a1849; CHECK-NEXT: addi a1, a1, 16850; CHECK-NEXT: vl8r.v v16, (a1) # vscale x 64-byte Folded Reload851; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma852; CHECK-NEXT: vfmadd.vv v8, v16, v24, v0.t853; CHECK-NEXT: csrr a0, vlenb854; CHECK-NEXT: slli a0, a0, 4855; CHECK-NEXT: add a0, sp, a0856; CHECK-NEXT: addi a0, a0, 16857; CHECK-NEXT: vs8r.v v8, (a0) # vscale x 64-byte Folded Spill858; CHECK-NEXT: addi a0, a4, -16859; CHECK-NEXT: sltu a1, a4, a0860; CHECK-NEXT: addi a1, a1, -1861; CHECK-NEXT: and a0, a1, a0862; CHECK-NEXT: vmv1r.v v0, v7863; CHECK-NEXT: csrr a1, vlenb864; CHECK-NEXT: li a2, 24865; CHECK-NEXT: mul a1, a1, a2866; CHECK-NEXT: add a1, sp, a1867; CHECK-NEXT: addi a1, a1, 16868; CHECK-NEXT: vl8r.v v16, (a1) # vscale x 64-byte Folded Reload869; CHECK-NEXT: csrr a1, vlenb870; CHECK-NEXT: slli a1, a1, 3871; CHECK-NEXT: add a1, sp, a1872; CHECK-NEXT: addi a1, a1, 16873; CHECK-NEXT: vl8r.v v24, (a1) # vscale x 64-byte Folded Reload874; CHECK-NEXT: addi a1, sp, 16875; CHECK-NEXT: vl8r.v v8, (a1) # vscale x 64-byte Folded Reload876; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma877; CHECK-NEXT: vfmadd.vv v8, v16, v24, v0.t878; CHECK-NEXT: vmv.v.v v16, v8879; CHECK-NEXT: csrr a0, vlenb880; CHECK-NEXT: slli a0, a0, 4881; CHECK-NEXT: add a0, sp, a0882; CHECK-NEXT: addi a0, a0, 16883; CHECK-NEXT: vl8r.v v8, (a0) # vscale x 64-byte Folded Reload884; CHECK-NEXT: csrr a0, vlenb885; CHECK-NEXT: slli a0, a0, 5886; CHECK-NEXT: add sp, sp, a0887; CHECK-NEXT: .cfi_def_cfa sp, 16888; CHECK-NEXT: addi sp, sp, 16889; CHECK-NEXT: .cfi_def_cfa_offset 0890; CHECK-NEXT: ret891 %v = call <32 x double> @llvm.vp.fma.v32f64(<32 x double> %va, <32 x double> %b, <32 x double> %c, <32 x i1> %m, i32 %evl)892 ret <32 x double> %v893}894 895define <32 x double> @vfma_vv_v32f64_unmasked(<32 x double> %va, <32 x double> %b, <32 x double> %c, i32 zeroext %evl) {896; CHECK-LABEL: vfma_vv_v32f64_unmasked:897; CHECK: # %bb.0:898; CHECK-NEXT: addi sp, sp, -16899; CHECK-NEXT: .cfi_def_cfa_offset 16900; CHECK-NEXT: csrr a1, vlenb901; CHECK-NEXT: li a3, 24902; CHECK-NEXT: mul a1, a1, a3903; CHECK-NEXT: sub sp, sp, a1904; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 24 * vlenb905; CHECK-NEXT: csrr a1, vlenb906; CHECK-NEXT: slli a1, a1, 4907; CHECK-NEXT: add a1, sp, a1908; CHECK-NEXT: addi a1, a1, 16909; CHECK-NEXT: vs8r.v v16, (a1) # vscale x 64-byte Folded Spill910; CHECK-NEXT: csrr a1, vlenb911; CHECK-NEXT: slli a1, a1, 3912; CHECK-NEXT: add a1, sp, a1913; CHECK-NEXT: addi a1, a1, 16914; CHECK-NEXT: vs8r.v v8, (a1) # vscale x 64-byte Folded Spill915; CHECK-NEXT: addi a1, a2, 128916; CHECK-NEXT: vsetivli zero, 16, e64, m8, ta, ma917; CHECK-NEXT: vle64.v v16, (a2)918; CHECK-NEXT: addi a2, a0, 128919; CHECK-NEXT: vle64.v v8, (a1)920; CHECK-NEXT: addi a1, sp, 16921; CHECK-NEXT: vs8r.v v8, (a1) # vscale x 64-byte Folded Spill922; CHECK-NEXT: vle64.v v24, (a2)923; CHECK-NEXT: vle64.v v0, (a0)924; CHECK-NEXT: li a1, 16925; CHECK-NEXT: mv a0, a4926; CHECK-NEXT: bltu a4, a1, .LBB51_2927; CHECK-NEXT: # %bb.1:928; CHECK-NEXT: li a0, 16929; CHECK-NEXT: .LBB51_2:930; CHECK-NEXT: csrr a1, vlenb931; CHECK-NEXT: slli a1, a1, 3932; CHECK-NEXT: add a1, sp, a1933; CHECK-NEXT: addi a1, a1, 16934; CHECK-NEXT: vl8r.v v8, (a1) # vscale x 64-byte Folded Reload935; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma936; CHECK-NEXT: vfmadd.vv v0, v8, v16937; CHECK-NEXT: addi a0, a4, -16938; CHECK-NEXT: sltu a1, a4, a0939; CHECK-NEXT: addi a1, a1, -1940; CHECK-NEXT: and a0, a1, a0941; CHECK-NEXT: csrr a1, vlenb942; CHECK-NEXT: slli a1, a1, 4943; CHECK-NEXT: add a1, sp, a1944; CHECK-NEXT: addi a1, a1, 16945; CHECK-NEXT: vl8r.v v16, (a1) # vscale x 64-byte Folded Reload946; CHECK-NEXT: addi a1, sp, 16947; CHECK-NEXT: vl8r.v v8, (a1) # vscale x 64-byte Folded Reload948; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma949; CHECK-NEXT: vfmadd.vv v24, v16, v8950; CHECK-NEXT: vmv8r.v v8, v0951; CHECK-NEXT: vmv.v.v v16, v24952; CHECK-NEXT: csrr a0, vlenb953; CHECK-NEXT: li a1, 24954; CHECK-NEXT: mul a0, a0, a1955; CHECK-NEXT: add sp, sp, a0956; CHECK-NEXT: .cfi_def_cfa sp, 16957; CHECK-NEXT: addi sp, sp, 16958; CHECK-NEXT: .cfi_def_cfa_offset 0959; CHECK-NEXT: ret960 %v = call <32 x double> @llvm.vp.fma.v32f64(<32 x double> %va, <32 x double> %b, <32 x double> %c, <32 x i1> splat (i1 true), i32 %evl)961 ret <32 x double> %v962}963