1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=ilp32d \
3 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH
4 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=lp64d \
5 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH
6 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfhmin,+v,+m -target-abi=ilp32d \
7 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN
8 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfhmin,+v,+m -target-abi=lp64d \
9 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN
11 declare <vscale x 1 x float> @llvm.vp.fma.nxv1f32(<vscale x 1 x float>, <vscale x 1 x float>, <vscale x 1 x float>, <vscale x 1 x i1>, i32)
12 declare <vscale x 1 x float> @llvm.vp.fneg.nxv1f32(<vscale x 1 x float>, <vscale x 1 x i1>, i32)
13 declare <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half>, <vscale x 1 x i1>, i32)
15 define <vscale x 1 x float> @vfnmsac_vv_nxv1f32(<vscale x 1 x half> %a, <vscale x 1 x half> %b, <vscale x 1 x float> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) {
16 ; ZVFH-LABEL: vfnmsac_vv_nxv1f32:
18 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
19 ; ZVFH-NEXT: vfwnmsac.vv v10, v8, v9, v0.t
20 ; ZVFH-NEXT: vmv1r.v v8, v10
23 ; ZVFHMIN-LABEL: vfnmsac_vv_nxv1f32:
25 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
26 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8, v0.t
27 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9, v0.t
28 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
29 ; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v10, v0.t
31 %aext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %a, <vscale x 1 x i1> %m, i32 %evl)
32 %bext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %b, <vscale x 1 x i1> %m, i32 %evl)
33 %nega = call <vscale x 1 x float> @llvm.vp.fneg.nxv1f32(<vscale x 1 x float> %aext, <vscale x 1 x i1> %m, i32 %evl)
34 %v = call <vscale x 1 x float> @llvm.vp.fma.nxv1f32(<vscale x 1 x float> %nega, <vscale x 1 x float> %bext, <vscale x 1 x float> %c, <vscale x 1 x i1> %m, i32 %evl)
35 ret <vscale x 1 x float> %v
38 define <vscale x 1 x float> @vfnmsac_vv_nxv1f32_unmasked(<vscale x 1 x half> %a, <vscale x 1 x half> %b, <vscale x 1 x float> %c, i32 zeroext %evl) {
39 ; ZVFH-LABEL: vfnmsac_vv_nxv1f32_unmasked:
41 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
42 ; ZVFH-NEXT: vfwnmsac.vv v10, v8, v9
43 ; ZVFH-NEXT: vmv1r.v v8, v10
46 ; ZVFHMIN-LABEL: vfnmsac_vv_nxv1f32_unmasked:
48 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
49 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8
50 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9
51 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
52 ; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v10
54 %aext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %a, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
55 %bext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %b, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
56 %nega = call <vscale x 1 x float> @llvm.vp.fneg.nxv1f32(<vscale x 1 x float> %aext, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
57 %v = call <vscale x 1 x float> @llvm.vp.fma.nxv1f32(<vscale x 1 x float> %nega, <vscale x 1 x float> %bext, <vscale x 1 x float> %c, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
58 ret <vscale x 1 x float> %v
61 define <vscale x 1 x float> @vfnmsac_vf_nxv1f32(<vscale x 1 x half> %a, half %b, <vscale x 1 x float> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) {
62 ; ZVFH-LABEL: vfnmsac_vf_nxv1f32:
64 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
65 ; ZVFH-NEXT: vfwnmsac.vf v9, fa0, v8, v0.t
66 ; ZVFH-NEXT: vmv1r.v v8, v9
69 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv1f32:
71 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
72 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
73 ; ZVFHMIN-NEXT: vmv.v.x v10, a1
74 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8, v0.t
75 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v10, v0.t
76 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
77 ; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v9, v0.t
79 %elt.head = insertelement <vscale x 1 x half> poison, half %b, i32 0
80 %vb = shufflevector <vscale x 1 x half> %elt.head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
81 %aext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %a, <vscale x 1 x i1> %m, i32 %evl)
82 %vbext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %vb, <vscale x 1 x i1> %m, i32 %evl)
83 %nega = call <vscale x 1 x float> @llvm.vp.fneg.nxv1f32(<vscale x 1 x float> %aext, <vscale x 1 x i1> %m, i32 %evl)
84 %v = call <vscale x 1 x float> @llvm.vp.fma.nxv1f32(<vscale x 1 x float> %nega, <vscale x 1 x float> %vbext, <vscale x 1 x float> %c, <vscale x 1 x i1> %m, i32 %evl)
85 ret <vscale x 1 x float> %v
88 define <vscale x 1 x float> @vfnmsac_vf_nxv1f32_commute(<vscale x 1 x half> %a, half %b, <vscale x 1 x float> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) {
89 ; ZVFH-LABEL: vfnmsac_vf_nxv1f32_commute:
91 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
92 ; ZVFH-NEXT: vfwnmsac.vf v9, fa0, v8, v0.t
93 ; ZVFH-NEXT: vmv1r.v v8, v9
96 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv1f32_commute:
98 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
99 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
100 ; ZVFHMIN-NEXT: vmv.v.x v11, a1
101 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8, v0.t
102 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v11, v0.t
103 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
104 ; ZVFHMIN-NEXT: vfnmsub.vv v10, v8, v9, v0.t
105 ; ZVFHMIN-NEXT: vmv1r.v v8, v10
107 %elt.head = insertelement <vscale x 1 x half> poison, half %b, i32 0
108 %vb = shufflevector <vscale x 1 x half> %elt.head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
109 %aext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %a, <vscale x 1 x i1> %m, i32 %evl)
110 %vbext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %vb, <vscale x 1 x i1> %m, i32 %evl)
111 %nega = call <vscale x 1 x float> @llvm.vp.fneg.nxv1f32(<vscale x 1 x float> %aext, <vscale x 1 x i1> %m, i32 %evl)
112 %v = call <vscale x 1 x float> @llvm.vp.fma.nxv1f32(<vscale x 1 x float> %vbext, <vscale x 1 x float> %nega, <vscale x 1 x float> %c, <vscale x 1 x i1> %m, i32 %evl)
113 ret <vscale x 1 x float> %v
116 define <vscale x 1 x float> @vfnmsac_vf_nxv1f32_unmasked(<vscale x 1 x half> %a, half %b, <vscale x 1 x float> %c, i32 zeroext %evl) {
117 ; ZVFH-LABEL: vfnmsac_vf_nxv1f32_unmasked:
119 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
120 ; ZVFH-NEXT: vfwnmsac.vf v9, fa0, v8
121 ; ZVFH-NEXT: vmv1r.v v8, v9
124 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv1f32_unmasked:
126 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
127 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
128 ; ZVFHMIN-NEXT: vmv.v.x v10, a1
129 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8
130 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v10
131 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
132 ; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v9
134 %elt.head = insertelement <vscale x 1 x half> poison, half %b, i32 0
135 %vb = shufflevector <vscale x 1 x half> %elt.head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
136 %aext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %a, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
137 %vbext = call <vscale x 1 x float> @llvm.vp.fpext.nxv1f32.nxv1f16(<vscale x 1 x half> %vb, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
138 %nega = call <vscale x 1 x float> @llvm.vp.fneg.nxv1f32(<vscale x 1 x float> %aext, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
139 %v = call <vscale x 1 x float> @llvm.vp.fma.nxv1f32(<vscale x 1 x float> %nega, <vscale x 1 x float> %vbext, <vscale x 1 x float> %c, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
140 ret <vscale x 1 x float> %v
143 declare <vscale x 2 x float> @llvm.vp.fma.nxv2f32(<vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x float>, <vscale x 2 x i1>, i32)
144 declare <vscale x 2 x float> @llvm.vp.fneg.nxv2f32(<vscale x 2 x float>, <vscale x 2 x i1>, i32)
145 declare <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half>, <vscale x 2 x i1>, i32)
147 define <vscale x 2 x float> @vfnmsac_vv_nxv2f32(<vscale x 2 x half> %a, <vscale x 2 x half> %b, <vscale x 2 x float> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) {
148 ; ZVFH-LABEL: vfnmsac_vv_nxv2f32:
150 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
151 ; ZVFH-NEXT: vfwnmsac.vv v10, v8, v9, v0.t
152 ; ZVFH-NEXT: vmv1r.v v8, v10
155 ; ZVFHMIN-LABEL: vfnmsac_vv_nxv2f32:
157 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
158 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8, v0.t
159 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9, v0.t
160 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma
161 ; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v10, v0.t
163 %aext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x i1> %m, i32 %evl)
164 %bext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %b, <vscale x 2 x i1> %m, i32 %evl)
165 %nega = call <vscale x 2 x float> @llvm.vp.fneg.nxv2f32(<vscale x 2 x float> %aext, <vscale x 2 x i1> %m, i32 %evl)
166 %v = call <vscale x 2 x float> @llvm.vp.fma.nxv2f32(<vscale x 2 x float> %nega, <vscale x 2 x float> %bext, <vscale x 2 x float> %c, <vscale x 2 x i1> %m, i32 %evl)
167 ret <vscale x 2 x float> %v
170 define <vscale x 2 x float> @vfnmsac_vv_nxv2f32_unmasked(<vscale x 2 x half> %a, <vscale x 2 x half> %b, <vscale x 2 x float> %c, i32 zeroext %evl) {
171 ; ZVFH-LABEL: vfnmsac_vv_nxv2f32_unmasked:
173 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
174 ; ZVFH-NEXT: vfwnmsac.vv v10, v8, v9
175 ; ZVFH-NEXT: vmv1r.v v8, v10
178 ; ZVFHMIN-LABEL: vfnmsac_vv_nxv2f32_unmasked:
180 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
181 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8
182 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9
183 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma
184 ; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v10
186 %aext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
187 %bext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %b, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
188 %nega = call <vscale x 2 x float> @llvm.vp.fneg.nxv2f32(<vscale x 2 x float> %aext, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
189 %v = call <vscale x 2 x float> @llvm.vp.fma.nxv2f32(<vscale x 2 x float> %nega, <vscale x 2 x float> %bext, <vscale x 2 x float> %c, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
190 ret <vscale x 2 x float> %v
193 define <vscale x 2 x float> @vfnmsac_vf_nxv2f32(<vscale x 2 x half> %a, half %b, <vscale x 2 x float> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) {
194 ; ZVFH-LABEL: vfnmsac_vf_nxv2f32:
196 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
197 ; ZVFH-NEXT: vfwnmsac.vf v9, fa0, v8, v0.t
198 ; ZVFH-NEXT: vmv1r.v v8, v9
201 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv2f32:
203 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
204 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
205 ; ZVFHMIN-NEXT: vmv.v.x v10, a1
206 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8, v0.t
207 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v10, v0.t
208 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma
209 ; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v9, v0.t
211 %elt.head = insertelement <vscale x 2 x half> poison, half %b, i32 0
212 %vb = shufflevector <vscale x 2 x half> %elt.head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
213 %aext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x i1> %m, i32 %evl)
214 %vbext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %vb, <vscale x 2 x i1> %m, i32 %evl)
215 %nega = call <vscale x 2 x float> @llvm.vp.fneg.nxv2f32(<vscale x 2 x float> %aext, <vscale x 2 x i1> %m, i32 %evl)
216 %v = call <vscale x 2 x float> @llvm.vp.fma.nxv2f32(<vscale x 2 x float> %nega, <vscale x 2 x float> %vbext, <vscale x 2 x float> %c, <vscale x 2 x i1> %m, i32 %evl)
217 ret <vscale x 2 x float> %v
220 define <vscale x 2 x float> @vfnmsac_vf_nxv2f32_commute(<vscale x 2 x half> %a, half %b, <vscale x 2 x float> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) {
221 ; ZVFH-LABEL: vfnmsac_vf_nxv2f32_commute:
223 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
224 ; ZVFH-NEXT: vfwnmsac.vf v9, fa0, v8, v0.t
225 ; ZVFH-NEXT: vmv1r.v v8, v9
228 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv2f32_commute:
230 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
231 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
232 ; ZVFHMIN-NEXT: vmv.v.x v11, a1
233 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8, v0.t
234 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v11, v0.t
235 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma
236 ; ZVFHMIN-NEXT: vfnmsub.vv v10, v8, v9, v0.t
237 ; ZVFHMIN-NEXT: vmv.v.v v8, v10
239 %elt.head = insertelement <vscale x 2 x half> poison, half %b, i32 0
240 %vb = shufflevector <vscale x 2 x half> %elt.head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
241 %aext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x i1> %m, i32 %evl)
242 %vbext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %vb, <vscale x 2 x i1> %m, i32 %evl)
243 %nega = call <vscale x 2 x float> @llvm.vp.fneg.nxv2f32(<vscale x 2 x float> %aext, <vscale x 2 x i1> %m, i32 %evl)
244 %v = call <vscale x 2 x float> @llvm.vp.fma.nxv2f32(<vscale x 2 x float> %vbext, <vscale x 2 x float> %nega, <vscale x 2 x float> %c, <vscale x 2 x i1> %m, i32 %evl)
245 ret <vscale x 2 x float> %v
248 define <vscale x 2 x float> @vfnmsac_vf_nxv2f32_unmasked(<vscale x 2 x half> %a, half %b, <vscale x 2 x float> %c, i32 zeroext %evl) {
249 ; ZVFH-LABEL: vfnmsac_vf_nxv2f32_unmasked:
251 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
252 ; ZVFH-NEXT: vfwnmsac.vf v9, fa0, v8
253 ; ZVFH-NEXT: vmv1r.v v8, v9
256 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv2f32_unmasked:
258 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
259 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
260 ; ZVFHMIN-NEXT: vmv.v.x v10, a1
261 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v8
262 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v10
263 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma
264 ; ZVFHMIN-NEXT: vfnmsub.vv v8, v11, v9
266 %elt.head = insertelement <vscale x 2 x half> poison, half %b, i32 0
267 %vb = shufflevector <vscale x 2 x half> %elt.head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
268 %aext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
269 %vbext = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %vb, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
270 %nega = call <vscale x 2 x float> @llvm.vp.fneg.nxv2f32(<vscale x 2 x float> %aext, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
271 %v = call <vscale x 2 x float> @llvm.vp.fma.nxv2f32(<vscale x 2 x float> %nega, <vscale x 2 x float> %vbext, <vscale x 2 x float> %c, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
272 ret <vscale x 2 x float> %v
275 declare <vscale x 4 x float> @llvm.vp.fma.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x i1>, i32)
276 declare <vscale x 4 x float> @llvm.vp.fneg.nxv4f32(<vscale x 4 x float>, <vscale x 4 x i1>, i32)
277 declare <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half>, <vscale x 4 x i1>, i32)
279 define <vscale x 4 x float> @vfnmsac_vv_nxv4f32(<vscale x 4 x half> %a, <vscale x 4 x half> %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) {
280 ; ZVFH-LABEL: vfnmsac_vv_nxv4f32:
282 ; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma
283 ; ZVFH-NEXT: vfwnmsac.vv v10, v8, v9, v0.t
284 ; ZVFH-NEXT: vmv2r.v v8, v10
287 ; ZVFHMIN-LABEL: vfnmsac_vv_nxv4f32:
289 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma
290 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v8, v0.t
291 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9, v0.t
292 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma
293 ; ZVFHMIN-NEXT: vfnmsub.vv v12, v14, v10, v0.t
294 ; ZVFHMIN-NEXT: vmv.v.v v8, v12
296 %aext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x i1> %m, i32 %evl)
297 %bext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %b, <vscale x 4 x i1> %m, i32 %evl)
298 %nega = call <vscale x 4 x float> @llvm.vp.fneg.nxv4f32(<vscale x 4 x float> %aext, <vscale x 4 x i1> %m, i32 %evl)
299 %v = call <vscale x 4 x float> @llvm.vp.fma.nxv4f32(<vscale x 4 x float> %nega, <vscale x 4 x float> %bext, <vscale x 4 x float> %c, <vscale x 4 x i1> %m, i32 %evl)
300 ret <vscale x 4 x float> %v
303 define <vscale x 4 x float> @vfnmsac_vv_nxv4f32_unmasked(<vscale x 4 x half> %a, <vscale x 4 x half> %b, <vscale x 4 x float> %c, i32 zeroext %evl) {
304 ; ZVFH-LABEL: vfnmsac_vv_nxv4f32_unmasked:
306 ; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma
307 ; ZVFH-NEXT: vfwnmsac.vv v10, v8, v9
308 ; ZVFH-NEXT: vmv2r.v v8, v10
311 ; ZVFHMIN-LABEL: vfnmsac_vv_nxv4f32_unmasked:
313 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma
314 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v8
315 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9
316 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma
317 ; ZVFHMIN-NEXT: vfnmsub.vv v12, v14, v10
318 ; ZVFHMIN-NEXT: vmv.v.v v8, v12
320 %aext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
321 %bext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %b, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
322 %nega = call <vscale x 4 x float> @llvm.vp.fneg.nxv4f32(<vscale x 4 x float> %aext, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
323 %v = call <vscale x 4 x float> @llvm.vp.fma.nxv4f32(<vscale x 4 x float> %nega, <vscale x 4 x float> %bext, <vscale x 4 x float> %c, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
324 ret <vscale x 4 x float> %v
327 define <vscale x 4 x float> @vfnmsac_vf_nxv4f32(<vscale x 4 x half> %a, half %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) {
328 ; ZVFH-LABEL: vfnmsac_vf_nxv4f32:
330 ; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma
331 ; ZVFH-NEXT: vfwnmsac.vf v10, fa0, v8, v0.t
332 ; ZVFH-NEXT: vmv2r.v v8, v10
335 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv4f32:
337 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
338 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma
339 ; ZVFHMIN-NEXT: vmv.v.x v12, a1
340 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v8, v0.t
341 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v12, v0.t
342 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma
343 ; ZVFHMIN-NEXT: vfnmsub.vv v8, v14, v10, v0.t
345 %elt.head = insertelement <vscale x 4 x half> poison, half %b, i32 0
346 %vb = shufflevector <vscale x 4 x half> %elt.head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
347 %aext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x i1> %m, i32 %evl)
348 %vbext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %vb, <vscale x 4 x i1> %m, i32 %evl)
349 %nega = call <vscale x 4 x float> @llvm.vp.fneg.nxv4f32(<vscale x 4 x float> %aext, <vscale x 4 x i1> %m, i32 %evl)
350 %v = call <vscale x 4 x float> @llvm.vp.fma.nxv4f32(<vscale x 4 x float> %nega, <vscale x 4 x float> %vbext, <vscale x 4 x float> %c, <vscale x 4 x i1> %m, i32 %evl)
351 ret <vscale x 4 x float> %v
354 define <vscale x 4 x float> @vfnmsac_vf_nxv4f32_commute(<vscale x 4 x half> %a, half %b, <vscale x 4 x float> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) {
355 ; ZVFH-LABEL: vfnmsac_vf_nxv4f32_commute:
357 ; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma
358 ; ZVFH-NEXT: vfwnmsac.vf v10, fa0, v8, v0.t
359 ; ZVFH-NEXT: vmv2r.v v8, v10
362 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv4f32_commute:
364 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
365 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma
366 ; ZVFHMIN-NEXT: vmv.v.x v9, a1
367 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8, v0.t
368 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v9, v0.t
369 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma
370 ; ZVFHMIN-NEXT: vfnmsub.vv v12, v14, v10, v0.t
371 ; ZVFHMIN-NEXT: vmv.v.v v8, v12
373 %elt.head = insertelement <vscale x 4 x half> poison, half %b, i32 0
374 %vb = shufflevector <vscale x 4 x half> %elt.head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
375 %aext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x i1> %m, i32 %evl)
376 %vbext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %vb, <vscale x 4 x i1> %m, i32 %evl)
377 %nega = call <vscale x 4 x float> @llvm.vp.fneg.nxv4f32(<vscale x 4 x float> %aext, <vscale x 4 x i1> %m, i32 %evl)
378 %v = call <vscale x 4 x float> @llvm.vp.fma.nxv4f32(<vscale x 4 x float> %vbext, <vscale x 4 x float> %nega, <vscale x 4 x float> %c, <vscale x 4 x i1> %m, i32 %evl)
379 ret <vscale x 4 x float> %v
382 define <vscale x 4 x float> @vfnmsac_vf_nxv4f32_unmasked(<vscale x 4 x half> %a, half %b, <vscale x 4 x float> %c, i32 zeroext %evl) {
383 ; ZVFH-LABEL: vfnmsac_vf_nxv4f32_unmasked:
385 ; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma
386 ; ZVFH-NEXT: vfwnmsac.vf v10, fa0, v8
387 ; ZVFH-NEXT: vmv2r.v v8, v10
390 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv4f32_unmasked:
392 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
393 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma
394 ; ZVFHMIN-NEXT: vmv.v.x v12, a1
395 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v14, v8
396 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v12
397 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma
398 ; ZVFHMIN-NEXT: vfnmsub.vv v8, v14, v10
400 %elt.head = insertelement <vscale x 4 x half> poison, half %b, i32 0
401 %vb = shufflevector <vscale x 4 x half> %elt.head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
402 %aext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
403 %vbext = call <vscale x 4 x float> @llvm.vp.fpext.nxv4f32.nxv4f16(<vscale x 4 x half> %vb, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
404 %nega = call <vscale x 4 x float> @llvm.vp.fneg.nxv4f32(<vscale x 4 x float> %aext, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
405 %v = call <vscale x 4 x float> @llvm.vp.fma.nxv4f32(<vscale x 4 x float> %nega, <vscale x 4 x float> %vbext, <vscale x 4 x float> %c, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
406 ret <vscale x 4 x float> %v
409 declare <vscale x 8 x float> @llvm.vp.fma.nxv8f32(<vscale x 8 x float>, <vscale x 8 x float>, <vscale x 8 x float>, <vscale x 8 x i1>, i32)
410 declare <vscale x 8 x float> @llvm.vp.fneg.nxv8f32(<vscale x 8 x float>, <vscale x 8 x i1>, i32)
411 declare <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half>, <vscale x 8 x i1>, i32)
413 define <vscale x 8 x float> @vfnmsac_vv_nxv8f32(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x float> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) {
414 ; ZVFH-LABEL: vfnmsac_vv_nxv8f32:
416 ; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma
417 ; ZVFH-NEXT: vfwnmsac.vv v12, v8, v10, v0.t
418 ; ZVFH-NEXT: vmv4r.v v8, v12
421 ; ZVFHMIN-LABEL: vfnmsac_vv_nxv8f32:
423 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma
424 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v8, v0.t
425 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v10, v0.t
426 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma
427 ; ZVFHMIN-NEXT: vfnmsub.vv v16, v20, v12, v0.t
428 ; ZVFHMIN-NEXT: vmv.v.v v8, v16
430 %aext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x i1> %m, i32 %evl)
431 %bext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %b, <vscale x 8 x i1> %m, i32 %evl)
432 %nega = call <vscale x 8 x float> @llvm.vp.fneg.nxv8f32(<vscale x 8 x float> %aext, <vscale x 8 x i1> %m, i32 %evl)
433 %v = call <vscale x 8 x float> @llvm.vp.fma.nxv8f32(<vscale x 8 x float> %nega, <vscale x 8 x float> %bext, <vscale x 8 x float> %c, <vscale x 8 x i1> %m, i32 %evl)
434 ret <vscale x 8 x float> %v
437 define <vscale x 8 x float> @vfnmsac_vv_nxv8f32_unmasked(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x float> %c, i32 zeroext %evl) {
438 ; ZVFH-LABEL: vfnmsac_vv_nxv8f32_unmasked:
440 ; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma
441 ; ZVFH-NEXT: vfwnmsac.vv v12, v8, v10
442 ; ZVFH-NEXT: vmv4r.v v8, v12
445 ; ZVFHMIN-LABEL: vfnmsac_vv_nxv8f32_unmasked:
447 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma
448 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v8
449 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v10
450 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma
451 ; ZVFHMIN-NEXT: vfnmsub.vv v16, v20, v12
452 ; ZVFHMIN-NEXT: vmv.v.v v8, v16
454 %aext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
455 %bext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %b, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
456 %nega = call <vscale x 8 x float> @llvm.vp.fneg.nxv8f32(<vscale x 8 x float> %aext, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
457 %v = call <vscale x 8 x float> @llvm.vp.fma.nxv8f32(<vscale x 8 x float> %nega, <vscale x 8 x float> %bext, <vscale x 8 x float> %c, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
458 ret <vscale x 8 x float> %v
461 define <vscale x 8 x float> @vfnmsac_vf_nxv8f32(<vscale x 8 x half> %a, half %b, <vscale x 8 x float> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) {
462 ; ZVFH-LABEL: vfnmsac_vf_nxv8f32:
464 ; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma
465 ; ZVFH-NEXT: vfwnmsac.vf v12, fa0, v8, v0.t
466 ; ZVFH-NEXT: vmv4r.v v8, v12
469 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv8f32:
471 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
472 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma
473 ; ZVFHMIN-NEXT: vmv.v.x v16, a1
474 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v8, v0.t
475 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v16, v0.t
476 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma
477 ; ZVFHMIN-NEXT: vfnmsub.vv v8, v20, v12, v0.t
479 %elt.head = insertelement <vscale x 8 x half> poison, half %b, i32 0
480 %vb = shufflevector <vscale x 8 x half> %elt.head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
481 %aext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x i1> %m, i32 %evl)
482 %vbext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %vb, <vscale x 8 x i1> %m, i32 %evl)
483 %nega = call <vscale x 8 x float> @llvm.vp.fneg.nxv8f32(<vscale x 8 x float> %aext, <vscale x 8 x i1> %m, i32 %evl)
484 %v = call <vscale x 8 x float> @llvm.vp.fma.nxv8f32(<vscale x 8 x float> %nega, <vscale x 8 x float> %vbext, <vscale x 8 x float> %c, <vscale x 8 x i1> %m, i32 %evl)
485 ret <vscale x 8 x float> %v
488 define <vscale x 8 x float> @vfnmsac_vf_nxv8f32_commute(<vscale x 8 x half> %a, half %b, <vscale x 8 x float> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) {
489 ; ZVFH-LABEL: vfnmsac_vf_nxv8f32_commute:
491 ; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma
492 ; ZVFH-NEXT: vfwnmsac.vf v12, fa0, v8, v0.t
493 ; ZVFH-NEXT: vmv4r.v v8, v12
496 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv8f32_commute:
498 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
499 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma
500 ; ZVFHMIN-NEXT: vmv.v.x v10, a1
501 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8, v0.t
502 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v10, v0.t
503 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma
504 ; ZVFHMIN-NEXT: vfnmsub.vv v16, v20, v12, v0.t
505 ; ZVFHMIN-NEXT: vmv.v.v v8, v16
507 %elt.head = insertelement <vscale x 8 x half> poison, half %b, i32 0
508 %vb = shufflevector <vscale x 8 x half> %elt.head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
509 %aext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x i1> %m, i32 %evl)
510 %vbext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %vb, <vscale x 8 x i1> %m, i32 %evl)
511 %nega = call <vscale x 8 x float> @llvm.vp.fneg.nxv8f32(<vscale x 8 x float> %aext, <vscale x 8 x i1> %m, i32 %evl)
512 %v = call <vscale x 8 x float> @llvm.vp.fma.nxv8f32(<vscale x 8 x float> %vbext, <vscale x 8 x float> %nega, <vscale x 8 x float> %c, <vscale x 8 x i1> %m, i32 %evl)
513 ret <vscale x 8 x float> %v
516 define <vscale x 8 x float> @vfnmsac_vf_nxv8f32_unmasked(<vscale x 8 x half> %a, half %b, <vscale x 8 x float> %c, i32 zeroext %evl) {
517 ; ZVFH-LABEL: vfnmsac_vf_nxv8f32_unmasked:
519 ; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma
520 ; ZVFH-NEXT: vfwnmsac.vf v12, fa0, v8
521 ; ZVFH-NEXT: vmv4r.v v8, v12
524 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv8f32_unmasked:
526 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
527 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma
528 ; ZVFHMIN-NEXT: vmv.v.x v16, a1
529 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v20, v8
530 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v16
531 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma
532 ; ZVFHMIN-NEXT: vfnmsub.vv v8, v20, v12
534 %elt.head = insertelement <vscale x 8 x half> poison, half %b, i32 0
535 %vb = shufflevector <vscale x 8 x half> %elt.head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
536 %aext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
537 %vbext = call <vscale x 8 x float> @llvm.vp.fpext.nxv8f32.nxv8f16(<vscale x 8 x half> %vb, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
538 %nega = call <vscale x 8 x float> @llvm.vp.fneg.nxv8f32(<vscale x 8 x float> %aext, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
539 %v = call <vscale x 8 x float> @llvm.vp.fma.nxv8f32(<vscale x 8 x float> %nega, <vscale x 8 x float> %vbext, <vscale x 8 x float> %c, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
540 ret <vscale x 8 x float> %v
543 declare <vscale x 16 x float> @llvm.vp.fma.nxv16f32(<vscale x 16 x float>, <vscale x 16 x float>, <vscale x 16 x float>, <vscale x 16 x i1>, i32)
544 declare <vscale x 16 x float> @llvm.vp.fneg.nxv16f32(<vscale x 16 x float>, <vscale x 16 x i1>, i32)
545 declare <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half>, <vscale x 16 x i1>, i32)
547 define <vscale x 16 x float> @vfnmsac_vv_nxv16f32(<vscale x 16 x half> %a, <vscale x 16 x half> %b, <vscale x 16 x float> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) {
548 ; ZVFH-LABEL: vfnmsac_vv_nxv16f32:
550 ; ZVFH-NEXT: vsetvli zero, a0, e16, m4, ta, ma
551 ; ZVFH-NEXT: vfwnmsac.vv v16, v8, v12, v0.t
552 ; ZVFH-NEXT: vmv8r.v v8, v16
555 ; ZVFHMIN-LABEL: vfnmsac_vv_nxv16f32:
557 ; ZVFHMIN-NEXT: addi sp, sp, -16
558 ; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16
559 ; ZVFHMIN-NEXT: csrr a1, vlenb
560 ; ZVFHMIN-NEXT: slli a1, a1, 3
561 ; ZVFHMIN-NEXT: sub sp, sp, a1
562 ; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
563 ; ZVFHMIN-NEXT: addi a1, sp, 16
564 ; ZVFHMIN-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
565 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma
566 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8, v0.t
567 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12, v0.t
568 ; ZVFHMIN-NEXT: addi a0, sp, 16
569 ; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload
570 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
571 ; ZVFHMIN-NEXT: vfnmsub.vv v24, v16, v8, v0.t
572 ; ZVFHMIN-NEXT: vmv.v.v v8, v24
573 ; ZVFHMIN-NEXT: csrr a0, vlenb
574 ; ZVFHMIN-NEXT: slli a0, a0, 3
575 ; ZVFHMIN-NEXT: add sp, sp, a0
576 ; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16
577 ; ZVFHMIN-NEXT: addi sp, sp, 16
578 ; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0
580 %aext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %a, <vscale x 16 x i1> %m, i32 %evl)
581 %bext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %b, <vscale x 16 x i1> %m, i32 %evl)
582 %nega = call <vscale x 16 x float> @llvm.vp.fneg.nxv16f32(<vscale x 16 x float> %aext, <vscale x 16 x i1> %m, i32 %evl)
583 %v = call <vscale x 16 x float> @llvm.vp.fma.nxv16f32(<vscale x 16 x float> %nega, <vscale x 16 x float> %bext, <vscale x 16 x float> %c, <vscale x 16 x i1> %m, i32 %evl)
584 ret <vscale x 16 x float> %v
587 define <vscale x 16 x float> @vfnmsac_vv_nxv16f32_unmasked(<vscale x 16 x half> %a, <vscale x 16 x half> %b, <vscale x 16 x float> %c, i32 zeroext %evl) {
588 ; ZVFH-LABEL: vfnmsac_vv_nxv16f32_unmasked:
590 ; ZVFH-NEXT: vsetvli zero, a0, e16, m4, ta, ma
591 ; ZVFH-NEXT: vfwnmsac.vv v16, v8, v12
592 ; ZVFH-NEXT: vmv8r.v v8, v16
595 ; ZVFHMIN-LABEL: vfnmsac_vv_nxv16f32_unmasked:
597 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma
598 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8
599 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12
600 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
601 ; ZVFHMIN-NEXT: vfnmsub.vv v24, v0, v16
602 ; ZVFHMIN-NEXT: vmv.v.v v8, v24
604 %aext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %a, <vscale x 16 x i1> splat (i1 -1), i32 %evl)
605 %bext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %b, <vscale x 16 x i1> splat (i1 -1), i32 %evl)
606 %nega = call <vscale x 16 x float> @llvm.vp.fneg.nxv16f32(<vscale x 16 x float> %aext, <vscale x 16 x i1> splat (i1 -1), i32 %evl)
607 %v = call <vscale x 16 x float> @llvm.vp.fma.nxv16f32(<vscale x 16 x float> %nega, <vscale x 16 x float> %bext, <vscale x 16 x float> %c, <vscale x 16 x i1> splat (i1 -1), i32 %evl)
608 ret <vscale x 16 x float> %v
611 define <vscale x 16 x float> @vfnmsac_vf_nxv16f32(<vscale x 16 x half> %a, half %b, <vscale x 16 x float> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) {
612 ; ZVFH-LABEL: vfnmsac_vf_nxv16f32:
614 ; ZVFH-NEXT: vsetvli zero, a0, e16, m4, ta, ma
615 ; ZVFH-NEXT: vfwnmsac.vf v16, fa0, v8, v0.t
616 ; ZVFH-NEXT: vmv8r.v v8, v16
619 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv16f32:
621 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
622 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma
623 ; ZVFHMIN-NEXT: vmv.v.x v4, a1
624 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v8, v0.t
625 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v4, v0.t
626 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
627 ; ZVFHMIN-NEXT: vfnmsub.vv v8, v24, v16, v0.t
629 %elt.head = insertelement <vscale x 16 x half> poison, half %b, i32 0
630 %vb = shufflevector <vscale x 16 x half> %elt.head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
631 %aext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %a, <vscale x 16 x i1> %m, i32 %evl)
632 %vbext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %vb, <vscale x 16 x i1> %m, i32 %evl)
633 %nega = call <vscale x 16 x float> @llvm.vp.fneg.nxv16f32(<vscale x 16 x float> %aext, <vscale x 16 x i1> %m, i32 %evl)
634 %v = call <vscale x 16 x float> @llvm.vp.fma.nxv16f32(<vscale x 16 x float> %nega, <vscale x 16 x float> %vbext, <vscale x 16 x float> %c, <vscale x 16 x i1> %m, i32 %evl)
635 ret <vscale x 16 x float> %v
638 define <vscale x 16 x float> @vfnmsac_vf_nxv16f32_commute(<vscale x 16 x half> %a, half %b, <vscale x 16 x float> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) {
639 ; ZVFH-LABEL: vfnmsac_vf_nxv16f32_commute:
641 ; ZVFH-NEXT: vsetvli zero, a0, e16, m4, ta, ma
642 ; ZVFH-NEXT: vfwnmsac.vf v16, fa0, v8, v0.t
643 ; ZVFH-NEXT: vmv8r.v v8, v16
646 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv16f32_commute:
648 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
649 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma
650 ; ZVFHMIN-NEXT: vmv.v.x v4, a1
651 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v8, v0.t
652 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v4, v0.t
653 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
654 ; ZVFHMIN-NEXT: vfnmsub.vv v24, v8, v16, v0.t
655 ; ZVFHMIN-NEXT: vmv.v.v v8, v24
657 %elt.head = insertelement <vscale x 16 x half> poison, half %b, i32 0
658 %vb = shufflevector <vscale x 16 x half> %elt.head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
659 %aext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %a, <vscale x 16 x i1> %m, i32 %evl)
660 %vbext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %vb, <vscale x 16 x i1> %m, i32 %evl)
661 %nega = call <vscale x 16 x float> @llvm.vp.fneg.nxv16f32(<vscale x 16 x float> %aext, <vscale x 16 x i1> %m, i32 %evl)
662 %v = call <vscale x 16 x float> @llvm.vp.fma.nxv16f32(<vscale x 16 x float> %vbext, <vscale x 16 x float> %nega, <vscale x 16 x float> %c, <vscale x 16 x i1> %m, i32 %evl)
663 ret <vscale x 16 x float> %v
666 define <vscale x 16 x float> @vfnmsac_vf_nxv16f32_unmasked(<vscale x 16 x half> %a, half %b, <vscale x 16 x float> %c, i32 zeroext %evl) {
667 ; ZVFH-LABEL: vfnmsac_vf_nxv16f32_unmasked:
669 ; ZVFH-NEXT: vsetvli zero, a0, e16, m4, ta, ma
670 ; ZVFH-NEXT: vfwnmsac.vf v16, fa0, v8
671 ; ZVFH-NEXT: vmv8r.v v8, v16
674 ; ZVFHMIN-LABEL: vfnmsac_vf_nxv16f32_unmasked:
676 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
677 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma
678 ; ZVFHMIN-NEXT: vmv.v.x v24, a1
679 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8
680 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v24
681 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma
682 ; ZVFHMIN-NEXT: vfnmsub.vv v8, v0, v16
684 %elt.head = insertelement <vscale x 16 x half> poison, half %b, i32 0
685 %vb = shufflevector <vscale x 16 x half> %elt.head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
686 %aext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %a, <vscale x 16 x i1> splat (i1 -1), i32 %evl)
687 %vbext = call <vscale x 16 x float> @llvm.vp.fpext.nxv16f32.nxv16f16(<vscale x 16 x half> %vb, <vscale x 16 x i1> splat (i1 -1), i32 %evl)
688 %nega = call <vscale x 16 x float> @llvm.vp.fneg.nxv16f32(<vscale x 16 x float> %aext, <vscale x 16 x i1> splat (i1 -1), i32 %evl)
689 %v = call <vscale x 16 x float> @llvm.vp.fma.nxv16f32(<vscale x 16 x float> %nega, <vscale x 16 x float> %vbext, <vscale x 16 x float> %c, <vscale x 16 x i1> splat (i1 -1), i32 %evl)
690 ret <vscale x 16 x float> %v
693 declare <vscale x 1 x double> @llvm.vp.fma.nxv1f64(<vscale x 1 x double>, <vscale x 1 x double>, <vscale x 1 x double>, <vscale x 1 x i1>, i32)
694 declare <vscale x 1 x double> @llvm.vp.fneg.nxv1f64(<vscale x 1 x double>, <vscale x 1 x i1>, i32)
695 declare <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float>, <vscale x 1 x i1>, i32)
697 define <vscale x 1 x double> @vfnmsac_vv_nxv1f64(<vscale x 1 x float> %a, <vscale x 1 x float> %b, <vscale x 1 x double> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) {
698 ; CHECK-LABEL: vfnmsac_vv_nxv1f64:
700 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
701 ; CHECK-NEXT: vfwnmsac.vv v10, v8, v9, v0.t
702 ; CHECK-NEXT: vmv1r.v v8, v10
704 %aext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %a, <vscale x 1 x i1> %m, i32 %evl)
705 %bext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %b, <vscale x 1 x i1> %m, i32 %evl)
706 %nega = call <vscale x 1 x double> @llvm.vp.fneg.nxv1f64(<vscale x 1 x double> %aext, <vscale x 1 x i1> %m, i32 %evl)
707 %v = call <vscale x 1 x double> @llvm.vp.fma.nxv1f64(<vscale x 1 x double> %nega, <vscale x 1 x double> %bext, <vscale x 1 x double> %c, <vscale x 1 x i1> %m, i32 %evl)
708 ret <vscale x 1 x double> %v
711 define <vscale x 1 x double> @vfnmsac_vv_nxv1f64_unmasked(<vscale x 1 x float> %a, <vscale x 1 x float> %b, <vscale x 1 x double> %c, i32 zeroext %evl) {
712 ; CHECK-LABEL: vfnmsac_vv_nxv1f64_unmasked:
714 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
715 ; CHECK-NEXT: vfwnmsac.vv v10, v8, v9
716 ; CHECK-NEXT: vmv1r.v v8, v10
718 %aext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %a, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
719 %bext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %b, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
720 %nega = call <vscale x 1 x double> @llvm.vp.fneg.nxv1f64(<vscale x 1 x double> %aext, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
721 %v = call <vscale x 1 x double> @llvm.vp.fma.nxv1f64(<vscale x 1 x double> %nega, <vscale x 1 x double> %bext, <vscale x 1 x double> %c, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
722 ret <vscale x 1 x double> %v
725 define <vscale x 1 x double> @vfnmsac_vf_nxv1f64(<vscale x 1 x float> %a, float %b, <vscale x 1 x double> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) {
726 ; CHECK-LABEL: vfnmsac_vf_nxv1f64:
728 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
729 ; CHECK-NEXT: vfwnmsac.vf v9, fa0, v8, v0.t
730 ; CHECK-NEXT: vmv1r.v v8, v9
732 %elt.head = insertelement <vscale x 1 x float> poison, float %b, i32 0
733 %vb = shufflevector <vscale x 1 x float> %elt.head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
734 %aext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %a, <vscale x 1 x i1> %m, i32 %evl)
735 %vbext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %vb, <vscale x 1 x i1> %m, i32 %evl)
736 %nega = call <vscale x 1 x double> @llvm.vp.fneg.nxv1f64(<vscale x 1 x double> %aext, <vscale x 1 x i1> %m, i32 %evl)
737 %v = call <vscale x 1 x double> @llvm.vp.fma.nxv1f64(<vscale x 1 x double> %nega, <vscale x 1 x double> %vbext, <vscale x 1 x double> %c, <vscale x 1 x i1> %m, i32 %evl)
738 ret <vscale x 1 x double> %v
741 define <vscale x 1 x double> @vfnmsac_vf_nxv1f64_commute(<vscale x 1 x float> %a, float %b, <vscale x 1 x double> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) {
742 ; CHECK-LABEL: vfnmsac_vf_nxv1f64_commute:
744 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
745 ; CHECK-NEXT: vfwnmsac.vf v9, fa0, v8, v0.t
746 ; CHECK-NEXT: vmv1r.v v8, v9
748 %elt.head = insertelement <vscale x 1 x float> poison, float %b, i32 0
749 %vb = shufflevector <vscale x 1 x float> %elt.head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
750 %aext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %a, <vscale x 1 x i1> %m, i32 %evl)
751 %vbext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %vb, <vscale x 1 x i1> %m, i32 %evl)
752 %nega = call <vscale x 1 x double> @llvm.vp.fneg.nxv1f64(<vscale x 1 x double> %aext, <vscale x 1 x i1> %m, i32 %evl)
753 %v = call <vscale x 1 x double> @llvm.vp.fma.nxv1f64(<vscale x 1 x double> %vbext, <vscale x 1 x double> %nega, <vscale x 1 x double> %c, <vscale x 1 x i1> %m, i32 %evl)
754 ret <vscale x 1 x double> %v
757 define <vscale x 1 x double> @vfnmsac_vf_nxv1f64_unmasked(<vscale x 1 x float> %a, float %b, <vscale x 1 x double> %c, i32 zeroext %evl) {
758 ; CHECK-LABEL: vfnmsac_vf_nxv1f64_unmasked:
760 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
761 ; CHECK-NEXT: vfwnmsac.vf v9, fa0, v8
762 ; CHECK-NEXT: vmv1r.v v8, v9
764 %elt.head = insertelement <vscale x 1 x float> poison, float %b, i32 0
765 %vb = shufflevector <vscale x 1 x float> %elt.head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
766 %aext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %a, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
767 %vbext = call <vscale x 1 x double> @llvm.vp.fpext.nxv1f64.nxv1f32(<vscale x 1 x float> %vb, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
768 %nega = call <vscale x 1 x double> @llvm.vp.fneg.nxv1f64(<vscale x 1 x double> %aext, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
769 %v = call <vscale x 1 x double> @llvm.vp.fma.nxv1f64(<vscale x 1 x double> %nega, <vscale x 1 x double> %vbext, <vscale x 1 x double> %c, <vscale x 1 x i1> splat (i1 -1), i32 %evl)
770 ret <vscale x 1 x double> %v
773 declare <vscale x 2 x double> @llvm.vp.fma.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x i1>, i32)
774 declare <vscale x 2 x double> @llvm.vp.fneg.nxv2f64(<vscale x 2 x double>, <vscale x 2 x i1>, i32)
775 declare <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float>, <vscale x 2 x i1>, i32)
777 define <vscale x 2 x double> @vfnmsac_vv_nxv2f64(<vscale x 2 x float> %a, <vscale x 2 x float> %b, <vscale x 2 x double> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) {
778 ; CHECK-LABEL: vfnmsac_vv_nxv2f64:
780 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
781 ; CHECK-NEXT: vfwnmsac.vv v10, v8, v9, v0.t
782 ; CHECK-NEXT: vmv2r.v v8, v10
784 %aext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x i1> %m, i32 %evl)
785 %bext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %b, <vscale x 2 x i1> %m, i32 %evl)
786 %nega = call <vscale x 2 x double> @llvm.vp.fneg.nxv2f64(<vscale x 2 x double> %aext, <vscale x 2 x i1> %m, i32 %evl)
787 %v = call <vscale x 2 x double> @llvm.vp.fma.nxv2f64(<vscale x 2 x double> %nega, <vscale x 2 x double> %bext, <vscale x 2 x double> %c, <vscale x 2 x i1> %m, i32 %evl)
788 ret <vscale x 2 x double> %v
791 define <vscale x 2 x double> @vfnmsac_vv_nxv2f64_unmasked(<vscale x 2 x float> %a, <vscale x 2 x float> %b, <vscale x 2 x double> %c, i32 zeroext %evl) {
792 ; CHECK-LABEL: vfnmsac_vv_nxv2f64_unmasked:
794 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
795 ; CHECK-NEXT: vfwnmsac.vv v10, v8, v9
796 ; CHECK-NEXT: vmv2r.v v8, v10
798 %aext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
799 %bext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %b, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
800 %nega = call <vscale x 2 x double> @llvm.vp.fneg.nxv2f64(<vscale x 2 x double> %aext, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
801 %v = call <vscale x 2 x double> @llvm.vp.fma.nxv2f64(<vscale x 2 x double> %nega, <vscale x 2 x double> %bext, <vscale x 2 x double> %c, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
802 ret <vscale x 2 x double> %v
805 define <vscale x 2 x double> @vfnmsac_vf_nxv2f64(<vscale x 2 x float> %a, float %b, <vscale x 2 x double> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) {
806 ; CHECK-LABEL: vfnmsac_vf_nxv2f64:
808 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
809 ; CHECK-NEXT: vfwnmsac.vf v10, fa0, v8, v0.t
810 ; CHECK-NEXT: vmv2r.v v8, v10
812 %elt.head = insertelement <vscale x 2 x float> poison, float %b, i32 0
813 %vb = shufflevector <vscale x 2 x float> %elt.head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
814 %aext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x i1> %m, i32 %evl)
815 %vbext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %vb, <vscale x 2 x i1> %m, i32 %evl)
816 %nega = call <vscale x 2 x double> @llvm.vp.fneg.nxv2f64(<vscale x 2 x double> %aext, <vscale x 2 x i1> %m, i32 %evl)
817 %v = call <vscale x 2 x double> @llvm.vp.fma.nxv2f64(<vscale x 2 x double> %nega, <vscale x 2 x double> %vbext, <vscale x 2 x double> %c, <vscale x 2 x i1> %m, i32 %evl)
818 ret <vscale x 2 x double> %v
821 define <vscale x 2 x double> @vfnmsac_vf_nxv2f64_commute(<vscale x 2 x float> %a, float %b, <vscale x 2 x double> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) {
822 ; CHECK-LABEL: vfnmsac_vf_nxv2f64_commute:
824 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
825 ; CHECK-NEXT: vfwnmsac.vf v10, fa0, v8, v0.t
826 ; CHECK-NEXT: vmv2r.v v8, v10
828 %elt.head = insertelement <vscale x 2 x float> poison, float %b, i32 0
829 %vb = shufflevector <vscale x 2 x float> %elt.head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
830 %aext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x i1> %m, i32 %evl)
831 %vbext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %vb, <vscale x 2 x i1> %m, i32 %evl)
832 %nega = call <vscale x 2 x double> @llvm.vp.fneg.nxv2f64(<vscale x 2 x double> %aext, <vscale x 2 x i1> %m, i32 %evl)
833 %v = call <vscale x 2 x double> @llvm.vp.fma.nxv2f64(<vscale x 2 x double> %vbext, <vscale x 2 x double> %nega, <vscale x 2 x double> %c, <vscale x 2 x i1> %m, i32 %evl)
834 ret <vscale x 2 x double> %v
837 define <vscale x 2 x double> @vfnmsac_vf_nxv2f64_unmasked(<vscale x 2 x float> %a, float %b, <vscale x 2 x double> %c, i32 zeroext %evl) {
838 ; CHECK-LABEL: vfnmsac_vf_nxv2f64_unmasked:
840 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
841 ; CHECK-NEXT: vfwnmsac.vf v10, fa0, v8
842 ; CHECK-NEXT: vmv2r.v v8, v10
844 %elt.head = insertelement <vscale x 2 x float> poison, float %b, i32 0
845 %vb = shufflevector <vscale x 2 x float> %elt.head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
846 %aext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
847 %vbext = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %vb, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
848 %nega = call <vscale x 2 x double> @llvm.vp.fneg.nxv2f64(<vscale x 2 x double> %aext, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
849 %v = call <vscale x 2 x double> @llvm.vp.fma.nxv2f64(<vscale x 2 x double> %nega, <vscale x 2 x double> %vbext, <vscale x 2 x double> %c, <vscale x 2 x i1> splat (i1 -1), i32 %evl)
850 ret <vscale x 2 x double> %v
853 declare <vscale x 4 x double> @llvm.vp.fma.nxv4f64(<vscale x 4 x double>, <vscale x 4 x double>, <vscale x 4 x double>, <vscale x 4 x i1>, i32)
854 declare <vscale x 4 x double> @llvm.vp.fneg.nxv4f64(<vscale x 4 x double>, <vscale x 4 x i1>, i32)
855 declare <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float>, <vscale x 4 x i1>, i32)
857 define <vscale x 4 x double> @vfnmsac_vv_nxv4f64(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x double> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) {
858 ; CHECK-LABEL: vfnmsac_vv_nxv4f64:
860 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
861 ; CHECK-NEXT: vfwnmsac.vv v12, v8, v10, v0.t
862 ; CHECK-NEXT: vmv4r.v v8, v12
864 %aext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x i1> %m, i32 %evl)
865 %bext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %b, <vscale x 4 x i1> %m, i32 %evl)
866 %nega = call <vscale x 4 x double> @llvm.vp.fneg.nxv4f64(<vscale x 4 x double> %aext, <vscale x 4 x i1> %m, i32 %evl)
867 %v = call <vscale x 4 x double> @llvm.vp.fma.nxv4f64(<vscale x 4 x double> %nega, <vscale x 4 x double> %bext, <vscale x 4 x double> %c, <vscale x 4 x i1> %m, i32 %evl)
868 ret <vscale x 4 x double> %v
871 define <vscale x 4 x double> @vfnmsac_vv_nxv4f64_unmasked(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x double> %c, i32 zeroext %evl) {
872 ; CHECK-LABEL: vfnmsac_vv_nxv4f64_unmasked:
874 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
875 ; CHECK-NEXT: vfwnmsac.vv v12, v8, v10
876 ; CHECK-NEXT: vmv4r.v v8, v12
878 %aext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
879 %bext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %b, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
880 %nega = call <vscale x 4 x double> @llvm.vp.fneg.nxv4f64(<vscale x 4 x double> %aext, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
881 %v = call <vscale x 4 x double> @llvm.vp.fma.nxv4f64(<vscale x 4 x double> %nega, <vscale x 4 x double> %bext, <vscale x 4 x double> %c, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
882 ret <vscale x 4 x double> %v
885 define <vscale x 4 x double> @vfnmsac_vf_nxv4f64(<vscale x 4 x float> %a, float %b, <vscale x 4 x double> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) {
886 ; CHECK-LABEL: vfnmsac_vf_nxv4f64:
888 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
889 ; CHECK-NEXT: vfwnmsac.vf v12, fa0, v8, v0.t
890 ; CHECK-NEXT: vmv4r.v v8, v12
892 %elt.head = insertelement <vscale x 4 x float> poison, float %b, i32 0
893 %vb = shufflevector <vscale x 4 x float> %elt.head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
894 %aext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x i1> %m, i32 %evl)
895 %vbext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %vb, <vscale x 4 x i1> %m, i32 %evl)
896 %nega = call <vscale x 4 x double> @llvm.vp.fneg.nxv4f64(<vscale x 4 x double> %aext, <vscale x 4 x i1> %m, i32 %evl)
897 %v = call <vscale x 4 x double> @llvm.vp.fma.nxv4f64(<vscale x 4 x double> %nega, <vscale x 4 x double> %vbext, <vscale x 4 x double> %c, <vscale x 4 x i1> %m, i32 %evl)
898 ret <vscale x 4 x double> %v
901 define <vscale x 4 x double> @vfnmsac_vf_nxv4f64_commute(<vscale x 4 x float> %a, float %b, <vscale x 4 x double> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) {
902 ; CHECK-LABEL: vfnmsac_vf_nxv4f64_commute:
904 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
905 ; CHECK-NEXT: vfwnmsac.vf v12, fa0, v8, v0.t
906 ; CHECK-NEXT: vmv4r.v v8, v12
908 %elt.head = insertelement <vscale x 4 x float> poison, float %b, i32 0
909 %vb = shufflevector <vscale x 4 x float> %elt.head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
910 %aext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x i1> %m, i32 %evl)
911 %vbext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %vb, <vscale x 4 x i1> %m, i32 %evl)
912 %nega = call <vscale x 4 x double> @llvm.vp.fneg.nxv4f64(<vscale x 4 x double> %aext, <vscale x 4 x i1> %m, i32 %evl)
913 %v = call <vscale x 4 x double> @llvm.vp.fma.nxv4f64(<vscale x 4 x double> %vbext, <vscale x 4 x double> %nega, <vscale x 4 x double> %c, <vscale x 4 x i1> %m, i32 %evl)
914 ret <vscale x 4 x double> %v
917 define <vscale x 4 x double> @vfnmsac_vf_nxv4f64_unmasked(<vscale x 4 x float> %a, float %b, <vscale x 4 x double> %c, i32 zeroext %evl) {
918 ; CHECK-LABEL: vfnmsac_vf_nxv4f64_unmasked:
920 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
921 ; CHECK-NEXT: vfwnmsac.vf v12, fa0, v8
922 ; CHECK-NEXT: vmv4r.v v8, v12
924 %elt.head = insertelement <vscale x 4 x float> poison, float %b, i32 0
925 %vb = shufflevector <vscale x 4 x float> %elt.head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
926 %aext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
927 %vbext = call <vscale x 4 x double> @llvm.vp.fpext.nxv4f64.nxv4f32(<vscale x 4 x float> %vb, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
928 %nega = call <vscale x 4 x double> @llvm.vp.fneg.nxv4f64(<vscale x 4 x double> %aext, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
929 %v = call <vscale x 4 x double> @llvm.vp.fma.nxv4f64(<vscale x 4 x double> %nega, <vscale x 4 x double> %vbext, <vscale x 4 x double> %c, <vscale x 4 x i1> splat (i1 -1), i32 %evl)
930 ret <vscale x 4 x double> %v
933 declare <vscale x 8 x double> @llvm.vp.fma.nxv8f64(<vscale x 8 x double>, <vscale x 8 x double>, <vscale x 8 x double>, <vscale x 8 x i1>, i32)
934 declare <vscale x 8 x double> @llvm.vp.fneg.nxv8f64(<vscale x 8 x double>, <vscale x 8 x i1>, i32)
935 declare <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float>, <vscale x 8 x i1>, i32)
937 define <vscale x 8 x double> @vfnmsac_vv_nxv8f64(<vscale x 8 x float> %a, <vscale x 8 x float> %b, <vscale x 8 x double> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) {
938 ; CHECK-LABEL: vfnmsac_vv_nxv8f64:
940 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
941 ; CHECK-NEXT: vfwnmsac.vv v16, v8, v12, v0.t
942 ; CHECK-NEXT: vmv8r.v v8, v16
944 %aext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %a, <vscale x 8 x i1> %m, i32 %evl)
945 %bext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %b, <vscale x 8 x i1> %m, i32 %evl)
946 %nega = call <vscale x 8 x double> @llvm.vp.fneg.nxv8f64(<vscale x 8 x double> %aext, <vscale x 8 x i1> %m, i32 %evl)
947 %v = call <vscale x 8 x double> @llvm.vp.fma.nxv8f64(<vscale x 8 x double> %nega, <vscale x 8 x double> %bext, <vscale x 8 x double> %c, <vscale x 8 x i1> %m, i32 %evl)
948 ret <vscale x 8 x double> %v
951 define <vscale x 8 x double> @vfnmsac_vv_nxv8f64_unmasked(<vscale x 8 x float> %a, <vscale x 8 x float> %b, <vscale x 8 x double> %c, i32 zeroext %evl) {
952 ; CHECK-LABEL: vfnmsac_vv_nxv8f64_unmasked:
954 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
955 ; CHECK-NEXT: vfwnmsac.vv v16, v8, v12
956 ; CHECK-NEXT: vmv8r.v v8, v16
958 %aext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %a, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
959 %bext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %b, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
960 %nega = call <vscale x 8 x double> @llvm.vp.fneg.nxv8f64(<vscale x 8 x double> %aext, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
961 %v = call <vscale x 8 x double> @llvm.vp.fma.nxv8f64(<vscale x 8 x double> %nega, <vscale x 8 x double> %bext, <vscale x 8 x double> %c, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
962 ret <vscale x 8 x double> %v
965 define <vscale x 8 x double> @vfnmsac_vf_nxv8f64(<vscale x 8 x float> %a, float %b, <vscale x 8 x double> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) {
966 ; CHECK-LABEL: vfnmsac_vf_nxv8f64:
968 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
969 ; CHECK-NEXT: vfwnmsac.vf v16, fa0, v8, v0.t
970 ; CHECK-NEXT: vmv8r.v v8, v16
972 %elt.head = insertelement <vscale x 8 x float> poison, float %b, i32 0
973 %vb = shufflevector <vscale x 8 x float> %elt.head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
974 %aext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %a, <vscale x 8 x i1> %m, i32 %evl)
975 %vbext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %vb, <vscale x 8 x i1> %m, i32 %evl)
976 %nega = call <vscale x 8 x double> @llvm.vp.fneg.nxv8f64(<vscale x 8 x double> %aext, <vscale x 8 x i1> %m, i32 %evl)
977 %v = call <vscale x 8 x double> @llvm.vp.fma.nxv8f64(<vscale x 8 x double> %nega, <vscale x 8 x double> %vbext, <vscale x 8 x double> %c, <vscale x 8 x i1> %m, i32 %evl)
978 ret <vscale x 8 x double> %v
981 define <vscale x 8 x double> @vfnmsac_vf_nxv8f64_commute(<vscale x 8 x float> %a, float %b, <vscale x 8 x double> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) {
982 ; CHECK-LABEL: vfnmsac_vf_nxv8f64_commute:
984 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
985 ; CHECK-NEXT: vfwnmsac.vf v16, fa0, v8, v0.t
986 ; CHECK-NEXT: vmv8r.v v8, v16
988 %elt.head = insertelement <vscale x 8 x float> poison, float %b, i32 0
989 %vb = shufflevector <vscale x 8 x float> %elt.head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
990 %aext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %a, <vscale x 8 x i1> %m, i32 %evl)
991 %vbext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %vb, <vscale x 8 x i1> %m, i32 %evl)
992 %nega = call <vscale x 8 x double> @llvm.vp.fneg.nxv8f64(<vscale x 8 x double> %aext, <vscale x 8 x i1> %m, i32 %evl)
993 %v = call <vscale x 8 x double> @llvm.vp.fma.nxv8f64(<vscale x 8 x double> %vbext, <vscale x 8 x double> %nega, <vscale x 8 x double> %c, <vscale x 8 x i1> %m, i32 %evl)
994 ret <vscale x 8 x double> %v
997 define <vscale x 8 x double> @vfnmsac_vf_nxv8f64_unmasked(<vscale x 8 x float> %a, float %b, <vscale x 8 x double> %c, i32 zeroext %evl) {
998 ; CHECK-LABEL: vfnmsac_vf_nxv8f64_unmasked:
1000 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
1001 ; CHECK-NEXT: vfwnmsac.vf v16, fa0, v8
1002 ; CHECK-NEXT: vmv8r.v v8, v16
1004 %elt.head = insertelement <vscale x 8 x float> poison, float %b, i32 0
1005 %vb = shufflevector <vscale x 8 x float> %elt.head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
1006 %aext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %a, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
1007 %vbext = call <vscale x 8 x double> @llvm.vp.fpext.nxv8f64.nxv8f32(<vscale x 8 x float> %vb, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
1008 %nega = call <vscale x 8 x double> @llvm.vp.fneg.nxv8f64(<vscale x 8 x double> %aext, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
1009 %v = call <vscale x 8 x double> @llvm.vp.fma.nxv8f64(<vscale x 8 x double> %nega, <vscale x 8 x double> %vbext, <vscale x 8 x double> %c, <vscale x 8 x i1> splat (i1 -1), i32 %evl)
1010 ret <vscale x 8 x double> %v