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