1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zvfh,+v -target-abi=ilp32d \ 3; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH 4; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+zvfh,+v -target-abi=lp64d \ 5; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH 6; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zfhmin,+zvfhmin,+v -target-abi=ilp32d \ 7; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN 8; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+zfhmin,+zvfhmin,+v -target-abi=lp64d \ 9; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN 10 11; This tests a mix of vfnmacc and vfnmadd by using different operand orders to 12; trigger commuting in TwoAddressInstructionPass. 13 14declare <vscale x 1 x half> @llvm.experimental.constrained.fma.nxv1f16(<vscale x 1 x half>, <vscale x 1 x half>, <vscale x 1 x half>, metadata, metadata) 15 16define <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) strictfp { 17; ZVFH-LABEL: vfnmsub_vv_nxv1f16: 18; ZVFH: # %bb.0: 19; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 20; ZVFH-NEXT: vfnmadd.vv v8, v9, v10 21; ZVFH-NEXT: ret 22; 23; ZVFHMIN-LABEL: vfnmsub_vv_nxv1f16: 24; ZVFHMIN: # %bb.0: 25; ZVFHMIN-NEXT: lui a0, 8 26; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 27; ZVFHMIN-NEXT: vxor.vx v8, v8, a0 28; ZVFHMIN-NEXT: vxor.vx v10, v10, a0 29; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v10 30; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 31; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9 32; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 33; ZVFHMIN-NEXT: vfmadd.vv v12, v10, v11 34; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 35; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12 36; ZVFHMIN-NEXT: ret 37 %neg = fneg <vscale x 1 x half> %va 38 %neg2 = fneg <vscale x 1 x half> %vc 39 %vd = call <vscale x 1 x half> @llvm.experimental.constrained.fma.nxv1f16(<vscale x 1 x half> %neg, <vscale x 1 x half> %vb, <vscale x 1 x half> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 40 ret <vscale x 1 x half> %vd 41} 42 43define <vscale x 1 x half> @vfnmsub_vf_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, half %c) strictfp { 44; ZVFH-LABEL: vfnmsub_vf_nxv1f16: 45; ZVFH: # %bb.0: 46; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 47; ZVFH-NEXT: vfnmadd.vf v8, fa0, v9 48; ZVFH-NEXT: ret 49; 50; ZVFHMIN-LABEL: vfnmsub_vf_nxv1f16: 51; ZVFHMIN: # %bb.0: 52; ZVFHMIN-NEXT: fmv.x.h a0, fa0 53; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 54; ZVFHMIN-NEXT: vmv.v.x v10, a0 55; ZVFHMIN-NEXT: lui a0, 8 56; ZVFHMIN-NEXT: vxor.vx v8, v8, a0 57; ZVFHMIN-NEXT: vxor.vx v9, v9, a0 58; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9 59; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8 60; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 61; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 62; ZVFHMIN-NEXT: vfmadd.vv v12, v9, v11 63; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 64; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12 65; ZVFHMIN-NEXT: ret 66 %head = insertelement <vscale x 1 x half> poison, half %c, i32 0 67 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 68 %neg = fneg <vscale x 1 x half> %va 69 %neg2 = fneg <vscale x 1 x half> %vb 70 %vd = call <vscale x 1 x half> @llvm.experimental.constrained.fma.nxv1f16(<vscale x 1 x half> %neg, <vscale x 1 x half> %splat, <vscale x 1 x half> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 71 ret <vscale x 1 x half> %vd 72} 73 74declare <vscale x 2 x half> @llvm.experimental.constrained.fma.nxv2f16(<vscale x 2 x half>, <vscale x 2 x half>, <vscale x 2 x half>, metadata, metadata) 75 76define <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) strictfp { 77; ZVFH-LABEL: vfnmsub_vv_nxv2f16: 78; ZVFH: # %bb.0: 79; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 80; ZVFH-NEXT: vfnmadd.vv v8, v10, v9 81; ZVFH-NEXT: ret 82; 83; ZVFHMIN-LABEL: vfnmsub_vv_nxv2f16: 84; ZVFHMIN: # %bb.0: 85; ZVFHMIN-NEXT: lui a0, 8 86; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf2, ta, ma 87; ZVFHMIN-NEXT: vxor.vx v8, v8, a0 88; ZVFHMIN-NEXT: vxor.vx v9, v9, a0 89; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9 90; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8 91; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 92; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 93; ZVFHMIN-NEXT: vfmadd.vv v12, v9, v11 94; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 95; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12 96; ZVFHMIN-NEXT: ret 97 %neg = fneg <vscale x 2 x half> %va 98 %neg2 = fneg <vscale x 2 x half> %vb 99 %vd = call <vscale x 2 x half> @llvm.experimental.constrained.fma.nxv2f16(<vscale x 2 x half> %neg, <vscale x 2 x half> %vc, <vscale x 2 x half> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 100 ret <vscale x 2 x half> %vd 101} 102 103define <vscale x 2 x half> @vfnmsub_vf_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, half %c) strictfp { 104; ZVFH-LABEL: vfnmsub_vf_nxv2f16: 105; ZVFH: # %bb.0: 106; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 107; ZVFH-NEXT: vfnmadd.vf v8, fa0, v9 108; ZVFH-NEXT: ret 109; 110; ZVFHMIN-LABEL: vfnmsub_vf_nxv2f16: 111; ZVFHMIN: # %bb.0: 112; ZVFHMIN-NEXT: fmv.x.h a0, fa0 113; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf2, ta, ma 114; ZVFHMIN-NEXT: vmv.v.x v10, a0 115; ZVFHMIN-NEXT: lui a0, 8 116; ZVFHMIN-NEXT: vxor.vx v8, v8, a0 117; ZVFHMIN-NEXT: vxor.vx v9, v9, a0 118; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9 119; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8 120; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 121; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 122; ZVFHMIN-NEXT: vfmadd.vv v12, v9, v11 123; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 124; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12 125; ZVFHMIN-NEXT: ret 126 %head = insertelement <vscale x 2 x half> poison, half %c, i32 0 127 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 128 %neg = fneg <vscale x 2 x half> %va 129 %neg2 = fneg <vscale x 2 x half> %vb 130 %vd = call <vscale x 2 x half> @llvm.experimental.constrained.fma.nxv2f16(<vscale x 2 x half> %splat, <vscale x 2 x half> %neg, <vscale x 2 x half> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 131 ret <vscale x 2 x half> %vd 132} 133 134declare <vscale x 4 x half> @llvm.experimental.constrained.fma.nxv4f16(<vscale x 4 x half>, <vscale x 4 x half>, <vscale x 4 x half>, metadata, metadata) 135 136define <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) strictfp { 137; ZVFH-LABEL: vfnmsub_vv_nxv4f16: 138; ZVFH: # %bb.0: 139; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 140; ZVFH-NEXT: vfnmadd.vv v8, v9, v10 141; ZVFH-NEXT: ret 142; 143; ZVFHMIN-LABEL: vfnmsub_vv_nxv4f16: 144; ZVFHMIN: # %bb.0: 145; ZVFHMIN-NEXT: lui a0, 8 146; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m1, ta, ma 147; ZVFHMIN-NEXT: vxor.vx v9, v9, a0 148; ZVFHMIN-NEXT: vxor.vx v10, v10, a0 149; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 150; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 151; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v8 152; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 153; ZVFHMIN-NEXT: vfmadd.vv v14, v10, v12 154; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma 155; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v14 156; ZVFHMIN-NEXT: ret 157 %neg = fneg <vscale x 4 x half> %vb 158 %neg2 = fneg <vscale x 4 x half> %vc 159 %vd = call <vscale x 4 x half> @llvm.experimental.constrained.fma.nxv4f16(<vscale x 4 x half> %neg, <vscale x 4 x half> %va, <vscale x 4 x half> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 160 ret <vscale x 4 x half> %vd 161} 162 163define <vscale x 4 x half> @vfnmsub_vf_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, half %c) strictfp { 164; ZVFH-LABEL: vfnmsub_vf_nxv4f16: 165; ZVFH: # %bb.0: 166; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 167; ZVFH-NEXT: vfnmadd.vf v8, fa0, v9 168; ZVFH-NEXT: ret 169; 170; ZVFHMIN-LABEL: vfnmsub_vf_nxv4f16: 171; ZVFHMIN: # %bb.0: 172; ZVFHMIN-NEXT: fmv.x.h a0, fa0 173; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m1, ta, ma 174; ZVFHMIN-NEXT: vmv.v.x v10, a0 175; ZVFHMIN-NEXT: lui a0, 8 176; ZVFHMIN-NEXT: vxor.vx v9, v9, a0 177; ZVFHMIN-NEXT: vxor.vx v10, v10, a0 178; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9 179; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v10 180; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 181; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 182; ZVFHMIN-NEXT: vfmadd.vv v10, v14, v12 183; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma 184; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10 185; ZVFHMIN-NEXT: ret 186 %head = insertelement <vscale x 4 x half> poison, half %c, i32 0 187 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 188 %neg = fneg <vscale x 4 x half> %splat 189 %neg2 = fneg <vscale x 4 x half> %vb 190 %vd = call <vscale x 4 x half> @llvm.experimental.constrained.fma.nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %neg, <vscale x 4 x half> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 191 ret <vscale x 4 x half> %vd 192} 193 194declare <vscale x 8 x half> @llvm.experimental.constrained.fma.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>, <vscale x 8 x half>, metadata, metadata) 195 196define <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) strictfp { 197; ZVFH-LABEL: vfnmsub_vv_nxv8f16: 198; ZVFH: # %bb.0: 199; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 200; ZVFH-NEXT: vfnmacc.vv v8, v12, v10 201; ZVFH-NEXT: ret 202; 203; ZVFHMIN-LABEL: vfnmsub_vv_nxv8f16: 204; ZVFHMIN: # %bb.0: 205; ZVFHMIN-NEXT: lui a0, 8 206; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m2, ta, ma 207; ZVFHMIN-NEXT: vxor.vx v10, v10, a0 208; ZVFHMIN-NEXT: vxor.vx v8, v8, a0 209; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8 210; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v10 211; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12 212; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 213; ZVFHMIN-NEXT: vfmadd.vv v24, v20, v16 214; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma 215; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v24 216; ZVFHMIN-NEXT: ret 217 %neg = fneg <vscale x 8 x half> %vb 218 %neg2 = fneg <vscale x 8 x half> %va 219 %vd = call <vscale x 8 x half> @llvm.experimental.constrained.fma.nxv8f16(<vscale x 8 x half> %neg, <vscale x 8 x half> %vc, <vscale x 8 x half> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 220 ret <vscale x 8 x half> %vd 221} 222 223define <vscale x 8 x half> @vfnmsub_vf_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, half %c) strictfp { 224; ZVFH-LABEL: vfnmsub_vf_nxv8f16: 225; ZVFH: # %bb.0: 226; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 227; ZVFH-NEXT: vfnmacc.vf v8, fa0, v10 228; ZVFH-NEXT: ret 229; 230; ZVFHMIN-LABEL: vfnmsub_vf_nxv8f16: 231; ZVFHMIN: # %bb.0: 232; ZVFHMIN-NEXT: fmv.x.h a0, fa0 233; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m2, ta, ma 234; ZVFHMIN-NEXT: vmv.v.x v12, a0 235; ZVFHMIN-NEXT: lui a0, 8 236; ZVFHMIN-NEXT: vxor.vx v8, v8, a0 237; ZVFHMIN-NEXT: vxor.vx v12, v12, a0 238; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8 239; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v12 240; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 241; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 242; ZVFHMIN-NEXT: vfmadd.vv v12, v20, v16 243; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma 244; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12 245; ZVFHMIN-NEXT: ret 246 %head = insertelement <vscale x 8 x half> poison, half %c, i32 0 247 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 248 %neg = fneg <vscale x 8 x half> %splat 249 %neg2 = fneg <vscale x 8 x half> %va 250 %vd = call <vscale x 8 x half> @llvm.experimental.constrained.fma.nxv8f16(<vscale x 8 x half> %vb, <vscale x 8 x half> %neg, <vscale x 8 x half> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 251 ret <vscale x 8 x half> %vd 252} 253 254declare <vscale x 16 x half> @llvm.experimental.constrained.fma.nxv16f16(<vscale x 16 x half>, <vscale x 16 x half>, <vscale x 16 x half>, metadata, metadata) 255 256define <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) strictfp { 257; ZVFH-LABEL: vfnmsub_vv_nxv16f16: 258; ZVFH: # %bb.0: 259; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 260; ZVFH-NEXT: vfnmadd.vv v8, v16, v12 261; ZVFH-NEXT: ret 262; 263; ZVFHMIN-LABEL: vfnmsub_vv_nxv16f16: 264; ZVFHMIN: # %bb.0: 265; ZVFHMIN-NEXT: lui a0, 8 266; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma 267; ZVFHMIN-NEXT: vxor.vx v16, v16, a0 268; ZVFHMIN-NEXT: vxor.vx v12, v12, a0 269; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12 270; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v16 271; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8 272; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 273; ZVFHMIN-NEXT: vfmadd.vv v16, v0, v24 274; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 275; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v16 276; ZVFHMIN-NEXT: ret 277 %neg = fneg <vscale x 16 x half> %vc 278 %neg2 = fneg <vscale x 16 x half> %vb 279 %vd = call <vscale x 16 x half> @llvm.experimental.constrained.fma.nxv16f16(<vscale x 16 x half> %neg, <vscale x 16 x half> %va, <vscale x 16 x half> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 280 ret <vscale x 16 x half> %vd 281} 282 283define <vscale x 16 x half> @vfnmsub_vf_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, half %c) strictfp { 284; ZVFH-LABEL: vfnmsub_vf_nxv16f16: 285; ZVFH: # %bb.0: 286; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 287; ZVFH-NEXT: vfnmadd.vf v8, fa0, v12 288; ZVFH-NEXT: ret 289; 290; ZVFHMIN-LABEL: vfnmsub_vf_nxv16f16: 291; ZVFHMIN: # %bb.0: 292; ZVFHMIN-NEXT: fmv.x.h a0, fa0 293; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma 294; ZVFHMIN-NEXT: vmv.v.x v16, a0 295; ZVFHMIN-NEXT: lui a0, 8 296; ZVFHMIN-NEXT: vxor.vx v12, v12, a0 297; ZVFHMIN-NEXT: vxor.vx v16, v16, a0 298; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12 299; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v16 300; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8 301; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 302; ZVFHMIN-NEXT: vfmadd.vv v16, v0, v24 303; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 304; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v16 305; ZVFHMIN-NEXT: ret 306 %head = insertelement <vscale x 16 x half> poison, half %c, i32 0 307 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 308 %neg = fneg <vscale x 16 x half> %splat 309 %neg2 = fneg <vscale x 16 x half> %vb 310 %vd = call <vscale x 16 x half> @llvm.experimental.constrained.fma.nxv16f16(<vscale x 16 x half> %neg, <vscale x 16 x half> %va, <vscale x 16 x half> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 311 ret <vscale x 16 x half> %vd 312} 313 314declare <vscale x 32 x half> @llvm.experimental.constrained.fma.nxv32f16(<vscale x 32 x half>, <vscale x 32 x half>, <vscale x 32 x half>, metadata, metadata) 315 316define <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) strictfp { 317; ZVFH-LABEL: vfnmsub_vv_nxv32f16: 318; ZVFH: # %bb.0: 319; ZVFH-NEXT: vl8re16.v v24, (a0) 320; ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma 321; ZVFH-NEXT: vfnmadd.vv v8, v24, v16 322; ZVFH-NEXT: ret 323; 324; ZVFHMIN-LABEL: vfnmsub_vv_nxv32f16: 325; ZVFHMIN: # %bb.0: 326; ZVFHMIN-NEXT: addi sp, sp, -16 327; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16 328; ZVFHMIN-NEXT: csrr a1, vlenb 329; ZVFHMIN-NEXT: slli a1, a1, 5 330; ZVFHMIN-NEXT: sub sp, sp, a1 331; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x20, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 32 * vlenb 332; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma 333; ZVFHMIN-NEXT: vmv8r.v v0, v16 334; ZVFHMIN-NEXT: csrr a1, vlenb 335; ZVFHMIN-NEXT: li a2, 24 336; ZVFHMIN-NEXT: mul a1, a1, a2 337; ZVFHMIN-NEXT: add a1, sp, a1 338; ZVFHMIN-NEXT: addi a1, a1, 16 339; ZVFHMIN-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill 340; ZVFHMIN-NEXT: vl8re16.v v16, (a0) 341; ZVFHMIN-NEXT: lui a0, 8 342; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v8 343; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m8, ta, ma 344; ZVFHMIN-NEXT: vxor.vx v8, v0, a0 345; ZVFHMIN-NEXT: csrr a1, vlenb 346; ZVFHMIN-NEXT: slli a1, a1, 4 347; ZVFHMIN-NEXT: add a1, sp, a1 348; ZVFHMIN-NEXT: addi a1, a1, 16 349; ZVFHMIN-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill 350; ZVFHMIN-NEXT: vxor.vx v16, v16, a0 351; ZVFHMIN-NEXT: addi a0, sp, 16 352; ZVFHMIN-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill 353; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 354; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8 355; ZVFHMIN-NEXT: csrr a0, vlenb 356; ZVFHMIN-NEXT: slli a0, a0, 3 357; ZVFHMIN-NEXT: add a0, sp, a0 358; ZVFHMIN-NEXT: addi a0, a0, 16 359; ZVFHMIN-NEXT: vs8r.v v0, (a0) # Unknown-size Folded Spill 360; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v16 361; ZVFHMIN-NEXT: csrr a0, vlenb 362; ZVFHMIN-NEXT: slli a0, a0, 3 363; ZVFHMIN-NEXT: add a0, sp, a0 364; ZVFHMIN-NEXT: addi a0, a0, 16 365; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 366; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 367; ZVFHMIN-NEXT: vfmadd.vv v24, v0, v8 368; ZVFHMIN-NEXT: csrr a0, vlenb 369; ZVFHMIN-NEXT: li a1, 24 370; ZVFHMIN-NEXT: mul a0, a0, a1 371; ZVFHMIN-NEXT: add a0, sp, a0 372; ZVFHMIN-NEXT: addi a0, a0, 16 373; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 374; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 375; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v12 376; ZVFHMIN-NEXT: csrr a0, vlenb 377; ZVFHMIN-NEXT: slli a0, a0, 4 378; ZVFHMIN-NEXT: add a0, sp, a0 379; ZVFHMIN-NEXT: addi a0, a0, 16 380; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 381; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 382; ZVFHMIN-NEXT: csrr a0, vlenb 383; ZVFHMIN-NEXT: li a1, 24 384; ZVFHMIN-NEXT: mul a0, a0, a1 385; ZVFHMIN-NEXT: add a0, sp, a0 386; ZVFHMIN-NEXT: addi a0, a0, 16 387; ZVFHMIN-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill 388; ZVFHMIN-NEXT: addi a0, sp, 16 389; ZVFHMIN-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload 390; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v20 391; ZVFHMIN-NEXT: csrr a0, vlenb 392; ZVFHMIN-NEXT: li a1, 24 393; ZVFHMIN-NEXT: mul a0, a0, a1 394; ZVFHMIN-NEXT: add a0, sp, a0 395; ZVFHMIN-NEXT: addi a0, a0, 16 396; ZVFHMIN-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload 397; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 398; ZVFHMIN-NEXT: vfmadd.vv v0, v8, v16 399; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 400; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v24 401; ZVFHMIN-NEXT: vfncvt.f.f.w v12, v0 402; ZVFHMIN-NEXT: csrr a0, vlenb 403; ZVFHMIN-NEXT: slli a0, a0, 5 404; ZVFHMIN-NEXT: add sp, sp, a0 405; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16 406; ZVFHMIN-NEXT: addi sp, sp, 16 407; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0 408; ZVFHMIN-NEXT: ret 409 %neg = fneg <vscale x 32 x half> %vc 410 %neg2 = fneg <vscale x 32 x half> %vb 411 %vd = call <vscale x 32 x half> @llvm.experimental.constrained.fma.nxv32f16(<vscale x 32 x half> %neg, <vscale x 32 x half> %va, <vscale x 32 x half> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 412 ret <vscale x 32 x half> %vd 413} 414 415define <vscale x 32 x half> @vfnmsub_vf_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, half %c) strictfp { 416; ZVFH-LABEL: vfnmsub_vf_nxv32f16: 417; ZVFH: # %bb.0: 418; ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma 419; ZVFH-NEXT: vfnmacc.vf v8, fa0, v16 420; ZVFH-NEXT: ret 421; 422; ZVFHMIN-LABEL: vfnmsub_vf_nxv32f16: 423; ZVFHMIN: # %bb.0: 424; ZVFHMIN-NEXT: addi sp, sp, -16 425; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16 426; ZVFHMIN-NEXT: csrr a0, vlenb 427; ZVFHMIN-NEXT: li a1, 24 428; ZVFHMIN-NEXT: mul a0, a0, a1 429; ZVFHMIN-NEXT: sub sp, sp, a0 430; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 24 * vlenb 431; ZVFHMIN-NEXT: csrr a0, vlenb 432; ZVFHMIN-NEXT: slli a0, a0, 4 433; ZVFHMIN-NEXT: add a0, sp, a0 434; ZVFHMIN-NEXT: addi a0, a0, 16 435; ZVFHMIN-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill 436; ZVFHMIN-NEXT: fmv.x.h a0, fa0 437; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m8, ta, ma 438; ZVFHMIN-NEXT: vmv.v.x v0, a0 439; ZVFHMIN-NEXT: lui a0, 8 440; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma 441; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16 442; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m8, ta, ma 443; ZVFHMIN-NEXT: vxor.vx v16, v8, a0 444; ZVFHMIN-NEXT: vxor.vx v8, v0, a0 445; ZVFHMIN-NEXT: csrr a0, vlenb 446; ZVFHMIN-NEXT: slli a0, a0, 3 447; ZVFHMIN-NEXT: add a0, sp, a0 448; ZVFHMIN-NEXT: addi a0, a0, 16 449; ZVFHMIN-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill 450; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 451; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v16 452; ZVFHMIN-NEXT: addi a0, sp, 16 453; ZVFHMIN-NEXT: vs8r.v v0, (a0) # Unknown-size Folded Spill 454; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8 455; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 456; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 457; ZVFHMIN-NEXT: vfmadd.vv v24, v0, v8 458; ZVFHMIN-NEXT: csrr a0, vlenb 459; ZVFHMIN-NEXT: slli a0, a0, 4 460; ZVFHMIN-NEXT: add a0, sp, a0 461; ZVFHMIN-NEXT: addi a0, a0, 16 462; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 463; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 464; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v12 465; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v20 466; ZVFHMIN-NEXT: csrr a0, vlenb 467; ZVFHMIN-NEXT: slli a0, a0, 4 468; ZVFHMIN-NEXT: add a0, sp, a0 469; ZVFHMIN-NEXT: addi a0, a0, 16 470; ZVFHMIN-NEXT: vs8r.v v8, (a0) # Unknown-size Folded Spill 471; ZVFHMIN-NEXT: csrr a0, vlenb 472; ZVFHMIN-NEXT: slli a0, a0, 3 473; ZVFHMIN-NEXT: add a0, sp, a0 474; ZVFHMIN-NEXT: addi a0, a0, 16 475; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 476; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 477; ZVFHMIN-NEXT: csrr a0, vlenb 478; ZVFHMIN-NEXT: slli a0, a0, 4 479; ZVFHMIN-NEXT: add a0, sp, a0 480; ZVFHMIN-NEXT: addi a0, a0, 16 481; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 482; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 483; ZVFHMIN-NEXT: vfmadd.vv v0, v16, v8 484; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 485; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v24 486; ZVFHMIN-NEXT: vfncvt.f.f.w v12, v0 487; ZVFHMIN-NEXT: csrr a0, vlenb 488; ZVFHMIN-NEXT: li a1, 24 489; ZVFHMIN-NEXT: mul a0, a0, a1 490; ZVFHMIN-NEXT: add sp, sp, a0 491; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16 492; ZVFHMIN-NEXT: addi sp, sp, 16 493; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0 494; ZVFHMIN-NEXT: ret 495 %head = insertelement <vscale x 32 x half> poison, half %c, i32 0 496 %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer 497 %neg = fneg <vscale x 32 x half> %splat 498 %neg2 = fneg <vscale x 32 x half> %va 499 %vd = call <vscale x 32 x half> @llvm.experimental.constrained.fma.nxv32f16(<vscale x 32 x half> %neg, <vscale x 32 x half> %vb, <vscale x 32 x half> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 500 ret <vscale x 32 x half> %vd 501} 502 503declare <vscale x 1 x float> @llvm.experimental.constrained.fma.nxv1f32(<vscale x 1 x float>, <vscale x 1 x float>, <vscale x 1 x float>, metadata, metadata) 504 505define <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) strictfp { 506; CHECK-LABEL: vfnmsub_vv_nxv1f32: 507; CHECK: # %bb.0: 508; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 509; CHECK-NEXT: vfnmadd.vv v8, v9, v10 510; CHECK-NEXT: ret 511 %neg = fneg <vscale x 1 x float> %vb 512 %neg2 = fneg <vscale x 1 x float> %vc 513 %vd = call <vscale x 1 x float> @llvm.experimental.constrained.fma.nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %neg, <vscale x 1 x float> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 514 ret <vscale x 1 x float> %vd 515} 516 517define <vscale x 1 x float> @vfnmsub_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, float %c) strictfp { 518; CHECK-LABEL: vfnmsub_vf_nxv1f32: 519; CHECK: # %bb.0: 520; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 521; CHECK-NEXT: vfnmadd.vf v8, fa0, v9 522; CHECK-NEXT: ret 523 %head = insertelement <vscale x 1 x float> poison, float %c, i32 0 524 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 525 %neg = fneg <vscale x 1 x float> %va 526 %neg2 = fneg <vscale x 1 x float> %vb 527 %vd = call <vscale x 1 x float> @llvm.experimental.constrained.fma.nxv1f32(<vscale x 1 x float> %neg, <vscale x 1 x float> %splat, <vscale x 1 x float> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 528 ret <vscale x 1 x float> %vd 529} 530 531declare <vscale x 2 x float> @llvm.experimental.constrained.fma.nxv2f32(<vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x float>, metadata, metadata) 532 533define <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) strictfp { 534; CHECK-LABEL: vfnmsub_vv_nxv2f32: 535; CHECK: # %bb.0: 536; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 537; CHECK-NEXT: vfnmadd.vv v8, v10, v9 538; CHECK-NEXT: ret 539 %neg = fneg <vscale x 2 x float> %vc 540 %neg2 = fneg <vscale x 2 x float> %vb 541 %vd = call <vscale x 2 x float> @llvm.experimental.constrained.fma.nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %neg, <vscale x 2 x float> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 542 ret <vscale x 2 x float> %vd 543} 544 545define <vscale x 2 x float> @vfnmsub_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, float %c) strictfp { 546; CHECK-LABEL: vfnmsub_vf_nxv2f32: 547; CHECK: # %bb.0: 548; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 549; CHECK-NEXT: vfnmadd.vf v8, fa0, v9 550; CHECK-NEXT: ret 551 %head = insertelement <vscale x 2 x float> poison, float %c, i32 0 552 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 553 %neg = fneg <vscale x 2 x float> %va 554 %neg2 = fneg <vscale x 2 x float> %vb 555 %vd = call <vscale x 2 x float> @llvm.experimental.constrained.fma.nxv2f32(<vscale x 2 x float> %splat, <vscale x 2 x float> %neg, <vscale x 2 x float> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 556 ret <vscale x 2 x float> %vd 557} 558 559declare <vscale x 4 x float> @llvm.experimental.constrained.fma.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>, metadata, metadata) 560 561define <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) strictfp { 562; CHECK-LABEL: vfnmsub_vv_nxv4f32: 563; CHECK: # %bb.0: 564; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 565; CHECK-NEXT: vfnmadd.vv v8, v10, v12 566; CHECK-NEXT: ret 567 %neg = fneg <vscale x 4 x float> %va 568 %neg2 = fneg <vscale x 4 x float> %vc 569 %vd = call <vscale x 4 x float> @llvm.experimental.constrained.fma.nxv4f32(<vscale x 4 x float> %vb, <vscale x 4 x float> %neg, <vscale x 4 x float> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 570 ret <vscale x 4 x float> %vd 571} 572 573define <vscale x 4 x float> @vfnmsub_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, float %c) strictfp { 574; CHECK-LABEL: vfnmsub_vf_nxv4f32: 575; CHECK: # %bb.0: 576; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 577; CHECK-NEXT: vfnmadd.vf v8, fa0, v10 578; CHECK-NEXT: ret 579 %head = insertelement <vscale x 4 x float> poison, float %c, i32 0 580 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 581 %neg = fneg <vscale x 4 x float> %splat 582 %neg2 = fneg <vscale x 4 x float> %vb 583 %vd = call <vscale x 4 x float> @llvm.experimental.constrained.fma.nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %neg, <vscale x 4 x float> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 584 ret <vscale x 4 x float> %vd 585} 586 587declare <vscale x 8 x float> @llvm.experimental.constrained.fma.nxv8f32(<vscale x 8 x float>, <vscale x 8 x float>, <vscale x 8 x float>, metadata, metadata) 588 589define <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) strictfp { 590; CHECK-LABEL: vfnmsub_vv_nxv8f32: 591; CHECK: # %bb.0: 592; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 593; CHECK-NEXT: vfnmacc.vv v8, v16, v12 594; CHECK-NEXT: ret 595 %neg = fneg <vscale x 8 x float> %vc 596 %neg2 = fneg <vscale x 8 x float> %va 597 %vd = call <vscale x 8 x float> @llvm.experimental.constrained.fma.nxv8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %neg, <vscale x 8 x float> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 598 ret <vscale x 8 x float> %vd 599} 600 601define <vscale x 8 x float> @vfnmsub_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, float %c) strictfp { 602; CHECK-LABEL: vfnmsub_vf_nxv8f32: 603; CHECK: # %bb.0: 604; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 605; CHECK-NEXT: vfnmacc.vf v8, fa0, v12 606; CHECK-NEXT: ret 607 %head = insertelement <vscale x 8 x float> poison, float %c, i32 0 608 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 609 %neg = fneg <vscale x 8 x float> %splat 610 %neg2 = fneg <vscale x 8 x float> %va 611 %vd = call <vscale x 8 x float> @llvm.experimental.constrained.fma.nxv8f32(<vscale x 8 x float> %vb, <vscale x 8 x float> %neg, <vscale x 8 x float> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 612 ret <vscale x 8 x float> %vd 613} 614 615declare <vscale x 16 x float> @llvm.experimental.constrained.fma.nxv16f32(<vscale x 16 x float>, <vscale x 16 x float>, <vscale x 16 x float>, metadata, metadata) 616 617define <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) strictfp { 618; CHECK-LABEL: vfnmsub_vv_nxv16f32: 619; CHECK: # %bb.0: 620; CHECK-NEXT: vl8re32.v v24, (a0) 621; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma 622; CHECK-NEXT: vfnmadd.vv v8, v24, v16 623; CHECK-NEXT: ret 624 %neg = fneg <vscale x 16 x float> %va 625 %neg2 = fneg <vscale x 16 x float> %vb 626 %vd = call <vscale x 16 x float> @llvm.experimental.constrained.fma.nxv16f32(<vscale x 16 x float> %vc, <vscale x 16 x float> %neg, <vscale x 16 x float> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 627 ret <vscale x 16 x float> %vd 628} 629 630define <vscale x 16 x float> @vfnmsub_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, float %c) strictfp { 631; CHECK-LABEL: vfnmsub_vf_nxv16f32: 632; CHECK: # %bb.0: 633; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma 634; CHECK-NEXT: vfnmadd.vf v8, fa0, v16 635; CHECK-NEXT: ret 636 %head = insertelement <vscale x 16 x float> poison, float %c, i32 0 637 %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer 638 %neg = fneg <vscale x 16 x float> %splat 639 %neg2 = fneg <vscale x 16 x float> %vb 640 %vd = call <vscale x 16 x float> @llvm.experimental.constrained.fma.nxv16f32(<vscale x 16 x float> %neg, <vscale x 16 x float> %va, <vscale x 16 x float> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 641 ret <vscale x 16 x float> %vd 642} 643 644declare <vscale x 1 x double> @llvm.experimental.constrained.fma.nxv1f64(<vscale x 1 x double>, <vscale x 1 x double>, <vscale x 1 x double>, metadata, metadata) 645 646define <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) strictfp { 647; CHECK-LABEL: vfnmsub_vv_nxv1f64: 648; CHECK: # %bb.0: 649; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma 650; CHECK-NEXT: vfnmacc.vv v8, v10, v9 651; CHECK-NEXT: ret 652 %neg = fneg <vscale x 1 x double> %vb 653 %neg2 = fneg <vscale x 1 x double> %va 654 %vd = call <vscale x 1 x double> @llvm.experimental.constrained.fma.nxv1f64(<vscale x 1 x double> %vc, <vscale x 1 x double> %neg, <vscale x 1 x double> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 655 ret <vscale x 1 x double> %vd 656} 657 658define <vscale x 1 x double> @vfnmsub_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, double %c) strictfp { 659; CHECK-LABEL: vfnmsub_vf_nxv1f64: 660; CHECK: # %bb.0: 661; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma 662; CHECK-NEXT: vfnmadd.vf v8, fa0, v9 663; CHECK-NEXT: ret 664 %head = insertelement <vscale x 1 x double> poison, double %c, i32 0 665 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer 666 %neg = fneg <vscale x 1 x double> %va 667 %neg2 = fneg <vscale x 1 x double> %vb 668 %vd = call <vscale x 1 x double> @llvm.experimental.constrained.fma.nxv1f64(<vscale x 1 x double> %neg, <vscale x 1 x double> %splat, <vscale x 1 x double> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 669 ret <vscale x 1 x double> %vd 670} 671 672declare <vscale x 2 x double> @llvm.experimental.constrained.fma.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>, metadata, metadata) 673 674define <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) strictfp { 675; CHECK-LABEL: vfnmsub_vv_nxv2f64: 676; CHECK: # %bb.0: 677; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 678; CHECK-NEXT: vfnmadd.vv v8, v12, v10 679; CHECK-NEXT: ret 680 %neg = fneg <vscale x 2 x double> %va 681 %neg2 = fneg <vscale x 2 x double> %vb 682 %vd = call <vscale x 2 x double> @llvm.experimental.constrained.fma.nxv2f64(<vscale x 2 x double> %neg, <vscale x 2 x double> %vc, <vscale x 2 x double> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 683 ret <vscale x 2 x double> %vd 684} 685 686define <vscale x 2 x double> @vfnmsub_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, double %c) strictfp { 687; CHECK-LABEL: vfnmsub_vf_nxv2f64: 688; CHECK: # %bb.0: 689; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 690; CHECK-NEXT: vfnmadd.vf v8, fa0, v10 691; CHECK-NEXT: ret 692 %head = insertelement <vscale x 2 x double> poison, double %c, i32 0 693 %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer 694 %neg = fneg <vscale x 2 x double> %va 695 %neg2 = fneg <vscale x 2 x double> %vb 696 %vd = call <vscale x 2 x double> @llvm.experimental.constrained.fma.nxv2f64(<vscale x 2 x double> %splat, <vscale x 2 x double> %neg, <vscale x 2 x double> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 697 ret <vscale x 2 x double> %vd 698} 699 700declare <vscale x 4 x double> @llvm.experimental.constrained.fma.nxv4f64(<vscale x 4 x double>, <vscale x 4 x double>, <vscale x 4 x double>, metadata, metadata) 701 702define <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) strictfp { 703; CHECK-LABEL: vfnmsub_vv_nxv4f64: 704; CHECK: # %bb.0: 705; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 706; CHECK-NEXT: vfnmadd.vv v8, v12, v16 707; CHECK-NEXT: ret 708 %neg = fneg <vscale x 4 x double> %vb 709 %neg2 = fneg <vscale x 4 x double> %vc 710 %vd = call <vscale x 4 x double> @llvm.experimental.constrained.fma.nxv4f64(<vscale x 4 x double> %neg, <vscale x 4 x double> %va, <vscale x 4 x double> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 711 ret <vscale x 4 x double> %vd 712} 713 714define <vscale x 4 x double> @vfnmsub_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, double %c) strictfp { 715; CHECK-LABEL: vfnmsub_vf_nxv4f64: 716; CHECK: # %bb.0: 717; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 718; CHECK-NEXT: vfnmadd.vf v8, fa0, v12 719; CHECK-NEXT: ret 720 %head = insertelement <vscale x 4 x double> poison, double %c, i32 0 721 %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer 722 %neg = fneg <vscale x 4 x double> %splat 723 %neg2 = fneg <vscale x 4 x double> %vb 724 %vd = call <vscale x 4 x double> @llvm.experimental.constrained.fma.nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %neg, <vscale x 4 x double> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 725 ret <vscale x 4 x double> %vd 726} 727 728declare <vscale x 8 x double> @llvm.experimental.constrained.fma.nxv8f64(<vscale x 8 x double>, <vscale x 8 x double>, <vscale x 8 x double>, metadata, metadata) 729 730define <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) strictfp { 731; CHECK-LABEL: vfnmsub_vv_nxv8f64: 732; CHECK: # %bb.0: 733; CHECK-NEXT: vl8re64.v v24, (a0) 734; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 735; CHECK-NEXT: vfnmacc.vv v8, v16, v24 736; CHECK-NEXT: ret 737 %neg = fneg <vscale x 8 x double> %vb 738 %neg2 = fneg <vscale x 8 x double> %va 739 %vd = call <vscale x 8 x double> @llvm.experimental.constrained.fma.nxv8f64(<vscale x 8 x double> %neg, <vscale x 8 x double> %vc, <vscale x 8 x double> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 740 ret <vscale x 8 x double> %vd 741} 742 743define <vscale x 8 x double> @vfnmsub_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, double %c) strictfp { 744; CHECK-LABEL: vfnmsub_vf_nxv8f64: 745; CHECK: # %bb.0: 746; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 747; CHECK-NEXT: vfnmacc.vf v8, fa0, v16 748; CHECK-NEXT: ret 749 %head = insertelement <vscale x 8 x double> poison, double %c, i32 0 750 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer 751 %neg = fneg <vscale x 8 x double> %splat 752 %neg2 = fneg <vscale x 8 x double> %va 753 %vd = call <vscale x 8 x double> @llvm.experimental.constrained.fma.nxv8f64(<vscale x 8 x double> %vb, <vscale x 8 x double> %neg, <vscale x 8 x double> %neg2, metadata !"round.dynamic", metadata !"fpexcept.strict") 754 ret <vscale x 8 x double> %vd 755} 756