402 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+v -target-abi=ilp32d \3; RUN: -verify-machineinstrs < %s | FileCheck %s4; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v -target-abi=lp64d \5; RUN: -verify-machineinstrs < %s | FileCheck %s6 7; This tests a mix of vfnmacc and vfnmadd by using different operand orders to8; trigger commuting in TwoAddressInstructionPass.9 10define <vscale x 1 x half> @vfnmsub_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) {11; CHECK-LABEL: vfnmsub_vv_nxv1f16:12; CHECK: # %bb.0:13; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma14; CHECK-NEXT: vfnmadd.vv v8, v9, v1015; CHECK-NEXT: ret16 %neg = fneg <vscale x 1 x half> %va17 %neg2 = fneg <vscale x 1 x half> %vc18 %vd = call <vscale x 1 x half> @llvm.fma.v1f16(<vscale x 1 x half> %neg, <vscale x 1 x half> %vb, <vscale x 1 x half> %neg2)19 ret <vscale x 1 x half> %vd20}21 22define <vscale x 1 x half> @vfnmsub_vf_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, half %c) {23; CHECK-LABEL: vfnmsub_vf_nxv1f16:24; CHECK: # %bb.0:25; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma26; CHECK-NEXT: vfnmadd.vf v8, fa0, v927; CHECK-NEXT: ret28 %head = insertelement <vscale x 1 x half> poison, half %c, i32 029 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer30 %neg = fneg <vscale x 1 x half> %va31 %neg2 = fneg <vscale x 1 x half> %vb32 %vd = call <vscale x 1 x half> @llvm.fma.v1f16(<vscale x 1 x half> %neg, <vscale x 1 x half> %splat, <vscale x 1 x half> %neg2)33 ret <vscale x 1 x half> %vd34}35 36define <vscale x 2 x half> @vfnmsub_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) {37; CHECK-LABEL: vfnmsub_vv_nxv2f16:38; CHECK: # %bb.0:39; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma40; CHECK-NEXT: vfnmadd.vv v8, v10, v941; CHECK-NEXT: ret42 %neg = fneg <vscale x 2 x half> %va43 %neg2 = fneg <vscale x 2 x half> %vb44 %vd = call <vscale x 2 x half> @llvm.fma.v2f16(<vscale x 2 x half> %neg, <vscale x 2 x half> %vc, <vscale x 2 x half> %neg2)45 ret <vscale x 2 x half> %vd46}47 48define <vscale x 2 x half> @vfnmsub_vf_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, half %c) {49; CHECK-LABEL: vfnmsub_vf_nxv2f16:50; CHECK: # %bb.0:51; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma52; CHECK-NEXT: vfnmadd.vf v8, fa0, v953; CHECK-NEXT: ret54 %head = insertelement <vscale x 2 x half> poison, half %c, i32 055 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer56 %neg = fneg <vscale x 2 x half> %va57 %neg2 = fneg <vscale x 2 x half> %vb58 %vd = call <vscale x 2 x half> @llvm.fma.v2f16(<vscale x 2 x half> %splat, <vscale x 2 x half> %neg, <vscale x 2 x half> %neg2)59 ret <vscale x 2 x half> %vd60}61 62define <vscale x 4 x half> @vfnmsub_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) {63; CHECK-LABEL: vfnmsub_vv_nxv4f16:64; CHECK: # %bb.0:65; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma66; CHECK-NEXT: vfnmadd.vv v8, v9, v1067; CHECK-NEXT: ret68 %neg = fneg <vscale x 4 x half> %vb69 %neg2 = fneg <vscale x 4 x half> %vc70 %vd = call <vscale x 4 x half> @llvm.fma.v4f16(<vscale x 4 x half> %neg, <vscale x 4 x half> %va, <vscale x 4 x half> %neg2)71 ret <vscale x 4 x half> %vd72}73 74define <vscale x 4 x half> @vfnmsub_vf_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, half %c) {75; CHECK-LABEL: vfnmsub_vf_nxv4f16:76; CHECK: # %bb.0:77; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma78; CHECK-NEXT: vfnmadd.vf v8, fa0, v979; CHECK-NEXT: ret80 %head = insertelement <vscale x 4 x half> poison, half %c, i32 081 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer82 %neg = fneg <vscale x 4 x half> %splat83 %neg2 = fneg <vscale x 4 x half> %vb84 %vd = call <vscale x 4 x half> @llvm.fma.v4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %neg, <vscale x 4 x half> %neg2)85 ret <vscale x 4 x half> %vd86}87 88define <vscale x 8 x half> @vfnmsub_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) {89; CHECK-LABEL: vfnmsub_vv_nxv8f16:90; CHECK: # %bb.0:91; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma92; CHECK-NEXT: vfnmacc.vv v8, v12, v1093; CHECK-NEXT: ret94 %neg = fneg <vscale x 8 x half> %vb95 %neg2 = fneg <vscale x 8 x half> %va96 %vd = call <vscale x 8 x half> @llvm.fma.v8f16(<vscale x 8 x half> %neg, <vscale x 8 x half> %vc, <vscale x 8 x half> %neg2)97 ret <vscale x 8 x half> %vd98}99 100define <vscale x 8 x half> @vfnmsub_vf_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, half %c) {101; CHECK-LABEL: vfnmsub_vf_nxv8f16:102; CHECK: # %bb.0:103; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma104; CHECK-NEXT: vfnmacc.vf v8, fa0, v10105; CHECK-NEXT: ret106 %head = insertelement <vscale x 8 x half> poison, half %c, i32 0107 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer108 %neg = fneg <vscale x 8 x half> %splat109 %neg2 = fneg <vscale x 8 x half> %va110 %vd = call <vscale x 8 x half> @llvm.fma.v8f16(<vscale x 8 x half> %vb, <vscale x 8 x half> %neg, <vscale x 8 x half> %neg2)111 ret <vscale x 8 x half> %vd112}113 114define <vscale x 16 x half> @vfnmsub_vv_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) {115; CHECK-LABEL: vfnmsub_vv_nxv16f16:116; CHECK: # %bb.0:117; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma118; CHECK-NEXT: vfnmadd.vv v8, v16, v12119; CHECK-NEXT: ret120 %neg = fneg <vscale x 16 x half> %vc121 %neg2 = fneg <vscale x 16 x half> %vb122 %vd = call <vscale x 16 x half> @llvm.fma.v16f16(<vscale x 16 x half> %neg, <vscale x 16 x half> %va, <vscale x 16 x half> %neg2)123 ret <vscale x 16 x half> %vd124}125 126define <vscale x 16 x half> @vfnmsub_vf_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, half %c) {127; CHECK-LABEL: vfnmsub_vf_nxv16f16:128; CHECK: # %bb.0:129; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma130; CHECK-NEXT: vfnmadd.vf v8, fa0, v12131; CHECK-NEXT: ret132 %head = insertelement <vscale x 16 x half> poison, half %c, i32 0133 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer134 %neg = fneg <vscale x 16 x half> %splat135 %neg2 = fneg <vscale x 16 x half> %vb136 %vd = call <vscale x 16 x half> @llvm.fma.v16f16(<vscale x 16 x half> %neg, <vscale x 16 x half> %va, <vscale x 16 x half> %neg2)137 ret <vscale x 16 x half> %vd138}139 140define <vscale x 32 x half> @vfnmsub_vv_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, <vscale x 32 x half> %vc) {141; CHECK-LABEL: vfnmsub_vv_nxv32f16:142; CHECK: # %bb.0:143; CHECK-NEXT: vl8re16.v v24, (a0)144; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma145; CHECK-NEXT: vfnmadd.vv v8, v24, v16146; CHECK-NEXT: ret147 %neg = fneg <vscale x 32 x half> %vc148 %neg2 = fneg <vscale x 32 x half> %vb149 %vd = call <vscale x 32 x half> @llvm.fma.v32f16(<vscale x 32 x half> %neg, <vscale x 32 x half> %va, <vscale x 32 x half> %neg2)150 ret <vscale x 32 x half> %vd151}152 153define <vscale x 32 x half> @vfnmsub_vf_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, half %c) {154; CHECK-LABEL: vfnmsub_vf_nxv32f16:155; CHECK: # %bb.0:156; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma157; CHECK-NEXT: vfnmacc.vf v8, fa0, v16158; CHECK-NEXT: ret159 %head = insertelement <vscale x 32 x half> poison, half %c, i32 0160 %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer161 %neg = fneg <vscale x 32 x half> %splat162 %neg2 = fneg <vscale x 32 x half> %va163 %vd = call <vscale x 32 x half> @llvm.fma.v32f16(<vscale x 32 x half> %neg, <vscale x 32 x half> %vb, <vscale x 32 x half> %neg2)164 ret <vscale x 32 x half> %vd165}166 167define <vscale x 1 x float> @vfnmsub_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) {168; CHECK-LABEL: vfnmsub_vv_nxv1f32:169; CHECK: # %bb.0:170; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma171; CHECK-NEXT: vfnmadd.vv v8, v9, v10172; CHECK-NEXT: ret173 %neg = fneg <vscale x 1 x float> %vb174 %neg2 = fneg <vscale x 1 x float> %vc175 %vd = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %neg, <vscale x 1 x float> %neg2)176 ret <vscale x 1 x float> %vd177}178 179define <vscale x 1 x float> @vfnmsub_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, float %c) {180; CHECK-LABEL: vfnmsub_vf_nxv1f32:181; CHECK: # %bb.0:182; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma183; CHECK-NEXT: vfnmadd.vf v8, fa0, v9184; CHECK-NEXT: ret185 %head = insertelement <vscale x 1 x float> poison, float %c, i32 0186 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer187 %neg = fneg <vscale x 1 x float> %va188 %neg2 = fneg <vscale x 1 x float> %vb189 %vd = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %neg, <vscale x 1 x float> %splat, <vscale x 1 x float> %neg2)190 ret <vscale x 1 x float> %vd191}192 193define <vscale x 2 x float> @vfnmsub_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) {194; CHECK-LABEL: vfnmsub_vv_nxv2f32:195; CHECK: # %bb.0:196; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma197; CHECK-NEXT: vfnmadd.vv v8, v10, v9198; CHECK-NEXT: ret199 %neg = fneg <vscale x 2 x float> %vc200 %neg2 = fneg <vscale x 2 x float> %vb201 %vd = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %neg, <vscale x 2 x float> %neg2)202 ret <vscale x 2 x float> %vd203}204 205define <vscale x 2 x float> @vfnmsub_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, float %c) {206; CHECK-LABEL: vfnmsub_vf_nxv2f32:207; CHECK: # %bb.0:208; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma209; CHECK-NEXT: vfnmadd.vf v8, fa0, v9210; CHECK-NEXT: ret211 %head = insertelement <vscale x 2 x float> poison, float %c, i32 0212 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer213 %neg = fneg <vscale x 2 x float> %va214 %neg2 = fneg <vscale x 2 x float> %vb215 %vd = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %splat, <vscale x 2 x float> %neg, <vscale x 2 x float> %neg2)216 ret <vscale x 2 x float> %vd217}218 219define <vscale x 4 x float> @vfnmsub_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) {220; CHECK-LABEL: vfnmsub_vv_nxv4f32:221; CHECK: # %bb.0:222; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma223; CHECK-NEXT: vfnmadd.vv v8, v10, v12224; CHECK-NEXT: ret225 %neg = fneg <vscale x 4 x float> %va226 %neg2 = fneg <vscale x 4 x float> %vc227 %vd = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vb, <vscale x 4 x float> %neg, <vscale x 4 x float> %neg2)228 ret <vscale x 4 x float> %vd229}230 231define <vscale x 4 x float> @vfnmsub_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, float %c) {232; CHECK-LABEL: vfnmsub_vf_nxv4f32:233; CHECK: # %bb.0:234; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma235; CHECK-NEXT: vfnmadd.vf v8, fa0, v10236; CHECK-NEXT: ret237 %head = insertelement <vscale x 4 x float> poison, float %c, i32 0238 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer239 %neg = fneg <vscale x 4 x float> %splat240 %neg2 = fneg <vscale x 4 x float> %vb241 %vd = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %neg, <vscale x 4 x float> %neg2)242 ret <vscale x 4 x float> %vd243}244 245define <vscale x 8 x float> @vfnmsub_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) {246; CHECK-LABEL: vfnmsub_vv_nxv8f32:247; CHECK: # %bb.0:248; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma249; CHECK-NEXT: vfnmacc.vv v8, v16, v12250; CHECK-NEXT: ret251 %neg = fneg <vscale x 8 x float> %vc252 %neg2 = fneg <vscale x 8 x float> %va253 %vd = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %neg, <vscale x 8 x float> %neg2)254 ret <vscale x 8 x float> %vd255}256 257define <vscale x 8 x float> @vfnmsub_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, float %c) {258; CHECK-LABEL: vfnmsub_vf_nxv8f32:259; CHECK: # %bb.0:260; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma261; CHECK-NEXT: vfnmacc.vf v8, fa0, v12262; CHECK-NEXT: ret263 %head = insertelement <vscale x 8 x float> poison, float %c, i32 0264 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer265 %neg = fneg <vscale x 8 x float> %splat266 %neg2 = fneg <vscale x 8 x float> %va267 %vd = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %neg, <vscale x 8 x float> %neg2)268 ret <vscale x 8 x float> %vd269}270 271define <vscale x 16 x float> @vfnmsub_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, <vscale x 16 x float> %vc) {272; CHECK-LABEL: vfnmsub_vv_nxv16f32:273; CHECK: # %bb.0:274; CHECK-NEXT: vl8re32.v v24, (a0)275; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma276; CHECK-NEXT: vfnmadd.vv v8, v24, v16277; CHECK-NEXT: ret278 %neg = fneg <vscale x 16 x float> %va279 %neg2 = fneg <vscale x 16 x float> %vb280 %vd = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vc, <vscale x 16 x float> %neg, <vscale x 16 x float> %neg2)281 ret <vscale x 16 x float> %vd282}283 284define <vscale x 16 x float> @vfnmsub_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, float %c) {285; CHECK-LABEL: vfnmsub_vf_nxv16f32:286; CHECK: # %bb.0:287; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma288; CHECK-NEXT: vfnmadd.vf v8, fa0, v16289; CHECK-NEXT: ret290 %head = insertelement <vscale x 16 x float> poison, float %c, i32 0291 %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer292 %neg = fneg <vscale x 16 x float> %splat293 %neg2 = fneg <vscale x 16 x float> %vb294 %vd = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %neg, <vscale x 16 x float> %va, <vscale x 16 x float> %neg2)295 ret <vscale x 16 x float> %vd296}297 298define <vscale x 1 x double> @vfnmsub_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x double> %vc) {299; CHECK-LABEL: vfnmsub_vv_nxv1f64:300; CHECK: # %bb.0:301; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma302; CHECK-NEXT: vfnmacc.vv v8, v10, v9303; CHECK-NEXT: ret304 %neg = fneg <vscale x 1 x double> %vb305 %neg2 = fneg <vscale x 1 x double> %va306 %vd = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vc, <vscale x 1 x double> %neg, <vscale x 1 x double> %neg2)307 ret <vscale x 1 x double> %vd308}309 310define <vscale x 1 x double> @vfnmsub_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, double %c) {311; CHECK-LABEL: vfnmsub_vf_nxv1f64:312; CHECK: # %bb.0:313; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma314; CHECK-NEXT: vfnmadd.vf v8, fa0, v9315; CHECK-NEXT: ret316 %head = insertelement <vscale x 1 x double> poison, double %c, i32 0317 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer318 %neg = fneg <vscale x 1 x double> %va319 %neg2 = fneg <vscale x 1 x double> %vb320 %vd = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %neg, <vscale x 1 x double> %splat, <vscale x 1 x double> %neg2)321 ret <vscale x 1 x double> %vd322}323 324define <vscale x 2 x double> @vfnmsub_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, <vscale x 2 x double> %vc) {325; CHECK-LABEL: vfnmsub_vv_nxv2f64:326; CHECK: # %bb.0:327; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma328; CHECK-NEXT: vfnmadd.vv v8, v12, v10329; CHECK-NEXT: ret330 %neg = fneg <vscale x 2 x double> %va331 %neg2 = fneg <vscale x 2 x double> %vb332 %vd = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %neg, <vscale x 2 x double> %vc, <vscale x 2 x double> %neg2)333 ret <vscale x 2 x double> %vd334}335 336define <vscale x 2 x double> @vfnmsub_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, double %c) {337; CHECK-LABEL: vfnmsub_vf_nxv2f64:338; CHECK: # %bb.0:339; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma340; CHECK-NEXT: vfnmadd.vf v8, fa0, v10341; CHECK-NEXT: ret342 %head = insertelement <vscale x 2 x double> poison, double %c, i32 0343 %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer344 %neg = fneg <vscale x 2 x double> %va345 %neg2 = fneg <vscale x 2 x double> %vb346 %vd = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %splat, <vscale x 2 x double> %neg, <vscale x 2 x double> %neg2)347 ret <vscale x 2 x double> %vd348}349 350define <vscale x 4 x double> @vfnmsub_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, <vscale x 4 x double> %vc) {351; CHECK-LABEL: vfnmsub_vv_nxv4f64:352; CHECK: # %bb.0:353; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma354; CHECK-NEXT: vfnmadd.vv v8, v12, v16355; CHECK-NEXT: ret356 %neg = fneg <vscale x 4 x double> %vb357 %neg2 = fneg <vscale x 4 x double> %vc358 %vd = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %neg, <vscale x 4 x double> %va, <vscale x 4 x double> %neg2)359 ret <vscale x 4 x double> %vd360}361 362define <vscale x 4 x double> @vfnmsub_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, double %c) {363; CHECK-LABEL: vfnmsub_vf_nxv4f64:364; CHECK: # %bb.0:365; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma366; CHECK-NEXT: vfnmadd.vf v8, fa0, v12367; CHECK-NEXT: ret368 %head = insertelement <vscale x 4 x double> poison, double %c, i32 0369 %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer370 %neg = fneg <vscale x 4 x double> %splat371 %neg2 = fneg <vscale x 4 x double> %vb372 %vd = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %neg, <vscale x 4 x double> %neg2)373 ret <vscale x 4 x double> %vd374}375 376define <vscale x 8 x double> @vfnmsub_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, <vscale x 8 x double> %vc) {377; CHECK-LABEL: vfnmsub_vv_nxv8f64:378; CHECK: # %bb.0:379; CHECK-NEXT: vl8re64.v v24, (a0)380; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma381; CHECK-NEXT: vfnmacc.vv v8, v16, v24382; CHECK-NEXT: ret383 %neg = fneg <vscale x 8 x double> %vb384 %neg2 = fneg <vscale x 8 x double> %va385 %vd = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %neg, <vscale x 8 x double> %vc, <vscale x 8 x double> %neg2)386 ret <vscale x 8 x double> %vd387}388 389define <vscale x 8 x double> @vfnmsub_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, double %c) {390; CHECK-LABEL: vfnmsub_vf_nxv8f64:391; CHECK: # %bb.0:392; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma393; CHECK-NEXT: vfnmacc.vf v8, fa0, v16394; CHECK-NEXT: ret395 %head = insertelement <vscale x 8 x double> poison, double %c, i32 0396 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer397 %neg = fneg <vscale x 8 x double> %splat398 %neg2 = fneg <vscale x 8 x double> %va399 %vd = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vb, <vscale x 8 x double> %neg, <vscale x 8 x double> %neg2)400 ret <vscale x 8 x double> %vd401}402