1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v -target-abi=ilp32d \ 3; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH 4; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v -target-abi=lp64d \ 5; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH 6; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfhmin,+v -target-abi=ilp32d \ 7; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN 8; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfhmin,+v -target-abi=lp64d \ 9; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN 10 11declare <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float>, <vscale x 1 x float>, <vscale x 1 x float>) 12 13define <vscale x 1 x float> @vfwmacc_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) { 14; ZVFH-LABEL: vfwmacc_vv_nxv1f32: 15; ZVFH: # %bb.0: 16; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 17; ZVFH-NEXT: vfwmacc.vv v8, v9, v10 18; ZVFH-NEXT: ret 19; 20; ZVFHMIN-LABEL: vfwmacc_vv_nxv1f32: 21; ZVFHMIN: # %bb.0: 22; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 23; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9 24; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v10 25; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 26; ZVFHMIN-NEXT: vfmacc.vv v8, v11, v9 27; ZVFHMIN-NEXT: ret 28 %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float> 29 %ve = fpext <vscale x 1 x half> %vc to <vscale x 1 x float> 30 %vf = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vd, <vscale x 1 x float> %ve, <vscale x 1 x float> %va) 31 ret <vscale x 1 x float> %vf 32} 33 34define <vscale x 1 x float> @vfwmacc_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, half %c) { 35; ZVFH-LABEL: vfwmacc_vf_nxv1f32: 36; ZVFH: # %bb.0: 37; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 38; ZVFH-NEXT: vfwmacc.vf v8, fa0, v9 39; ZVFH-NEXT: ret 40; 41; ZVFHMIN-LABEL: vfwmacc_vf_nxv1f32: 42; ZVFHMIN: # %bb.0: 43; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 44; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 45; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 46; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 47; ZVFHMIN-NEXT: vfmacc.vf v8, fa5, v10 48; ZVFHMIN-NEXT: ret 49 %head = insertelement <vscale x 1 x half> poison, half %c, i32 0 50 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 51 %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float> 52 %ve = fpext <vscale x 1 x half> %splat to <vscale x 1 x float> 53 %vf = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vd, <vscale x 1 x float> %ve, <vscale x 1 x float> %va) 54 ret <vscale x 1 x float> %vf 55} 56 57define <vscale x 1 x float> @vfwnmacc_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) { 58; ZVFH-LABEL: vfwnmacc_vv_nxv1f32: 59; ZVFH: # %bb.0: 60; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 61; ZVFH-NEXT: vfwnmacc.vv v8, v9, v10 62; ZVFH-NEXT: ret 63; 64; ZVFHMIN-LABEL: vfwnmacc_vv_nxv1f32: 65; ZVFHMIN: # %bb.0: 66; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 67; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9 68; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v10 69; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 70; ZVFHMIN-NEXT: vfnmacc.vv v8, v11, v9 71; ZVFHMIN-NEXT: ret 72 %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float> 73 %ve = fpext <vscale x 1 x half> %vc to <vscale x 1 x float> 74 %vf = fneg <vscale x 1 x float> %va 75 %vg = fneg <vscale x 1 x float> %vd 76 %vh = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vg, <vscale x 1 x float> %ve, <vscale x 1 x float> %vf) 77 ret <vscale x 1 x float> %vh 78} 79 80define <vscale x 1 x float> @vfwnmacc_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, half %c) { 81; ZVFH-LABEL: vfwnmacc_vf_nxv1f32: 82; ZVFH: # %bb.0: 83; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 84; ZVFH-NEXT: vfwnmacc.vf v8, fa0, v9 85; ZVFH-NEXT: ret 86; 87; ZVFHMIN-LABEL: vfwnmacc_vf_nxv1f32: 88; ZVFHMIN: # %bb.0: 89; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 90; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 91; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 92; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 93; ZVFHMIN-NEXT: vfnmacc.vf v8, fa5, v10 94; ZVFHMIN-NEXT: ret 95 %head = insertelement <vscale x 1 x half> poison, half %c, i32 0 96 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 97 %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float> 98 %ve = fpext <vscale x 1 x half> %splat to <vscale x 1 x float> 99 %vf = fneg <vscale x 1 x float> %va 100 %vg = fneg <vscale x 1 x float> %vd 101 %vh = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vg, <vscale x 1 x float> %ve, <vscale x 1 x float> %vf) 102 ret <vscale x 1 x float> %vh 103} 104 105define <vscale x 1 x float> @vfwnmacc_fv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, half %c) { 106; ZVFH-LABEL: vfwnmacc_fv_nxv1f32: 107; ZVFH: # %bb.0: 108; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 109; ZVFH-NEXT: vfwnmacc.vf v8, fa0, v9 110; ZVFH-NEXT: ret 111; 112; ZVFHMIN-LABEL: vfwnmacc_fv_nxv1f32: 113; ZVFHMIN: # %bb.0: 114; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 115; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 116; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 117; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 118; ZVFHMIN-NEXT: vfnmacc.vf v8, fa5, v10 119; ZVFHMIN-NEXT: ret 120 %head = insertelement <vscale x 1 x half> poison, half %c, i32 0 121 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 122 %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float> 123 %ve = fpext <vscale x 1 x half> %splat to <vscale x 1 x float> 124 %vf = fneg <vscale x 1 x float> %va 125 %vg = fneg <vscale x 1 x float> %ve 126 %vh = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vd, <vscale x 1 x float> %vg, <vscale x 1 x float> %vf) 127 ret <vscale x 1 x float> %vh 128} 129 130define <vscale x 1 x float> @vfwmsac_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) { 131; ZVFH-LABEL: vfwmsac_vv_nxv1f32: 132; ZVFH: # %bb.0: 133; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 134; ZVFH-NEXT: vfwmsac.vv v8, v9, v10 135; ZVFH-NEXT: ret 136; 137; ZVFHMIN-LABEL: vfwmsac_vv_nxv1f32: 138; ZVFHMIN: # %bb.0: 139; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 140; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9 141; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v10 142; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 143; ZVFHMIN-NEXT: vfmsac.vv v8, v11, v9 144; ZVFHMIN-NEXT: ret 145 %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float> 146 %ve = fpext <vscale x 1 x half> %vc to <vscale x 1 x float> 147 %vf = fneg <vscale x 1 x float> %va 148 %vg = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vd, <vscale x 1 x float> %ve, <vscale x 1 x float> %vf) 149 ret <vscale x 1 x float> %vg 150} 151 152define <vscale x 1 x float> @vfwmsac_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, half %c) { 153; ZVFH-LABEL: vfwmsac_vf_nxv1f32: 154; ZVFH: # %bb.0: 155; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 156; ZVFH-NEXT: vfwmsac.vf v8, fa0, v9 157; ZVFH-NEXT: ret 158; 159; ZVFHMIN-LABEL: vfwmsac_vf_nxv1f32: 160; ZVFHMIN: # %bb.0: 161; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 162; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 163; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 164; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 165; ZVFHMIN-NEXT: vfmsac.vf v8, fa5, v10 166; ZVFHMIN-NEXT: ret 167 %head = insertelement <vscale x 1 x half> poison, half %c, i32 0 168 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 169 %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float> 170 %ve = fpext <vscale x 1 x half> %splat to <vscale x 1 x float> 171 %vf = fneg <vscale x 1 x float> %va 172 %vg = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vd, <vscale x 1 x float> %ve, <vscale x 1 x float> %vf) 173 ret <vscale x 1 x float> %vg 174} 175 176define <vscale x 1 x float> @vfwnmsac_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, <vscale x 1 x half> %vc) { 177; ZVFH-LABEL: vfwnmsac_vv_nxv1f32: 178; ZVFH: # %bb.0: 179; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 180; ZVFH-NEXT: vfwnmsac.vv v8, v9, v10 181; ZVFH-NEXT: ret 182; 183; ZVFHMIN-LABEL: vfwnmsac_vv_nxv1f32: 184; ZVFHMIN: # %bb.0: 185; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 186; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9 187; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v10 188; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 189; ZVFHMIN-NEXT: vfnmsac.vv v8, v11, v9 190; ZVFHMIN-NEXT: ret 191 %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float> 192 %ve = fpext <vscale x 1 x half> %vc to <vscale x 1 x float> 193 %vf = fneg <vscale x 1 x float> %vd 194 %vg = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vf, <vscale x 1 x float> %ve, <vscale x 1 x float> %va) 195 ret <vscale x 1 x float> %vg 196} 197 198define <vscale x 1 x float> @vfwnmsac_vf_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, half %c) { 199; ZVFH-LABEL: vfwnmsac_vf_nxv1f32: 200; ZVFH: # %bb.0: 201; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 202; ZVFH-NEXT: vfwnmsac.vf v8, fa0, v9 203; ZVFH-NEXT: ret 204; 205; ZVFHMIN-LABEL: vfwnmsac_vf_nxv1f32: 206; ZVFHMIN: # %bb.0: 207; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 208; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 209; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 210; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 211; ZVFHMIN-NEXT: vfnmsac.vf v8, fa5, v10 212; ZVFHMIN-NEXT: ret 213 %head = insertelement <vscale x 1 x half> poison, half %c, i32 0 214 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 215 %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float> 216 %ve = fpext <vscale x 1 x half> %splat to <vscale x 1 x float> 217 %vf = fneg <vscale x 1 x float> %vd 218 %vg = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vf, <vscale x 1 x float> %ve, <vscale x 1 x float> %va) 219 ret <vscale x 1 x float> %vg 220} 221 222define <vscale x 1 x float> @vfwnmsac_fv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x half> %vb, half %c) { 223; ZVFH-LABEL: vfwnmsac_fv_nxv1f32: 224; ZVFH: # %bb.0: 225; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 226; ZVFH-NEXT: vfwnmsac.vf v8, fa0, v9 227; ZVFH-NEXT: ret 228; 229; ZVFHMIN-LABEL: vfwnmsac_fv_nxv1f32: 230; ZVFHMIN: # %bb.0: 231; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 232; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 233; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 234; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 235; ZVFHMIN-NEXT: vfnmsac.vf v8, fa5, v10 236; ZVFHMIN-NEXT: ret 237 %head = insertelement <vscale x 1 x half> poison, half %c, i32 0 238 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 239 %vd = fpext <vscale x 1 x half> %vb to <vscale x 1 x float> 240 %ve = fpext <vscale x 1 x half> %splat to <vscale x 1 x float> 241 %vf = fneg <vscale x 1 x float> %ve 242 %vg = call <vscale x 1 x float> @llvm.fma.v1f32(<vscale x 1 x float> %vd, <vscale x 1 x float> %vf, <vscale x 1 x float> %va) 243 ret <vscale x 1 x float> %vg 244} 245 246declare <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x float>) 247 248define <vscale x 2 x float> @vfwmacc_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) { 249; ZVFH-LABEL: vfwmacc_vv_nxv2f32: 250; ZVFH: # %bb.0: 251; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 252; ZVFH-NEXT: vfwmacc.vv v8, v9, v10 253; ZVFH-NEXT: ret 254; 255; ZVFHMIN-LABEL: vfwmacc_vv_nxv2f32: 256; ZVFHMIN: # %bb.0: 257; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 258; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9 259; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v10 260; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 261; ZVFHMIN-NEXT: vfmacc.vv v8, v11, v9 262; ZVFHMIN-NEXT: ret 263 %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float> 264 %ve = fpext <vscale x 2 x half> %vc to <vscale x 2 x float> 265 %vf = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vd, <vscale x 2 x float> %ve, <vscale x 2 x float> %va) 266 ret <vscale x 2 x float> %vf 267} 268 269define <vscale x 2 x float> @vfwmacc_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, half %c) { 270; ZVFH-LABEL: vfwmacc_vf_nxv2f32: 271; ZVFH: # %bb.0: 272; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 273; ZVFH-NEXT: vfwmacc.vf v8, fa0, v9 274; ZVFH-NEXT: ret 275; 276; ZVFHMIN-LABEL: vfwmacc_vf_nxv2f32: 277; ZVFHMIN: # %bb.0: 278; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 279; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 280; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 281; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 282; ZVFHMIN-NEXT: vfmacc.vf v8, fa5, v10 283; ZVFHMIN-NEXT: ret 284 %head = insertelement <vscale x 2 x half> poison, half %c, i32 0 285 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 286 %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float> 287 %ve = fpext <vscale x 2 x half> %splat to <vscale x 2 x float> 288 %vf = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vd, <vscale x 2 x float> %ve, <vscale x 2 x float> %va) 289 ret <vscale x 2 x float> %vf 290} 291 292define <vscale x 2 x float> @vfwnmacc_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) { 293; ZVFH-LABEL: vfwnmacc_vv_nxv2f32: 294; ZVFH: # %bb.0: 295; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 296; ZVFH-NEXT: vfwnmacc.vv v8, v9, v10 297; ZVFH-NEXT: ret 298; 299; ZVFHMIN-LABEL: vfwnmacc_vv_nxv2f32: 300; ZVFHMIN: # %bb.0: 301; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 302; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9 303; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v10 304; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 305; ZVFHMIN-NEXT: vfnmacc.vv v8, v11, v9 306; ZVFHMIN-NEXT: ret 307 %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float> 308 %ve = fpext <vscale x 2 x half> %vc to <vscale x 2 x float> 309 %vf = fneg <vscale x 2 x float> %va 310 %vg = fneg <vscale x 2 x float> %vd 311 %vh = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vg, <vscale x 2 x float> %ve, <vscale x 2 x float> %vf) 312 ret <vscale x 2 x float> %vh 313} 314 315define <vscale x 2 x float> @vfwnmacc_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, half %c) { 316; ZVFH-LABEL: vfwnmacc_vf_nxv2f32: 317; ZVFH: # %bb.0: 318; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 319; ZVFH-NEXT: vfwnmacc.vf v8, fa0, v9 320; ZVFH-NEXT: ret 321; 322; ZVFHMIN-LABEL: vfwnmacc_vf_nxv2f32: 323; ZVFHMIN: # %bb.0: 324; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 325; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 326; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 327; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 328; ZVFHMIN-NEXT: vfnmacc.vf v8, fa5, v10 329; ZVFHMIN-NEXT: ret 330 %head = insertelement <vscale x 2 x half> poison, half %c, i32 0 331 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 332 %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float> 333 %ve = fpext <vscale x 2 x half> %splat to <vscale x 2 x float> 334 %vf = fneg <vscale x 2 x float> %va 335 %vg = fneg <vscale x 2 x float> %vd 336 %vh = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vg, <vscale x 2 x float> %ve, <vscale x 2 x float> %vf) 337 ret <vscale x 2 x float> %vh 338} 339 340define <vscale x 2 x float> @vfwnmacc_fv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, half %c) { 341; ZVFH-LABEL: vfwnmacc_fv_nxv2f32: 342; ZVFH: # %bb.0: 343; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 344; ZVFH-NEXT: vfwnmacc.vf v8, fa0, v9 345; ZVFH-NEXT: ret 346; 347; ZVFHMIN-LABEL: vfwnmacc_fv_nxv2f32: 348; ZVFHMIN: # %bb.0: 349; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 350; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 351; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 352; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 353; ZVFHMIN-NEXT: vfnmacc.vf v8, fa5, v10 354; ZVFHMIN-NEXT: ret 355 %head = insertelement <vscale x 2 x half> poison, half %c, i32 0 356 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 357 %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float> 358 %ve = fpext <vscale x 2 x half> %splat to <vscale x 2 x float> 359 %vf = fneg <vscale x 2 x float> %va 360 %vg = fneg <vscale x 2 x float> %ve 361 %vh = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vd, <vscale x 2 x float> %vg, <vscale x 2 x float> %vf) 362 ret <vscale x 2 x float> %vh 363} 364 365define <vscale x 2 x float> @vfwmsac_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) { 366; ZVFH-LABEL: vfwmsac_vv_nxv2f32: 367; ZVFH: # %bb.0: 368; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 369; ZVFH-NEXT: vfwmsac.vv v8, v9, v10 370; ZVFH-NEXT: ret 371; 372; ZVFHMIN-LABEL: vfwmsac_vv_nxv2f32: 373; ZVFHMIN: # %bb.0: 374; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 375; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9 376; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v10 377; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 378; ZVFHMIN-NEXT: vfmsac.vv v8, v11, v9 379; ZVFHMIN-NEXT: ret 380 %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float> 381 %ve = fpext <vscale x 2 x half> %vc to <vscale x 2 x float> 382 %vf = fneg <vscale x 2 x float> %va 383 %vg = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vd, <vscale x 2 x float> %ve, <vscale x 2 x float> %vf) 384 ret <vscale x 2 x float> %vg 385} 386 387define <vscale x 2 x float> @vfwmsac_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, half %c) { 388; ZVFH-LABEL: vfwmsac_vf_nxv2f32: 389; ZVFH: # %bb.0: 390; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 391; ZVFH-NEXT: vfwmsac.vf v8, fa0, v9 392; ZVFH-NEXT: ret 393; 394; ZVFHMIN-LABEL: vfwmsac_vf_nxv2f32: 395; ZVFHMIN: # %bb.0: 396; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 397; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 398; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 399; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 400; ZVFHMIN-NEXT: vfmsac.vf v8, fa5, v10 401; ZVFHMIN-NEXT: ret 402 %head = insertelement <vscale x 2 x half> poison, half %c, i32 0 403 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 404 %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float> 405 %ve = fpext <vscale x 2 x half> %splat to <vscale x 2 x float> 406 %vf = fneg <vscale x 2 x float> %va 407 %vg = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vd, <vscale x 2 x float> %ve, <vscale x 2 x float> %vf) 408 ret <vscale x 2 x float> %vg 409} 410 411define <vscale x 2 x float> @vfwnmsac_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, <vscale x 2 x half> %vc) { 412; ZVFH-LABEL: vfwnmsac_vv_nxv2f32: 413; ZVFH: # %bb.0: 414; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 415; ZVFH-NEXT: vfwnmsac.vv v8, v9, v10 416; ZVFH-NEXT: ret 417; 418; ZVFHMIN-LABEL: vfwnmsac_vv_nxv2f32: 419; ZVFHMIN: # %bb.0: 420; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 421; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v9 422; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v10 423; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 424; ZVFHMIN-NEXT: vfnmsac.vv v8, v11, v9 425; ZVFHMIN-NEXT: ret 426 %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float> 427 %ve = fpext <vscale x 2 x half> %vc to <vscale x 2 x float> 428 %vf = fneg <vscale x 2 x float> %vd 429 %vg = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vf, <vscale x 2 x float> %ve, <vscale x 2 x float> %va) 430 ret <vscale x 2 x float> %vg 431} 432 433define <vscale x 2 x float> @vfwnmsac_vf_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, half %c) { 434; ZVFH-LABEL: vfwnmsac_vf_nxv2f32: 435; ZVFH: # %bb.0: 436; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 437; ZVFH-NEXT: vfwnmsac.vf v8, fa0, v9 438; ZVFH-NEXT: ret 439; 440; ZVFHMIN-LABEL: vfwnmsac_vf_nxv2f32: 441; ZVFHMIN: # %bb.0: 442; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 443; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 444; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 445; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 446; ZVFHMIN-NEXT: vfnmsac.vf v8, fa5, v10 447; ZVFHMIN-NEXT: ret 448 %head = insertelement <vscale x 2 x half> poison, half %c, i32 0 449 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 450 %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float> 451 %ve = fpext <vscale x 2 x half> %splat to <vscale x 2 x float> 452 %vf = fneg <vscale x 2 x float> %vd 453 %vg = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vf, <vscale x 2 x float> %ve, <vscale x 2 x float> %va) 454 ret <vscale x 2 x float> %vg 455} 456 457define <vscale x 2 x float> @vfwnmsac_fv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x half> %vb, half %c) { 458; ZVFH-LABEL: vfwnmsac_fv_nxv2f32: 459; ZVFH: # %bb.0: 460; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 461; ZVFH-NEXT: vfwnmsac.vf v8, fa0, v9 462; ZVFH-NEXT: ret 463; 464; ZVFHMIN-LABEL: vfwnmsac_fv_nxv2f32: 465; ZVFHMIN: # %bb.0: 466; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 467; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 468; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 469; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 470; ZVFHMIN-NEXT: vfnmsac.vf v8, fa5, v10 471; ZVFHMIN-NEXT: ret 472 %head = insertelement <vscale x 2 x half> poison, half %c, i32 0 473 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 474 %vd = fpext <vscale x 2 x half> %vb to <vscale x 2 x float> 475 %ve = fpext <vscale x 2 x half> %splat to <vscale x 2 x float> 476 %vf = fneg <vscale x 2 x float> %ve 477 %vg = call <vscale x 2 x float> @llvm.fma.v2f32(<vscale x 2 x float> %vd, <vscale x 2 x float> %vf, <vscale x 2 x float> %va) 478 ret <vscale x 2 x float> %vg 479} 480 481 482declare <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>) 483 484define <vscale x 4 x float> @vfwmacc_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) { 485; ZVFH-LABEL: vfwmacc_vv_nxv4f32: 486; ZVFH: # %bb.0: 487; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 488; ZVFH-NEXT: vfwmacc.vv v8, v10, v11 489; ZVFH-NEXT: ret 490; 491; ZVFHMIN-LABEL: vfwmacc_vv_nxv4f32: 492; ZVFHMIN: # %bb.0: 493; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma 494; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 495; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v11 496; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 497; ZVFHMIN-NEXT: vfmacc.vv v8, v12, v14 498; ZVFHMIN-NEXT: ret 499 %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float> 500 %ve = fpext <vscale x 4 x half> %vc to <vscale x 4 x float> 501 %vf = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vd, <vscale x 4 x float> %ve, <vscale x 4 x float> %va) 502 ret <vscale x 4 x float> %vf 503} 504 505define <vscale x 4 x float> @vfwmacc_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, half %c) { 506; ZVFH-LABEL: vfwmacc_vf_nxv4f32: 507; ZVFH: # %bb.0: 508; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 509; ZVFH-NEXT: vfwmacc.vf v8, fa0, v10 510; ZVFH-NEXT: ret 511; 512; ZVFHMIN-LABEL: vfwmacc_vf_nxv4f32: 513; ZVFHMIN: # %bb.0: 514; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma 515; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 516; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 517; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 518; ZVFHMIN-NEXT: vfmacc.vf v8, fa5, v12 519; ZVFHMIN-NEXT: ret 520 %head = insertelement <vscale x 4 x half> poison, half %c, i32 0 521 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 522 %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float> 523 %ve = fpext <vscale x 4 x half> %splat to <vscale x 4 x float> 524 %vf = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vd, <vscale x 4 x float> %ve, <vscale x 4 x float> %va) 525 ret <vscale x 4 x float> %vf 526} 527 528define <vscale x 4 x float> @vfwnmacc_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) { 529; ZVFH-LABEL: vfwnmacc_vv_nxv4f32: 530; ZVFH: # %bb.0: 531; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 532; ZVFH-NEXT: vfwnmacc.vv v8, v10, v11 533; ZVFH-NEXT: ret 534; 535; ZVFHMIN-LABEL: vfwnmacc_vv_nxv4f32: 536; ZVFHMIN: # %bb.0: 537; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma 538; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 539; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v11 540; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 541; ZVFHMIN-NEXT: vfnmacc.vv v8, v12, v14 542; ZVFHMIN-NEXT: ret 543 %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float> 544 %ve = fpext <vscale x 4 x half> %vc to <vscale x 4 x float> 545 %vf = fneg <vscale x 4 x float> %va 546 %vg = fneg <vscale x 4 x float> %vd 547 %vh = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vg, <vscale x 4 x float> %ve, <vscale x 4 x float> %vf) 548 ret <vscale x 4 x float> %vh 549} 550 551define <vscale x 4 x float> @vfwnmacc_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, half %c) { 552; ZVFH-LABEL: vfwnmacc_vf_nxv4f32: 553; ZVFH: # %bb.0: 554; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 555; ZVFH-NEXT: vfwnmacc.vf v8, fa0, v10 556; ZVFH-NEXT: ret 557; 558; ZVFHMIN-LABEL: vfwnmacc_vf_nxv4f32: 559; ZVFHMIN: # %bb.0: 560; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma 561; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 562; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 563; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 564; ZVFHMIN-NEXT: vfnmacc.vf v8, fa5, v12 565; ZVFHMIN-NEXT: ret 566 %head = insertelement <vscale x 4 x half> poison, half %c, i32 0 567 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 568 %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float> 569 %ve = fpext <vscale x 4 x half> %splat to <vscale x 4 x float> 570 %vf = fneg <vscale x 4 x float> %va 571 %vg = fneg <vscale x 4 x float> %vd 572 %vh = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vg, <vscale x 4 x float> %ve, <vscale x 4 x float> %vf) 573 ret <vscale x 4 x float> %vh 574} 575 576define <vscale x 4 x float> @vfwnmacc_fv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, half %c) { 577; ZVFH-LABEL: vfwnmacc_fv_nxv4f32: 578; ZVFH: # %bb.0: 579; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 580; ZVFH-NEXT: vfwnmacc.vf v8, fa0, v10 581; ZVFH-NEXT: ret 582; 583; ZVFHMIN-LABEL: vfwnmacc_fv_nxv4f32: 584; ZVFHMIN: # %bb.0: 585; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma 586; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 587; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 588; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 589; ZVFHMIN-NEXT: vfnmacc.vf v8, fa5, v12 590; ZVFHMIN-NEXT: ret 591 %head = insertelement <vscale x 4 x half> poison, half %c, i32 0 592 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 593 %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float> 594 %ve = fpext <vscale x 4 x half> %splat to <vscale x 4 x float> 595 %vf = fneg <vscale x 4 x float> %va 596 %vg = fneg <vscale x 4 x float> %ve 597 %vh = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vd, <vscale x 4 x float> %vg, <vscale x 4 x float> %vf) 598 ret <vscale x 4 x float> %vh 599} 600 601define <vscale x 4 x float> @vfwmsac_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) { 602; ZVFH-LABEL: vfwmsac_vv_nxv4f32: 603; ZVFH: # %bb.0: 604; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 605; ZVFH-NEXT: vfwmsac.vv v8, v10, v11 606; ZVFH-NEXT: ret 607; 608; ZVFHMIN-LABEL: vfwmsac_vv_nxv4f32: 609; ZVFHMIN: # %bb.0: 610; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma 611; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 612; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v11 613; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 614; ZVFHMIN-NEXT: vfmsac.vv v8, v12, v14 615; ZVFHMIN-NEXT: ret 616 %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float> 617 %ve = fpext <vscale x 4 x half> %vc to <vscale x 4 x float> 618 %vf = fneg <vscale x 4 x float> %va 619 %vg = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vd, <vscale x 4 x float> %ve, <vscale x 4 x float> %vf) 620 ret <vscale x 4 x float> %vg 621} 622 623define <vscale x 4 x float> @vfwmsac_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, half %c) { 624; ZVFH-LABEL: vfwmsac_vf_nxv4f32: 625; ZVFH: # %bb.0: 626; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 627; ZVFH-NEXT: vfwmsac.vf v8, fa0, v10 628; ZVFH-NEXT: ret 629; 630; ZVFHMIN-LABEL: vfwmsac_vf_nxv4f32: 631; ZVFHMIN: # %bb.0: 632; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma 633; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 634; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 635; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 636; ZVFHMIN-NEXT: vfmsac.vf v8, fa5, v12 637; ZVFHMIN-NEXT: ret 638 %head = insertelement <vscale x 4 x half> poison, half %c, i32 0 639 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 640 %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float> 641 %ve = fpext <vscale x 4 x half> %splat to <vscale x 4 x float> 642 %vf = fneg <vscale x 4 x float> %va 643 %vg = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vd, <vscale x 4 x float> %ve, <vscale x 4 x float> %vf) 644 ret <vscale x 4 x float> %vg 645} 646 647define <vscale x 4 x float> @vfwnmsac_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, <vscale x 4 x half> %vc) { 648; ZVFH-LABEL: vfwnmsac_vv_nxv4f32: 649; ZVFH: # %bb.0: 650; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 651; ZVFH-NEXT: vfwnmsac.vv v8, v10, v11 652; ZVFH-NEXT: ret 653; 654; ZVFHMIN-LABEL: vfwnmsac_vv_nxv4f32: 655; ZVFHMIN: # %bb.0: 656; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma 657; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 658; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v11 659; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 660; ZVFHMIN-NEXT: vfnmsac.vv v8, v12, v14 661; ZVFHMIN-NEXT: ret 662 %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float> 663 %ve = fpext <vscale x 4 x half> %vc to <vscale x 4 x float> 664 %vf = fneg <vscale x 4 x float> %vd 665 %vg = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vf, <vscale x 4 x float> %ve, <vscale x 4 x float> %va) 666 ret <vscale x 4 x float> %vg 667} 668 669define <vscale x 4 x float> @vfwnmsac_vf_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, half %c) { 670; ZVFH-LABEL: vfwnmsac_vf_nxv4f32: 671; ZVFH: # %bb.0: 672; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 673; ZVFH-NEXT: vfwnmsac.vf v8, fa0, v10 674; ZVFH-NEXT: ret 675; 676; ZVFHMIN-LABEL: vfwnmsac_vf_nxv4f32: 677; ZVFHMIN: # %bb.0: 678; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma 679; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 680; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 681; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 682; ZVFHMIN-NEXT: vfnmsac.vf v8, fa5, v12 683; ZVFHMIN-NEXT: ret 684 %head = insertelement <vscale x 4 x half> poison, half %c, i32 0 685 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 686 %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float> 687 %ve = fpext <vscale x 4 x half> %splat to <vscale x 4 x float> 688 %vf = fneg <vscale x 4 x float> %vd 689 %vg = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vf, <vscale x 4 x float> %ve, <vscale x 4 x float> %va) 690 ret <vscale x 4 x float> %vg 691} 692 693define <vscale x 4 x float> @vfwnmsac_fv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x half> %vb, half %c) { 694; ZVFH-LABEL: vfwnmsac_fv_nxv4f32: 695; ZVFH: # %bb.0: 696; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 697; ZVFH-NEXT: vfwnmsac.vf v8, fa0, v10 698; ZVFH-NEXT: ret 699; 700; ZVFHMIN-LABEL: vfwnmsac_fv_nxv4f32: 701; ZVFHMIN: # %bb.0: 702; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma 703; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 704; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 705; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 706; ZVFHMIN-NEXT: vfnmsac.vf v8, fa5, v12 707; ZVFHMIN-NEXT: ret 708 %head = insertelement <vscale x 4 x half> poison, half %c, i32 0 709 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 710 %vd = fpext <vscale x 4 x half> %vb to <vscale x 4 x float> 711 %ve = fpext <vscale x 4 x half> %splat to <vscale x 4 x float> 712 %vf = fneg <vscale x 4 x float> %ve 713 %vg = call <vscale x 4 x float> @llvm.fma.v4f32(<vscale x 4 x float> %vd, <vscale x 4 x float> %vf, <vscale x 4 x float> %va) 714 ret <vscale x 4 x float> %vg 715} 716 717declare <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float>, <vscale x 8 x float>, <vscale x 8 x float>) 718 719define <vscale x 8 x float> @vfwmacc_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) { 720; ZVFH-LABEL: vfwmacc_vv_nxv8f32: 721; ZVFH: # %bb.0: 722; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 723; ZVFH-NEXT: vfwmacc.vv v8, v12, v14 724; ZVFH-NEXT: ret 725; 726; ZVFHMIN-LABEL: vfwmacc_vv_nxv8f32: 727; ZVFHMIN: # %bb.0: 728; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma 729; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 730; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v14 731; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 732; ZVFHMIN-NEXT: vfmacc.vv v8, v16, v20 733; ZVFHMIN-NEXT: ret 734 %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float> 735 %ve = fpext <vscale x 8 x half> %vc to <vscale x 8 x float> 736 %vf = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vd, <vscale x 8 x float> %ve, <vscale x 8 x float> %va) 737 ret <vscale x 8 x float> %vf 738} 739 740define <vscale x 8 x float> @vfwmacc_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, half %c) { 741; ZVFH-LABEL: vfwmacc_vf_nxv8f32: 742; ZVFH: # %bb.0: 743; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 744; ZVFH-NEXT: vfwmacc.vf v8, fa0, v12 745; ZVFH-NEXT: ret 746; 747; ZVFHMIN-LABEL: vfwmacc_vf_nxv8f32: 748; ZVFHMIN: # %bb.0: 749; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma 750; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 751; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 752; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 753; ZVFHMIN-NEXT: vfmacc.vf v8, fa5, v16 754; ZVFHMIN-NEXT: ret 755 %head = insertelement <vscale x 8 x half> poison, half %c, i32 0 756 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 757 %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float> 758 %ve = fpext <vscale x 8 x half> %splat to <vscale x 8 x float> 759 %vf = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vd, <vscale x 8 x float> %ve, <vscale x 8 x float> %va) 760 ret <vscale x 8 x float> %vf 761} 762 763define <vscale x 8 x float> @vfwnmacc_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) { 764; ZVFH-LABEL: vfwnmacc_vv_nxv8f32: 765; ZVFH: # %bb.0: 766; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 767; ZVFH-NEXT: vfwnmacc.vv v8, v12, v14 768; ZVFH-NEXT: ret 769; 770; ZVFHMIN-LABEL: vfwnmacc_vv_nxv8f32: 771; ZVFHMIN: # %bb.0: 772; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma 773; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 774; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v14 775; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 776; ZVFHMIN-NEXT: vfnmacc.vv v8, v16, v20 777; ZVFHMIN-NEXT: ret 778 %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float> 779 %ve = fpext <vscale x 8 x half> %vc to <vscale x 8 x float> 780 %vf = fneg <vscale x 8 x float> %va 781 %vg = fneg <vscale x 8 x float> %vd 782 %vh = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vg, <vscale x 8 x float> %ve, <vscale x 8 x float> %vf) 783 ret <vscale x 8 x float> %vh 784} 785 786define <vscale x 8 x float> @vfwnmacc_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, half %c) { 787; ZVFH-LABEL: vfwnmacc_vf_nxv8f32: 788; ZVFH: # %bb.0: 789; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 790; ZVFH-NEXT: vfwnmacc.vf v8, fa0, v12 791; ZVFH-NEXT: ret 792; 793; ZVFHMIN-LABEL: vfwnmacc_vf_nxv8f32: 794; ZVFHMIN: # %bb.0: 795; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma 796; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 797; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 798; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 799; ZVFHMIN-NEXT: vfnmacc.vf v8, fa5, v16 800; ZVFHMIN-NEXT: ret 801 %head = insertelement <vscale x 8 x half> poison, half %c, i32 0 802 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 803 %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float> 804 %ve = fpext <vscale x 8 x half> %splat to <vscale x 8 x float> 805 %vf = fneg <vscale x 8 x float> %va 806 %vg = fneg <vscale x 8 x float> %vd 807 %vh = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vg, <vscale x 8 x float> %ve, <vscale x 8 x float> %vf) 808 ret <vscale x 8 x float> %vh 809} 810 811define <vscale x 8 x float> @vfwnmacc_fv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, half %c) { 812; ZVFH-LABEL: vfwnmacc_fv_nxv8f32: 813; ZVFH: # %bb.0: 814; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 815; ZVFH-NEXT: vfwnmacc.vf v8, fa0, v12 816; ZVFH-NEXT: ret 817; 818; ZVFHMIN-LABEL: vfwnmacc_fv_nxv8f32: 819; ZVFHMIN: # %bb.0: 820; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma 821; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 822; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 823; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 824; ZVFHMIN-NEXT: vfnmacc.vf v8, fa5, v16 825; ZVFHMIN-NEXT: ret 826 %head = insertelement <vscale x 8 x half> poison, half %c, i32 0 827 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 828 %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float> 829 %ve = fpext <vscale x 8 x half> %splat to <vscale x 8 x float> 830 %vf = fneg <vscale x 8 x float> %va 831 %vg = fneg <vscale x 8 x float> %ve 832 %vh = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vd, <vscale x 8 x float> %vg, <vscale x 8 x float> %vf) 833 ret <vscale x 8 x float> %vh 834} 835 836define <vscale x 8 x float> @vfwmsac_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) { 837; ZVFH-LABEL: vfwmsac_vv_nxv8f32: 838; ZVFH: # %bb.0: 839; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 840; ZVFH-NEXT: vfwmsac.vv v8, v12, v14 841; ZVFH-NEXT: ret 842; 843; ZVFHMIN-LABEL: vfwmsac_vv_nxv8f32: 844; ZVFHMIN: # %bb.0: 845; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma 846; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 847; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v14 848; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 849; ZVFHMIN-NEXT: vfmsac.vv v8, v16, v20 850; ZVFHMIN-NEXT: ret 851 %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float> 852 %ve = fpext <vscale x 8 x half> %vc to <vscale x 8 x float> 853 %vf = fneg <vscale x 8 x float> %va 854 %vg = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vd, <vscale x 8 x float> %ve, <vscale x 8 x float> %vf) 855 ret <vscale x 8 x float> %vg 856} 857 858define <vscale x 8 x float> @vfwmsac_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, half %c) { 859; ZVFH-LABEL: vfwmsac_vf_nxv8f32: 860; ZVFH: # %bb.0: 861; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 862; ZVFH-NEXT: vfwmsac.vf v8, fa0, v12 863; ZVFH-NEXT: ret 864; 865; ZVFHMIN-LABEL: vfwmsac_vf_nxv8f32: 866; ZVFHMIN: # %bb.0: 867; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma 868; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 869; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 870; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 871; ZVFHMIN-NEXT: vfmsac.vf v8, fa5, v16 872; ZVFHMIN-NEXT: ret 873 %head = insertelement <vscale x 8 x half> poison, half %c, i32 0 874 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 875 %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float> 876 %ve = fpext <vscale x 8 x half> %splat to <vscale x 8 x float> 877 %vf = fneg <vscale x 8 x float> %va 878 %vg = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vd, <vscale x 8 x float> %ve, <vscale x 8 x float> %vf) 879 ret <vscale x 8 x float> %vg 880} 881 882define <vscale x 8 x float> @vfwnmsac_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, <vscale x 8 x half> %vc) { 883; ZVFH-LABEL: vfwnmsac_vv_nxv8f32: 884; ZVFH: # %bb.0: 885; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 886; ZVFH-NEXT: vfwnmsac.vv v8, v12, v14 887; ZVFH-NEXT: ret 888; 889; ZVFHMIN-LABEL: vfwnmsac_vv_nxv8f32: 890; ZVFHMIN: # %bb.0: 891; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma 892; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 893; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v14 894; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 895; ZVFHMIN-NEXT: vfnmsac.vv v8, v16, v20 896; ZVFHMIN-NEXT: ret 897 %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float> 898 %ve = fpext <vscale x 8 x half> %vc to <vscale x 8 x float> 899 %vf = fneg <vscale x 8 x float> %vd 900 %vg = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vf, <vscale x 8 x float> %ve, <vscale x 8 x float> %va) 901 ret <vscale x 8 x float> %vg 902} 903 904define <vscale x 8 x float> @vfwnmsac_vf_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, half %c) { 905; ZVFH-LABEL: vfwnmsac_vf_nxv8f32: 906; ZVFH: # %bb.0: 907; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 908; ZVFH-NEXT: vfwnmsac.vf v8, fa0, v12 909; ZVFH-NEXT: ret 910; 911; ZVFHMIN-LABEL: vfwnmsac_vf_nxv8f32: 912; ZVFHMIN: # %bb.0: 913; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma 914; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 915; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 916; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 917; ZVFHMIN-NEXT: vfnmsac.vf v8, fa5, v16 918; ZVFHMIN-NEXT: ret 919 %head = insertelement <vscale x 8 x half> poison, half %c, i32 0 920 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 921 %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float> 922 %ve = fpext <vscale x 8 x half> %splat to <vscale x 8 x float> 923 %vf = fneg <vscale x 8 x float> %vd 924 %vg = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vf, <vscale x 8 x float> %ve, <vscale x 8 x float> %va) 925 ret <vscale x 8 x float> %vg 926} 927 928define <vscale x 8 x float> @vfwnmsac_fv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x half> %vb, half %c) { 929; ZVFH-LABEL: vfwnmsac_fv_nxv8f32: 930; ZVFH: # %bb.0: 931; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 932; ZVFH-NEXT: vfwnmsac.vf v8, fa0, v12 933; ZVFH-NEXT: ret 934; 935; ZVFHMIN-LABEL: vfwnmsac_fv_nxv8f32: 936; ZVFHMIN: # %bb.0: 937; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma 938; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 939; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 940; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 941; ZVFHMIN-NEXT: vfnmsac.vf v8, fa5, v16 942; ZVFHMIN-NEXT: ret 943 %head = insertelement <vscale x 8 x half> poison, half %c, i32 0 944 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 945 %vd = fpext <vscale x 8 x half> %vb to <vscale x 8 x float> 946 %ve = fpext <vscale x 8 x half> %splat to <vscale x 8 x float> 947 %vf = fneg <vscale x 8 x float> %ve 948 %vg = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %vd, <vscale x 8 x float> %vf, <vscale x 8 x float> %va) 949 ret <vscale x 8 x float> %vg 950} 951 952declare <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float>, <vscale x 16 x float>, <vscale x 16 x float>) 953 954define <vscale x 16 x float> @vfwmacc_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) { 955; ZVFH-LABEL: vfwmacc_vv_nxv16f32: 956; ZVFH: # %bb.0: 957; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 958; ZVFH-NEXT: vfwmacc.vv v8, v16, v20 959; ZVFH-NEXT: ret 960; 961; ZVFHMIN-LABEL: vfwmacc_vv_nxv16f32: 962; ZVFHMIN: # %bb.0: 963; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 964; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16 965; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v20 966; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 967; ZVFHMIN-NEXT: vfmacc.vv v8, v24, v0 968; ZVFHMIN-NEXT: ret 969 %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float> 970 %ve = fpext <vscale x 16 x half> %vc to <vscale x 16 x float> 971 %vf = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vd, <vscale x 16 x float> %ve, <vscale x 16 x float> %va) 972 ret <vscale x 16 x float> %vf 973} 974 975define <vscale x 16 x float> @vfwmacc_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, half %c) { 976; ZVFH-LABEL: vfwmacc_vf_nxv16f32: 977; ZVFH: # %bb.0: 978; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 979; ZVFH-NEXT: vfwmacc.vf v8, fa0, v16 980; ZVFH-NEXT: ret 981; 982; ZVFHMIN-LABEL: vfwmacc_vf_nxv16f32: 983; ZVFHMIN: # %bb.0: 984; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 985; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16 986; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 987; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 988; ZVFHMIN-NEXT: vfmacc.vf v8, fa5, v24 989; ZVFHMIN-NEXT: ret 990 %head = insertelement <vscale x 16 x half> poison, half %c, i32 0 991 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 992 %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float> 993 %ve = fpext <vscale x 16 x half> %splat to <vscale x 16 x float> 994 %vf = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vd, <vscale x 16 x float> %ve, <vscale x 16 x float> %va) 995 ret <vscale x 16 x float> %vf 996} 997 998define <vscale x 16 x float> @vfwnmacc_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) { 999; ZVFH-LABEL: vfwnmacc_vv_nxv16f32: 1000; ZVFH: # %bb.0: 1001; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1002; ZVFH-NEXT: vfwnmacc.vv v8, v16, v20 1003; ZVFH-NEXT: ret 1004; 1005; ZVFHMIN-LABEL: vfwnmacc_vv_nxv16f32: 1006; ZVFHMIN: # %bb.0: 1007; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1008; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16 1009; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v20 1010; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 1011; ZVFHMIN-NEXT: vfnmacc.vv v8, v24, v0 1012; ZVFHMIN-NEXT: ret 1013 %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float> 1014 %ve = fpext <vscale x 16 x half> %vc to <vscale x 16 x float> 1015 %vf = fneg <vscale x 16 x float> %va 1016 %vg = fneg <vscale x 16 x float> %vd 1017 %vh = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vg, <vscale x 16 x float> %ve, <vscale x 16 x float> %vf) 1018 ret <vscale x 16 x float> %vh 1019} 1020 1021define <vscale x 16 x float> @vfwnmacc_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, half %c) { 1022; ZVFH-LABEL: vfwnmacc_vf_nxv16f32: 1023; ZVFH: # %bb.0: 1024; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1025; ZVFH-NEXT: vfwnmacc.vf v8, fa0, v16 1026; ZVFH-NEXT: ret 1027; 1028; ZVFHMIN-LABEL: vfwnmacc_vf_nxv16f32: 1029; ZVFHMIN: # %bb.0: 1030; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1031; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16 1032; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 1033; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 1034; ZVFHMIN-NEXT: vfnmacc.vf v8, fa5, v24 1035; ZVFHMIN-NEXT: ret 1036 %head = insertelement <vscale x 16 x half> poison, half %c, i32 0 1037 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 1038 %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float> 1039 %ve = fpext <vscale x 16 x half> %splat to <vscale x 16 x float> 1040 %vf = fneg <vscale x 16 x float> %va 1041 %vg = fneg <vscale x 16 x float> %vd 1042 %vh = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vg, <vscale x 16 x float> %ve, <vscale x 16 x float> %vf) 1043 ret <vscale x 16 x float> %vh 1044} 1045 1046define <vscale x 16 x float> @vfwnmacc_fv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, half %c) { 1047; ZVFH-LABEL: vfwnmacc_fv_nxv16f32: 1048; ZVFH: # %bb.0: 1049; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1050; ZVFH-NEXT: vfwnmacc.vf v8, fa0, v16 1051; ZVFH-NEXT: ret 1052; 1053; ZVFHMIN-LABEL: vfwnmacc_fv_nxv16f32: 1054; ZVFHMIN: # %bb.0: 1055; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1056; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16 1057; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 1058; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 1059; ZVFHMIN-NEXT: vfnmacc.vf v8, fa5, v24 1060; ZVFHMIN-NEXT: ret 1061 %head = insertelement <vscale x 16 x half> poison, half %c, i32 0 1062 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 1063 %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float> 1064 %ve = fpext <vscale x 16 x half> %splat to <vscale x 16 x float> 1065 %vf = fneg <vscale x 16 x float> %va 1066 %vg = fneg <vscale x 16 x float> %ve 1067 %vh = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vd, <vscale x 16 x float> %vg, <vscale x 16 x float> %vf) 1068 ret <vscale x 16 x float> %vh 1069} 1070 1071define <vscale x 16 x float> @vfwmsac_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) { 1072; ZVFH-LABEL: vfwmsac_vv_nxv16f32: 1073; ZVFH: # %bb.0: 1074; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1075; ZVFH-NEXT: vfwmsac.vv v8, v16, v20 1076; ZVFH-NEXT: ret 1077; 1078; ZVFHMIN-LABEL: vfwmsac_vv_nxv16f32: 1079; ZVFHMIN: # %bb.0: 1080; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1081; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16 1082; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v20 1083; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 1084; ZVFHMIN-NEXT: vfmsac.vv v8, v24, v0 1085; ZVFHMIN-NEXT: ret 1086 %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float> 1087 %ve = fpext <vscale x 16 x half> %vc to <vscale x 16 x float> 1088 %vf = fneg <vscale x 16 x float> %va 1089 %vg = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vd, <vscale x 16 x float> %ve, <vscale x 16 x float> %vf) 1090 ret <vscale x 16 x float> %vg 1091} 1092 1093define <vscale x 16 x float> @vfwmsac_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, half %c) { 1094; ZVFH-LABEL: vfwmsac_vf_nxv16f32: 1095; ZVFH: # %bb.0: 1096; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1097; ZVFH-NEXT: vfwmsac.vf v8, fa0, v16 1098; ZVFH-NEXT: ret 1099; 1100; ZVFHMIN-LABEL: vfwmsac_vf_nxv16f32: 1101; ZVFHMIN: # %bb.0: 1102; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1103; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16 1104; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 1105; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 1106; ZVFHMIN-NEXT: vfmsac.vf v8, fa5, v24 1107; ZVFHMIN-NEXT: ret 1108 %head = insertelement <vscale x 16 x half> poison, half %c, i32 0 1109 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 1110 %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float> 1111 %ve = fpext <vscale x 16 x half> %splat to <vscale x 16 x float> 1112 %vf = fneg <vscale x 16 x float> %va 1113 %vg = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vd, <vscale x 16 x float> %ve, <vscale x 16 x float> %vf) 1114 ret <vscale x 16 x float> %vg 1115} 1116 1117define <vscale x 16 x float> @vfwnmsac_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, <vscale x 16 x half> %vc) { 1118; ZVFH-LABEL: vfwnmsac_vv_nxv16f32: 1119; ZVFH: # %bb.0: 1120; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1121; ZVFH-NEXT: vfwnmsac.vv v8, v16, v20 1122; ZVFH-NEXT: ret 1123; 1124; ZVFHMIN-LABEL: vfwnmsac_vv_nxv16f32: 1125; ZVFHMIN: # %bb.0: 1126; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1127; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16 1128; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v20 1129; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 1130; ZVFHMIN-NEXT: vfnmsac.vv v8, v24, v0 1131; ZVFHMIN-NEXT: ret 1132 %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float> 1133 %ve = fpext <vscale x 16 x half> %vc to <vscale x 16 x float> 1134 %vf = fneg <vscale x 16 x float> %vd 1135 %vg = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vf, <vscale x 16 x float> %ve, <vscale x 16 x float> %va) 1136 ret <vscale x 16 x float> %vg 1137} 1138 1139define <vscale x 16 x float> @vfwnmsac_vf_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, half %c) { 1140; ZVFH-LABEL: vfwnmsac_vf_nxv16f32: 1141; ZVFH: # %bb.0: 1142; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1143; ZVFH-NEXT: vfwnmsac.vf v8, fa0, v16 1144; ZVFH-NEXT: ret 1145; 1146; ZVFHMIN-LABEL: vfwnmsac_vf_nxv16f32: 1147; ZVFHMIN: # %bb.0: 1148; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1149; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16 1150; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 1151; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 1152; ZVFHMIN-NEXT: vfnmsac.vf v8, fa5, v24 1153; ZVFHMIN-NEXT: ret 1154 %head = insertelement <vscale x 16 x half> poison, half %c, i32 0 1155 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 1156 %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float> 1157 %ve = fpext <vscale x 16 x half> %splat to <vscale x 16 x float> 1158 %vf = fneg <vscale x 16 x float> %vd 1159 %vg = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vf, <vscale x 16 x float> %ve, <vscale x 16 x float> %va) 1160 ret <vscale x 16 x float> %vg 1161} 1162 1163define <vscale x 16 x float> @vfwnmsac_fv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x half> %vb, half %c) { 1164; ZVFH-LABEL: vfwnmsac_fv_nxv16f32: 1165; ZVFH: # %bb.0: 1166; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1167; ZVFH-NEXT: vfwnmsac.vf v8, fa0, v16 1168; ZVFH-NEXT: ret 1169; 1170; ZVFHMIN-LABEL: vfwnmsac_fv_nxv16f32: 1171; ZVFHMIN: # %bb.0: 1172; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 1173; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16 1174; ZVFHMIN-NEXT: fcvt.s.h fa5, fa0 1175; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 1176; ZVFHMIN-NEXT: vfnmsac.vf v8, fa5, v24 1177; ZVFHMIN-NEXT: ret 1178 %head = insertelement <vscale x 16 x half> poison, half %c, i32 0 1179 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 1180 %vd = fpext <vscale x 16 x half> %vb to <vscale x 16 x float> 1181 %ve = fpext <vscale x 16 x half> %splat to <vscale x 16 x float> 1182 %vf = fneg <vscale x 16 x float> %ve 1183 %vg = call <vscale x 16 x float> @llvm.fma.v16f32(<vscale x 16 x float> %vd, <vscale x 16 x float> %vf, <vscale x 16 x float> %va) 1184 ret <vscale x 16 x float> %vg 1185} 1186 1187declare <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double>, <vscale x 1 x double>, <vscale x 1 x double>) 1188 1189define <vscale x 1 x double> @vfwmacc_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) { 1190; CHECK-LABEL: vfwmacc_vv_nxv1f64: 1191; CHECK: # %bb.0: 1192; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1193; CHECK-NEXT: vfwmacc.vv v8, v9, v10 1194; CHECK-NEXT: ret 1195 %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double> 1196 %ve = fpext <vscale x 1 x float> %vc to <vscale x 1 x double> 1197 %vf = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vd, <vscale x 1 x double> %ve, <vscale x 1 x double> %va) 1198 ret <vscale x 1 x double> %vf 1199} 1200 1201define <vscale x 1 x double> @vfwmacc_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, float %c) { 1202; CHECK-LABEL: vfwmacc_vf_nxv1f64: 1203; CHECK: # %bb.0: 1204; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1205; CHECK-NEXT: vfwmacc.vf v8, fa0, v9 1206; CHECK-NEXT: ret 1207 %head = insertelement <vscale x 1 x float> poison, float %c, i32 0 1208 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 1209 %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double> 1210 %ve = fpext <vscale x 1 x float> %splat to <vscale x 1 x double> 1211 %vf = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vd, <vscale x 1 x double> %ve, <vscale x 1 x double> %va) 1212 ret <vscale x 1 x double> %vf 1213} 1214 1215define <vscale x 1 x double> @vfwnmacc_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) { 1216; CHECK-LABEL: vfwnmacc_vv_nxv1f64: 1217; CHECK: # %bb.0: 1218; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1219; CHECK-NEXT: vfwnmacc.vv v8, v9, v10 1220; CHECK-NEXT: ret 1221 %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double> 1222 %ve = fpext <vscale x 1 x float> %vc to <vscale x 1 x double> 1223 %vf = fneg <vscale x 1 x double> %va 1224 %vg = fneg <vscale x 1 x double> %vd 1225 %vh = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vg, <vscale x 1 x double> %ve, <vscale x 1 x double> %vf) 1226 ret <vscale x 1 x double> %vh 1227} 1228 1229define <vscale x 1 x double> @vfwnmacc_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, float %c) { 1230; CHECK-LABEL: vfwnmacc_vf_nxv1f64: 1231; CHECK: # %bb.0: 1232; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1233; CHECK-NEXT: vfwnmacc.vf v8, fa0, v9 1234; CHECK-NEXT: ret 1235 %head = insertelement <vscale x 1 x float> poison, float %c, i32 0 1236 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 1237 %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double> 1238 %ve = fpext <vscale x 1 x float> %splat to <vscale x 1 x double> 1239 %vf = fneg <vscale x 1 x double> %va 1240 %vg = fneg <vscale x 1 x double> %vd 1241 %vh = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vg, <vscale x 1 x double> %ve, <vscale x 1 x double> %vf) 1242 ret <vscale x 1 x double> %vh 1243} 1244 1245define <vscale x 1 x double> @vfwnmacc_fv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, float %c) { 1246; CHECK-LABEL: vfwnmacc_fv_nxv1f64: 1247; CHECK: # %bb.0: 1248; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1249; CHECK-NEXT: vfwnmacc.vf v8, fa0, v9 1250; CHECK-NEXT: ret 1251 %head = insertelement <vscale x 1 x float> poison, float %c, i32 0 1252 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 1253 %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double> 1254 %ve = fpext <vscale x 1 x float> %splat to <vscale x 1 x double> 1255 %vf = fneg <vscale x 1 x double> %va 1256 %vg = fneg <vscale x 1 x double> %ve 1257 %vh = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vd, <vscale x 1 x double> %vg, <vscale x 1 x double> %vf) 1258 ret <vscale x 1 x double> %vh 1259} 1260 1261define <vscale x 1 x double> @vfwmsac_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) { 1262; CHECK-LABEL: vfwmsac_vv_nxv1f64: 1263; CHECK: # %bb.0: 1264; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1265; CHECK-NEXT: vfwmsac.vv v8, v9, v10 1266; CHECK-NEXT: ret 1267 %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double> 1268 %ve = fpext <vscale x 1 x float> %vc to <vscale x 1 x double> 1269 %vf = fneg <vscale x 1 x double> %va 1270 %vg = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vd, <vscale x 1 x double> %ve, <vscale x 1 x double> %vf) 1271 ret <vscale x 1 x double> %vg 1272} 1273 1274define <vscale x 1 x double> @vfwmsac_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, float %c) { 1275; CHECK-LABEL: vfwmsac_vf_nxv1f64: 1276; CHECK: # %bb.0: 1277; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1278; CHECK-NEXT: vfwmsac.vf v8, fa0, v9 1279; CHECK-NEXT: ret 1280 %head = insertelement <vscale x 1 x float> poison, float %c, i32 0 1281 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 1282 %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double> 1283 %ve = fpext <vscale x 1 x float> %splat to <vscale x 1 x double> 1284 %vf = fneg <vscale x 1 x double> %va 1285 %vg = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vd, <vscale x 1 x double> %ve, <vscale x 1 x double> %vf) 1286 ret <vscale x 1 x double> %vg 1287} 1288 1289define <vscale x 1 x double> @vfwnmsac_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, <vscale x 1 x float> %vc) { 1290; CHECK-LABEL: vfwnmsac_vv_nxv1f64: 1291; CHECK: # %bb.0: 1292; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1293; CHECK-NEXT: vfwnmsac.vv v8, v9, v10 1294; CHECK-NEXT: ret 1295 %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double> 1296 %ve = fpext <vscale x 1 x float> %vc to <vscale x 1 x double> 1297 %vf = fneg <vscale x 1 x double> %vd 1298 %vg = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vf, <vscale x 1 x double> %ve, <vscale x 1 x double> %va) 1299 ret <vscale x 1 x double> %vg 1300} 1301 1302define <vscale x 1 x double> @vfwnmsac_vf_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, float %c) { 1303; CHECK-LABEL: vfwnmsac_vf_nxv1f64: 1304; CHECK: # %bb.0: 1305; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1306; CHECK-NEXT: vfwnmsac.vf v8, fa0, v9 1307; CHECK-NEXT: ret 1308 %head = insertelement <vscale x 1 x float> poison, float %c, i32 0 1309 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 1310 %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double> 1311 %ve = fpext <vscale x 1 x float> %splat to <vscale x 1 x double> 1312 %vf = fneg <vscale x 1 x double> %vd 1313 %vg = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vf, <vscale x 1 x double> %ve, <vscale x 1 x double> %va) 1314 ret <vscale x 1 x double> %vg 1315} 1316 1317define <vscale x 1 x double> @vfwnmsac_fv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x float> %vb, float %c) { 1318; CHECK-LABEL: vfwnmsac_fv_nxv1f64: 1319; CHECK: # %bb.0: 1320; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 1321; CHECK-NEXT: vfwnmsac.vf v8, fa0, v9 1322; CHECK-NEXT: ret 1323 %head = insertelement <vscale x 1 x float> poison, float %c, i32 0 1324 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 1325 %vd = fpext <vscale x 1 x float> %vb to <vscale x 1 x double> 1326 %ve = fpext <vscale x 1 x float> %splat to <vscale x 1 x double> 1327 %vf = fneg <vscale x 1 x double> %ve 1328 %vg = call <vscale x 1 x double> @llvm.fma.v1f64(<vscale x 1 x double> %vd, <vscale x 1 x double> %vf, <vscale x 1 x double> %va) 1329 ret <vscale x 1 x double> %vg 1330} 1331 1332declare <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>) 1333 1334define <vscale x 2 x double> @vfwmacc_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) { 1335; CHECK-LABEL: vfwmacc_vv_nxv2f64: 1336; CHECK: # %bb.0: 1337; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1338; CHECK-NEXT: vfwmacc.vv v8, v10, v11 1339; CHECK-NEXT: ret 1340 %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double> 1341 %ve = fpext <vscale x 2 x float> %vc to <vscale x 2 x double> 1342 %vf = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vd, <vscale x 2 x double> %ve, <vscale x 2 x double> %va) 1343 ret <vscale x 2 x double> %vf 1344} 1345 1346define <vscale x 2 x double> @vfwmacc_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, float %c) { 1347; CHECK-LABEL: vfwmacc_vf_nxv2f64: 1348; CHECK: # %bb.0: 1349; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1350; CHECK-NEXT: vfwmacc.vf v8, fa0, v10 1351; CHECK-NEXT: ret 1352 %head = insertelement <vscale x 2 x float> poison, float %c, i32 0 1353 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 1354 %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double> 1355 %ve = fpext <vscale x 2 x float> %splat to <vscale x 2 x double> 1356 %vf = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vd, <vscale x 2 x double> %ve, <vscale x 2 x double> %va) 1357 ret <vscale x 2 x double> %vf 1358} 1359 1360define <vscale x 2 x double> @vfwnmacc_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) { 1361; CHECK-LABEL: vfwnmacc_vv_nxv2f64: 1362; CHECK: # %bb.0: 1363; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1364; CHECK-NEXT: vfwnmacc.vv v8, v10, v11 1365; CHECK-NEXT: ret 1366 %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double> 1367 %ve = fpext <vscale x 2 x float> %vc to <vscale x 2 x double> 1368 %vf = fneg <vscale x 2 x double> %va 1369 %vg = fneg <vscale x 2 x double> %vd 1370 %vh = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vg, <vscale x 2 x double> %ve, <vscale x 2 x double> %vf) 1371 ret <vscale x 2 x double> %vh 1372} 1373 1374define <vscale x 2 x double> @vfwnmacc_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, float %c) { 1375; CHECK-LABEL: vfwnmacc_vf_nxv2f64: 1376; CHECK: # %bb.0: 1377; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1378; CHECK-NEXT: vfwnmacc.vf v8, fa0, v10 1379; CHECK-NEXT: ret 1380 %head = insertelement <vscale x 2 x float> poison, float %c, i32 0 1381 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 1382 %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double> 1383 %ve = fpext <vscale x 2 x float> %splat to <vscale x 2 x double> 1384 %vf = fneg <vscale x 2 x double> %va 1385 %vg = fneg <vscale x 2 x double> %vd 1386 %vh = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vg, <vscale x 2 x double> %ve, <vscale x 2 x double> %vf) 1387 ret <vscale x 2 x double> %vh 1388} 1389 1390define <vscale x 2 x double> @vfwnmacc_fv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, float %c) { 1391; CHECK-LABEL: vfwnmacc_fv_nxv2f64: 1392; CHECK: # %bb.0: 1393; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1394; CHECK-NEXT: vfwnmacc.vf v8, fa0, v10 1395; CHECK-NEXT: ret 1396 %head = insertelement <vscale x 2 x float> poison, float %c, i32 0 1397 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 1398 %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double> 1399 %ve = fpext <vscale x 2 x float> %splat to <vscale x 2 x double> 1400 %vf = fneg <vscale x 2 x double> %va 1401 %vg = fneg <vscale x 2 x double> %ve 1402 %vh = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vd, <vscale x 2 x double> %vg, <vscale x 2 x double> %vf) 1403 ret <vscale x 2 x double> %vh 1404} 1405 1406define <vscale x 2 x double> @vfwmsac_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) { 1407; CHECK-LABEL: vfwmsac_vv_nxv2f64: 1408; CHECK: # %bb.0: 1409; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1410; CHECK-NEXT: vfwmsac.vv v8, v10, v11 1411; CHECK-NEXT: ret 1412 %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double> 1413 %ve = fpext <vscale x 2 x float> %vc to <vscale x 2 x double> 1414 %vf = fneg <vscale x 2 x double> %va 1415 %vg = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vd, <vscale x 2 x double> %ve, <vscale x 2 x double> %vf) 1416 ret <vscale x 2 x double> %vg 1417} 1418 1419define <vscale x 2 x double> @vfwmsac_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, float %c) { 1420; CHECK-LABEL: vfwmsac_vf_nxv2f64: 1421; CHECK: # %bb.0: 1422; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1423; CHECK-NEXT: vfwmsac.vf v8, fa0, v10 1424; CHECK-NEXT: ret 1425 %head = insertelement <vscale x 2 x float> poison, float %c, i32 0 1426 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 1427 %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double> 1428 %ve = fpext <vscale x 2 x float> %splat to <vscale x 2 x double> 1429 %vf = fneg <vscale x 2 x double> %va 1430 %vg = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vd, <vscale x 2 x double> %ve, <vscale x 2 x double> %vf) 1431 ret <vscale x 2 x double> %vg 1432} 1433 1434define <vscale x 2 x double> @vfwnmsac_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, <vscale x 2 x float> %vc) { 1435; CHECK-LABEL: vfwnmsac_vv_nxv2f64: 1436; CHECK: # %bb.0: 1437; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1438; CHECK-NEXT: vfwnmsac.vv v8, v10, v11 1439; CHECK-NEXT: ret 1440 %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double> 1441 %ve = fpext <vscale x 2 x float> %vc to <vscale x 2 x double> 1442 %vf = fneg <vscale x 2 x double> %vd 1443 %vg = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vf, <vscale x 2 x double> %ve, <vscale x 2 x double> %va) 1444 ret <vscale x 2 x double> %vg 1445} 1446 1447define <vscale x 2 x double> @vfwnmsac_vf_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, float %c) { 1448; CHECK-LABEL: vfwnmsac_vf_nxv2f64: 1449; CHECK: # %bb.0: 1450; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1451; CHECK-NEXT: vfwnmsac.vf v8, fa0, v10 1452; CHECK-NEXT: ret 1453 %head = insertelement <vscale x 2 x float> poison, float %c, i32 0 1454 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 1455 %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double> 1456 %ve = fpext <vscale x 2 x float> %splat to <vscale x 2 x double> 1457 %vf = fneg <vscale x 2 x double> %vd 1458 %vg = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vf, <vscale x 2 x double> %ve, <vscale x 2 x double> %va) 1459 ret <vscale x 2 x double> %vg 1460} 1461 1462define <vscale x 2 x double> @vfwnmsac_fv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x float> %vb, float %c) { 1463; CHECK-LABEL: vfwnmsac_fv_nxv2f64: 1464; CHECK: # %bb.0: 1465; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 1466; CHECK-NEXT: vfwnmsac.vf v8, fa0, v10 1467; CHECK-NEXT: ret 1468 %head = insertelement <vscale x 2 x float> poison, float %c, i32 0 1469 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 1470 %vd = fpext <vscale x 2 x float> %vb to <vscale x 2 x double> 1471 %ve = fpext <vscale x 2 x float> %splat to <vscale x 2 x double> 1472 %vf = fneg <vscale x 2 x double> %ve 1473 %vg = call <vscale x 2 x double> @llvm.fma.v2f64(<vscale x 2 x double> %vd, <vscale x 2 x double> %vf, <vscale x 2 x double> %va) 1474 ret <vscale x 2 x double> %vg 1475} 1476 1477 1478declare <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double>, <vscale x 4 x double>, <vscale x 4 x double>) 1479 1480define <vscale x 4 x double> @vfwmacc_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) { 1481; CHECK-LABEL: vfwmacc_vv_nxv4f64: 1482; CHECK: # %bb.0: 1483; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1484; CHECK-NEXT: vfwmacc.vv v8, v12, v14 1485; CHECK-NEXT: ret 1486 %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double> 1487 %ve = fpext <vscale x 4 x float> %vc to <vscale x 4 x double> 1488 %vf = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vd, <vscale x 4 x double> %ve, <vscale x 4 x double> %va) 1489 ret <vscale x 4 x double> %vf 1490} 1491 1492define <vscale x 4 x double> @vfwmacc_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, float %c) { 1493; CHECK-LABEL: vfwmacc_vf_nxv4f64: 1494; CHECK: # %bb.0: 1495; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1496; CHECK-NEXT: vfwmacc.vf v8, fa0, v12 1497; CHECK-NEXT: ret 1498 %head = insertelement <vscale x 4 x float> poison, float %c, i32 0 1499 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 1500 %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double> 1501 %ve = fpext <vscale x 4 x float> %splat to <vscale x 4 x double> 1502 %vf = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vd, <vscale x 4 x double> %ve, <vscale x 4 x double> %va) 1503 ret <vscale x 4 x double> %vf 1504} 1505 1506define <vscale x 4 x double> @vfwnmacc_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) { 1507; CHECK-LABEL: vfwnmacc_vv_nxv4f64: 1508; CHECK: # %bb.0: 1509; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1510; CHECK-NEXT: vfwnmacc.vv v8, v12, v14 1511; CHECK-NEXT: ret 1512 %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double> 1513 %ve = fpext <vscale x 4 x float> %vc to <vscale x 4 x double> 1514 %vf = fneg <vscale x 4 x double> %va 1515 %vg = fneg <vscale x 4 x double> %vd 1516 %vh = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vg, <vscale x 4 x double> %ve, <vscale x 4 x double> %vf) 1517 ret <vscale x 4 x double> %vh 1518} 1519 1520define <vscale x 4 x double> @vfwnmacc_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, float %c) { 1521; CHECK-LABEL: vfwnmacc_vf_nxv4f64: 1522; CHECK: # %bb.0: 1523; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1524; CHECK-NEXT: vfwnmacc.vf v8, fa0, v12 1525; CHECK-NEXT: ret 1526 %head = insertelement <vscale x 4 x float> poison, float %c, i32 0 1527 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 1528 %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double> 1529 %ve = fpext <vscale x 4 x float> %splat to <vscale x 4 x double> 1530 %vf = fneg <vscale x 4 x double> %va 1531 %vg = fneg <vscale x 4 x double> %vd 1532 %vh = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vg, <vscale x 4 x double> %ve, <vscale x 4 x double> %vf) 1533 ret <vscale x 4 x double> %vh 1534} 1535 1536define <vscale x 4 x double> @vfwnmacc_fv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, float %c) { 1537; CHECK-LABEL: vfwnmacc_fv_nxv4f64: 1538; CHECK: # %bb.0: 1539; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1540; CHECK-NEXT: vfwnmacc.vf v8, fa0, v12 1541; CHECK-NEXT: ret 1542 %head = insertelement <vscale x 4 x float> poison, float %c, i32 0 1543 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 1544 %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double> 1545 %ve = fpext <vscale x 4 x float> %splat to <vscale x 4 x double> 1546 %vf = fneg <vscale x 4 x double> %va 1547 %vg = fneg <vscale x 4 x double> %ve 1548 %vh = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vd, <vscale x 4 x double> %vg, <vscale x 4 x double> %vf) 1549 ret <vscale x 4 x double> %vh 1550} 1551 1552define <vscale x 4 x double> @vfwmsac_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) { 1553; CHECK-LABEL: vfwmsac_vv_nxv4f64: 1554; CHECK: # %bb.0: 1555; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1556; CHECK-NEXT: vfwmsac.vv v8, v12, v14 1557; CHECK-NEXT: ret 1558 %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double> 1559 %ve = fpext <vscale x 4 x float> %vc to <vscale x 4 x double> 1560 %vf = fneg <vscale x 4 x double> %va 1561 %vg = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vd, <vscale x 4 x double> %ve, <vscale x 4 x double> %vf) 1562 ret <vscale x 4 x double> %vg 1563} 1564 1565define <vscale x 4 x double> @vfwmsac_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, float %c) { 1566; CHECK-LABEL: vfwmsac_vf_nxv4f64: 1567; CHECK: # %bb.0: 1568; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1569; CHECK-NEXT: vfwmsac.vf v8, fa0, v12 1570; CHECK-NEXT: ret 1571 %head = insertelement <vscale x 4 x float> poison, float %c, i32 0 1572 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 1573 %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double> 1574 %ve = fpext <vscale x 4 x float> %splat to <vscale x 4 x double> 1575 %vf = fneg <vscale x 4 x double> %va 1576 %vg = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vd, <vscale x 4 x double> %ve, <vscale x 4 x double> %vf) 1577 ret <vscale x 4 x double> %vg 1578} 1579 1580define <vscale x 4 x double> @vfwnmsac_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, <vscale x 4 x float> %vc) { 1581; CHECK-LABEL: vfwnmsac_vv_nxv4f64: 1582; CHECK: # %bb.0: 1583; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1584; CHECK-NEXT: vfwnmsac.vv v8, v12, v14 1585; CHECK-NEXT: ret 1586 %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double> 1587 %ve = fpext <vscale x 4 x float> %vc to <vscale x 4 x double> 1588 %vf = fneg <vscale x 4 x double> %vd 1589 %vg = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vf, <vscale x 4 x double> %ve, <vscale x 4 x double> %va) 1590 ret <vscale x 4 x double> %vg 1591} 1592 1593define <vscale x 4 x double> @vfwnmsac_vf_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, float %c) { 1594; CHECK-LABEL: vfwnmsac_vf_nxv4f64: 1595; CHECK: # %bb.0: 1596; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1597; CHECK-NEXT: vfwnmsac.vf v8, fa0, v12 1598; CHECK-NEXT: ret 1599 %head = insertelement <vscale x 4 x float> poison, float %c, i32 0 1600 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 1601 %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double> 1602 %ve = fpext <vscale x 4 x float> %splat to <vscale x 4 x double> 1603 %vf = fneg <vscale x 4 x double> %vd 1604 %vg = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vf, <vscale x 4 x double> %ve, <vscale x 4 x double> %va) 1605 ret <vscale x 4 x double> %vg 1606} 1607 1608define <vscale x 4 x double> @vfwnmsac_fv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x float> %vb, float %c) { 1609; CHECK-LABEL: vfwnmsac_fv_nxv4f64: 1610; CHECK: # %bb.0: 1611; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 1612; CHECK-NEXT: vfwnmsac.vf v8, fa0, v12 1613; CHECK-NEXT: ret 1614 %head = insertelement <vscale x 4 x float> poison, float %c, i32 0 1615 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 1616 %vd = fpext <vscale x 4 x float> %vb to <vscale x 4 x double> 1617 %ve = fpext <vscale x 4 x float> %splat to <vscale x 4 x double> 1618 %vf = fneg <vscale x 4 x double> %ve 1619 %vg = call <vscale x 4 x double> @llvm.fma.v4f64(<vscale x 4 x double> %vd, <vscale x 4 x double> %vf, <vscale x 4 x double> %va) 1620 ret <vscale x 4 x double> %vg 1621} 1622 1623declare <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double>, <vscale x 8 x double>, <vscale x 8 x double>) 1624 1625define <vscale x 8 x double> @vfwmacc_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) { 1626; CHECK-LABEL: vfwmacc_vv_nxv8f64: 1627; CHECK: # %bb.0: 1628; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1629; CHECK-NEXT: vfwmacc.vv v8, v16, v20 1630; CHECK-NEXT: ret 1631 %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double> 1632 %ve = fpext <vscale x 8 x float> %vc to <vscale x 8 x double> 1633 %vf = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vd, <vscale x 8 x double> %ve, <vscale x 8 x double> %va) 1634 ret <vscale x 8 x double> %vf 1635} 1636 1637define <vscale x 8 x double> @vfwmacc_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, float %c) { 1638; CHECK-LABEL: vfwmacc_vf_nxv8f64: 1639; CHECK: # %bb.0: 1640; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1641; CHECK-NEXT: vfwmacc.vf v8, fa0, v16 1642; CHECK-NEXT: ret 1643 %head = insertelement <vscale x 8 x float> poison, float %c, i32 0 1644 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 1645 %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double> 1646 %ve = fpext <vscale x 8 x float> %splat to <vscale x 8 x double> 1647 %vf = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vd, <vscale x 8 x double> %ve, <vscale x 8 x double> %va) 1648 ret <vscale x 8 x double> %vf 1649} 1650 1651define <vscale x 8 x double> @vfwnmacc_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) { 1652; CHECK-LABEL: vfwnmacc_vv_nxv8f64: 1653; CHECK: # %bb.0: 1654; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1655; CHECK-NEXT: vfwnmacc.vv v8, v16, v20 1656; CHECK-NEXT: ret 1657 %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double> 1658 %ve = fpext <vscale x 8 x float> %vc to <vscale x 8 x double> 1659 %vf = fneg <vscale x 8 x double> %va 1660 %vg = fneg <vscale x 8 x double> %vd 1661 %vh = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vg, <vscale x 8 x double> %ve, <vscale x 8 x double> %vf) 1662 ret <vscale x 8 x double> %vh 1663} 1664 1665define <vscale x 8 x double> @vfwnmacc_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, float %c) { 1666; CHECK-LABEL: vfwnmacc_vf_nxv8f64: 1667; CHECK: # %bb.0: 1668; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1669; CHECK-NEXT: vfwnmacc.vf v8, fa0, v16 1670; CHECK-NEXT: ret 1671 %head = insertelement <vscale x 8 x float> poison, float %c, i32 0 1672 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 1673 %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double> 1674 %ve = fpext <vscale x 8 x float> %splat to <vscale x 8 x double> 1675 %vf = fneg <vscale x 8 x double> %va 1676 %vg = fneg <vscale x 8 x double> %vd 1677 %vh = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vg, <vscale x 8 x double> %ve, <vscale x 8 x double> %vf) 1678 ret <vscale x 8 x double> %vh 1679} 1680 1681define <vscale x 8 x double> @vfwnmacc_fv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, float %c) { 1682; CHECK-LABEL: vfwnmacc_fv_nxv8f64: 1683; CHECK: # %bb.0: 1684; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1685; CHECK-NEXT: vfwnmacc.vf v8, fa0, v16 1686; CHECK-NEXT: ret 1687 %head = insertelement <vscale x 8 x float> poison, float %c, i32 0 1688 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 1689 %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double> 1690 %ve = fpext <vscale x 8 x float> %splat to <vscale x 8 x double> 1691 %vf = fneg <vscale x 8 x double> %va 1692 %vg = fneg <vscale x 8 x double> %ve 1693 %vh = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vd, <vscale x 8 x double> %vg, <vscale x 8 x double> %vf) 1694 ret <vscale x 8 x double> %vh 1695} 1696 1697define <vscale x 8 x double> @vfwmsac_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) { 1698; CHECK-LABEL: vfwmsac_vv_nxv8f64: 1699; CHECK: # %bb.0: 1700; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1701; CHECK-NEXT: vfwmsac.vv v8, v16, v20 1702; CHECK-NEXT: ret 1703 %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double> 1704 %ve = fpext <vscale x 8 x float> %vc to <vscale x 8 x double> 1705 %vf = fneg <vscale x 8 x double> %va 1706 %vg = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vd, <vscale x 8 x double> %ve, <vscale x 8 x double> %vf) 1707 ret <vscale x 8 x double> %vg 1708} 1709 1710define <vscale x 8 x double> @vfwmsac_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, float %c) { 1711; CHECK-LABEL: vfwmsac_vf_nxv8f64: 1712; CHECK: # %bb.0: 1713; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1714; CHECK-NEXT: vfwmsac.vf v8, fa0, v16 1715; CHECK-NEXT: ret 1716 %head = insertelement <vscale x 8 x float> poison, float %c, i32 0 1717 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 1718 %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double> 1719 %ve = fpext <vscale x 8 x float> %splat to <vscale x 8 x double> 1720 %vf = fneg <vscale x 8 x double> %va 1721 %vg = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vd, <vscale x 8 x double> %ve, <vscale x 8 x double> %vf) 1722 ret <vscale x 8 x double> %vg 1723} 1724 1725define <vscale x 8 x double> @vfwnmsac_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, <vscale x 8 x float> %vc) { 1726; CHECK-LABEL: vfwnmsac_vv_nxv8f64: 1727; CHECK: # %bb.0: 1728; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1729; CHECK-NEXT: vfwnmsac.vv v8, v16, v20 1730; CHECK-NEXT: ret 1731 %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double> 1732 %ve = fpext <vscale x 8 x float> %vc to <vscale x 8 x double> 1733 %vf = fneg <vscale x 8 x double> %vd 1734 %vg = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vf, <vscale x 8 x double> %ve, <vscale x 8 x double> %va) 1735 ret <vscale x 8 x double> %vg 1736} 1737 1738define <vscale x 8 x double> @vfwnmsac_vf_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, float %c) { 1739; CHECK-LABEL: vfwnmsac_vf_nxv8f64: 1740; CHECK: # %bb.0: 1741; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1742; CHECK-NEXT: vfwnmsac.vf v8, fa0, v16 1743; CHECK-NEXT: ret 1744 %head = insertelement <vscale x 8 x float> poison, float %c, i32 0 1745 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 1746 %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double> 1747 %ve = fpext <vscale x 8 x float> %splat to <vscale x 8 x double> 1748 %vf = fneg <vscale x 8 x double> %vd 1749 %vg = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vf, <vscale x 8 x double> %ve, <vscale x 8 x double> %va) 1750 ret <vscale x 8 x double> %vg 1751} 1752 1753define <vscale x 8 x double> @vfwnmsac_fv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x float> %vb, float %c) { 1754; CHECK-LABEL: vfwnmsac_fv_nxv8f64: 1755; CHECK: # %bb.0: 1756; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 1757; CHECK-NEXT: vfwnmsac.vf v8, fa0, v16 1758; CHECK-NEXT: ret 1759 %head = insertelement <vscale x 8 x float> poison, float %c, i32 0 1760 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 1761 %vd = fpext <vscale x 8 x float> %vb to <vscale x 8 x double> 1762 %ve = fpext <vscale x 8 x float> %splat to <vscale x 8 x double> 1763 %vf = fneg <vscale x 8 x double> %ve 1764 %vg = call <vscale x 8 x double> @llvm.fma.v8f64(<vscale x 8 x double> %vd, <vscale x 8 x double> %vf, <vscale x 8 x double> %va) 1765 ret <vscale x 8 x double> %vg 1766} 1767