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
11 declare <2 x half> @llvm.vp.fmul.v2f16(<2 x half>, <2 x half>, <2 x i1>, i32)
13 define <2 x half> @vfmul_vv_v2f16(<2 x half> %va, <2 x half> %b, <2 x i1> %m, i32 zeroext %evl) {
14 ; ZVFH-LABEL: vfmul_vv_v2f16:
16 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
17 ; ZVFH-NEXT: vfmul.vv v8, v8, v9, v0.t
20 ; ZVFHMIN-LABEL: vfmul_vv_v2f16:
22 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
23 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9, v0.t
24 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8, v0.t
25 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
26 ; ZVFHMIN-NEXT: vfmul.vv v9, v9, v10, v0.t
27 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
28 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9, v0.t
30 %v = call <2 x half> @llvm.vp.fmul.v2f16(<2 x half> %va, <2 x half> %b, <2 x i1> %m, i32 %evl)
34 define <2 x half> @vfmul_vv_v2f16_unmasked(<2 x half> %va, <2 x half> %b, i32 zeroext %evl) {
35 ; ZVFH-LABEL: vfmul_vv_v2f16_unmasked:
37 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
38 ; ZVFH-NEXT: vfmul.vv v8, v8, v9
41 ; ZVFHMIN-LABEL: vfmul_vv_v2f16_unmasked:
43 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
44 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9
45 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8
46 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
47 ; ZVFHMIN-NEXT: vfmul.vv v9, v9, v10
48 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
49 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9
51 %v = call <2 x half> @llvm.vp.fmul.v2f16(<2 x half> %va, <2 x half> %b, <2 x i1> splat (i1 true), i32 %evl)
55 define <2 x half> @vfmul_vf_v2f16(<2 x half> %va, half %b, <2 x i1> %m, i32 zeroext %evl) {
56 ; ZVFH-LABEL: vfmul_vf_v2f16:
58 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
59 ; ZVFH-NEXT: vfmul.vf v8, v8, fa0, v0.t
62 ; ZVFHMIN-LABEL: vfmul_vf_v2f16:
64 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
65 ; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
66 ; ZVFHMIN-NEXT: vmv.v.x v9, a1
67 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
68 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8, v0.t
69 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9, v0.t
70 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
71 ; ZVFHMIN-NEXT: vfmul.vv v9, v10, v8, v0.t
72 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
73 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9, v0.t
75 %elt.head = insertelement <2 x half> poison, half %b, i32 0
76 %vb = shufflevector <2 x half> %elt.head, <2 x half> poison, <2 x i32> zeroinitializer
77 %v = call <2 x half> @llvm.vp.fmul.v2f16(<2 x half> %va, <2 x half> %vb, <2 x i1> %m, i32 %evl)
81 define <2 x half> @vfmul_vf_v2f16_unmasked(<2 x half> %va, half %b, i32 zeroext %evl) {
82 ; ZVFH-LABEL: vfmul_vf_v2f16_unmasked:
84 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
85 ; ZVFH-NEXT: vfmul.vf v8, v8, fa0
88 ; ZVFHMIN-LABEL: vfmul_vf_v2f16_unmasked:
90 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
91 ; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
92 ; ZVFHMIN-NEXT: vmv.v.x v9, a1
93 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
94 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8
95 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9
96 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
97 ; ZVFHMIN-NEXT: vfmul.vv v9, v10, v8
98 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma
99 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9
101 %elt.head = insertelement <2 x half> poison, half %b, i32 0
102 %vb = shufflevector <2 x half> %elt.head, <2 x half> poison, <2 x i32> zeroinitializer
103 %v = call <2 x half> @llvm.vp.fmul.v2f16(<2 x half> %va, <2 x half> %vb, <2 x i1> splat (i1 true), i32 %evl)
107 declare <3 x half> @llvm.vp.fmul.v3f16(<3 x half>, <3 x half>, <3 x i1>, i32)
109 define <3 x half> @vfmul_vv_v3f16(<3 x half> %va, <3 x half> %b, <3 x i1> %m, i32 zeroext %evl) {
110 ; ZVFH-LABEL: vfmul_vv_v3f16:
112 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
113 ; ZVFH-NEXT: vfmul.vv v8, v8, v9, v0.t
116 ; ZVFHMIN-LABEL: vfmul_vv_v3f16:
118 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
119 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9, v0.t
120 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8, v0.t
121 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma
122 ; ZVFHMIN-NEXT: vfmul.vv v9, v9, v10, v0.t
123 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
124 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9, v0.t
126 %v = call <3 x half> @llvm.vp.fmul.v3f16(<3 x half> %va, <3 x half> %b, <3 x i1> %m, i32 %evl)
130 declare <4 x half> @llvm.vp.fmul.v4f16(<4 x half>, <4 x half>, <4 x i1>, i32)
132 define <4 x half> @vfmul_vv_v4f16(<4 x half> %va, <4 x half> %b, <4 x i1> %m, i32 zeroext %evl) {
133 ; ZVFH-LABEL: vfmul_vv_v4f16:
135 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
136 ; ZVFH-NEXT: vfmul.vv v8, v8, v9, v0.t
139 ; ZVFHMIN-LABEL: vfmul_vv_v4f16:
141 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
142 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9, v0.t
143 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8, v0.t
144 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma
145 ; ZVFHMIN-NEXT: vfmul.vv v9, v9, v10, v0.t
146 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
147 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9, v0.t
149 %v = call <4 x half> @llvm.vp.fmul.v4f16(<4 x half> %va, <4 x half> %b, <4 x i1> %m, i32 %evl)
153 define <4 x half> @vfmul_vv_v4f16_unmasked(<4 x half> %va, <4 x half> %b, i32 zeroext %evl) {
154 ; ZVFH-LABEL: vfmul_vv_v4f16_unmasked:
156 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
157 ; ZVFH-NEXT: vfmul.vv v8, v8, v9
160 ; ZVFHMIN-LABEL: vfmul_vv_v4f16_unmasked:
162 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
163 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9
164 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8
165 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma
166 ; ZVFHMIN-NEXT: vfmul.vv v9, v9, v10
167 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
168 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9
170 %v = call <4 x half> @llvm.vp.fmul.v4f16(<4 x half> %va, <4 x half> %b, <4 x i1> splat (i1 true), i32 %evl)
174 define <4 x half> @vfmul_vf_v4f16(<4 x half> %va, half %b, <4 x i1> %m, i32 zeroext %evl) {
175 ; ZVFH-LABEL: vfmul_vf_v4f16:
177 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
178 ; ZVFH-NEXT: vfmul.vf v8, v8, fa0, v0.t
181 ; ZVFHMIN-LABEL: vfmul_vf_v4f16:
183 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
184 ; ZVFHMIN-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
185 ; ZVFHMIN-NEXT: vmv.v.x v9, a1
186 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
187 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8, v0.t
188 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9, v0.t
189 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma
190 ; ZVFHMIN-NEXT: vfmul.vv v9, v10, v8, v0.t
191 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
192 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9, v0.t
194 %elt.head = insertelement <4 x half> poison, half %b, i32 0
195 %vb = shufflevector <4 x half> %elt.head, <4 x half> poison, <4 x i32> zeroinitializer
196 %v = call <4 x half> @llvm.vp.fmul.v4f16(<4 x half> %va, <4 x half> %vb, <4 x i1> %m, i32 %evl)
200 define <4 x half> @vfmul_vf_v4f16_unmasked(<4 x half> %va, half %b, i32 zeroext %evl) {
201 ; ZVFH-LABEL: vfmul_vf_v4f16_unmasked:
203 ; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
204 ; ZVFH-NEXT: vfmul.vf v8, v8, fa0
207 ; ZVFHMIN-LABEL: vfmul_vf_v4f16_unmasked:
209 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
210 ; ZVFHMIN-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
211 ; ZVFHMIN-NEXT: vmv.v.x v9, a1
212 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
213 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8
214 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9
215 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma
216 ; ZVFHMIN-NEXT: vfmul.vv v9, v10, v8
217 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
218 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9
220 %elt.head = insertelement <4 x half> poison, half %b, i32 0
221 %vb = shufflevector <4 x half> %elt.head, <4 x half> poison, <4 x i32> zeroinitializer
222 %v = call <4 x half> @llvm.vp.fmul.v4f16(<4 x half> %va, <4 x half> %vb, <4 x i1> splat (i1 true), i32 %evl)
226 declare <8 x half> @llvm.vp.fmul.v8f16(<8 x half>, <8 x half>, <8 x i1>, i32)
228 define <8 x half> @vfmul_vv_v8f16(<8 x half> %va, <8 x half> %b, <8 x i1> %m, i32 zeroext %evl) {
229 ; ZVFH-LABEL: vfmul_vv_v8f16:
231 ; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma
232 ; ZVFH-NEXT: vfmul.vv v8, v8, v9, v0.t
235 ; ZVFHMIN-LABEL: vfmul_vv_v8f16:
237 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma
238 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9, v0.t
239 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8, v0.t
240 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma
241 ; ZVFHMIN-NEXT: vfmul.vv v10, v12, v10, v0.t
242 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma
243 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10, v0.t
245 %v = call <8 x half> @llvm.vp.fmul.v8f16(<8 x half> %va, <8 x half> %b, <8 x i1> %m, i32 %evl)
249 define <8 x half> @vfmul_vv_v8f16_unmasked(<8 x half> %va, <8 x half> %b, i32 zeroext %evl) {
250 ; ZVFH-LABEL: vfmul_vv_v8f16_unmasked:
252 ; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma
253 ; ZVFH-NEXT: vfmul.vv v8, v8, v9
256 ; ZVFHMIN-LABEL: vfmul_vv_v8f16_unmasked:
258 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma
259 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9
260 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8
261 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma
262 ; ZVFHMIN-NEXT: vfmul.vv v10, v12, v10
263 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma
264 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10
266 %v = call <8 x half> @llvm.vp.fmul.v8f16(<8 x half> %va, <8 x half> %b, <8 x i1> splat (i1 true), i32 %evl)
270 define <8 x half> @vfmul_vf_v8f16(<8 x half> %va, half %b, <8 x i1> %m, i32 zeroext %evl) {
271 ; ZVFH-LABEL: vfmul_vf_v8f16:
273 ; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma
274 ; ZVFH-NEXT: vfmul.vf v8, v8, fa0, v0.t
277 ; ZVFHMIN-LABEL: vfmul_vf_v8f16:
279 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
280 ; ZVFHMIN-NEXT: vsetivli zero, 8, e16, m1, ta, ma
281 ; ZVFHMIN-NEXT: vmv.v.x v9, a1
282 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma
283 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8, v0.t
284 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9, v0.t
285 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma
286 ; ZVFHMIN-NEXT: vfmul.vv v10, v10, v12, v0.t
287 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma
288 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10, v0.t
290 %elt.head = insertelement <8 x half> poison, half %b, i32 0
291 %vb = shufflevector <8 x half> %elt.head, <8 x half> poison, <8 x i32> zeroinitializer
292 %v = call <8 x half> @llvm.vp.fmul.v8f16(<8 x half> %va, <8 x half> %vb, <8 x i1> %m, i32 %evl)
296 define <8 x half> @vfmul_vf_v8f16_unmasked(<8 x half> %va, half %b, i32 zeroext %evl) {
297 ; ZVFH-LABEL: vfmul_vf_v8f16_unmasked:
299 ; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma
300 ; ZVFH-NEXT: vfmul.vf v8, v8, fa0
303 ; ZVFHMIN-LABEL: vfmul_vf_v8f16_unmasked:
305 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
306 ; ZVFHMIN-NEXT: vsetivli zero, 8, e16, m1, ta, ma
307 ; ZVFHMIN-NEXT: vmv.v.x v9, a1
308 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma
309 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8
310 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9
311 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma
312 ; ZVFHMIN-NEXT: vfmul.vv v10, v10, v12
313 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma
314 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10
316 %elt.head = insertelement <8 x half> poison, half %b, i32 0
317 %vb = shufflevector <8 x half> %elt.head, <8 x half> poison, <8 x i32> zeroinitializer
318 %v = call <8 x half> @llvm.vp.fmul.v8f16(<8 x half> %va, <8 x half> %vb, <8 x i1> splat (i1 true), i32 %evl)
322 declare <16 x half> @llvm.vp.fmul.v16f16(<16 x half>, <16 x half>, <16 x i1>, i32)
324 define <16 x half> @vfmul_vv_v16f16(<16 x half> %va, <16 x half> %b, <16 x i1> %m, i32 zeroext %evl) {
325 ; ZVFH-LABEL: vfmul_vv_v16f16:
327 ; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma
328 ; ZVFH-NEXT: vfmul.vv v8, v8, v10, v0.t
331 ; ZVFHMIN-LABEL: vfmul_vv_v16f16:
333 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma
334 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10, v0.t
335 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8, v0.t
336 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma
337 ; ZVFHMIN-NEXT: vfmul.vv v12, v16, v12, v0.t
338 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma
339 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12, v0.t
341 %v = call <16 x half> @llvm.vp.fmul.v16f16(<16 x half> %va, <16 x half> %b, <16 x i1> %m, i32 %evl)
345 define <16 x half> @vfmul_vv_v16f16_unmasked(<16 x half> %va, <16 x half> %b, i32 zeroext %evl) {
346 ; ZVFH-LABEL: vfmul_vv_v16f16_unmasked:
348 ; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma
349 ; ZVFH-NEXT: vfmul.vv v8, v8, v10
352 ; ZVFHMIN-LABEL: vfmul_vv_v16f16_unmasked:
354 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma
355 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10
356 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8
357 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma
358 ; ZVFHMIN-NEXT: vfmul.vv v12, v16, v12
359 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma
360 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12
362 %v = call <16 x half> @llvm.vp.fmul.v16f16(<16 x half> %va, <16 x half> %b, <16 x i1> splat (i1 true), i32 %evl)
366 define <16 x half> @vfmul_vf_v16f16(<16 x half> %va, half %b, <16 x i1> %m, i32 zeroext %evl) {
367 ; ZVFH-LABEL: vfmul_vf_v16f16:
369 ; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma
370 ; ZVFH-NEXT: vfmul.vf v8, v8, fa0, v0.t
373 ; ZVFHMIN-LABEL: vfmul_vf_v16f16:
375 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
376 ; ZVFHMIN-NEXT: vsetivli zero, 16, e16, m2, ta, ma
377 ; ZVFHMIN-NEXT: vmv.v.x v10, a1
378 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma
379 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8, v0.t
380 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v10, v0.t
381 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma
382 ; ZVFHMIN-NEXT: vfmul.vv v12, v12, v16, v0.t
383 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma
384 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12, v0.t
386 %elt.head = insertelement <16 x half> poison, half %b, i32 0
387 %vb = shufflevector <16 x half> %elt.head, <16 x half> poison, <16 x i32> zeroinitializer
388 %v = call <16 x half> @llvm.vp.fmul.v16f16(<16 x half> %va, <16 x half> %vb, <16 x i1> %m, i32 %evl)
392 define <16 x half> @vfmul_vf_v16f16_unmasked(<16 x half> %va, half %b, i32 zeroext %evl) {
393 ; ZVFH-LABEL: vfmul_vf_v16f16_unmasked:
395 ; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma
396 ; ZVFH-NEXT: vfmul.vf v8, v8, fa0
399 ; ZVFHMIN-LABEL: vfmul_vf_v16f16_unmasked:
401 ; ZVFHMIN-NEXT: fmv.x.h a1, fa0
402 ; ZVFHMIN-NEXT: vsetivli zero, 16, e16, m2, ta, ma
403 ; ZVFHMIN-NEXT: vmv.v.x v10, a1
404 ; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma
405 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8
406 ; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v10
407 ; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma
408 ; ZVFHMIN-NEXT: vfmul.vv v12, v12, v16
409 ; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma
410 ; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12
412 %elt.head = insertelement <16 x half> poison, half %b, i32 0
413 %vb = shufflevector <16 x half> %elt.head, <16 x half> poison, <16 x i32> zeroinitializer
414 %v = call <16 x half> @llvm.vp.fmul.v16f16(<16 x half> %va, <16 x half> %vb, <16 x i1> splat (i1 true), i32 %evl)
418 declare <2 x float> @llvm.vp.fmul.v2f32(<2 x float>, <2 x float>, <2 x i1>, i32)
420 define <2 x float> @vfmul_vv_v2f32(<2 x float> %va, <2 x float> %b, <2 x i1> %m, i32 zeroext %evl) {
421 ; CHECK-LABEL: vfmul_vv_v2f32:
423 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
424 ; CHECK-NEXT: vfmul.vv v8, v8, v9, v0.t
426 %v = call <2 x float> @llvm.vp.fmul.v2f32(<2 x float> %va, <2 x float> %b, <2 x i1> %m, i32 %evl)
430 define <2 x float> @vfmul_vv_v2f32_unmasked(<2 x float> %va, <2 x float> %b, i32 zeroext %evl) {
431 ; CHECK-LABEL: vfmul_vv_v2f32_unmasked:
433 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
434 ; CHECK-NEXT: vfmul.vv v8, v8, v9
436 %v = call <2 x float> @llvm.vp.fmul.v2f32(<2 x float> %va, <2 x float> %b, <2 x i1> splat (i1 true), i32 %evl)
440 define <2 x float> @vfmul_vf_v2f32(<2 x float> %va, float %b, <2 x i1> %m, i32 zeroext %evl) {
441 ; CHECK-LABEL: vfmul_vf_v2f32:
443 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
444 ; CHECK-NEXT: vfmul.vf v8, v8, fa0, v0.t
446 %elt.head = insertelement <2 x float> poison, float %b, i32 0
447 %vb = shufflevector <2 x float> %elt.head, <2 x float> poison, <2 x i32> zeroinitializer
448 %v = call <2 x float> @llvm.vp.fmul.v2f32(<2 x float> %va, <2 x float> %vb, <2 x i1> %m, i32 %evl)
452 define <2 x float> @vfmul_vf_v2f32_unmasked(<2 x float> %va, float %b, i32 zeroext %evl) {
453 ; CHECK-LABEL: vfmul_vf_v2f32_unmasked:
455 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
456 ; CHECK-NEXT: vfmul.vf v8, v8, fa0
458 %elt.head = insertelement <2 x float> poison, float %b, i32 0
459 %vb = shufflevector <2 x float> %elt.head, <2 x float> poison, <2 x i32> zeroinitializer
460 %v = call <2 x float> @llvm.vp.fmul.v2f32(<2 x float> %va, <2 x float> %vb, <2 x i1> splat (i1 true), i32 %evl)
464 declare <4 x float> @llvm.vp.fmul.v4f32(<4 x float>, <4 x float>, <4 x i1>, i32)
466 define <4 x float> @vfmul_vv_v4f32(<4 x float> %va, <4 x float> %b, <4 x i1> %m, i32 zeroext %evl) {
467 ; CHECK-LABEL: vfmul_vv_v4f32:
469 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
470 ; CHECK-NEXT: vfmul.vv v8, v8, v9, v0.t
472 %v = call <4 x float> @llvm.vp.fmul.v4f32(<4 x float> %va, <4 x float> %b, <4 x i1> %m, i32 %evl)
476 define <4 x float> @vfmul_vv_v4f32_unmasked(<4 x float> %va, <4 x float> %b, i32 zeroext %evl) {
477 ; CHECK-LABEL: vfmul_vv_v4f32_unmasked:
479 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
480 ; CHECK-NEXT: vfmul.vv v8, v8, v9
482 %v = call <4 x float> @llvm.vp.fmul.v4f32(<4 x float> %va, <4 x float> %b, <4 x i1> splat (i1 true), i32 %evl)
486 define <4 x float> @vfmul_vf_v4f32(<4 x float> %va, float %b, <4 x i1> %m, i32 zeroext %evl) {
487 ; CHECK-LABEL: vfmul_vf_v4f32:
489 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
490 ; CHECK-NEXT: vfmul.vf v8, v8, fa0, v0.t
492 %elt.head = insertelement <4 x float> poison, float %b, i32 0
493 %vb = shufflevector <4 x float> %elt.head, <4 x float> poison, <4 x i32> zeroinitializer
494 %v = call <4 x float> @llvm.vp.fmul.v4f32(<4 x float> %va, <4 x float> %vb, <4 x i1> %m, i32 %evl)
498 define <4 x float> @vfmul_vf_v4f32_unmasked(<4 x float> %va, float %b, i32 zeroext %evl) {
499 ; CHECK-LABEL: vfmul_vf_v4f32_unmasked:
501 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
502 ; CHECK-NEXT: vfmul.vf v8, v8, fa0
504 %elt.head = insertelement <4 x float> poison, float %b, i32 0
505 %vb = shufflevector <4 x float> %elt.head, <4 x float> poison, <4 x i32> zeroinitializer
506 %v = call <4 x float> @llvm.vp.fmul.v4f32(<4 x float> %va, <4 x float> %vb, <4 x i1> splat (i1 true), i32 %evl)
510 declare <8 x float> @llvm.vp.fmul.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32)
512 define <8 x float> @vfmul_vv_v8f32(<8 x float> %va, <8 x float> %b, <8 x i1> %m, i32 zeroext %evl) {
513 ; CHECK-LABEL: vfmul_vv_v8f32:
515 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
516 ; CHECK-NEXT: vfmul.vv v8, v8, v10, v0.t
518 %v = call <8 x float> @llvm.vp.fmul.v8f32(<8 x float> %va, <8 x float> %b, <8 x i1> %m, i32 %evl)
522 define <8 x float> @vfmul_vv_v8f32_unmasked(<8 x float> %va, <8 x float> %b, i32 zeroext %evl) {
523 ; CHECK-LABEL: vfmul_vv_v8f32_unmasked:
525 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
526 ; CHECK-NEXT: vfmul.vv v8, v8, v10
528 %v = call <8 x float> @llvm.vp.fmul.v8f32(<8 x float> %va, <8 x float> %b, <8 x i1> splat (i1 true), i32 %evl)
532 define <8 x float> @vfmul_vf_v8f32(<8 x float> %va, float %b, <8 x i1> %m, i32 zeroext %evl) {
533 ; CHECK-LABEL: vfmul_vf_v8f32:
535 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
536 ; CHECK-NEXT: vfmul.vf v8, v8, fa0, v0.t
538 %elt.head = insertelement <8 x float> poison, float %b, i32 0
539 %vb = shufflevector <8 x float> %elt.head, <8 x float> poison, <8 x i32> zeroinitializer
540 %v = call <8 x float> @llvm.vp.fmul.v8f32(<8 x float> %va, <8 x float> %vb, <8 x i1> %m, i32 %evl)
544 define <8 x float> @vfmul_vf_v8f32_unmasked(<8 x float> %va, float %b, i32 zeroext %evl) {
545 ; CHECK-LABEL: vfmul_vf_v8f32_unmasked:
547 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
548 ; CHECK-NEXT: vfmul.vf v8, v8, fa0
550 %elt.head = insertelement <8 x float> poison, float %b, i32 0
551 %vb = shufflevector <8 x float> %elt.head, <8 x float> poison, <8 x i32> zeroinitializer
552 %v = call <8 x float> @llvm.vp.fmul.v8f32(<8 x float> %va, <8 x float> %vb, <8 x i1> splat (i1 true), i32 %evl)
556 declare <16 x float> @llvm.vp.fmul.v16f32(<16 x float>, <16 x float>, <16 x i1>, i32)
558 define <16 x float> @vfmul_vv_v16f32(<16 x float> %va, <16 x float> %b, <16 x i1> %m, i32 zeroext %evl) {
559 ; CHECK-LABEL: vfmul_vv_v16f32:
561 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
562 ; CHECK-NEXT: vfmul.vv v8, v8, v12, v0.t
564 %v = call <16 x float> @llvm.vp.fmul.v16f32(<16 x float> %va, <16 x float> %b, <16 x i1> %m, i32 %evl)
568 define <16 x float> @vfmul_vv_v16f32_unmasked(<16 x float> %va, <16 x float> %b, i32 zeroext %evl) {
569 ; CHECK-LABEL: vfmul_vv_v16f32_unmasked:
571 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
572 ; CHECK-NEXT: vfmul.vv v8, v8, v12
574 %v = call <16 x float> @llvm.vp.fmul.v16f32(<16 x float> %va, <16 x float> %b, <16 x i1> splat (i1 true), i32 %evl)
578 define <16 x float> @vfmul_vf_v16f32(<16 x float> %va, float %b, <16 x i1> %m, i32 zeroext %evl) {
579 ; CHECK-LABEL: vfmul_vf_v16f32:
581 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
582 ; CHECK-NEXT: vfmul.vf v8, v8, fa0, v0.t
584 %elt.head = insertelement <16 x float> poison, float %b, i32 0
585 %vb = shufflevector <16 x float> %elt.head, <16 x float> poison, <16 x i32> zeroinitializer
586 %v = call <16 x float> @llvm.vp.fmul.v16f32(<16 x float> %va, <16 x float> %vb, <16 x i1> %m, i32 %evl)
590 define <16 x float> @vfmul_vf_v16f32_unmasked(<16 x float> %va, float %b, i32 zeroext %evl) {
591 ; CHECK-LABEL: vfmul_vf_v16f32_unmasked:
593 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
594 ; CHECK-NEXT: vfmul.vf v8, v8, fa0
596 %elt.head = insertelement <16 x float> poison, float %b, i32 0
597 %vb = shufflevector <16 x float> %elt.head, <16 x float> poison, <16 x i32> zeroinitializer
598 %v = call <16 x float> @llvm.vp.fmul.v16f32(<16 x float> %va, <16 x float> %vb, <16 x i1> splat (i1 true), i32 %evl)
602 declare <2 x double> @llvm.vp.fmul.v2f64(<2 x double>, <2 x double>, <2 x i1>, i32)
604 define <2 x double> @vfmul_vv_v2f64(<2 x double> %va, <2 x double> %b, <2 x i1> %m, i32 zeroext %evl) {
605 ; CHECK-LABEL: vfmul_vv_v2f64:
607 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
608 ; CHECK-NEXT: vfmul.vv v8, v8, v9, v0.t
610 %v = call <2 x double> @llvm.vp.fmul.v2f64(<2 x double> %va, <2 x double> %b, <2 x i1> %m, i32 %evl)
614 define <2 x double> @vfmul_vv_v2f64_unmasked(<2 x double> %va, <2 x double> %b, i32 zeroext %evl) {
615 ; CHECK-LABEL: vfmul_vv_v2f64_unmasked:
617 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
618 ; CHECK-NEXT: vfmul.vv v8, v8, v9
620 %v = call <2 x double> @llvm.vp.fmul.v2f64(<2 x double> %va, <2 x double> %b, <2 x i1> splat (i1 true), i32 %evl)
624 define <2 x double> @vfmul_vf_v2f64(<2 x double> %va, double %b, <2 x i1> %m, i32 zeroext %evl) {
625 ; CHECK-LABEL: vfmul_vf_v2f64:
627 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
628 ; CHECK-NEXT: vfmul.vf v8, v8, fa0, v0.t
630 %elt.head = insertelement <2 x double> poison, double %b, i32 0
631 %vb = shufflevector <2 x double> %elt.head, <2 x double> poison, <2 x i32> zeroinitializer
632 %v = call <2 x double> @llvm.vp.fmul.v2f64(<2 x double> %va, <2 x double> %vb, <2 x i1> %m, i32 %evl)
636 define <2 x double> @vfmul_vf_v2f64_unmasked(<2 x double> %va, double %b, i32 zeroext %evl) {
637 ; CHECK-LABEL: vfmul_vf_v2f64_unmasked:
639 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
640 ; CHECK-NEXT: vfmul.vf v8, v8, fa0
642 %elt.head = insertelement <2 x double> poison, double %b, i32 0
643 %vb = shufflevector <2 x double> %elt.head, <2 x double> poison, <2 x i32> zeroinitializer
644 %v = call <2 x double> @llvm.vp.fmul.v2f64(<2 x double> %va, <2 x double> %vb, <2 x i1> splat (i1 true), i32 %evl)
648 declare <4 x double> @llvm.vp.fmul.v4f64(<4 x double>, <4 x double>, <4 x i1>, i32)
650 define <4 x double> @vfmul_vv_v4f64(<4 x double> %va, <4 x double> %b, <4 x i1> %m, i32 zeroext %evl) {
651 ; CHECK-LABEL: vfmul_vv_v4f64:
653 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
654 ; CHECK-NEXT: vfmul.vv v8, v8, v10, v0.t
656 %v = call <4 x double> @llvm.vp.fmul.v4f64(<4 x double> %va, <4 x double> %b, <4 x i1> %m, i32 %evl)
660 define <4 x double> @vfmul_vv_v4f64_unmasked(<4 x double> %va, <4 x double> %b, i32 zeroext %evl) {
661 ; CHECK-LABEL: vfmul_vv_v4f64_unmasked:
663 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
664 ; CHECK-NEXT: vfmul.vv v8, v8, v10
666 %v = call <4 x double> @llvm.vp.fmul.v4f64(<4 x double> %va, <4 x double> %b, <4 x i1> splat (i1 true), i32 %evl)
670 define <4 x double> @vfmul_vf_v4f64(<4 x double> %va, double %b, <4 x i1> %m, i32 zeroext %evl) {
671 ; CHECK-LABEL: vfmul_vf_v4f64:
673 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
674 ; CHECK-NEXT: vfmul.vf v8, v8, fa0, v0.t
676 %elt.head = insertelement <4 x double> poison, double %b, i32 0
677 %vb = shufflevector <4 x double> %elt.head, <4 x double> poison, <4 x i32> zeroinitializer
678 %v = call <4 x double> @llvm.vp.fmul.v4f64(<4 x double> %va, <4 x double> %vb, <4 x i1> %m, i32 %evl)
682 define <4 x double> @vfmul_vf_v4f64_unmasked(<4 x double> %va, double %b, i32 zeroext %evl) {
683 ; CHECK-LABEL: vfmul_vf_v4f64_unmasked:
685 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
686 ; CHECK-NEXT: vfmul.vf v8, v8, fa0
688 %elt.head = insertelement <4 x double> poison, double %b, i32 0
689 %vb = shufflevector <4 x double> %elt.head, <4 x double> poison, <4 x i32> zeroinitializer
690 %v = call <4 x double> @llvm.vp.fmul.v4f64(<4 x double> %va, <4 x double> %vb, <4 x i1> splat (i1 true), i32 %evl)
694 declare <8 x double> @llvm.vp.fmul.v8f64(<8 x double>, <8 x double>, <8 x i1>, i32)
696 define <8 x double> @vfmul_vv_v8f64(<8 x double> %va, <8 x double> %b, <8 x i1> %m, i32 zeroext %evl) {
697 ; CHECK-LABEL: vfmul_vv_v8f64:
699 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma
700 ; CHECK-NEXT: vfmul.vv v8, v8, v12, v0.t
702 %v = call <8 x double> @llvm.vp.fmul.v8f64(<8 x double> %va, <8 x double> %b, <8 x i1> %m, i32 %evl)
706 define <8 x double> @vfmul_vv_v8f64_unmasked(<8 x double> %va, <8 x double> %b, i32 zeroext %evl) {
707 ; CHECK-LABEL: vfmul_vv_v8f64_unmasked:
709 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma
710 ; CHECK-NEXT: vfmul.vv v8, v8, v12
712 %v = call <8 x double> @llvm.vp.fmul.v8f64(<8 x double> %va, <8 x double> %b, <8 x i1> splat (i1 true), i32 %evl)
716 define <8 x double> @vfmul_vf_v8f64(<8 x double> %va, double %b, <8 x i1> %m, i32 zeroext %evl) {
717 ; CHECK-LABEL: vfmul_vf_v8f64:
719 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma
720 ; CHECK-NEXT: vfmul.vf v8, v8, fa0, v0.t
722 %elt.head = insertelement <8 x double> poison, double %b, i32 0
723 %vb = shufflevector <8 x double> %elt.head, <8 x double> poison, <8 x i32> zeroinitializer
724 %v = call <8 x double> @llvm.vp.fmul.v8f64(<8 x double> %va, <8 x double> %vb, <8 x i1> %m, i32 %evl)
728 define <8 x double> @vfmul_vf_v8f64_unmasked(<8 x double> %va, double %b, i32 zeroext %evl) {
729 ; CHECK-LABEL: vfmul_vf_v8f64_unmasked:
731 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma
732 ; CHECK-NEXT: vfmul.vf v8, v8, fa0
734 %elt.head = insertelement <8 x double> poison, double %b, i32 0
735 %vb = shufflevector <8 x double> %elt.head, <8 x double> poison, <8 x i32> zeroinitializer
736 %v = call <8 x double> @llvm.vp.fmul.v8f64(<8 x double> %va, <8 x double> %vb, <8 x i1> splat (i1 true), i32 %evl)
740 declare <16 x double> @llvm.vp.fmul.v16f64(<16 x double>, <16 x double>, <16 x i1>, i32)
742 define <16 x double> @vfmul_vv_v16f64(<16 x double> %va, <16 x double> %b, <16 x i1> %m, i32 zeroext %evl) {
743 ; CHECK-LABEL: vfmul_vv_v16f64:
745 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
746 ; CHECK-NEXT: vfmul.vv v8, v8, v16, v0.t
748 %v = call <16 x double> @llvm.vp.fmul.v16f64(<16 x double> %va, <16 x double> %b, <16 x i1> %m, i32 %evl)
752 define <16 x double> @vfmul_vv_v16f64_unmasked(<16 x double> %va, <16 x double> %b, i32 zeroext %evl) {
753 ; CHECK-LABEL: vfmul_vv_v16f64_unmasked:
755 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
756 ; CHECK-NEXT: vfmul.vv v8, v8, v16
758 %v = call <16 x double> @llvm.vp.fmul.v16f64(<16 x double> %va, <16 x double> %b, <16 x i1> splat (i1 true), i32 %evl)
762 define <16 x double> @vfmul_vf_v16f64(<16 x double> %va, double %b, <16 x i1> %m, i32 zeroext %evl) {
763 ; CHECK-LABEL: vfmul_vf_v16f64:
765 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
766 ; CHECK-NEXT: vfmul.vf v8, v8, fa0, v0.t
768 %elt.head = insertelement <16 x double> poison, double %b, i32 0
769 %vb = shufflevector <16 x double> %elt.head, <16 x double> poison, <16 x i32> zeroinitializer
770 %v = call <16 x double> @llvm.vp.fmul.v16f64(<16 x double> %va, <16 x double> %vb, <16 x i1> %m, i32 %evl)
774 define <16 x double> @vfmul_vf_v16f64_unmasked(<16 x double> %va, double %b, i32 zeroext %evl) {
775 ; CHECK-LABEL: vfmul_vf_v16f64_unmasked:
777 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
778 ; CHECK-NEXT: vfmul.vf v8, v8, fa0
780 %elt.head = insertelement <16 x double> poison, double %b, i32 0
781 %vb = shufflevector <16 x double> %elt.head, <16 x double> poison, <16 x i32> zeroinitializer
782 %v = call <16 x double> @llvm.vp.fmul.v16f64(<16 x double> %va, <16 x double> %vb, <16 x i1> splat (i1 true), i32 %evl)