376 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=riscv32 -mattr=+d,+zvfh,+v -target-abi=ilp32d \5; RUN: -verify-machineinstrs -early-live-intervals < %s | FileCheck %s6; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v -target-abi=lp64d \7; RUN: -verify-machineinstrs < %s | FileCheck %s8; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v -target-abi=lp64d \9; RUN: -verify-machineinstrs -early-live-intervals < %s | FileCheck %s10 11; This tests a mix of vfmsac and vfmsub by using different operand orders to12; trigger commuting in TwoAddressInstructionPass.13 14define <vscale x 1 x half> @vfmsub_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) {15; CHECK-LABEL: vfmsub_vv_nxv1f16:16; CHECK: # %bb.0:17; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma18; CHECK-NEXT: vfmsub.vv v8, v9, v1019; CHECK-NEXT: ret20 %neg = fneg <vscale x 1 x half> %vc21 %vd = call <vscale x 1 x half> @llvm.fma.v1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %neg)22 ret <vscale x 1 x half> %vd23}24 25define <vscale x 1 x half> @vfmsub_vf_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, half %c) {26; CHECK-LABEL: vfmsub_vf_nxv1f16:27; CHECK: # %bb.0:28; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma29; CHECK-NEXT: vfmsub.vf v8, fa0, v930; CHECK-NEXT: ret31 %head = insertelement <vscale x 1 x half> poison, half %c, i32 032 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer33 %neg = fneg <vscale x 1 x half> %vb34 %vd = call <vscale x 1 x half> @llvm.fma.v1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %splat, <vscale x 1 x half> %neg)35 ret <vscale x 1 x half> %vd36}37 38define <vscale x 2 x half> @vfmsub_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) {39; CHECK-LABEL: vfmsub_vv_nxv2f16:40; CHECK: # %bb.0:41; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma42; CHECK-NEXT: vfmsub.vv v8, v10, v943; CHECK-NEXT: ret44 %neg = fneg <vscale x 2 x half> %vb45 %vd = call <vscale x 2 x half> @llvm.fma.v2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vc, <vscale x 2 x half> %neg)46 ret <vscale x 2 x half> %vd47}48 49define <vscale x 2 x half> @vfmsub_vf_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, half %c) {50; CHECK-LABEL: vfmsub_vf_nxv2f16:51; CHECK: # %bb.0:52; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma53; CHECK-NEXT: vfmsac.vf v8, fa0, v954; CHECK-NEXT: ret55 %head = insertelement <vscale x 2 x half> poison, half %c, i32 056 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer57 %neg = fneg <vscale x 2 x half> %va58 %vd = call <vscale x 2 x half> @llvm.fma.v2f16(<vscale x 2 x half> %vb, <vscale x 2 x half> %splat, <vscale x 2 x half> %neg)59 ret <vscale x 2 x half> %vd60}61 62define <vscale x 4 x half> @vfmsub_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) {63; CHECK-LABEL: vfmsub_vv_nxv4f16:64; CHECK: # %bb.0:65; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma66; CHECK-NEXT: vfmsub.vv v8, v9, v1067; CHECK-NEXT: ret68 %neg = fneg <vscale x 4 x half> %vc69 %vd = call <vscale x 4 x half> @llvm.fma.v4f16(<vscale x 4 x half> %vb, <vscale x 4 x half> %va, <vscale x 4 x half> %neg)70 ret <vscale x 4 x half> %vd71}72 73define <vscale x 4 x half> @vfmsub_vf_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, half %c) {74; CHECK-LABEL: vfmsub_vf_nxv4f16:75; CHECK: # %bb.0:76; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma77; CHECK-NEXT: vfmsub.vf v8, fa0, v978; CHECK-NEXT: ret79 %head = insertelement <vscale x 4 x half> poison, half %c, i32 080 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer81 %neg = fneg <vscale x 4 x half> %vb82 %vd = call <vscale x 4 x half> @llvm.fma.v4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %splat, <vscale x 4 x half> %neg)83 ret <vscale x 4 x half> %vd84}85 86define <vscale x 8 x half> @vfmsub_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) {87; CHECK-LABEL: vfmsub_vv_nxv8f16:88; CHECK: # %bb.0:89; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma90; CHECK-NEXT: vfmsac.vv v8, v12, v1091; CHECK-NEXT: ret92 %neg = fneg <vscale x 8 x half> %va93 %vd = call <vscale x 8 x half> @llvm.fma.v8f16(<vscale x 8 x half> %vb, <vscale x 8 x half> %vc, <vscale x 8 x half> %neg)94 ret <vscale x 8 x half> %vd95}96 97define <vscale x 8 x half> @vfmsub_vf_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, half %c) {98; CHECK-LABEL: vfmsub_vf_nxv8f16:99; CHECK: # %bb.0:100; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma101; CHECK-NEXT: vfmsac.vf v8, fa0, v10102; CHECK-NEXT: ret103 %head = insertelement <vscale x 8 x half> poison, half %c, i32 0104 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer105 %neg = fneg <vscale x 8 x half> %va106 %vd = call <vscale x 8 x half> @llvm.fma.v8f16(<vscale x 8 x half> %vb, <vscale x 8 x half> %splat, <vscale x 8 x half> %neg)107 ret <vscale x 8 x half> %vd108}109 110define <vscale x 16 x half> @vfmsub_vv_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) {111; CHECK-LABEL: vfmsub_vv_nxv16f16:112; CHECK: # %bb.0:113; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma114; CHECK-NEXT: vfmsub.vv v8, v16, v12115; CHECK-NEXT: ret116 %neg = fneg <vscale x 16 x half> %vb117 %vd = call <vscale x 16 x half> @llvm.fma.v16f16(<vscale x 16 x half> %vc, <vscale x 16 x half> %va, <vscale x 16 x half> %neg)118 ret <vscale x 16 x half> %vd119}120 121define <vscale x 16 x half> @vfmsub_vf_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, half %c) {122; CHECK-LABEL: vfmsub_vf_nxv16f16:123; CHECK: # %bb.0:124; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma125; CHECK-NEXT: vfmsub.vf v8, fa0, v12126; CHECK-NEXT: ret127 %head = insertelement <vscale x 16 x half> poison, half %c, i32 0128 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer129 %neg = fneg <vscale x 16 x half> %vb130 %vd = call <vscale x 16 x half> @llvm.fma.v16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %splat, <vscale x 16 x half> %neg)131 ret <vscale x 16 x half> %vd132}133 134define <vscale x 32 x half> @vfmsub_vv_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, <vscale x 32 x half> %vc) {135; CHECK-LABEL: vfmsub_vv_nxv32f16:136; CHECK: # %bb.0:137; CHECK-NEXT: vl8re16.v v24, (a0)138; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma139; CHECK-NEXT: vfmsac.vv v8, v16, v24140; CHECK-NEXT: ret141 %neg = fneg <vscale x 32 x half> %va142 %vd = call <vscale x 32 x half> @llvm.fma.v32f16(<vscale x 32 x half> %vc, <vscale x 32 x half> %vb, <vscale x 32 x half> %neg)143 ret <vscale x 32 x half> %vd144}145 146define <vscale x 32 x half> @vfmsub_vf_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, half %c) {147; CHECK-LABEL: vfmsub_vf_nxv32f16:148; CHECK: # %bb.0:149; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma150; CHECK-NEXT: vfmsac.vf v8, fa0, v16151; CHECK-NEXT: ret152 %head = insertelement <vscale x 32 x half> poison, half %c, i32 0153 %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer154 %neg = fneg <vscale x 32 x half> %va155 %vd = call <vscale x 32 x half> @llvm.fma.v32f16(<vscale x 32 x half> %vb, <vscale x 32 x half> %splat, <vscale x 32 x half> %neg)156 ret <vscale x 32 x half> %vd157}158 159define <vscale x 1 x float> @vfmsub_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) {160; CHECK-LABEL: vfmsub_vv_nxv1f32:161; CHECK: # %bb.0:162; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma163; CHECK-NEXT: vfmsub.vv v8, v9, v10164; CHECK-NEXT: ret165 %neg = fneg <vscale x 1 x float> %vc166 %vd = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %neg)167 ret <vscale x 1 x float> %vd168}169 170define <vscale x 1 x float> @vfmsub_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, float %c) {171; CHECK-LABEL: vfmsub_vf_nxv1f32:172; CHECK: # %bb.0:173; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma174; CHECK-NEXT: vfmsub.vf v8, fa0, v9175; CHECK-NEXT: ret176 %head = insertelement <vscale x 1 x float> poison, float %c, i32 0177 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer178 %neg = fneg <vscale x 1 x float> %vb179 %vd = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %splat, <vscale x 1 x float> %neg)180 ret <vscale x 1 x float> %vd181}182 183define <vscale x 2 x float> @vfmsub_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) {184; CHECK-LABEL: vfmsub_vv_nxv2f32:185; CHECK: # %bb.0:186; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma187; CHECK-NEXT: vfmsub.vv v8, v10, v9188; CHECK-NEXT: ret189 %neg = fneg <vscale x 2 x float> %vb190 %vd = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vc, <vscale x 2 x float> %neg)191 ret <vscale x 2 x float> %vd192}193 194define <vscale x 2 x float> @vfmsub_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, float %c) {195; CHECK-LABEL: vfmsub_vf_nxv2f32:196; CHECK: # %bb.0:197; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma198; CHECK-NEXT: vfmsac.vf v8, fa0, v9199; CHECK-NEXT: ret200 %head = insertelement <vscale x 2 x float> poison, float %c, i32 0201 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer202 %neg = fneg <vscale x 2 x float> %va203 %vd = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vb, <vscale x 2 x float> %splat, <vscale x 2 x float> %neg)204 ret <vscale x 2 x float> %vd205}206 207define <vscale x 4 x float> @vfmsub_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) {208; CHECK-LABEL: vfmsub_vv_nxv4f32:209; CHECK: # %bb.0:210; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma211; CHECK-NEXT: vfmsub.vv v8, v10, v12212; CHECK-NEXT: ret213 %neg = fneg <vscale x 4 x float> %vc214 %vd = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vb, <vscale x 4 x float> %va, <vscale x 4 x float> %neg)215 ret <vscale x 4 x float> %vd216}217 218define <vscale x 4 x float> @vfmsub_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, float %c) {219; CHECK-LABEL: vfmsub_vf_nxv4f32:220; CHECK: # %bb.0:221; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma222; CHECK-NEXT: vfmsub.vf v8, fa0, v10223; CHECK-NEXT: ret224 %head = insertelement <vscale x 4 x float> poison, float %c, i32 0225 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer226 %neg = fneg <vscale x 4 x float> %vb227 %vd = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %splat, <vscale x 4 x float> %neg)228 ret <vscale x 4 x float> %vd229}230 231define <vscale x 8 x float> @vfmsub_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) {232; CHECK-LABEL: vfmsub_vv_nxv8f32:233; CHECK: # %bb.0:234; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma235; CHECK-NEXT: vfmsac.vv v8, v16, v12236; CHECK-NEXT: ret237 %neg = fneg <vscale x 8 x float> %va238 %vd = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %vc, <vscale x 8 x float> %neg)239 ret <vscale x 8 x float> %vd240}241 242define <vscale x 8 x float> @vfmsub_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, float %c) {243; CHECK-LABEL: vfmsub_vf_nxv8f32:244; CHECK: # %bb.0:245; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma246; CHECK-NEXT: vfmsac.vf v8, fa0, v12247; CHECK-NEXT: ret248 %head = insertelement <vscale x 8 x float> poison, float %c, i32 0249 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer250 %neg = fneg <vscale x 8 x float> %va251 %vd = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %splat, <vscale x 8 x float> %neg)252 ret <vscale x 8 x float> %vd253}254 255define <vscale x 16 x float> @vfmsub_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, <vscale x 16 x float> %vc) {256; CHECK-LABEL: vfmsub_vv_nxv16f32:257; CHECK: # %bb.0:258; CHECK-NEXT: vl8re32.v v24, (a0)259; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma260; CHECK-NEXT: vfmsub.vv v8, v24, v16261; CHECK-NEXT: ret262 %neg = fneg <vscale x 16 x float> %vb263 %vd = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vc, <vscale x 16 x float> %va, <vscale x 16 x float> %neg)264 ret <vscale x 16 x float> %vd265}266 267define <vscale x 16 x float> @vfmsub_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, float %c) {268; CHECK-LABEL: vfmsub_vf_nxv16f32:269; CHECK: # %bb.0:270; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma271; CHECK-NEXT: vfmsub.vf v8, fa0, v16272; CHECK-NEXT: ret273 %head = insertelement <vscale x 16 x float> poison, float %c, i32 0274 %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer275 %neg = fneg <vscale x 16 x float> %vb276 %vd = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %splat, <vscale x 16 x float> %neg)277 ret <vscale x 16 x float> %vd278}279 280define <vscale x 1 x double> @vfmsub_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x double> %vc) {281; CHECK-LABEL: vfmsub_vv_nxv1f64:282; CHECK: # %bb.0:283; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma284; CHECK-NEXT: vfmsub.vv v8, v9, v10285; CHECK-NEXT: ret286 %neg = fneg <vscale x 1 x double> %vc287 %vd = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x double> %neg)288 ret <vscale x 1 x double> %vd289}290 291define <vscale x 1 x double> @vfmsub_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, double %c) {292; CHECK-LABEL: vfmsub_vf_nxv1f64:293; CHECK: # %bb.0:294; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma295; CHECK-NEXT: vfmsub.vf v8, fa0, v9296; CHECK-NEXT: ret297 %head = insertelement <vscale x 1 x double> poison, double %c, i32 0298 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer299 %neg = fneg <vscale x 1 x double> %vb300 %vd = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %splat, <vscale x 1 x double> %neg)301 ret <vscale x 1 x double> %vd302}303 304define <vscale x 2 x double> @vfmsub_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, <vscale x 2 x double> %vc) {305; CHECK-LABEL: vfmsub_vv_nxv2f64:306; CHECK: # %bb.0:307; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma308; CHECK-NEXT: vfmsub.vv v8, v12, v10309; CHECK-NEXT: ret310 %neg = fneg <vscale x 2 x double> %vb311 %vd = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vc, <vscale x 2 x double> %neg)312 ret <vscale x 2 x double> %vd313}314 315define <vscale x 2 x double> @vfmsub_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, double %c) {316; CHECK-LABEL: vfmsub_vf_nxv2f64:317; CHECK: # %bb.0:318; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma319; CHECK-NEXT: vfmsac.vf v8, fa0, v10320; CHECK-NEXT: ret321 %head = insertelement <vscale x 2 x double> poison, double %c, i32 0322 %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer323 %neg = fneg <vscale x 2 x double> %va324 %vd = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vb, <vscale x 2 x double> %splat, <vscale x 2 x double> %neg)325 ret <vscale x 2 x double> %vd326}327 328define <vscale x 4 x double> @vfmsub_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, <vscale x 4 x double> %vc) {329; CHECK-LABEL: vfmsub_vv_nxv4f64:330; CHECK: # %bb.0:331; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma332; CHECK-NEXT: vfmsub.vv v8, v12, v16333; CHECK-NEXT: ret334 %neg = fneg <vscale x 4 x double> %vc335 %vd = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vb, <vscale x 4 x double> %va, <vscale x 4 x double> %neg)336 ret <vscale x 4 x double> %vd337}338 339define <vscale x 4 x double> @vfmsub_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, double %c) {340; CHECK-LABEL: vfmsub_vf_nxv4f64:341; CHECK: # %bb.0:342; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma343; CHECK-NEXT: vfmsub.vf v8, fa0, v12344; CHECK-NEXT: ret345 %head = insertelement <vscale x 4 x double> poison, double %c, i32 0346 %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer347 %neg = fneg <vscale x 4 x double> %vb348 %vd = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %splat, <vscale x 4 x double> %neg)349 ret <vscale x 4 x double> %vd350}351 352define <vscale x 8 x double> @vfmsub_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, <vscale x 8 x double> %vc) {353; CHECK-LABEL: vfmsub_vv_nxv8f64:354; CHECK: # %bb.0:355; CHECK-NEXT: vl8re64.v v24, (a0)356; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma357; CHECK-NEXT: vfmsac.vv v8, v16, v24358; CHECK-NEXT: ret359 %neg = fneg <vscale x 8 x double> %va360 %vd = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vb, <vscale x 8 x double> %vc, <vscale x 8 x double> %neg)361 ret <vscale x 8 x double> %vd362}363 364define <vscale x 8 x double> @vfmsub_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, double %c) {365; CHECK-LABEL: vfmsub_vf_nxv8f64:366; CHECK: # %bb.0:367; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma368; CHECK-NEXT: vfmsac.vf v8, fa0, v16369; CHECK-NEXT: ret370 %head = insertelement <vscale x 8 x double> poison, double %c, i32 0371 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer372 %neg = fneg <vscale x 8 x double> %va373 %vd = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vb, <vscale x 8 x double> %splat, <vscale x 8 x double> %neg)374 ret <vscale x 8 x double> %vd375}376