brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.0 KiB · 4a40799 Raw
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