brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.1 KiB · b0f5599 Raw
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