1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2 ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+v,+zvbb -riscv-enable-vl-optimizer=false -verify-machineinstrs | FileCheck %s --check-prefixes=NOVLOPT
3 ; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+v,+zvbb -riscv-enable-vl-optimizer=false -verify-machineinstrs | FileCheck %s --check-prefixes=NOVLOPT
4 ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+v,+zvbb -riscv-enable-vl-optimizer -verify-machineinstrs | FileCheck %s --check-prefixes=VLOPT
5 ; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+v,+zvbb -riscv-enable-vl-optimizer -verify-machineinstrs | FileCheck %s --check-prefixes=VLOPT
7 ; The purpose of this file is to check the behavior of specific instructions as it relates to the VL optimizer
9 define <vscale x 4 x i32> @vadd_vi(<vscale x 4 x i32> %a, iXLen %vl) {
10 ; NOVLOPT-LABEL: vadd_vi:
12 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
13 ; NOVLOPT-NEXT: vadd.vi v10, v8, 5
14 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
15 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
18 ; VLOPT-LABEL: vadd_vi:
20 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
21 ; VLOPT-NEXT: vadd.vi v10, v8, 5
22 ; VLOPT-NEXT: vadd.vv v8, v10, v8
24 %1 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 5, iXLen -1)
25 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
26 ret <vscale x 4 x i32> %2
29 define <vscale x 4 x i32> @vadd_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
30 ; NOVLOPT-LABEL: vadd_vv:
32 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
33 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
34 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
35 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
38 ; VLOPT-LABEL: vadd_vv:
40 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
41 ; VLOPT-NEXT: vadd.vv v8, v8, v10
42 ; VLOPT-NEXT: vadd.vv v8, v8, v10
44 %1 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
45 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
46 ret <vscale x 4 x i32> %2
49 define <vscale x 4 x i32> @vadd_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
50 ; NOVLOPT-LABEL: vadd_vx:
52 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
53 ; NOVLOPT-NEXT: vadd.vx v10, v8, a0
54 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
55 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
58 ; VLOPT-LABEL: vadd_vx:
60 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
61 ; VLOPT-NEXT: vadd.vx v10, v8, a0
62 ; VLOPT-NEXT: vadd.vv v8, v10, v8
64 %1 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
65 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
66 ret <vscale x 4 x i32> %2
69 define <vscale x 4 x i32> @vsub_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
70 ; NOVLOPT-LABEL: vsub_vv:
72 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
73 ; NOVLOPT-NEXT: vsub.vv v8, v8, v10
74 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
75 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
78 ; VLOPT-LABEL: vsub_vv:
80 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
81 ; VLOPT-NEXT: vsub.vv v8, v8, v10
82 ; VLOPT-NEXT: vadd.vv v8, v8, v10
84 %1 = call <vscale x 4 x i32> @llvm.riscv.vsub.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
85 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
86 ret <vscale x 4 x i32> %2
89 define <vscale x 4 x i32> @vsub_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
90 ; NOVLOPT-LABEL: vsub_vx:
92 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
93 ; NOVLOPT-NEXT: vsub.vx v10, v8, a0
94 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
95 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
98 ; VLOPT-LABEL: vsub_vx:
100 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
101 ; VLOPT-NEXT: vsub.vx v10, v8, a0
102 ; VLOPT-NEXT: vadd.vv v8, v10, v8
104 %1 = call <vscale x 4 x i32> @llvm.riscv.vsub.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
105 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
106 ret <vscale x 4 x i32> %2
109 define <vscale x 4 x i32> @vrsub_vi(<vscale x 4 x i32> %a, iXLen %vl) {
110 ; NOVLOPT-LABEL: vrsub_vi:
112 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
113 ; NOVLOPT-NEXT: vrsub.vi v10, v8, 5
114 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
115 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
118 ; VLOPT-LABEL: vrsub_vi:
120 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
121 ; VLOPT-NEXT: vrsub.vi v10, v8, 5
122 ; VLOPT-NEXT: vadd.vv v8, v10, v8
124 %1 = call <vscale x 4 x i32> @llvm.riscv.vrsub.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 5, iXLen -1)
125 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
126 ret <vscale x 4 x i32> %2
129 define <vscale x 4 x i32> @vrsub_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
130 ; NOVLOPT-LABEL: vrsub_vx:
132 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
133 ; NOVLOPT-NEXT: vrsub.vx v10, v8, a0
134 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
135 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
138 ; VLOPT-LABEL: vrsub_vx:
140 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
141 ; VLOPT-NEXT: vrsub.vx v10, v8, a0
142 ; VLOPT-NEXT: vadd.vv v8, v10, v8
144 %1 = call <vscale x 4 x i32> @llvm.riscv.vrsub.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
145 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
146 ret <vscale x 4 x i32> %2
149 define <vscale x 4 x i32> @vand_vi(<vscale x 4 x i32> %a, iXLen %vl) {
150 ; NOVLOPT-LABEL: vand_vi:
152 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
153 ; NOVLOPT-NEXT: vand.vi v10, v8, 5
154 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
155 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
158 ; VLOPT-LABEL: vand_vi:
160 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
161 ; VLOPT-NEXT: vand.vi v10, v8, 5
162 ; VLOPT-NEXT: vadd.vv v8, v10, v8
164 %1 = call <vscale x 4 x i32> @llvm.riscv.vand.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 5, iXLen -1)
165 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
166 ret <vscale x 4 x i32> %2
169 define <vscale x 4 x i32> @vand_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
170 ; NOVLOPT-LABEL: vand_vv:
172 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
173 ; NOVLOPT-NEXT: vand.vv v8, v8, v10
174 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
175 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
178 ; VLOPT-LABEL: vand_vv:
180 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
181 ; VLOPT-NEXT: vand.vv v8, v8, v10
182 ; VLOPT-NEXT: vadd.vv v8, v8, v10
184 %1 = call <vscale x 4 x i32> @llvm.riscv.vand.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
185 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
186 ret <vscale x 4 x i32> %2
189 define <vscale x 4 x i32> @vand_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
190 ; NOVLOPT-LABEL: vand_vx:
192 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
193 ; NOVLOPT-NEXT: vand.vx v10, v8, a0
194 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
195 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
198 ; VLOPT-LABEL: vand_vx:
200 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
201 ; VLOPT-NEXT: vand.vx v10, v8, a0
202 ; VLOPT-NEXT: vadd.vv v8, v10, v8
204 %1 = call <vscale x 4 x i32> @llvm.riscv.vand.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
205 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
206 ret <vscale x 4 x i32> %2
209 define <vscale x 4 x i32> @vor_vi(<vscale x 4 x i32> %a, iXLen %vl) {
210 ; NOVLOPT-LABEL: vor_vi:
212 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
213 ; NOVLOPT-NEXT: vor.vi v10, v8, 5
214 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
215 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
218 ; VLOPT-LABEL: vor_vi:
220 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
221 ; VLOPT-NEXT: vor.vi v10, v8, 5
222 ; VLOPT-NEXT: vadd.vv v8, v10, v8
224 %1 = call <vscale x 4 x i32> @llvm.riscv.vor.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 5, iXLen -1)
225 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
226 ret <vscale x 4 x i32> %2
229 define <vscale x 4 x i32> @vor_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
230 ; NOVLOPT-LABEL: vor_vv:
232 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
233 ; NOVLOPT-NEXT: vor.vv v8, v8, v10
234 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
235 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
238 ; VLOPT-LABEL: vor_vv:
240 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
241 ; VLOPT-NEXT: vor.vv v8, v8, v10
242 ; VLOPT-NEXT: vadd.vv v8, v8, v10
244 %1 = call <vscale x 4 x i32> @llvm.riscv.vor.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
245 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
246 ret <vscale x 4 x i32> %2
249 define <vscale x 4 x i32> @vor_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
250 ; NOVLOPT-LABEL: vor_vx:
252 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
253 ; NOVLOPT-NEXT: vor.vx v10, v8, a0
254 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
255 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
258 ; VLOPT-LABEL: vor_vx:
260 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
261 ; VLOPT-NEXT: vor.vx v10, v8, a0
262 ; VLOPT-NEXT: vadd.vv v8, v10, v8
264 %1 = call <vscale x 4 x i32> @llvm.riscv.vor.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
265 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
266 ret <vscale x 4 x i32> %2
269 define <vscale x 4 x i32> @vxor_vi(<vscale x 4 x i32> %a, iXLen %vl) {
270 ; NOVLOPT-LABEL: vxor_vi:
272 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
273 ; NOVLOPT-NEXT: vxor.vi v10, v8, 5
274 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
275 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
278 ; VLOPT-LABEL: vxor_vi:
280 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
281 ; VLOPT-NEXT: vxor.vi v10, v8, 5
282 ; VLOPT-NEXT: vadd.vv v8, v10, v8
284 %1 = call <vscale x 4 x i32> @llvm.riscv.vxor.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 5, iXLen -1)
285 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
286 ret <vscale x 4 x i32> %2
289 define <vscale x 4 x i32> @vxor_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
290 ; NOVLOPT-LABEL: vxor_vv:
292 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
293 ; NOVLOPT-NEXT: vxor.vv v8, v8, v10
294 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
295 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
298 ; VLOPT-LABEL: vxor_vv:
300 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
301 ; VLOPT-NEXT: vxor.vv v8, v8, v10
302 ; VLOPT-NEXT: vadd.vv v8, v8, v10
304 %1 = call <vscale x 4 x i32> @llvm.riscv.vxor.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
305 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
306 ret <vscale x 4 x i32> %2
309 define <vscale x 4 x i32> @vxor_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
310 ; NOVLOPT-LABEL: vxor_vx:
312 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
313 ; NOVLOPT-NEXT: vxor.vx v10, v8, a0
314 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
315 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
318 ; VLOPT-LABEL: vxor_vx:
320 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
321 ; VLOPT-NEXT: vxor.vx v10, v8, a0
322 ; VLOPT-NEXT: vadd.vv v8, v10, v8
324 %1 = call <vscale x 4 x i32> @llvm.riscv.vxor.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
325 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
326 ret <vscale x 4 x i32> %2
329 define <vscale x 4 x i32> @vsll_vi(<vscale x 4 x i32> %a, iXLen %vl) {
330 ; NOVLOPT-LABEL: vsll_vi:
332 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
333 ; NOVLOPT-NEXT: vsll.vi v10, v8, 5
334 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
335 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
338 ; VLOPT-LABEL: vsll_vi:
340 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
341 ; VLOPT-NEXT: vsll.vi v10, v8, 5
342 ; VLOPT-NEXT: vadd.vv v8, v10, v8
344 %1 = call <vscale x 4 x i32> @llvm.riscv.vsll.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1)
345 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
346 ret <vscale x 4 x i32> %2
349 define <vscale x 4 x i32> @vsll_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
350 ; NOVLOPT-LABEL: vsll_vv:
352 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
353 ; NOVLOPT-NEXT: vsll.vv v8, v8, v10
354 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
355 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
358 ; VLOPT-LABEL: vsll_vv:
360 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
361 ; VLOPT-NEXT: vsll.vv v8, v8, v10
362 ; VLOPT-NEXT: vadd.vv v8, v8, v10
364 %1 = call <vscale x 4 x i32> @llvm.riscv.vsll.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
365 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
366 ret <vscale x 4 x i32> %2
369 define <vscale x 4 x i32> @vsll_vx(<vscale x 4 x i32> %a, iXLen %b, iXLen %vl) {
370 ; NOVLOPT-LABEL: vsll_vx:
372 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
373 ; NOVLOPT-NEXT: vsll.vx v10, v8, a0
374 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
375 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
378 ; VLOPT-LABEL: vsll_vx:
380 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
381 ; VLOPT-NEXT: vsll.vx v10, v8, a0
382 ; VLOPT-NEXT: vadd.vv v8, v10, v8
384 %1 = call <vscale x 4 x i32> @llvm.riscv.vsll.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen %b, iXLen -1)
385 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
386 ret <vscale x 4 x i32> %2
389 define <vscale x 4 x i64> @vwaddu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
390 ; NOVLOPT-LABEL: vwaddu_vv:
392 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
393 ; NOVLOPT-NEXT: vwaddu.vv v12, v8, v10
394 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
395 ; NOVLOPT-NEXT: vadd.vv v8, v12, v12
398 ; VLOPT-LABEL: vwaddu_vv:
400 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
401 ; VLOPT-NEXT: vwaddu.vv v12, v8, v10
402 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
403 ; VLOPT-NEXT: vadd.vv v8, v12, v12
405 %1 = call <vscale x 4 x i64> @llvm.riscv.vwaddu.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
406 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
407 ret <vscale x 4 x i64> %2
410 define <vscale x 4 x i32> @vsrl_vi(<vscale x 4 x i32> %a, iXLen %vl) {
411 ; NOVLOPT-LABEL: vsrl_vi:
413 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
414 ; NOVLOPT-NEXT: vsrl.vi v10, v8, 5
415 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
416 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
419 ; VLOPT-LABEL: vsrl_vi:
421 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
422 ; VLOPT-NEXT: vsrl.vi v10, v8, 5
423 ; VLOPT-NEXT: vadd.vv v8, v10, v8
425 %1 = call <vscale x 4 x i32> @llvm.riscv.vsrl.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1)
426 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
427 ret <vscale x 4 x i32> %2
430 define <vscale x 4 x i32> @vsrl_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
431 ; NOVLOPT-LABEL: vsrl_vv:
433 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
434 ; NOVLOPT-NEXT: vsrl.vv v8, v8, v10
435 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
436 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
439 ; VLOPT-LABEL: vsrl_vv:
441 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
442 ; VLOPT-NEXT: vsrl.vv v8, v8, v10
443 ; VLOPT-NEXT: vadd.vv v8, v8, v10
445 %1 = call <vscale x 4 x i32> @llvm.riscv.vsrl.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
446 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
447 ret <vscale x 4 x i32> %2
450 define <vscale x 4 x i32> @vsrl_vx(<vscale x 4 x i32> %a, iXLen %b, iXLen %vl) {
451 ; NOVLOPT-LABEL: vsrl_vx:
453 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
454 ; NOVLOPT-NEXT: vsrl.vx v10, v8, a0
455 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
456 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
459 ; VLOPT-LABEL: vsrl_vx:
461 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
462 ; VLOPT-NEXT: vsrl.vx v10, v8, a0
463 ; VLOPT-NEXT: vadd.vv v8, v10, v8
465 %1 = call <vscale x 4 x i32> @llvm.riscv.vsrl.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen %b, iXLen -1)
466 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
467 ret <vscale x 4 x i32> %2
470 define <vscale x 4 x i32> @vsra_vi(<vscale x 4 x i32> %a, iXLen %vl) {
471 ; NOVLOPT-LABEL: vsra_vi:
473 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
474 ; NOVLOPT-NEXT: vsra.vi v10, v8, 5
475 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
476 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
479 ; VLOPT-LABEL: vsra_vi:
481 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
482 ; VLOPT-NEXT: vsra.vi v10, v8, 5
483 ; VLOPT-NEXT: vadd.vv v8, v10, v8
485 %1 = call <vscale x 4 x i32> @llvm.riscv.vsra.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1)
486 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
487 ret <vscale x 4 x i32> %2
490 define <vscale x 4 x i32> @vsra_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
491 ; NOVLOPT-LABEL: vsra_vv:
493 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
494 ; NOVLOPT-NEXT: vsra.vv v8, v8, v10
495 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
496 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
499 ; VLOPT-LABEL: vsra_vv:
501 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
502 ; VLOPT-NEXT: vsra.vv v8, v8, v10
503 ; VLOPT-NEXT: vadd.vv v8, v8, v10
505 %1 = call <vscale x 4 x i32> @llvm.riscv.vsra.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
506 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
507 ret <vscale x 4 x i32> %2
510 define <vscale x 4 x i32> @vsra_vx(<vscale x 4 x i32> %a, iXLen %b, iXLen %vl) {
511 ; NOVLOPT-LABEL: vsra_vx:
513 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
514 ; NOVLOPT-NEXT: vsra.vx v10, v8, a0
515 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
516 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
519 ; VLOPT-LABEL: vsra_vx:
521 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
522 ; VLOPT-NEXT: vsra.vx v10, v8, a0
523 ; VLOPT-NEXT: vadd.vv v8, v10, v8
525 %1 = call <vscale x 4 x i32> @llvm.riscv.vsra.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen %b, iXLen -1)
526 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
527 ret <vscale x 4 x i32> %2
530 define <vscale x 4 x i64> @vwaddu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
531 ; NOVLOPT-LABEL: vwaddu_vx:
533 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
534 ; NOVLOPT-NEXT: vwaddu.vx v12, v8, a0
535 ; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma
536 ; NOVLOPT-NEXT: vadd.vv v8, v12, v12
539 ; VLOPT-LABEL: vwaddu_vx:
541 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
542 ; VLOPT-NEXT: vwaddu.vx v12, v8, a0
543 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
544 ; VLOPT-NEXT: vadd.vv v8, v12, v12
546 %1 = call <vscale x 4 x i64> @llvm.riscv.vwaddu.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
547 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
548 ret <vscale x 4 x i64> %2
551 define <vscale x 4 x i64> @vwsubu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
552 ; NOVLOPT-LABEL: vwsubu_vv:
554 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
555 ; NOVLOPT-NEXT: vwsubu.vv v12, v8, v10
556 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
557 ; NOVLOPT-NEXT: vadd.vv v8, v12, v12
560 ; VLOPT-LABEL: vwsubu_vv:
562 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
563 ; VLOPT-NEXT: vwsubu.vv v12, v8, v10
564 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
565 ; VLOPT-NEXT: vadd.vv v8, v12, v12
567 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsubu.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
568 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
569 ret <vscale x 4 x i64> %2
572 define <vscale x 4 x i64> @vwsubu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
573 ; NOVLOPT-LABEL: vwsubu_vx:
575 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
576 ; NOVLOPT-NEXT: vwsubu.vx v12, v8, a0
577 ; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma
578 ; NOVLOPT-NEXT: vadd.vv v8, v12, v12
581 ; VLOPT-LABEL: vwsubu_vx:
583 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
584 ; VLOPT-NEXT: vwsubu.vx v12, v8, a0
585 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
586 ; VLOPT-NEXT: vadd.vv v8, v12, v12
588 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsubu.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
589 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
590 ret <vscale x 4 x i64> %2
593 define <vscale x 4 x i64> @vwadd_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
594 ; NOVLOPT-LABEL: vwadd_vv:
596 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
597 ; NOVLOPT-NEXT: vwadd.vv v12, v8, v10
598 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
599 ; NOVLOPT-NEXT: vadd.vv v8, v12, v12
602 ; VLOPT-LABEL: vwadd_vv:
604 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
605 ; VLOPT-NEXT: vwadd.vv v12, v8, v10
606 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
607 ; VLOPT-NEXT: vadd.vv v8, v12, v12
609 %1 = call <vscale x 4 x i64> @llvm.riscv.vwadd.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
610 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
611 ret <vscale x 4 x i64> %2
614 define <vscale x 4 x i64> @vwadd_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
615 ; NOVLOPT-LABEL: vwadd_vx:
617 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
618 ; NOVLOPT-NEXT: vwadd.vx v12, v8, a0
619 ; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma
620 ; NOVLOPT-NEXT: vadd.vv v8, v12, v12
623 ; VLOPT-LABEL: vwadd_vx:
625 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
626 ; VLOPT-NEXT: vwadd.vx v12, v8, a0
627 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
628 ; VLOPT-NEXT: vadd.vv v8, v12, v12
630 %1 = call <vscale x 4 x i64> @llvm.riscv.vwadd.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
631 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
632 ret <vscale x 4 x i64> %2
635 define <vscale x 4 x i64> @vwsub_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
636 ; NOVLOPT-LABEL: vwsub_vv:
638 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
639 ; NOVLOPT-NEXT: vwsub.vv v12, v8, v10
640 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
641 ; NOVLOPT-NEXT: vadd.vv v8, v12, v12
644 ; VLOPT-LABEL: vwsub_vv:
646 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
647 ; VLOPT-NEXT: vwsub.vv v12, v8, v10
648 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
649 ; VLOPT-NEXT: vadd.vv v8, v12, v12
651 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsub.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
652 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
653 ret <vscale x 4 x i64> %2
656 define <vscale x 4 x i64> @vwsub_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
657 ; NOVLOPT-LABEL: vwsub_vx:
659 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
660 ; NOVLOPT-NEXT: vwsub.vx v12, v8, a0
661 ; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma
662 ; NOVLOPT-NEXT: vadd.vv v8, v12, v12
665 ; VLOPT-LABEL: vwsub_vx:
667 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
668 ; VLOPT-NEXT: vwsub.vx v12, v8, a0
669 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
670 ; VLOPT-NEXT: vadd.vv v8, v12, v12
672 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsub.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
673 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
674 ret <vscale x 4 x i64> %2
677 define <vscale x 4 x i64> @vwaddu_wv(<vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen %vl) {
678 ; NOVLOPT-LABEL: vwaddu_wv:
680 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
681 ; NOVLOPT-NEXT: vwaddu.wv v8, v8, v12
682 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
683 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
686 ; VLOPT-LABEL: vwaddu_wv:
688 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
689 ; VLOPT-NEXT: vwaddu.wv v8, v8, v12
690 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
691 ; VLOPT-NEXT: vadd.vv v8, v8, v8
693 %1 = call <vscale x 4 x i64> @llvm.riscv.vwaddu.w.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen -1)
694 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
695 ret <vscale x 4 x i64> %2
698 define <vscale x 4 x i64> @vwaddu_wx(<vscale x 4 x i64> %a, i32 %b, iXLen %vl) {
699 ; NOVLOPT-LABEL: vwaddu_wx:
701 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
702 ; NOVLOPT-NEXT: vwaddu.wx v8, v8, a0
703 ; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma
704 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
707 ; VLOPT-LABEL: vwaddu_wx:
709 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
710 ; VLOPT-NEXT: vwaddu.wx v8, v8, a0
711 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
712 ; VLOPT-NEXT: vadd.vv v8, v8, v8
714 %1 = call <vscale x 4 x i64> @llvm.riscv.vwaddu.w.xv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, i32 %b, iXLen -1)
715 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
716 ret <vscale x 4 x i64> %2
719 define <vscale x 4 x i64> @vwsubu_wv(<vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen %vl) {
720 ; NOVLOPT-LABEL: vwsubu_wv:
722 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
723 ; NOVLOPT-NEXT: vwsubu.wv v8, v8, v12
724 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
725 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
728 ; VLOPT-LABEL: vwsubu_wv:
730 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
731 ; VLOPT-NEXT: vwsubu.wv v8, v8, v12
732 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
733 ; VLOPT-NEXT: vadd.vv v8, v8, v8
735 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsubu.w.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen -1)
736 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
737 ret <vscale x 4 x i64> %2
740 define <vscale x 4 x i64> @vwsubu_wx(<vscale x 4 x i64> %a, i32 %b, iXLen %vl) {
741 ; NOVLOPT-LABEL: vwsubu_wx:
743 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
744 ; NOVLOPT-NEXT: vwsubu.wx v8, v8, a0
745 ; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma
746 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
749 ; VLOPT-LABEL: vwsubu_wx:
751 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
752 ; VLOPT-NEXT: vwsubu.wx v8, v8, a0
753 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
754 ; VLOPT-NEXT: vadd.vv v8, v8, v8
756 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsubu.w.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, i32 %b, iXLen -1)
757 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
758 ret <vscale x 4 x i64> %2
761 define <vscale x 4 x i64> @vwadd_wv(<vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen %vl) {
762 ; NOVLOPT-LABEL: vwadd_wv:
764 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
765 ; NOVLOPT-NEXT: vwadd.wv v8, v8, v12
766 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
767 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
770 ; VLOPT-LABEL: vwadd_wv:
772 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
773 ; VLOPT-NEXT: vwadd.wv v8, v8, v12
774 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
775 ; VLOPT-NEXT: vadd.vv v8, v8, v8
777 %1 = call <vscale x 4 x i64> @llvm.riscv.vwadd.w.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen -1)
778 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
779 ret <vscale x 4 x i64> %2
782 define <vscale x 4 x i64> @vwadd_wx(<vscale x 4 x i64> %a, i32 %b, iXLen %vl) {
783 ; NOVLOPT-LABEL: vwadd_wx:
785 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
786 ; NOVLOPT-NEXT: vwadd.wx v8, v8, a0
787 ; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma
788 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
791 ; VLOPT-LABEL: vwadd_wx:
793 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
794 ; VLOPT-NEXT: vwadd.wx v8, v8, a0
795 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
796 ; VLOPT-NEXT: vadd.vv v8, v8, v8
798 %1 = call <vscale x 4 x i64> @llvm.riscv.vwadd.w.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, i32 %b, iXLen -1)
799 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
800 ret <vscale x 4 x i64> %2
803 define <vscale x 4 x i64> @vwsub_wv(<vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen %vl) {
804 ; NOVLOPT-LABEL: vwsub_wv:
806 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
807 ; NOVLOPT-NEXT: vwsub.wv v8, v8, v12
808 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
809 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
812 ; VLOPT-LABEL: vwsub_wv:
814 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
815 ; VLOPT-NEXT: vwsub.wv v8, v8, v12
816 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
817 ; VLOPT-NEXT: vadd.vv v8, v8, v8
819 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsub.w.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, <vscale x 4 x i32> %b, iXLen -1)
820 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
821 ret <vscale x 4 x i64> %2
824 define <vscale x 4 x i64> @vwsub_wx(<vscale x 4 x i64> %a, i32 %b, iXLen %vl) {
825 ; NOVLOPT-LABEL: vwsub_wx:
827 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
828 ; NOVLOPT-NEXT: vwsub.wx v8, v8, a0
829 ; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma
830 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
833 ; VLOPT-LABEL: vwsub_wx:
835 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
836 ; VLOPT-NEXT: vwsub.wx v8, v8, a0
837 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
838 ; VLOPT-NEXT: vadd.vv v8, v8, v8
840 %1 = call <vscale x 4 x i64> @llvm.riscv.vwsub.w.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %a, i32 %b, iXLen -1)
841 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
842 ret <vscale x 4 x i64> %2
845 define <vscale x 4 x i32> @vsext_vf2(<vscale x 4 x i16> %a, <vscale x 4 x i32> %b, iXLen %vl) {
846 ; NOVLOPT-LABEL: vsext_vf2:
848 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
849 ; NOVLOPT-NEXT: vsext.vf2 v12, v8
850 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
851 ; NOVLOPT-NEXT: vadd.vv v8, v12, v10
854 ; VLOPT-LABEL: vsext_vf2:
856 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
857 ; VLOPT-NEXT: vsext.vf2 v12, v8
858 ; VLOPT-NEXT: vadd.vv v8, v12, v10
860 %1 = call <vscale x 4 x i32> @llvm.riscv.vsext.nxv4i32.nxv4i16(<vscale x 4 x i32> poison, <vscale x 4 x i16> %a, iXLen -1)
861 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
862 ret <vscale x 4 x i32> %2
865 define <vscale x 4 x i32> @vsext_vf4(<vscale x 4 x i8> %a, <vscale x 4 x i32> %b, iXLen %vl) {
866 ; NOVLOPT-LABEL: vsext_vf4:
868 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
869 ; NOVLOPT-NEXT: vsext.vf4 v12, v8
870 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
871 ; NOVLOPT-NEXT: vadd.vv v8, v12, v10
874 ; VLOPT-LABEL: vsext_vf4:
876 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
877 ; VLOPT-NEXT: vsext.vf4 v12, v8
878 ; VLOPT-NEXT: vadd.vv v8, v12, v10
880 %1 = call <vscale x 4 x i32> @llvm.riscv.vsext.nxv4i32.nxv4i8(<vscale x 4 x i32> poison, <vscale x 4 x i8> %a, iXLen -1)
881 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
882 ret <vscale x 4 x i32> %2
885 define <vscale x 4 x i64> @vsext_vf8(<vscale x 4 x i8> %a, <vscale x 4 x i64> %b, iXLen %vl) {
886 ; NOVLOPT-LABEL: vsext_vf8:
888 ; NOVLOPT-NEXT: vsetvli a1, zero, e64, m4, ta, ma
889 ; NOVLOPT-NEXT: vsext.vf8 v16, v8
890 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
891 ; NOVLOPT-NEXT: vadd.vv v8, v16, v12
894 ; VLOPT-LABEL: vsext_vf8:
896 ; VLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
897 ; VLOPT-NEXT: vsext.vf8 v16, v8
898 ; VLOPT-NEXT: vadd.vv v8, v16, v12
900 %1 = call <vscale x 4 x i64> @llvm.riscv.vsext.nxv4i32.nxv4i8(<vscale x 4 x i64> poison, <vscale x 4 x i8> %a, iXLen -1)
901 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %b, iXLen %vl)
902 ret <vscale x 4 x i64> %2
905 define <vscale x 4 x i32> @vzext_vf2(<vscale x 4 x i16> %a, <vscale x 4 x i32> %b, iXLen %vl) {
906 ; NOVLOPT-LABEL: vzext_vf2:
908 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
909 ; NOVLOPT-NEXT: vzext.vf2 v12, v8
910 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
911 ; NOVLOPT-NEXT: vadd.vv v8, v12, v10
914 ; VLOPT-LABEL: vzext_vf2:
916 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
917 ; VLOPT-NEXT: vzext.vf2 v12, v8
918 ; VLOPT-NEXT: vadd.vv v8, v12, v10
920 %1 = call <vscale x 4 x i32> @llvm.riscv.vzext.nxv4i32.nxv4i16(<vscale x 4 x i32> poison, <vscale x 4 x i16> %a, iXLen -1)
921 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
922 ret <vscale x 4 x i32> %2
925 define <vscale x 4 x i32> @vzext_vf4(<vscale x 4 x i8> %a, <vscale x 4 x i32> %b, iXLen %vl) {
926 ; NOVLOPT-LABEL: vzext_vf4:
928 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
929 ; NOVLOPT-NEXT: vzext.vf4 v12, v8
930 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
931 ; NOVLOPT-NEXT: vadd.vv v8, v12, v10
934 ; VLOPT-LABEL: vzext_vf4:
936 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
937 ; VLOPT-NEXT: vzext.vf4 v12, v8
938 ; VLOPT-NEXT: vadd.vv v8, v12, v10
940 %1 = call <vscale x 4 x i32> @llvm.riscv.vzext.nxv4i32.nxv4i8(<vscale x 4 x i32> poison, <vscale x 4 x i8> %a, iXLen -1)
941 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
942 ret <vscale x 4 x i32> %2
945 define <vscale x 4 x i64> @vzext_vf8(<vscale x 4 x i8> %a, <vscale x 4 x i64> %b, iXLen %vl) {
946 ; NOVLOPT-LABEL: vzext_vf8:
948 ; NOVLOPT-NEXT: vsetvli a1, zero, e64, m4, ta, ma
949 ; NOVLOPT-NEXT: vzext.vf8 v16, v8
950 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
951 ; NOVLOPT-NEXT: vadd.vv v8, v16, v12
954 ; VLOPT-LABEL: vzext_vf8:
956 ; VLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
957 ; VLOPT-NEXT: vzext.vf8 v16, v8
958 ; VLOPT-NEXT: vadd.vv v8, v16, v12
960 %1 = call <vscale x 4 x i64> @llvm.riscv.vzext.nxv4i32.nxv4i8(<vscale x 4 x i64> poison, <vscale x 4 x i8> %a, iXLen -1)
961 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %b, iXLen %vl)
962 ret <vscale x 4 x i64> %2
965 define <vscale x 4 x i1> @vmadc_vi(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, iXLen %vl) {
966 ; NOVLOPT-LABEL: vmadc_vi:
968 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
969 ; NOVLOPT-NEXT: vmadc.vi v10, v8, 5
970 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
971 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
974 ; VLOPT-LABEL: vmadc_vi:
976 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
977 ; VLOPT-NEXT: vmadc.vi v10, v8, 5
978 ; VLOPT-NEXT: vmand.mm v0, v10, v0
980 %1 = call <vscale x 4 x i1> @llvm.riscv.vmadc.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, iXLen -1)
981 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
982 ret <vscale x 4 x i1> %2
985 define <vscale x 4 x i1> @vmadc_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) {
986 ; NOVLOPT-LABEL: vmadc_vx:
988 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
989 ; NOVLOPT-NEXT: vmadc.vx v10, v8, a0
990 ; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
991 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
994 ; VLOPT-LABEL: vmadc_vx:
996 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
997 ; VLOPT-NEXT: vmadc.vx v10, v8, a0
998 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1000 %1 = call <vscale x 4 x i1> @llvm.riscv.vmadc.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1)
1001 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1002 ret <vscale x 4 x i1> %2
1005 define <vscale x 4 x i1> @vmadc_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) {
1006 ; NOVLOPT-LABEL: vmadc_vv:
1008 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1009 ; NOVLOPT-NEXT: vmadc.vv v12, v8, v10
1010 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
1011 ; NOVLOPT-NEXT: vmand.mm v0, v12, v0
1014 ; VLOPT-LABEL: vmadc_vv:
1016 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1017 ; VLOPT-NEXT: vmadc.vv v12, v8, v10
1018 ; VLOPT-NEXT: vmand.mm v0, v12, v0
1020 %1 = call <vscale x 4 x i1> @llvm.riscv.vmadc.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1)
1021 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1022 ret <vscale x 4 x i1> %2
1025 define <vscale x 4 x i1> @vmsbc_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) {
1026 ; NOVLOPT-LABEL: vmsbc_vx:
1028 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1029 ; NOVLOPT-NEXT: vmsbc.vx v10, v8, a0
1030 ; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
1031 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1034 ; VLOPT-LABEL: vmsbc_vx:
1036 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1037 ; VLOPT-NEXT: vmsbc.vx v10, v8, a0
1038 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1040 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsbc.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1)
1041 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1042 ret <vscale x 4 x i1> %2
1045 define <vscale x 4 x i1> @vmsbc_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) {
1046 ; NOVLOPT-LABEL: vmsbc_vv:
1048 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1049 ; NOVLOPT-NEXT: vmsbc.vv v12, v8, v10
1050 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
1051 ; NOVLOPT-NEXT: vmand.mm v0, v12, v0
1054 ; VLOPT-LABEL: vmsbc_vv:
1056 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1057 ; VLOPT-NEXT: vmsbc.vv v12, v8, v10
1058 ; VLOPT-NEXT: vmand.mm v0, v12, v0
1060 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsbc.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1)
1061 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1062 ret <vscale x 4 x i1> %2
1065 define <vscale x 4 x i16> @vnsrl_wi(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, iXLen %vl) {
1066 ; NOVLOPT-LABEL: vnsrl_wi:
1068 ; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma
1069 ; NOVLOPT-NEXT: vnsrl.wi v11, v8, 5
1070 ; NOVLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1071 ; NOVLOPT-NEXT: vadd.vv v8, v11, v10
1074 ; VLOPT-LABEL: vnsrl_wi:
1076 ; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1077 ; VLOPT-NEXT: vnsrl.wi v11, v8, 5
1078 ; VLOPT-NEXT: vadd.vv v8, v11, v10
1080 %1 = call <vscale x 4 x i16> @llvm.riscv.vnsrl.nxv4i16.nxv4i32(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1)
1081 %2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl)
1082 ret <vscale x 4 x i16> %2
1085 define <vscale x 4 x i16> @vnsrl_wx(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, iXLen %c, iXLen %vl) {
1086 ; NOVLOPT-LABEL: vnsrl_wx:
1088 ; NOVLOPT-NEXT: vsetvli a2, zero, e16, m1, ta, ma
1089 ; NOVLOPT-NEXT: vnsrl.wx v11, v8, a0
1090 ; NOVLOPT-NEXT: vsetvli zero, a1, e16, m1, ta, ma
1091 ; NOVLOPT-NEXT: vadd.vv v8, v11, v10
1094 ; VLOPT-LABEL: vnsrl_wx:
1096 ; VLOPT-NEXT: vsetvli zero, a1, e16, m1, ta, ma
1097 ; VLOPT-NEXT: vnsrl.wx v11, v8, a0
1098 ; VLOPT-NEXT: vadd.vv v8, v11, v10
1100 %1 = call <vscale x 4 x i16> @llvm.riscv.vnsrl.nxv4i16.nxv4i32(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, iXLen %c, iXLen -1)
1101 %2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl)
1102 ret <vscale x 4 x i16> %2
1105 define <vscale x 4 x i16> @vnsrl_wv(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, iXLen %vl) {
1106 ; NOVLOPT-LABEL: vnsrl_wv:
1108 ; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma
1109 ; NOVLOPT-NEXT: vnsrl.wv v12, v8, v11
1110 ; NOVLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1111 ; NOVLOPT-NEXT: vadd.vv v8, v12, v10
1114 ; VLOPT-LABEL: vnsrl_wv:
1116 ; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1117 ; VLOPT-NEXT: vnsrl.wv v12, v8, v11
1118 ; VLOPT-NEXT: vadd.vv v8, v12, v10
1120 %1 = call <vscale x 4 x i16> @llvm.riscv.vnsrl.nxv4i16.nxv4i32.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, <vscale x 4 x i16> %c, iXLen -1)
1121 %2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl)
1122 ret <vscale x 4 x i16> %2
1125 define <vscale x 4 x i16> @vnsra_wi(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, iXLen %vl) {
1126 ; NOVLOPT-LABEL: vnsra_wi:
1128 ; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma
1129 ; NOVLOPT-NEXT: vnsra.wi v11, v8, 5
1130 ; NOVLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1131 ; NOVLOPT-NEXT: vadd.vv v8, v11, v10
1134 ; VLOPT-LABEL: vnsra_wi:
1136 ; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1137 ; VLOPT-NEXT: vnsra.wi v11, v8, 5
1138 ; VLOPT-NEXT: vadd.vv v8, v11, v10
1140 %1 = call <vscale x 4 x i16> @llvm.riscv.vnsra.nxv4i16.nxv4i32(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1)
1141 %2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl)
1142 ret <vscale x 4 x i16> %2
1145 define <vscale x 4 x i16> @vnsra_wx(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, iXLen %c, iXLen %vl) {
1146 ; NOVLOPT-LABEL: vnsra_wx:
1148 ; NOVLOPT-NEXT: vsetvli a2, zero, e16, m1, ta, ma
1149 ; NOVLOPT-NEXT: vnsra.wx v11, v8, a0
1150 ; NOVLOPT-NEXT: vsetvli zero, a1, e16, m1, ta, ma
1151 ; NOVLOPT-NEXT: vadd.vv v8, v11, v10
1154 ; VLOPT-LABEL: vnsra_wx:
1156 ; VLOPT-NEXT: vsetvli zero, a1, e16, m1, ta, ma
1157 ; VLOPT-NEXT: vnsra.wx v11, v8, a0
1158 ; VLOPT-NEXT: vadd.vv v8, v11, v10
1160 %1 = call <vscale x 4 x i16> @llvm.riscv.vnsra.nxv4i16.nxv4i32(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, iXLen %c, iXLen -1)
1161 %2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl)
1162 ret <vscale x 4 x i16> %2
1165 define <vscale x 4 x i16> @vnsra_wv(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, iXLen %vl) {
1166 ; NOVLOPT-LABEL: vnsra_wv:
1168 ; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma
1169 ; NOVLOPT-NEXT: vnsra.wv v12, v8, v11
1170 ; NOVLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1171 ; NOVLOPT-NEXT: vadd.vv v8, v12, v10
1174 ; VLOPT-LABEL: vnsra_wv:
1176 ; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1177 ; VLOPT-NEXT: vnsra.wv v12, v8, v11
1178 ; VLOPT-NEXT: vadd.vv v8, v12, v10
1180 %1 = call <vscale x 4 x i16> @llvm.riscv.vnsra.nxv4i16.nxv4i32.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, <vscale x 4 x i16> %c, iXLen -1)
1181 %2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl)
1182 ret <vscale x 4 x i16> %2
1185 define <vscale x 4 x i1> @vmseq_vi(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, iXLen %vl) {
1186 ; NOVLOPT-LABEL: vmseq_vi:
1188 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1189 ; NOVLOPT-NEXT: vmseq.vi v10, v8, 5
1190 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
1191 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1194 ; VLOPT-LABEL: vmseq_vi:
1196 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1197 ; VLOPT-NEXT: vmseq.vi v10, v8, 5
1198 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1200 %1 = call <vscale x 4 x i1> @llvm.riscv.vmseq.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, iXLen -1)
1201 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1202 ret <vscale x 4 x i1> %2
1205 define <vscale x 4 x i1> @vmseq_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) {
1206 ; NOVLOPT-LABEL: vmseq_vx:
1208 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1209 ; NOVLOPT-NEXT: vmseq.vx v10, v8, a0
1210 ; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
1211 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1214 ; VLOPT-LABEL: vmseq_vx:
1216 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1217 ; VLOPT-NEXT: vmseq.vx v10, v8, a0
1218 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1220 %1 = call <vscale x 4 x i1> @llvm.riscv.vmseq.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1)
1221 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1222 ret <vscale x 4 x i1> %2
1225 define <vscale x 4 x i1> @vmseq_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) {
1226 ; NOVLOPT-LABEL: vmseq_vv:
1228 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1229 ; NOVLOPT-NEXT: vmseq.vv v12, v8, v10
1230 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
1231 ; NOVLOPT-NEXT: vmand.mm v0, v12, v0
1234 ; VLOPT-LABEL: vmseq_vv:
1236 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1237 ; VLOPT-NEXT: vmseq.vv v12, v8, v10
1238 ; VLOPT-NEXT: vmand.mm v0, v12, v0
1240 %1 = call <vscale x 4 x i1> @llvm.riscv.vmseq.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1)
1241 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1242 ret <vscale x 4 x i1> %2
1245 define <vscale x 4 x i1> @vmsne_vi(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, iXLen %vl) {
1246 ; NOVLOPT-LABEL: vmsne_vi:
1248 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1249 ; NOVLOPT-NEXT: vmsne.vi v10, v8, 5
1250 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
1251 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1254 ; VLOPT-LABEL: vmsne_vi:
1256 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1257 ; VLOPT-NEXT: vmsne.vi v10, v8, 5
1258 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1260 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsne.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, iXLen -1)
1261 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1262 ret <vscale x 4 x i1> %2
1265 define <vscale x 4 x i1> @vmsne_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) {
1266 ; NOVLOPT-LABEL: vmsne_vx:
1268 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1269 ; NOVLOPT-NEXT: vmsne.vx v10, v8, a0
1270 ; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
1271 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1274 ; VLOPT-LABEL: vmsne_vx:
1276 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1277 ; VLOPT-NEXT: vmsne.vx v10, v8, a0
1278 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1280 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsne.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1)
1281 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1282 ret <vscale x 4 x i1> %2
1285 define <vscale x 4 x i1> @vmsne_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) {
1286 ; NOVLOPT-LABEL: vmsne_vv:
1288 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1289 ; NOVLOPT-NEXT: vmsne.vv v12, v8, v10
1290 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
1291 ; NOVLOPT-NEXT: vmand.mm v0, v12, v0
1294 ; VLOPT-LABEL: vmsne_vv:
1296 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1297 ; VLOPT-NEXT: vmsne.vv v12, v8, v10
1298 ; VLOPT-NEXT: vmand.mm v0, v12, v0
1300 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsne.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1)
1301 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1302 ret <vscale x 4 x i1> %2
1305 define <vscale x 4 x i1> @vmsltu_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) {
1306 ; NOVLOPT-LABEL: vmsltu_vx:
1308 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1309 ; NOVLOPT-NEXT: vmsltu.vx v10, v8, a0
1310 ; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
1311 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1314 ; VLOPT-LABEL: vmsltu_vx:
1316 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1317 ; VLOPT-NEXT: vmsltu.vx v10, v8, a0
1318 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1320 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsltu.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1)
1321 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1322 ret <vscale x 4 x i1> %2
1325 define <vscale x 4 x i1> @vmsltu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) {
1326 ; NOVLOPT-LABEL: vmsltu_vv:
1328 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1329 ; NOVLOPT-NEXT: vmsltu.vv v12, v8, v10
1330 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
1331 ; NOVLOPT-NEXT: vmand.mm v0, v12, v0
1334 ; VLOPT-LABEL: vmsltu_vv:
1336 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1337 ; VLOPT-NEXT: vmsltu.vv v12, v8, v10
1338 ; VLOPT-NEXT: vmand.mm v0, v12, v0
1340 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsltu.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1)
1341 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1342 ret <vscale x 4 x i1> %2
1345 define <vscale x 4 x i1> @vmslt_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) {
1346 ; NOVLOPT-LABEL: vmslt_vx:
1348 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1349 ; NOVLOPT-NEXT: vmslt.vx v10, v8, a0
1350 ; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
1351 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1354 ; VLOPT-LABEL: vmslt_vx:
1356 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1357 ; VLOPT-NEXT: vmslt.vx v10, v8, a0
1358 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1360 %1 = call <vscale x 4 x i1> @llvm.riscv.vmslt.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1)
1361 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1362 ret <vscale x 4 x i1> %2
1365 define <vscale x 4 x i1> @vmslt_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) {
1366 ; NOVLOPT-LABEL: vmslt_vv:
1368 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1369 ; NOVLOPT-NEXT: vmslt.vv v12, v8, v10
1370 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
1371 ; NOVLOPT-NEXT: vmand.mm v0, v12, v0
1374 ; VLOPT-LABEL: vmslt_vv:
1376 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1377 ; VLOPT-NEXT: vmslt.vv v12, v8, v10
1378 ; VLOPT-NEXT: vmand.mm v0, v12, v0
1380 %1 = call <vscale x 4 x i1> @llvm.riscv.vmslt.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1)
1381 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1382 ret <vscale x 4 x i1> %2
1385 define <vscale x 4 x i1> @vmsleu_vi(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, iXLen %vl) {
1386 ; NOVLOPT-LABEL: vmsleu_vi:
1388 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1389 ; NOVLOPT-NEXT: vmsleu.vi v10, v8, 5
1390 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
1391 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1394 ; VLOPT-LABEL: vmsleu_vi:
1396 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1397 ; VLOPT-NEXT: vmsleu.vi v10, v8, 5
1398 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1400 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsleu.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, iXLen -1)
1401 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1402 ret <vscale x 4 x i1> %2
1405 define <vscale x 4 x i1> @vmsleu_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) {
1406 ; NOVLOPT-LABEL: vmsleu_vx:
1408 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1409 ; NOVLOPT-NEXT: vmsleu.vx v10, v8, a0
1410 ; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
1411 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1414 ; VLOPT-LABEL: vmsleu_vx:
1416 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1417 ; VLOPT-NEXT: vmsleu.vx v10, v8, a0
1418 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1420 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsleu.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1)
1421 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1422 ret <vscale x 4 x i1> %2
1425 define <vscale x 4 x i1> @vmsleu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) {
1426 ; NOVLOPT-LABEL: vmsleu_vv:
1428 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1429 ; NOVLOPT-NEXT: vmsleu.vv v12, v8, v10
1430 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
1431 ; NOVLOPT-NEXT: vmand.mm v0, v12, v0
1434 ; VLOPT-LABEL: vmsleu_vv:
1436 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1437 ; VLOPT-NEXT: vmsleu.vv v12, v8, v10
1438 ; VLOPT-NEXT: vmand.mm v0, v12, v0
1440 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsleu.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1)
1441 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1442 ret <vscale x 4 x i1> %2
1445 define <vscale x 4 x i1> @vmsle_vi(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, iXLen %vl) {
1446 ; NOVLOPT-LABEL: vmsle_vi:
1448 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1449 ; NOVLOPT-NEXT: vmsle.vi v10, v8, 5
1450 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
1451 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1454 ; VLOPT-LABEL: vmsle_vi:
1456 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1457 ; VLOPT-NEXT: vmsle.vi v10, v8, 5
1458 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1460 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsle.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, iXLen -1)
1461 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1462 ret <vscale x 4 x i1> %2
1465 define <vscale x 4 x i1> @vmsle_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) {
1466 ; NOVLOPT-LABEL: vmsle_vx:
1468 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1469 ; NOVLOPT-NEXT: vmsle.vx v10, v8, a0
1470 ; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
1471 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1474 ; VLOPT-LABEL: vmsle_vx:
1476 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1477 ; VLOPT-NEXT: vmsle.vx v10, v8, a0
1478 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1480 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsle.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1)
1481 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1482 ret <vscale x 4 x i1> %2
1485 define <vscale x 4 x i1> @vmsle_vv(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, <vscale x 4 x i32> %c, iXLen %vl) {
1486 ; NOVLOPT-LABEL: vmsle_vv:
1488 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1489 ; NOVLOPT-NEXT: vmsle.vv v12, v8, v10
1490 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
1491 ; NOVLOPT-NEXT: vmand.mm v0, v12, v0
1494 ; VLOPT-LABEL: vmsle_vv:
1496 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1497 ; VLOPT-NEXT: vmsle.vv v12, v8, v10
1498 ; VLOPT-NEXT: vmand.mm v0, v12, v0
1500 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsle.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, iXLen -1)
1501 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1502 ret <vscale x 4 x i1> %2
1505 define <vscale x 4 x i1> @vmsgtu_vi(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, iXLen %vl) {
1506 ; NOVLOPT-LABEL: vmsgtu_vi:
1508 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1509 ; NOVLOPT-NEXT: vmsgtu.vi v10, v8, 5
1510 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
1511 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1514 ; VLOPT-LABEL: vmsgtu_vi:
1516 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1517 ; VLOPT-NEXT: vmsgtu.vi v10, v8, 5
1518 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1520 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsgtu.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, iXLen -1)
1521 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1522 ret <vscale x 4 x i1> %2
1525 define <vscale x 4 x i1> @vmsgtu_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) {
1526 ; NOVLOPT-LABEL: vmsgtu_vx:
1528 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1529 ; NOVLOPT-NEXT: vmsgtu.vx v10, v8, a0
1530 ; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
1531 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1534 ; VLOPT-LABEL: vmsgtu_vx:
1536 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1537 ; VLOPT-NEXT: vmsgtu.vx v10, v8, a0
1538 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1540 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsgtu.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1)
1541 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1542 ret <vscale x 4 x i1> %2
1545 define <vscale x 4 x i1> @vmsgt_vi(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, iXLen %vl) {
1546 ; NOVLOPT-LABEL: vmsgt_vi:
1548 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1549 ; NOVLOPT-NEXT: vmsgt.vi v10, v8, 5
1550 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
1551 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1554 ; VLOPT-LABEL: vmsgt_vi:
1556 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1557 ; VLOPT-NEXT: vmsgt.vi v10, v8, 5
1558 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1560 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsgt.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, iXLen -1)
1561 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1562 ret <vscale x 4 x i1> %2
1565 define <vscale x 4 x i1> @vmsgt_vx(<vscale x 4 x i32> %a, <vscale x 4 x i1> %b, i32 %c, iXLen %vl) {
1566 ; NOVLOPT-LABEL: vmsgt_vx:
1568 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1569 ; NOVLOPT-NEXT: vmsgt.vx v10, v8, a0
1570 ; NOVLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
1571 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
1574 ; VLOPT-LABEL: vmsgt_vx:
1576 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1577 ; VLOPT-NEXT: vmsgt.vx v10, v8, a0
1578 ; VLOPT-NEXT: vmand.mm v0, v10, v0
1580 %1 = call <vscale x 4 x i1> @llvm.riscv.vmsgt.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, iXLen -1)
1581 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
1582 ret <vscale x 4 x i1> %2
1585 define <vscale x 4 x i32> @vminu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
1586 ; NOVLOPT-LABEL: vminu_vv:
1588 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1589 ; NOVLOPT-NEXT: vminu.vv v8, v8, v10
1590 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1591 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
1594 ; VLOPT-LABEL: vminu_vv:
1596 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1597 ; VLOPT-NEXT: vminu.vv v8, v8, v10
1598 ; VLOPT-NEXT: vadd.vv v8, v8, v10
1600 %1 = call <vscale x 4 x i32> @llvm.riscv.vminu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
1601 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
1602 ret <vscale x 4 x i32> %2
1605 define <vscale x 4 x i32> @vminu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
1606 ; NOVLOPT-LABEL: vminu_vx:
1608 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1609 ; NOVLOPT-NEXT: vminu.vx v10, v8, a0
1610 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1611 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
1614 ; VLOPT-LABEL: vminu_vx:
1616 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1617 ; VLOPT-NEXT: vminu.vx v10, v8, a0
1618 ; VLOPT-NEXT: vadd.vv v8, v10, v8
1620 %1 = call <vscale x 4 x i32> @llvm.riscv.vminu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
1621 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
1622 ret <vscale x 4 x i32> %2
1625 define <vscale x 4 x i32> @vmin_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
1626 ; NOVLOPT-LABEL: vmin_vv:
1628 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1629 ; NOVLOPT-NEXT: vmin.vv v8, v8, v10
1630 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1631 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
1634 ; VLOPT-LABEL: vmin_vv:
1636 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1637 ; VLOPT-NEXT: vmin.vv v8, v8, v10
1638 ; VLOPT-NEXT: vadd.vv v8, v8, v10
1640 %1 = call <vscale x 4 x i32> @llvm.riscv.vmin.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
1641 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
1642 ret <vscale x 4 x i32> %2
1645 define <vscale x 4 x i32> @vmin_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
1646 ; NOVLOPT-LABEL: vmin_vx:
1648 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1649 ; NOVLOPT-NEXT: vmin.vx v10, v8, a0
1650 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1651 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
1654 ; VLOPT-LABEL: vmin_vx:
1656 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1657 ; VLOPT-NEXT: vmin.vx v10, v8, a0
1658 ; VLOPT-NEXT: vadd.vv v8, v10, v8
1660 %1 = call <vscale x 4 x i32> @llvm.riscv.vmin.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
1661 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
1662 ret <vscale x 4 x i32> %2
1665 define <vscale x 4 x i32> @vmaxu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
1666 ; NOVLOPT-LABEL: vmaxu_vv:
1668 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1669 ; NOVLOPT-NEXT: vmaxu.vv v8, v8, v10
1670 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1671 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
1674 ; VLOPT-LABEL: vmaxu_vv:
1676 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1677 ; VLOPT-NEXT: vmaxu.vv v8, v8, v10
1678 ; VLOPT-NEXT: vadd.vv v8, v8, v10
1680 %1 = call <vscale x 4 x i32> @llvm.riscv.vmaxu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
1681 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
1682 ret <vscale x 4 x i32> %2
1685 define <vscale x 4 x i32> @vmaxu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
1686 ; NOVLOPT-LABEL: vmaxu_vx:
1688 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1689 ; NOVLOPT-NEXT: vmaxu.vx v10, v8, a0
1690 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1691 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
1694 ; VLOPT-LABEL: vmaxu_vx:
1696 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1697 ; VLOPT-NEXT: vmaxu.vx v10, v8, a0
1698 ; VLOPT-NEXT: vadd.vv v8, v10, v8
1700 %1 = call <vscale x 4 x i32> @llvm.riscv.vmaxu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
1701 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
1702 ret <vscale x 4 x i32> %2
1705 define <vscale x 4 x i32> @vmax_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
1706 ; NOVLOPT-LABEL: vmax_vv:
1708 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1709 ; NOVLOPT-NEXT: vmax.vv v8, v8, v10
1710 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1711 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
1714 ; VLOPT-LABEL: vmax_vv:
1716 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1717 ; VLOPT-NEXT: vmax.vv v8, v8, v10
1718 ; VLOPT-NEXT: vadd.vv v8, v8, v10
1720 %1 = call <vscale x 4 x i32> @llvm.riscv.vmax.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
1721 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
1722 ret <vscale x 4 x i32> %2
1725 define <vscale x 4 x i32> @vmax_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
1726 ; NOVLOPT-LABEL: vmax_vx:
1728 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1729 ; NOVLOPT-NEXT: vmax.vx v10, v8, a0
1730 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1731 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
1734 ; VLOPT-LABEL: vmax_vx:
1736 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1737 ; VLOPT-NEXT: vmax.vx v10, v8, a0
1738 ; VLOPT-NEXT: vadd.vv v8, v10, v8
1740 %1 = call <vscale x 4 x i32> @llvm.riscv.vmax.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
1741 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
1742 ret <vscale x 4 x i32> %2
1745 define <vscale x 4 x i32> @vmul_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
1746 ; NOVLOPT-LABEL: vmul_vv:
1748 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1749 ; NOVLOPT-NEXT: vmul.vv v8, v8, v10
1750 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1751 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
1754 ; VLOPT-LABEL: vmul_vv:
1756 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1757 ; VLOPT-NEXT: vmul.vv v8, v8, v10
1758 ; VLOPT-NEXT: vadd.vv v8, v8, v10
1760 %1 = call <vscale x 4 x i32> @llvm.riscv.vmul.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
1761 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
1762 ret <vscale x 4 x i32> %2
1765 define <vscale x 4 x i32> @vmul_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
1766 ; NOVLOPT-LABEL: vmul_vx:
1768 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1769 ; NOVLOPT-NEXT: vmul.vx v10, v8, a0
1770 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1771 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
1774 ; VLOPT-LABEL: vmul_vx:
1776 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1777 ; VLOPT-NEXT: vmul.vx v10, v8, a0
1778 ; VLOPT-NEXT: vadd.vv v8, v10, v8
1780 %1 = call <vscale x 4 x i32> @llvm.riscv.vmul.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
1781 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
1782 ret <vscale x 4 x i32> %2
1785 define <vscale x 4 x i32> @vmulh_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
1786 ; NOVLOPT-LABEL: vmulh_vv:
1788 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1789 ; NOVLOPT-NEXT: vmulh.vv v8, v8, v10
1790 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1791 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
1794 ; VLOPT-LABEL: vmulh_vv:
1796 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1797 ; VLOPT-NEXT: vmulh.vv v8, v8, v10
1798 ; VLOPT-NEXT: vadd.vv v8, v8, v10
1800 %1 = call <vscale x 4 x i32> @llvm.riscv.vmulh.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
1801 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
1802 ret <vscale x 4 x i32> %2
1805 define <vscale x 4 x i32> @vmulh_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
1806 ; NOVLOPT-LABEL: vmulh_vx:
1808 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1809 ; NOVLOPT-NEXT: vmulh.vx v10, v8, a0
1810 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1811 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
1814 ; VLOPT-LABEL: vmulh_vx:
1816 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1817 ; VLOPT-NEXT: vmulh.vx v10, v8, a0
1818 ; VLOPT-NEXT: vadd.vv v8, v10, v8
1820 %1 = call <vscale x 4 x i32> @llvm.riscv.vmulh.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
1821 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
1822 ret <vscale x 4 x i32> %2
1825 define <vscale x 4 x i32> @vmulhu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
1826 ; NOVLOPT-LABEL: vmulhu_vv:
1828 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1829 ; NOVLOPT-NEXT: vmulhu.vv v8, v8, v10
1830 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1831 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
1834 ; VLOPT-LABEL: vmulhu_vv:
1836 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1837 ; VLOPT-NEXT: vmulhu.vv v8, v8, v10
1838 ; VLOPT-NEXT: vadd.vv v8, v8, v10
1840 %1 = call <vscale x 4 x i32> @llvm.riscv.vmulhu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
1841 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
1842 ret <vscale x 4 x i32> %2
1845 define <vscale x 4 x i32> @vmulhu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
1846 ; NOVLOPT-LABEL: vmulhu_vx:
1848 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1849 ; NOVLOPT-NEXT: vmulhu.vx v10, v8, a0
1850 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1851 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
1854 ; VLOPT-LABEL: vmulhu_vx:
1856 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1857 ; VLOPT-NEXT: vmulhu.vx v10, v8, a0
1858 ; VLOPT-NEXT: vadd.vv v8, v10, v8
1860 %1 = call <vscale x 4 x i32> @llvm.riscv.vmulhu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
1861 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
1862 ret <vscale x 4 x i32> %2
1865 define <vscale x 4 x i32> @vmulhsu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
1866 ; NOVLOPT-LABEL: vmulhsu_vv:
1868 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1869 ; NOVLOPT-NEXT: vmulhsu.vv v8, v8, v10
1870 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1871 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
1874 ; VLOPT-LABEL: vmulhsu_vv:
1876 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1877 ; VLOPT-NEXT: vmulhsu.vv v8, v8, v10
1878 ; VLOPT-NEXT: vadd.vv v8, v8, v10
1880 %1 = call <vscale x 4 x i32> @llvm.riscv.vmulhsu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
1881 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
1882 ret <vscale x 4 x i32> %2
1885 define <vscale x 4 x i32> @vmulhsu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
1886 ; NOVLOPT-LABEL: vmulhsu_vx:
1888 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1889 ; NOVLOPT-NEXT: vmulhsu.vx v10, v8, a0
1890 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1891 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
1894 ; VLOPT-LABEL: vmulhsu_vx:
1896 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1897 ; VLOPT-NEXT: vmulhsu.vx v10, v8, a0
1898 ; VLOPT-NEXT: vadd.vv v8, v10, v8
1900 %1 = call <vscale x 4 x i32> @llvm.riscv.vmulhsu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
1901 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
1902 ret <vscale x 4 x i32> %2
1905 define <vscale x 4 x i32> @vdivu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
1906 ; NOVLOPT-LABEL: vdivu_vv:
1908 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1909 ; NOVLOPT-NEXT: vdivu.vv v8, v8, v10
1910 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1911 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
1914 ; VLOPT-LABEL: vdivu_vv:
1916 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1917 ; VLOPT-NEXT: vdivu.vv v8, v8, v10
1918 ; VLOPT-NEXT: vadd.vv v8, v8, v10
1920 %1 = call <vscale x 4 x i32> @llvm.riscv.vdivu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
1921 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
1922 ret <vscale x 4 x i32> %2
1925 define <vscale x 4 x i32> @vdivu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
1926 ; NOVLOPT-LABEL: vdivu_vx:
1928 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1929 ; NOVLOPT-NEXT: vdivu.vx v10, v8, a0
1930 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1931 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
1934 ; VLOPT-LABEL: vdivu_vx:
1936 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1937 ; VLOPT-NEXT: vdivu.vx v10, v8, a0
1938 ; VLOPT-NEXT: vadd.vv v8, v10, v8
1940 %1 = call <vscale x 4 x i32> @llvm.riscv.vdivu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
1941 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
1942 ret <vscale x 4 x i32> %2
1945 define <vscale x 4 x i32> @vdiv_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
1946 ; NOVLOPT-LABEL: vdiv_vv:
1948 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1949 ; NOVLOPT-NEXT: vdiv.vv v8, v8, v10
1950 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1951 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
1954 ; VLOPT-LABEL: vdiv_vv:
1956 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1957 ; VLOPT-NEXT: vdiv.vv v8, v8, v10
1958 ; VLOPT-NEXT: vadd.vv v8, v8, v10
1960 %1 = call <vscale x 4 x i32> @llvm.riscv.vdiv.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
1961 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
1962 ret <vscale x 4 x i32> %2
1965 define <vscale x 4 x i32> @vdiv_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
1966 ; NOVLOPT-LABEL: vdiv_vx:
1968 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1969 ; NOVLOPT-NEXT: vdiv.vx v10, v8, a0
1970 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1971 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
1974 ; VLOPT-LABEL: vdiv_vx:
1976 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1977 ; VLOPT-NEXT: vdiv.vx v10, v8, a0
1978 ; VLOPT-NEXT: vadd.vv v8, v10, v8
1980 %1 = call <vscale x 4 x i32> @llvm.riscv.vdiv.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
1981 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
1982 ret <vscale x 4 x i32> %2
1985 define <vscale x 4 x i32> @vremu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
1986 ; NOVLOPT-LABEL: vremu_vv:
1988 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1989 ; NOVLOPT-NEXT: vremu.vv v8, v8, v10
1990 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1991 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
1994 ; VLOPT-LABEL: vremu_vv:
1996 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
1997 ; VLOPT-NEXT: vremu.vv v8, v8, v10
1998 ; VLOPT-NEXT: vadd.vv v8, v8, v10
2000 %1 = call <vscale x 4 x i32> @llvm.riscv.vremu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
2001 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
2002 ret <vscale x 4 x i32> %2
2005 define <vscale x 4 x i32> @vremu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
2006 ; NOVLOPT-LABEL: vremu_vx:
2008 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
2009 ; NOVLOPT-NEXT: vremu.vx v10, v8, a0
2010 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2011 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
2014 ; VLOPT-LABEL: vremu_vx:
2016 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2017 ; VLOPT-NEXT: vremu.vx v10, v8, a0
2018 ; VLOPT-NEXT: vadd.vv v8, v10, v8
2020 %1 = call <vscale x 4 x i32> @llvm.riscv.vremu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
2021 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
2022 ret <vscale x 4 x i32> %2
2025 define <vscale x 4 x i32> @vrem_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
2026 ; NOVLOPT-LABEL: vrem_vv:
2028 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
2029 ; NOVLOPT-NEXT: vrem.vv v8, v8, v10
2030 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2031 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
2034 ; VLOPT-LABEL: vrem_vv:
2036 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2037 ; VLOPT-NEXT: vrem.vv v8, v8, v10
2038 ; VLOPT-NEXT: vadd.vv v8, v8, v10
2040 %1 = call <vscale x 4 x i32> @llvm.riscv.vrem.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
2041 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
2042 ret <vscale x 4 x i32> %2
2045 define <vscale x 4 x i32> @vrem_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
2046 ; NOVLOPT-LABEL: vrem_vx:
2048 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
2049 ; NOVLOPT-NEXT: vrem.vx v10, v8, a0
2050 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2051 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
2054 ; VLOPT-LABEL: vrem_vx:
2056 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2057 ; VLOPT-NEXT: vrem.vx v10, v8, a0
2058 ; VLOPT-NEXT: vadd.vv v8, v10, v8
2060 %1 = call <vscale x 4 x i32> @llvm.riscv.vrem.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
2061 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
2062 ret <vscale x 4 x i32> %2
2065 define <vscale x 4 x i64> @vwmul_vv(<vscale x 4 x i16> %a, <vscale x 4 x i16> %b, iXLen %vl) {
2066 ; NOVLOPT-LABEL: vwmul_vv:
2068 ; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma
2069 ; NOVLOPT-NEXT: vwmul.vv v12, v8, v9
2070 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2071 ; NOVLOPT-NEXT: vwmul.vv v8, v12, v12
2074 ; VLOPT-LABEL: vwmul_vv:
2076 ; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
2077 ; VLOPT-NEXT: vwmul.vv v12, v8, v9
2078 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2079 ; VLOPT-NEXT: vwmul.vv v8, v12, v12
2081 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmul.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i16> %a, <vscale x 4 x i16> %b, iXLen -1)
2082 %2 = call <vscale x 4 x i64> @llvm.riscv.vwmul.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl)
2083 ret <vscale x 4 x i64> %2
2086 define <vscale x 4 x i64> @vwmul_vx(<vscale x 4 x i16> %a, i16 %b, i32 %c, iXLen %vl) {
2087 ; NOVLOPT-LABEL: vwmul_vx:
2089 ; NOVLOPT-NEXT: vsetvli a3, zero, e16, m1, ta, ma
2090 ; NOVLOPT-NEXT: vwmul.vx v12, v8, a0
2091 ; NOVLOPT-NEXT: vsetvli zero, a2, e32, m2, ta, ma
2092 ; NOVLOPT-NEXT: vwmul.vx v8, v12, a1
2095 ; VLOPT-LABEL: vwmul_vx:
2097 ; VLOPT-NEXT: vsetvli zero, a2, e16, m1, ta, ma
2098 ; VLOPT-NEXT: vwmul.vx v12, v8, a0
2099 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2100 ; VLOPT-NEXT: vwmul.vx v8, v12, a1
2102 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmul.nxv4i32.nxv4i16.i16(<vscale x 4 x i32> poison, <vscale x 4 x i16> %a, i16 %b, iXLen -1)
2103 %2 = call <vscale x 4 x i64> @llvm.riscv.vwmul.nxv4i64.nxv4i64.i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %1, i32 %c, iXLen %vl)
2104 ret <vscale x 4 x i64> %2
2107 define <vscale x 4 x i64> @vwmulsu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
2108 ; NOVLOPT-LABEL: vwmulsu_vv:
2110 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
2111 ; NOVLOPT-NEXT: vwmulsu.vv v12, v8, v10
2112 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
2113 ; NOVLOPT-NEXT: vadd.vv v8, v12, v12
2116 ; VLOPT-LABEL: vwmulsu_vv:
2118 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2119 ; VLOPT-NEXT: vwmulsu.vv v12, v8, v10
2120 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
2121 ; VLOPT-NEXT: vadd.vv v8, v12, v12
2123 %1 = call <vscale x 4 x i64> @llvm.riscv.vwmulsu.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
2124 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
2125 ret <vscale x 4 x i64> %2
2128 define <vscale x 4 x i64> @vwmulsu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
2129 ; NOVLOPT-LABEL: vwmulsu_vx:
2131 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
2132 ; NOVLOPT-NEXT: vwmulsu.vx v12, v8, a0
2133 ; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma
2134 ; NOVLOPT-NEXT: vadd.vv v8, v12, v12
2137 ; VLOPT-LABEL: vwmulsu_vx:
2139 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2140 ; VLOPT-NEXT: vwmulsu.vx v12, v8, a0
2141 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
2142 ; VLOPT-NEXT: vadd.vv v8, v12, v12
2144 %1 = call <vscale x 4 x i64> @llvm.riscv.vwmulsu.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
2145 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
2146 ret <vscale x 4 x i64> %2
2149 define <vscale x 4 x i64> @vwmulu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
2150 ; NOVLOPT-LABEL: vwmulu_vv:
2152 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
2153 ; NOVLOPT-NEXT: vwmulu.vv v12, v8, v10
2154 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
2155 ; NOVLOPT-NEXT: vadd.vv v8, v12, v12
2158 ; VLOPT-LABEL: vwmulu_vv:
2160 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2161 ; VLOPT-NEXT: vwmulu.vv v12, v8, v10
2162 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
2163 ; VLOPT-NEXT: vadd.vv v8, v12, v12
2165 %1 = call <vscale x 4 x i64> @llvm.riscv.vwmulu.nxv4i64.nxv4i32.nxv4i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
2166 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
2167 ret <vscale x 4 x i64> %2
2170 define <vscale x 4 x i64> @vwmulu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
2171 ; NOVLOPT-LABEL: vwmulu_vx:
2173 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
2174 ; NOVLOPT-NEXT: vwmulu.vx v12, v8, a0
2175 ; NOVLOPT-NEXT: vsetvli zero, a1, e64, m4, ta, ma
2176 ; NOVLOPT-NEXT: vadd.vv v8, v12, v12
2179 ; VLOPT-LABEL: vwmulu_vx:
2181 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2182 ; VLOPT-NEXT: vwmulu.vx v12, v8, a0
2183 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
2184 ; VLOPT-NEXT: vadd.vv v8, v12, v12
2186 %1 = call <vscale x 4 x i64> @llvm.riscv.vwmulu.nxv4i64.nxv4i32.i32(<vscale x 4 x i64> poison, <vscale x 4 x i32> %a, i32 %b, iXLen -1)
2187 %2 = call <vscale x 4 x i64> @llvm.riscv.vadd.nxv4i64.nxv4i64(<vscale x 4 x i64> poison, <vscale x 4 x i64> %1, <vscale x 4 x i64> %1, iXLen %vl)
2188 ret <vscale x 4 x i64> %2
2191 define <vscale x 4 x i32> @vwmacc_vv(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, <vscale x 4 x i32> %d, iXLen %vl) {
2192 ; NOVLOPT-LABEL: vwmacc_vv:
2194 ; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, tu, ma
2195 ; NOVLOPT-NEXT: vwmacc.vv v8, v10, v11
2196 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2197 ; NOVLOPT-NEXT: vadd.vv v8, v8, v12
2200 ; VLOPT-LABEL: vwmacc_vv:
2202 ; VLOPT-NEXT: vsetvli zero, a0, e16, m1, tu, ma
2203 ; VLOPT-NEXT: vwmacc.vv v8, v10, v11
2204 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2205 ; VLOPT-NEXT: vadd.vv v8, v8, v12
2207 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmacc.nxv4i32.nxv4i16(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, iXLen -1, iXLen 0)
2208 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %d, iXLen %vl)
2209 ret <vscale x 4 x i32> %2
2212 define <vscale x 4 x i32> @vmacc_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
2213 ; NOVLOPT-LABEL: vmacc_vv:
2215 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, tu, ma
2216 ; NOVLOPT-NEXT: vmacc.vv v8, v8, v10
2217 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2218 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
2221 ; VLOPT-LABEL: vmacc_vv:
2223 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, tu, ma
2224 ; VLOPT-NEXT: vmacc.vv v8, v8, v10
2225 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2226 ; VLOPT-NEXT: vadd.vv v8, v8, v10
2228 %1 = call <vscale x 4 x i32> @llvm.riscv.vmacc.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1, iXLen 0)
2229 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
2230 ret <vscale x 4 x i32> %2
2233 define <vscale x 4 x i32> @vmacc_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
2234 ; NOVLOPT-LABEL: vmacc_vx:
2236 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, tu, ma
2237 ; NOVLOPT-NEXT: vmv2r.v v10, v8
2238 ; NOVLOPT-NEXT: vmacc.vx v10, a0, v8
2239 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2240 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
2243 ; VLOPT-LABEL: vmacc_vx:
2245 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, tu, ma
2246 ; VLOPT-NEXT: vmv2r.v v10, v8
2247 ; VLOPT-NEXT: vmacc.vx v10, a0, v8
2248 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2249 ; VLOPT-NEXT: vadd.vv v8, v10, v8
2251 %1 = call <vscale x 4 x i32> @llvm.riscv.vmacc.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i32> %a, iXLen -1, iXLen 0)
2252 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
2253 ret <vscale x 4 x i32> %2
2256 define <vscale x 4 x i32> @vmadd_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
2257 ; NOVLOPT-LABEL: vmadd_vv:
2259 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, tu, ma
2260 ; NOVLOPT-NEXT: vmadd.vv v8, v8, v10
2261 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2262 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
2265 ; VLOPT-LABEL: vmadd_vv:
2267 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, tu, ma
2268 ; VLOPT-NEXT: vmadd.vv v8, v8, v10
2269 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2270 ; VLOPT-NEXT: vadd.vv v8, v8, v10
2272 %1 = call <vscale x 4 x i32> @llvm.riscv.vmadd.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1, iXLen 0)
2273 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
2274 ret <vscale x 4 x i32> %2
2277 define <vscale x 4 x i32> @vmadd_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
2278 ; NOVLOPT-LABEL: vmadd_vx:
2280 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, tu, ma
2281 ; NOVLOPT-NEXT: vmv2r.v v10, v8
2282 ; NOVLOPT-NEXT: vmadd.vx v10, a0, v8
2283 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2284 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
2287 ; VLOPT-LABEL: vmadd_vx:
2289 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, tu, ma
2290 ; VLOPT-NEXT: vmv2r.v v10, v8
2291 ; VLOPT-NEXT: vmadd.vx v10, a0, v8
2292 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2293 ; VLOPT-NEXT: vadd.vv v8, v10, v8
2295 %1 = call <vscale x 4 x i32> @llvm.riscv.vmadd.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i32> %a, iXLen -1, iXLen 0)
2296 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
2297 ret <vscale x 4 x i32> %2
2300 define <vscale x 4 x i32> @vnmsac_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
2301 ; NOVLOPT-LABEL: vnmsac_vv:
2303 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, tu, ma
2304 ; NOVLOPT-NEXT: vnmsac.vv v8, v8, v10
2305 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2306 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
2309 ; VLOPT-LABEL: vnmsac_vv:
2311 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, tu, ma
2312 ; VLOPT-NEXT: vnmsac.vv v8, v8, v10
2313 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2314 ; VLOPT-NEXT: vadd.vv v8, v8, v10
2316 %1 = call <vscale x 4 x i32> @llvm.riscv.vnmsac.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1, iXLen 0)
2317 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
2318 ret <vscale x 4 x i32> %2
2321 define <vscale x 4 x i32> @vnmsac_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
2322 ; NOVLOPT-LABEL: vnmsac_vx:
2324 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, tu, ma
2325 ; NOVLOPT-NEXT: vmv2r.v v10, v8
2326 ; NOVLOPT-NEXT: vnmsac.vx v10, a0, v8
2327 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2328 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
2331 ; VLOPT-LABEL: vnmsac_vx:
2333 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, tu, ma
2334 ; VLOPT-NEXT: vmv2r.v v10, v8
2335 ; VLOPT-NEXT: vnmsac.vx v10, a0, v8
2336 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2337 ; VLOPT-NEXT: vadd.vv v8, v10, v8
2339 %1 = call <vscale x 4 x i32> @llvm.riscv.vnmsac.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i32> %a, iXLen -1, iXLen 0)
2340 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
2341 ret <vscale x 4 x i32> %2
2344 define <vscale x 4 x i32> @vnmsub_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
2345 ; NOVLOPT-LABEL: vnmsub_vv:
2347 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, tu, ma
2348 ; NOVLOPT-NEXT: vnmsub.vv v8, v8, v10
2349 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2350 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
2353 ; VLOPT-LABEL: vnmsub_vv:
2355 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, tu, ma
2356 ; VLOPT-NEXT: vnmsub.vv v8, v8, v10
2357 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2358 ; VLOPT-NEXT: vadd.vv v8, v8, v10
2360 %1 = call <vscale x 4 x i32> @llvm.riscv.vnmsub.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1, iXLen 0)
2361 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
2362 ret <vscale x 4 x i32> %2
2365 define <vscale x 4 x i32> @vnmsub_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
2366 ; NOVLOPT-LABEL: vnmsub_vx:
2368 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, tu, ma
2369 ; NOVLOPT-NEXT: vmv2r.v v10, v8
2370 ; NOVLOPT-NEXT: vnmsub.vx v10, a0, v8
2371 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2372 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
2375 ; VLOPT-LABEL: vnmsub_vx:
2377 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, tu, ma
2378 ; VLOPT-NEXT: vmv2r.v v10, v8
2379 ; VLOPT-NEXT: vnmsub.vx v10, a0, v8
2380 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2381 ; VLOPT-NEXT: vadd.vv v8, v10, v8
2383 %1 = call <vscale x 4 x i32> @llvm.riscv.vnmsub.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i32> %a, iXLen -1, iXLen 0)
2384 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
2385 ret <vscale x 4 x i32> %2
2388 define <vscale x 4 x i32> @vwmacc_vx(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, iXLen %vl) {
2389 ; NOVLOPT-LABEL: vwmacc_vx:
2391 ; NOVLOPT-NEXT: vsetvli a2, zero, e16, m1, tu, ma
2392 ; NOVLOPT-NEXT: vwmacc.vx v8, a0, v10
2393 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2394 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
2397 ; VLOPT-LABEL: vwmacc_vx:
2399 ; VLOPT-NEXT: vsetvli zero, a1, e16, m1, tu, ma
2400 ; VLOPT-NEXT: vwmacc.vx v8, a0, v10
2401 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2402 ; VLOPT-NEXT: vadd.vv v8, v8, v8
2404 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmacc.nxv4i32.i16(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, iXLen -1, iXLen 0)
2405 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl)
2406 ret <vscale x 4 x i32> %2
2409 define <vscale x 4 x i32> @vwmaccu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, <vscale x 4 x i32> %d, iXLen %vl) {
2410 ; NOVLOPT-LABEL: vwmaccu_vv:
2412 ; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, tu, ma
2413 ; NOVLOPT-NEXT: vwmaccu.vv v8, v10, v11
2414 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2415 ; NOVLOPT-NEXT: vadd.vv v8, v8, v12
2418 ; VLOPT-LABEL: vwmaccu_vv:
2420 ; VLOPT-NEXT: vsetvli zero, a0, e16, m1, tu, ma
2421 ; VLOPT-NEXT: vwmaccu.vv v8, v10, v11
2422 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2423 ; VLOPT-NEXT: vadd.vv v8, v8, v12
2425 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmaccu.nxv4i32.nxv4i16(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, iXLen -1, iXLen 0)
2426 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %d, iXLen %vl)
2427 ret <vscale x 4 x i32> %2
2430 define <vscale x 4 x i32> @vwmaccu_vx(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, <vscale x 4 x i32> %d, i32 %e, iXLen %vl) {
2431 ; NOVLOPT-LABEL: vwmaccu_vx:
2433 ; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, tu, ma
2434 ; NOVLOPT-NEXT: vwmaccu.vx v8, a0, v10
2435 ; NOVLOPT-NEXT: vsetvli zero, a2, e32, m2, ta, ma
2436 ; NOVLOPT-NEXT: vadd.vv v8, v8, v12
2439 ; VLOPT-LABEL: vwmaccu_vx:
2441 ; VLOPT-NEXT: vsetvli zero, a2, e16, m1, tu, ma
2442 ; VLOPT-NEXT: vwmaccu.vx v8, a0, v10
2443 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2444 ; VLOPT-NEXT: vadd.vv v8, v8, v12
2446 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmaccu.nxv4i32.i16(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, iXLen -1, iXLen 0)
2447 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %d, iXLen %vl)
2448 ret <vscale x 4 x i32> %2
2451 define <vscale x 4 x i32> @vwmaccsu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, iXLen %vl) {
2452 ; NOVLOPT-LABEL: vwmaccsu_vv:
2454 ; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, tu, ma
2455 ; NOVLOPT-NEXT: vwmaccsu.vv v8, v10, v11
2456 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2457 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
2460 ; VLOPT-LABEL: vwmaccsu_vv:
2462 ; VLOPT-NEXT: vsetvli zero, a0, e16, m1, tu, ma
2463 ; VLOPT-NEXT: vwmaccsu.vv v8, v10, v11
2464 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2465 ; VLOPT-NEXT: vadd.vv v8, v8, v8
2467 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmaccsu.nxv4i32.nxv4i16(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, iXLen -1, iXLen 0)
2468 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl)
2469 ret <vscale x 4 x i32> %2
2472 define <vscale x 4 x i32> @vwmaccsu_vx(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, iXLen %vl) {
2473 ; NOVLOPT-LABEL: vwmaccsu_vx:
2475 ; NOVLOPT-NEXT: vsetvli a2, zero, e16, m1, tu, ma
2476 ; NOVLOPT-NEXT: vwmaccsu.vx v8, a0, v10
2477 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2478 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
2481 ; VLOPT-LABEL: vwmaccsu_vx:
2483 ; VLOPT-NEXT: vsetvli zero, a1, e16, m1, tu, ma
2484 ; VLOPT-NEXT: vwmaccsu.vx v8, a0, v10
2485 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2486 ; VLOPT-NEXT: vadd.vv v8, v8, v8
2488 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmaccsu.nxv4i32.i16(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, iXLen -1, iXLen 0)
2489 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl)
2490 ret <vscale x 4 x i32> %2
2493 define <vscale x 4 x i32> @vwmaccus_vx(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, iXLen %vl) {
2494 ; NOVLOPT-LABEL: vwmaccus_vx:
2496 ; NOVLOPT-NEXT: vsetvli a2, zero, e16, m1, tu, ma
2497 ; NOVLOPT-NEXT: vwmaccus.vx v8, a0, v10
2498 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2499 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
2502 ; VLOPT-LABEL: vwmaccus_vx:
2504 ; VLOPT-NEXT: vsetvli zero, a1, e16, m1, tu, ma
2505 ; VLOPT-NEXT: vwmaccus.vx v8, a0, v10
2506 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2507 ; VLOPT-NEXT: vadd.vv v8, v8, v8
2509 %1 = call <vscale x 4 x i32> @llvm.riscv.vwmaccus.nxv4i32.i16(<vscale x 4 x i32> %a, i16 %b, <vscale x 4 x i16> %c, iXLen -1, iXLen 0)
2510 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl)
2511 ret <vscale x 4 x i32> %2
2514 define <vscale x 4 x i32> @vmv_v_i(<vscale x 4 x i32> %a, i32 %x, iXLen %vl) {
2515 ; NOVLOPT-LABEL: vmv_v_i:
2517 ; NOVLOPT-NEXT: vsetvli a0, zero, e32, m2, ta, ma
2518 ; NOVLOPT-NEXT: vmv.v.i v10, 5
2519 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2520 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
2523 ; VLOPT-LABEL: vmv_v_i:
2525 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2526 ; VLOPT-NEXT: vmv.v.i v10, 5
2527 ; VLOPT-NEXT: vadd.vv v8, v10, v8
2529 %1 = call <vscale x 4 x i32> @llvm.riscv.vmv.v.x.nxv4i32(<vscale x 4 x i32> poison, i32 5, iXLen -1)
2530 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
2531 ret <vscale x 4 x i32> %2
2534 define <vscale x 4 x i32> @vmv_v_x(<vscale x 4 x i32> %a, i32 %x, iXLen %vl) {
2535 ; NOVLOPT-LABEL: vmv_v_x:
2537 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
2538 ; NOVLOPT-NEXT: vmv.v.x v10, a0
2539 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2540 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
2543 ; VLOPT-LABEL: vmv_v_x:
2545 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
2546 ; VLOPT-NEXT: vmv.v.x v10, a0
2547 ; VLOPT-NEXT: vadd.vv v8, v10, v8
2549 %1 = call <vscale x 4 x i32> @llvm.riscv.vmv.v.x.nxv4i32(<vscale x 4 x i32> poison, i32 %x, iXLen -1)
2550 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
2551 ret <vscale x 4 x i32> %2
2554 ; The vmv.v.v is optimized away if we use a vadd as the user.
2555 define <vscale x 1 x i8> @vmv_v_v(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, iXLen %vl) {
2556 ; NOVLOPT-LABEL: vmv_v_v:
2558 ; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, tu, ma
2559 ; NOVLOPT-NEXT: vmv.v.v v8, v9
2560 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2561 ; NOVLOPT-NEXT: vmerge.vvm v8, v8, v10, v0
2564 ; VLOPT-LABEL: vmv_v_v:
2566 ; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, tu, ma
2567 ; VLOPT-NEXT: vmv.v.v v8, v9
2568 ; VLOPT-NEXT: vsetvli zero, zero, e8, mf8, ta, ma
2569 ; VLOPT-NEXT: vmerge.vvm v8, v8, v10, v0
2571 %2 = call <vscale x 1 x i8> @llvm.riscv.vmv.v.v.nxv1i8.nxv1i8(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b, iXLen -1)
2572 %3 = call <vscale x 1 x i8> @llvm.riscv.vmerge.nxv1i8.nxv1i8(<vscale x 1 x i8> undef, <vscale x 1 x i8> %2, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, iXLen %vl)
2573 ret <vscale x 1 x i8> %3
2576 define <vscale x 4 x i32> @vwsll_vi(<vscale x 4 x i16> %a, <vscale x 4 x i32> %b, iXLen %vl) {
2577 ; NOVLOPT-LABEL: vwsll_vi:
2579 ; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma
2580 ; NOVLOPT-NEXT: vwsll.vi v12, v8, 1
2581 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2582 ; NOVLOPT-NEXT: vadd.vv v8, v12, v10
2585 ; VLOPT-LABEL: vwsll_vi:
2587 ; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
2588 ; VLOPT-NEXT: vwsll.vi v12, v8, 1
2589 ; VLOPT-NEXT: vsetvli zero, zero, e32, m2, ta, ma
2590 ; VLOPT-NEXT: vadd.vv v8, v12, v10
2592 %1 = call <vscale x 4 x i32> @llvm.riscv.vwsll.nxv4i32.nxv4i16(<vscale x 4 x i32> poison, <vscale x 4 x i16> %a,iXLen 1, iXLen -1)
2593 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
2594 ret <vscale x 4 x i32> %2
2597 define <vscale x 1 x i32> @vmand_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) {
2598 ; NOVLOPT-LABEL: vmand_mm:
2600 ; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma
2601 ; NOVLOPT-NEXT: vmand.mm v8, v0, v8
2602 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2603 ; NOVLOPT-NEXT: vmand.mm v0, v0, v8
2604 ; NOVLOPT-NEXT: vmv1r.v v8, v9
2605 ; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2606 ; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2609 ; VLOPT-LABEL: vmand_mm:
2611 ; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2612 ; VLOPT-NEXT: vmand.mm v8, v0, v8
2613 ; VLOPT-NEXT: vmand.mm v0, v0, v8
2614 ; VLOPT-NEXT: vmv1r.v v8, v9
2615 ; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2616 ; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2618 %1 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1)
2619 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl)
2620 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0)
2621 ret <vscale x 1 x i32> %3
2624 define <vscale x 1 x i32> @vmnand_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) {
2625 ; NOVLOPT-LABEL: vmnand_mm:
2627 ; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma
2628 ; NOVLOPT-NEXT: vmnand.mm v8, v0, v8
2629 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2630 ; NOVLOPT-NEXT: vmand.mm v0, v0, v8
2631 ; NOVLOPT-NEXT: vmv1r.v v8, v9
2632 ; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2633 ; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2636 ; VLOPT-LABEL: vmnand_mm:
2638 ; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2639 ; VLOPT-NEXT: vmnand.mm v8, v0, v8
2640 ; VLOPT-NEXT: vmand.mm v0, v0, v8
2641 ; VLOPT-NEXT: vmv1r.v v8, v9
2642 ; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2643 ; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2645 %1 = call <vscale x 1 x i1> @llvm.riscv.vmnand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1)
2646 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl)
2647 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0)
2648 ret <vscale x 1 x i32> %3
2651 define <vscale x 1 x i32> @vmandn_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) {
2652 ; NOVLOPT-LABEL: vmandn_mm:
2654 ; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma
2655 ; NOVLOPT-NEXT: vmandn.mm v8, v0, v8
2656 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2657 ; NOVLOPT-NEXT: vmand.mm v0, v0, v8
2658 ; NOVLOPT-NEXT: vmv1r.v v8, v9
2659 ; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2660 ; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2663 ; VLOPT-LABEL: vmandn_mm:
2665 ; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2666 ; VLOPT-NEXT: vmandn.mm v8, v0, v8
2667 ; VLOPT-NEXT: vmand.mm v0, v0, v8
2668 ; VLOPT-NEXT: vmv1r.v v8, v9
2669 ; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2670 ; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2672 %1 = call <vscale x 1 x i1> @llvm.riscv.vmandn.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1)
2673 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl)
2674 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0)
2675 ret <vscale x 1 x i32> %3
2678 define <vscale x 1 x i32> @vmxor_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) {
2679 ; NOVLOPT-LABEL: vmxor_mm:
2681 ; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma
2682 ; NOVLOPT-NEXT: vmxor.mm v8, v0, v8
2683 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2684 ; NOVLOPT-NEXT: vmand.mm v0, v0, v8
2685 ; NOVLOPT-NEXT: vmv1r.v v8, v9
2686 ; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2687 ; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2690 ; VLOPT-LABEL: vmxor_mm:
2692 ; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2693 ; VLOPT-NEXT: vmxor.mm v8, v0, v8
2694 ; VLOPT-NEXT: vmand.mm v0, v0, v8
2695 ; VLOPT-NEXT: vmv1r.v v8, v9
2696 ; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2697 ; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2699 %1 = call <vscale x 1 x i1> @llvm.riscv.vmxor.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1)
2700 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl)
2701 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0)
2702 ret <vscale x 1 x i32> %3
2705 define <vscale x 1 x i32> @vmor_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) {
2706 ; NOVLOPT-LABEL: vmor_mm:
2708 ; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma
2709 ; NOVLOPT-NEXT: vmor.mm v8, v0, v8
2710 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2711 ; NOVLOPT-NEXT: vmand.mm v0, v0, v8
2712 ; NOVLOPT-NEXT: vmv1r.v v8, v9
2713 ; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2714 ; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2717 ; VLOPT-LABEL: vmor_mm:
2719 ; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2720 ; VLOPT-NEXT: vmor.mm v8, v0, v8
2721 ; VLOPT-NEXT: vmand.mm v0, v0, v8
2722 ; VLOPT-NEXT: vmv1r.v v8, v9
2723 ; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2724 ; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2726 %1 = call <vscale x 1 x i1> @llvm.riscv.vmor.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1)
2727 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl)
2728 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0)
2729 ret <vscale x 1 x i32> %3
2733 define <vscale x 1 x i32> @vmnor_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) {
2734 ; NOVLOPT-LABEL: vmnor_mm:
2736 ; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma
2737 ; NOVLOPT-NEXT: vmnor.mm v8, v0, v8
2738 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2739 ; NOVLOPT-NEXT: vmand.mm v0, v0, v8
2740 ; NOVLOPT-NEXT: vmv1r.v v8, v9
2741 ; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2742 ; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2745 ; VLOPT-LABEL: vmnor_mm:
2747 ; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2748 ; VLOPT-NEXT: vmnor.mm v8, v0, v8
2749 ; VLOPT-NEXT: vmand.mm v0, v0, v8
2750 ; VLOPT-NEXT: vmv1r.v v8, v9
2751 ; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2752 ; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2754 %1 = call <vscale x 1 x i1> @llvm.riscv.vmnor.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1)
2755 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl)
2756 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0)
2757 ret <vscale x 1 x i32> %3
2760 define <vscale x 1 x i32> @vmorn_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) {
2761 ; NOVLOPT-LABEL: vmorn_mm:
2763 ; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma
2764 ; NOVLOPT-NEXT: vmorn.mm v8, v0, v8
2765 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2766 ; NOVLOPT-NEXT: vmand.mm v0, v0, v8
2767 ; NOVLOPT-NEXT: vmv1r.v v8, v9
2768 ; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2769 ; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2772 ; VLOPT-LABEL: vmorn_mm:
2774 ; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2775 ; VLOPT-NEXT: vmorn.mm v8, v0, v8
2776 ; VLOPT-NEXT: vmand.mm v0, v0, v8
2777 ; VLOPT-NEXT: vmv1r.v v8, v9
2778 ; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2779 ; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2781 %1 = call <vscale x 1 x i1> @llvm.riscv.vmorn.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1)
2782 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl)
2783 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0)
2784 ret <vscale x 1 x i32> %3
2787 define <vscale x 1 x i32> @vmxnor_mm(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i32> %c, iXLen %vl) {
2788 ; NOVLOPT-LABEL: vmxnor_mm:
2790 ; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma
2791 ; NOVLOPT-NEXT: vmxnor.mm v8, v0, v8
2792 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2793 ; NOVLOPT-NEXT: vmand.mm v0, v0, v8
2794 ; NOVLOPT-NEXT: vmv1r.v v8, v9
2795 ; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2796 ; NOVLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2799 ; VLOPT-LABEL: vmxnor_mm:
2801 ; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2802 ; VLOPT-NEXT: vmxnor.mm v8, v0, v8
2803 ; VLOPT-NEXT: vmand.mm v0, v0, v8
2804 ; VLOPT-NEXT: vmv1r.v v8, v9
2805 ; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2806 ; VLOPT-NEXT: vadd.vv v8, v9, v9, v0.t
2808 %1 = call <vscale x 1 x i1> @llvm.riscv.vmxnor.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, iXLen -1)
2809 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl)
2810 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0)
2811 ret <vscale x 1 x i32> %3
2814 define <vscale x 1 x i32> @vmsbf_m(<vscale x 1 x i1> %a, <vscale x 1 x i32> %c, iXLen %vl) {
2815 ; NOVLOPT-LABEL: vmsbf_m:
2817 ; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma
2818 ; NOVLOPT-NEXT: vmsbf.m v9, v0
2819 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2820 ; NOVLOPT-NEXT: vmand.mm v0, v0, v9
2821 ; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2822 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8, v0.t
2825 ; VLOPT-LABEL: vmsbf_m:
2827 ; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2828 ; VLOPT-NEXT: vmsbf.m v9, v0
2829 ; VLOPT-NEXT: vmand.mm v0, v0, v9
2830 ; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2831 ; VLOPT-NEXT: vadd.vv v8, v8, v8, v0.t
2833 %1 = call <vscale x 1 x i1> @llvm.riscv.vmsbf.nxv1i1(<vscale x 1 x i1> %a, iXLen -1)
2834 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl)
2835 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0)
2836 ret <vscale x 1 x i32> %3
2839 define <vscale x 1 x i32> @vmsif_m(<vscale x 1 x i1> %a, <vscale x 1 x i32> %c, iXLen %vl) {
2840 ; NOVLOPT-LABEL: vmsif_m:
2842 ; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma
2843 ; NOVLOPT-NEXT: vmsif.m v9, v0
2844 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2845 ; NOVLOPT-NEXT: vmand.mm v0, v0, v9
2846 ; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2847 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8, v0.t
2850 ; VLOPT-LABEL: vmsif_m:
2852 ; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2853 ; VLOPT-NEXT: vmsif.m v9, v0
2854 ; VLOPT-NEXT: vmand.mm v0, v0, v9
2855 ; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2856 ; VLOPT-NEXT: vadd.vv v8, v8, v8, v0.t
2858 %1 = call <vscale x 1 x i1> @llvm.riscv.vmsif.nxv1i1(<vscale x 1 x i1> %a, iXLen -1)
2859 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl)
2860 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0)
2861 ret <vscale x 1 x i32> %3
2864 define <vscale x 1 x i32> @vmsof_m(<vscale x 1 x i1> %a, <vscale x 1 x i32> %c, iXLen %vl) {
2865 ; NOVLOPT-LABEL: vmsof_m:
2867 ; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, ta, ma
2868 ; NOVLOPT-NEXT: vmsof.m v9, v0
2869 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2870 ; NOVLOPT-NEXT: vmand.mm v0, v0, v9
2871 ; NOVLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2872 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8, v0.t
2875 ; VLOPT-LABEL: vmsof_m:
2877 ; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
2878 ; VLOPT-NEXT: vmsof.m v9, v0
2879 ; VLOPT-NEXT: vmand.mm v0, v0, v9
2880 ; VLOPT-NEXT: vsetvli zero, zero, e32, mf2, tu, mu
2881 ; VLOPT-NEXT: vadd.vv v8, v8, v8, v0.t
2883 %1 = call <vscale x 1 x i1> @llvm.riscv.vmsof.nxv1i1(<vscale x 1 x i1> %a, iXLen -1)
2884 %2 = call <vscale x 1 x i1> @llvm.riscv.vmand.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %1, iXLen %vl)
2885 %3 = call <vscale x 1 x i32> @llvm.riscv.vadd.mask.nxv1i32.nxv1i32(<vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i32> %c, <vscale x 1 x i1> %2, iXLen %vl, iXLen 0)
2886 ret <vscale x 1 x i32> %3
2889 define <vscale x 4 x i32> @viota_m(<vscale x 4 x i1> %a, <vscale x 4 x i32> %c, iXLen %vl) {
2890 ; NOVLOPT-LABEL: viota_m:
2892 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
2893 ; NOVLOPT-NEXT: viota.m v10, v0
2894 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2895 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
2898 ; VLOPT-LABEL: viota_m:
2900 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2901 ; VLOPT-NEXT: viota.m v10, v0
2902 ; VLOPT-NEXT: vadd.vv v8, v10, v8
2904 %1 = call <vscale x 4 x i32> @llvm.riscv.viota.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %a, iXLen -1)
2905 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %c, iXLen %vl)
2906 ret <vscale x 4 x i32> %2
2909 define <vscale x 4 x i32> @vid.v(<vscale x 4 x i32> %c, iXLen %vl) {
2910 ; NOVLOPT-LABEL: vid.v:
2912 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
2913 ; NOVLOPT-NEXT: vid.v v10
2914 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2915 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
2918 ; VLOPT-LABEL: vid.v:
2920 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2921 ; VLOPT-NEXT: vid.v v10
2922 ; VLOPT-NEXT: vadd.vv v8, v10, v8
2924 %1 = call <vscale x 4 x i32> @llvm.riscv.vid.nxv4i32(<vscale x 4 x i32> poison, iXLen -1)
2925 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %c, iXLen %vl)
2926 ret <vscale x 4 x i32> %2
2929 define <vscale x 4 x float> @vfadd_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
2930 ; NOVLOPT-LABEL: vfadd_vv:
2932 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
2933 ; NOVLOPT-NEXT: vfadd.vv v8, v8, v10
2934 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2935 ; NOVLOPT-NEXT: vfadd.vv v8, v8, v10
2938 ; VLOPT-LABEL: vfadd_vv:
2940 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2941 ; VLOPT-NEXT: vfadd.vv v8, v8, v10
2942 ; VLOPT-NEXT: vfadd.vv v8, v8, v10
2944 %1 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1)
2945 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl)
2946 ret <vscale x 4 x float> %2
2949 define <vscale x 4 x float> @vfadd_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
2950 ; NOVLOPT-LABEL: vfadd_vf:
2952 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
2953 ; NOVLOPT-NEXT: vfadd.vf v10, v8, fa0
2954 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2955 ; NOVLOPT-NEXT: vfadd.vv v8, v10, v8
2958 ; VLOPT-LABEL: vfadd_vf:
2960 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2961 ; VLOPT-NEXT: vfadd.vf v10, v8, fa0
2962 ; VLOPT-NEXT: vfadd.vv v8, v10, v8
2964 %1 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1)
2965 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl)
2966 ret <vscale x 4 x float> %2
2969 define <vscale x 4 x float> @vfsub_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
2970 ; NOVLOPT-LABEL: vfsub_vv:
2972 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
2973 ; NOVLOPT-NEXT: vfsub.vv v8, v8, v10
2974 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2975 ; NOVLOPT-NEXT: vfadd.vv v8, v8, v10
2978 ; VLOPT-LABEL: vfsub_vv:
2980 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2981 ; VLOPT-NEXT: vfsub.vv v8, v8, v10
2982 ; VLOPT-NEXT: vfadd.vv v8, v8, v10
2984 %1 = call <vscale x 4 x float> @llvm.riscv.vfsub.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1)
2985 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl)
2986 ret <vscale x 4 x float> %2
2989 define <vscale x 4 x float> @vfsub_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
2990 ; NOVLOPT-LABEL: vfsub_vf:
2992 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
2993 ; NOVLOPT-NEXT: vfsub.vf v10, v8, fa0
2994 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
2995 ; NOVLOPT-NEXT: vfadd.vv v8, v10, v8
2998 ; VLOPT-LABEL: vfsub_vf:
3000 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3001 ; VLOPT-NEXT: vfsub.vf v10, v8, fa0
3002 ; VLOPT-NEXT: vfadd.vv v8, v10, v8
3004 %1 = call <vscale x 4 x float> @llvm.riscv.vfsub.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1)
3005 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl)
3006 ret <vscale x 4 x float> %2
3009 define <vscale x 4 x float> @vfrsub_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3010 ; NOVLOPT-LABEL: vfrsub_vf:
3012 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3013 ; NOVLOPT-NEXT: vfrsub.vf v10, v8, fa0
3014 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3015 ; NOVLOPT-NEXT: vfadd.vv v8, v10, v8
3018 ; VLOPT-LABEL: vfrsub_vf:
3020 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3021 ; VLOPT-NEXT: vfrsub.vf v10, v8, fa0
3022 ; VLOPT-NEXT: vfadd.vv v8, v10, v8
3024 %1 = call <vscale x 4 x float> @llvm.riscv.vfrsub.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1)
3025 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl)
3026 ret <vscale x 4 x float> %2
3029 define <vscale x 4 x double> @vfwadd_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
3030 ; NOVLOPT-LABEL: vfwadd_vv:
3032 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3033 ; NOVLOPT-NEXT: vfwadd.vv v12, v8, v10
3034 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3035 ; NOVLOPT-NEXT: vfadd.vv v8, v12, v12
3038 ; VLOPT-LABEL: vfwadd_vv:
3040 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3041 ; VLOPT-NEXT: vfwadd.vv v12, v8, v10
3042 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3043 ; VLOPT-NEXT: vfadd.vv v8, v12, v12
3045 %1 = call <vscale x 4 x double> @llvm.riscv.vfwadd.nxv4f64.nxv4f32.nxv4f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1)
3046 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3047 ret <vscale x 4 x double> %2
3050 define <vscale x 4 x double> @vfwadd_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3051 ; NOVLOPT-LABEL: vfwadd_vf:
3053 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3054 ; NOVLOPT-NEXT: vfwadd.vf v12, v8, fa0
3055 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3056 ; NOVLOPT-NEXT: vfadd.vv v8, v12, v12
3059 ; VLOPT-LABEL: vfwadd_vf:
3061 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3062 ; VLOPT-NEXT: vfwadd.vf v12, v8, fa0
3063 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3064 ; VLOPT-NEXT: vfadd.vv v8, v12, v12
3066 %1 = call <vscale x 4 x double> @llvm.riscv.vfwadd.nxv4f64.nxv4f32.f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1)
3067 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3068 ret <vscale x 4 x double> %2
3071 define <vscale x 4 x double> @vfwsub_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
3072 ; NOVLOPT-LABEL: vfwsub_vv:
3074 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3075 ; NOVLOPT-NEXT: vfwsub.vv v12, v8, v10
3076 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3077 ; NOVLOPT-NEXT: vfadd.vv v8, v12, v12
3080 ; VLOPT-LABEL: vfwsub_vv:
3082 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3083 ; VLOPT-NEXT: vfwsub.vv v12, v8, v10
3084 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3085 ; VLOPT-NEXT: vfadd.vv v8, v12, v12
3087 %1 = call <vscale x 4 x double> @llvm.riscv.vfwsub.nxv4f64.nxv4f32.nxv4f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1)
3088 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3089 ret <vscale x 4 x double> %2
3092 define <vscale x 4 x double> @vfwsub_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3093 ; NOVLOPT-LABEL: vfwsub_vf:
3095 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3096 ; NOVLOPT-NEXT: vfwsub.vf v12, v8, fa0
3097 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3098 ; NOVLOPT-NEXT: vfadd.vv v8, v12, v12
3101 ; VLOPT-LABEL: vfwsub_vf:
3103 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3104 ; VLOPT-NEXT: vfwsub.vf v12, v8, fa0
3105 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3106 ; VLOPT-NEXT: vfadd.vv v8, v12, v12
3108 %1 = call <vscale x 4 x double> @llvm.riscv.vfwsub.nxv4f64.nxv4f32.f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1)
3109 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3110 ret <vscale x 4 x double> %2
3113 define <vscale x 4 x double> @vfwadd_wv(<vscale x 4 x double> %a, <vscale x 4 x float> %b, iXLen %vl) {
3114 ; NOVLOPT-LABEL: vfwadd_wv:
3116 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3117 ; NOVLOPT-NEXT: vfwadd.wv v8, v8, v12
3118 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3119 ; NOVLOPT-NEXT: vfadd.vv v8, v8, v8
3122 ; VLOPT-LABEL: vfwadd_wv:
3124 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3125 ; VLOPT-NEXT: vfwadd.wv v8, v8, v12
3126 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3127 ; VLOPT-NEXT: vfadd.vv v8, v8, v8
3129 %1 = call <vscale x 4 x double> @llvm.riscv.vfwadd.w.nxv4f64.nxv4f32.nxv4f32(<vscale x 4 x double> poison, <vscale x 4 x double> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1)
3130 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3131 ret <vscale x 4 x double> %2
3134 define <vscale x 4 x double> @vfwadd_wf(<vscale x 4 x double> %a, float %b, iXLen %vl) {
3135 ; NOVLOPT-LABEL: vfwadd_wf:
3137 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3138 ; NOVLOPT-NEXT: vfwadd.wf v8, v8, fa0
3139 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3140 ; NOVLOPT-NEXT: vfadd.vv v8, v8, v8
3143 ; VLOPT-LABEL: vfwadd_wf:
3145 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3146 ; VLOPT-NEXT: vfwadd.wf v8, v8, fa0
3147 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3148 ; VLOPT-NEXT: vfadd.vv v8, v8, v8
3150 %1 = call <vscale x 4 x double> @llvm.riscv.vfwadd.w.nxv4f64.nxv4f32.f32(<vscale x 4 x double> poison, <vscale x 4 x double> %a, float %b, iXLen 7, iXLen -1)
3151 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3152 ret <vscale x 4 x double> %2
3155 define <vscale x 4 x double> @vfwsub_wv(<vscale x 4 x double> %a, <vscale x 4 x float> %b, iXLen %vl) {
3156 ; NOVLOPT-LABEL: vfwsub_wv:
3158 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3159 ; NOVLOPT-NEXT: vfwsub.wv v8, v8, v12
3160 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3161 ; NOVLOPT-NEXT: vfadd.vv v8, v8, v8
3164 ; VLOPT-LABEL: vfwsub_wv:
3166 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3167 ; VLOPT-NEXT: vfwsub.wv v8, v8, v12
3168 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3169 ; VLOPT-NEXT: vfadd.vv v8, v8, v8
3171 %1 = call <vscale x 4 x double> @llvm.riscv.vfwsub.w.nxv4f64.nxv4f32.nxv4f32(<vscale x 4 x double> poison, <vscale x 4 x double> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1)
3172 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3173 ret <vscale x 4 x double> %2
3176 define <vscale x 4 x double> @vfwsub_wf(<vscale x 4 x double> %a, float %b, iXLen %vl) {
3177 ; NOVLOPT-LABEL: vfwsub_wf:
3179 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3180 ; NOVLOPT-NEXT: vfwsub.wf v8, v8, fa0
3181 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3182 ; NOVLOPT-NEXT: vfadd.vv v8, v8, v8
3185 ; VLOPT-LABEL: vfwsub_wf:
3187 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3188 ; VLOPT-NEXT: vfwsub.wf v8, v8, fa0
3189 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3190 ; VLOPT-NEXT: vfadd.vv v8, v8, v8
3192 %1 = call <vscale x 4 x double> @llvm.riscv.vfwsub.w.nxv4f64.nxv4f32.f32(<vscale x 4 x double> poison, <vscale x 4 x double> %a, float %b, iXLen 7, iXLen -1)
3193 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3194 ret <vscale x 4 x double> %2
3197 define <vscale x 4 x float> @vfmul_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
3198 ; NOVLOPT-LABEL: vfmul_vv:
3200 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3201 ; NOVLOPT-NEXT: vfmul.vv v8, v8, v10
3202 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3203 ; NOVLOPT-NEXT: vfadd.vv v8, v8, v10
3206 ; VLOPT-LABEL: vfmul_vv:
3208 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3209 ; VLOPT-NEXT: vfmul.vv v8, v8, v10
3210 ; VLOPT-NEXT: vfadd.vv v8, v8, v10
3212 %1 = call <vscale x 4 x float> @llvm.riscv.vfmul.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1)
3213 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl)
3214 ret <vscale x 4 x float> %2
3217 define <vscale x 4 x float> @vfmul_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3218 ; NOVLOPT-LABEL: vfmul_vf:
3220 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3221 ; NOVLOPT-NEXT: vfmul.vf v10, v8, fa0
3222 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3223 ; NOVLOPT-NEXT: vfadd.vv v8, v10, v8
3226 ; VLOPT-LABEL: vfmul_vf:
3228 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3229 ; VLOPT-NEXT: vfmul.vf v10, v8, fa0
3230 ; VLOPT-NEXT: vfadd.vv v8, v10, v8
3232 %1 = call <vscale x 4 x float> @llvm.riscv.vfmul.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1)
3233 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl)
3234 ret <vscale x 4 x float> %2
3237 define <vscale x 4 x float> @vfdiv_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
3238 ; NOVLOPT-LABEL: vfdiv_vv:
3240 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3241 ; NOVLOPT-NEXT: vfdiv.vv v8, v8, v10
3242 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3243 ; NOVLOPT-NEXT: vfadd.vv v8, v8, v10
3246 ; VLOPT-LABEL: vfdiv_vv:
3248 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3249 ; VLOPT-NEXT: vfdiv.vv v8, v8, v10
3250 ; VLOPT-NEXT: vfadd.vv v8, v8, v10
3252 %1 = call <vscale x 4 x float> @llvm.riscv.vfdiv.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1)
3253 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl)
3254 ret <vscale x 4 x float> %2
3257 define <vscale x 4 x float> @vfdiv_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3258 ; NOVLOPT-LABEL: vfdiv_vf:
3260 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3261 ; NOVLOPT-NEXT: vfdiv.vf v10, v8, fa0
3262 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3263 ; NOVLOPT-NEXT: vfadd.vv v8, v10, v8
3266 ; VLOPT-LABEL: vfdiv_vf:
3268 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3269 ; VLOPT-NEXT: vfdiv.vf v10, v8, fa0
3270 ; VLOPT-NEXT: vfadd.vv v8, v10, v8
3272 %1 = call <vscale x 4 x float> @llvm.riscv.vfdiv.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1)
3273 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl)
3274 ret <vscale x 4 x float> %2
3277 define <vscale x 4 x float> @vfrdiv_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3278 ; NOVLOPT-LABEL: vfrdiv_vf:
3280 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3281 ; NOVLOPT-NEXT: vfrdiv.vf v10, v8, fa0
3282 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3283 ; NOVLOPT-NEXT: vfadd.vv v8, v10, v8
3286 ; VLOPT-LABEL: vfrdiv_vf:
3288 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3289 ; VLOPT-NEXT: vfrdiv.vf v10, v8, fa0
3290 ; VLOPT-NEXT: vfadd.vv v8, v10, v8
3292 %1 = call <vscale x 4 x float> @llvm.riscv.vfrdiv.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1)
3293 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl)
3294 ret <vscale x 4 x float> %2
3297 define <vscale x 4 x double> @vfwmul_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
3298 ; NOVLOPT-LABEL: vfwmul_vv:
3300 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3301 ; NOVLOPT-NEXT: vfwmul.vv v12, v8, v10
3302 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3303 ; NOVLOPT-NEXT: vfadd.vv v8, v12, v12
3306 ; VLOPT-LABEL: vfwmul_vv:
3308 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3309 ; VLOPT-NEXT: vfwmul.vv v12, v8, v10
3310 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3311 ; VLOPT-NEXT: vfadd.vv v8, v12, v12
3313 %1 = call <vscale x 4 x double> @llvm.riscv.vfwmul.nxv4f64.nxv4f32.nxv4f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen 7, iXLen -1)
3314 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3315 ret <vscale x 4 x double> %2
3318 define <vscale x 4 x double> @vfwmul_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3319 ; NOVLOPT-LABEL: vfwmul_vf:
3321 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3322 ; NOVLOPT-NEXT: vfwmul.vf v12, v8, fa0
3323 ; NOVLOPT-NEXT: vsetvli zero, a0, e64, m4, ta, ma
3324 ; NOVLOPT-NEXT: vfadd.vv v8, v12, v12
3327 ; VLOPT-LABEL: vfwmul_vf:
3329 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3330 ; VLOPT-NEXT: vfwmul.vf v12, v8, fa0
3331 ; VLOPT-NEXT: vsetvli zero, zero, e64, m4, ta, ma
3332 ; VLOPT-NEXT: vfadd.vv v8, v12, v12
3334 %1 = call <vscale x 4 x double> @llvm.riscv.vfwmul.nxv4f64.nxv4f32.f32(<vscale x 4 x double> poison, <vscale x 4 x float> %a, float %b, iXLen 7, iXLen -1)
3335 %2 = call <vscale x 4 x double> @llvm.riscv.vfadd.nxv4f64.nxv4f64(<vscale x 4 x double> poison, <vscale x 4 x double> %1, <vscale x 4 x double> %1, iXLen 7, iXLen %vl)
3336 ret <vscale x 4 x double> %2
3339 define <vscale x 4 x i1> @vmfeq_vf(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, float%c, iXLen %vl) {
3340 ; NOVLOPT-LABEL: vmfeq_vf:
3342 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3343 ; NOVLOPT-NEXT: vmfeq.vf v10, v8, fa0
3344 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
3345 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
3348 ; VLOPT-LABEL: vmfeq_vf:
3350 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3351 ; VLOPT-NEXT: vmfeq.vf v10, v8, fa0
3352 ; VLOPT-NEXT: vmand.mm v0, v10, v0
3354 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfeq.nxv4f32.f32(<vscale x 4 x float> %a, float %c, iXLen -1)
3355 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
3356 ret <vscale x 4 x i1> %2
3359 define <vscale x 4 x i1> @vmfeq_vv(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, <vscale x 4 x float> %c, iXLen %vl) {
3360 ; NOVLOPT-LABEL: vmfeq_vv:
3362 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3363 ; NOVLOPT-NEXT: vmfeq.vv v12, v8, v10
3364 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
3365 ; NOVLOPT-NEXT: vmand.mm v0, v12, v0
3368 ; VLOPT-LABEL: vmfeq_vv:
3370 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3371 ; VLOPT-NEXT: vmfeq.vv v12, v8, v10
3372 ; VLOPT-NEXT: vmand.mm v0, v12, v0
3374 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfeq.nxv4f32.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %c, iXLen -1)
3375 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
3376 ret <vscale x 4 x i1> %2
3379 define <vscale x 4 x i1> @vmfne_vf(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, float%c, iXLen %vl) {
3380 ; NOVLOPT-LABEL: vmfne_vf:
3382 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3383 ; NOVLOPT-NEXT: vmfne.vf v10, v8, fa0
3384 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
3385 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
3388 ; VLOPT-LABEL: vmfne_vf:
3390 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3391 ; VLOPT-NEXT: vmfne.vf v10, v8, fa0
3392 ; VLOPT-NEXT: vmand.mm v0, v10, v0
3394 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfne.nxv4f32.f32(<vscale x 4 x float> %a, float %c, iXLen -1)
3395 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
3396 ret <vscale x 4 x i1> %2
3399 define <vscale x 4 x i1> @vmfne_vv(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, <vscale x 4 x float> %c, iXLen %vl) {
3400 ; NOVLOPT-LABEL: vmfne_vv:
3402 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3403 ; NOVLOPT-NEXT: vmfne.vv v12, v8, v10
3404 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
3405 ; NOVLOPT-NEXT: vmand.mm v0, v12, v0
3408 ; VLOPT-LABEL: vmfne_vv:
3410 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3411 ; VLOPT-NEXT: vmfne.vv v12, v8, v10
3412 ; VLOPT-NEXT: vmand.mm v0, v12, v0
3414 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfne.nxv4f32.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %c, iXLen -1)
3415 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
3416 ret <vscale x 4 x i1> %2
3419 define <vscale x 4 x i1> @vmflt_vf(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, float%c, iXLen %vl) {
3420 ; NOVLOPT-LABEL: vmflt_vf:
3422 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3423 ; NOVLOPT-NEXT: vmflt.vf v10, v8, fa0
3424 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
3425 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
3428 ; VLOPT-LABEL: vmflt_vf:
3430 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3431 ; VLOPT-NEXT: vmflt.vf v10, v8, fa0
3432 ; VLOPT-NEXT: vmand.mm v0, v10, v0
3434 %1 = call <vscale x 4 x i1> @llvm.riscv.vmflt.nxv4f32.f32(<vscale x 4 x float> %a, float %c, iXLen -1)
3435 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
3436 ret <vscale x 4 x i1> %2
3439 define <vscale x 4 x i1> @vmflt_vv(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, <vscale x 4 x float> %c, iXLen %vl) {
3440 ; NOVLOPT-LABEL: vmflt_vv:
3442 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3443 ; NOVLOPT-NEXT: vmflt.vv v12, v8, v10
3444 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
3445 ; NOVLOPT-NEXT: vmand.mm v0, v12, v0
3448 ; VLOPT-LABEL: vmflt_vv:
3450 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3451 ; VLOPT-NEXT: vmflt.vv v12, v8, v10
3452 ; VLOPT-NEXT: vmand.mm v0, v12, v0
3454 %1 = call <vscale x 4 x i1> @llvm.riscv.vmflt.nxv4f32.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %c, iXLen -1)
3455 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
3456 ret <vscale x 4 x i1> %2
3459 define <vscale x 4 x i1> @vmfle_vf(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, float%c, iXLen %vl) {
3460 ; NOVLOPT-LABEL: vmfle_vf:
3462 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3463 ; NOVLOPT-NEXT: vmfle.vf v10, v8, fa0
3464 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
3465 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
3468 ; VLOPT-LABEL: vmfle_vf:
3470 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3471 ; VLOPT-NEXT: vmfle.vf v10, v8, fa0
3472 ; VLOPT-NEXT: vmand.mm v0, v10, v0
3474 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfle.nxv4f32.f32(<vscale x 4 x float> %a, float %c, iXLen -1)
3475 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
3476 ret <vscale x 4 x i1> %2
3479 define <vscale x 4 x i1> @vmfle_vv(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, <vscale x 4 x float> %c, iXLen %vl) {
3480 ; NOVLOPT-LABEL: vmfle_vv:
3482 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3483 ; NOVLOPT-NEXT: vmfle.vv v12, v8, v10
3484 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
3485 ; NOVLOPT-NEXT: vmand.mm v0, v12, v0
3488 ; VLOPT-LABEL: vmfle_vv:
3490 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3491 ; VLOPT-NEXT: vmfle.vv v12, v8, v10
3492 ; VLOPT-NEXT: vmand.mm v0, v12, v0
3494 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfle.nxv4f32.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %c, iXLen -1)
3495 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
3496 ret <vscale x 4 x i1> %2
3499 define <vscale x 4 x i1> @vmfgt_vf(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, float%c, iXLen %vl) {
3500 ; NOVLOPT-LABEL: vmfgt_vf:
3502 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3503 ; NOVLOPT-NEXT: vmfgt.vf v10, v8, fa0
3504 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
3505 ; NOVLOPT-NEXT: vmand.mm v0, v10, v0
3508 ; VLOPT-LABEL: vmfgt_vf:
3510 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3511 ; VLOPT-NEXT: vmfgt.vf v10, v8, fa0
3512 ; VLOPT-NEXT: vmand.mm v0, v10, v0
3514 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfgt.nxv4f32.f32(<vscale x 4 x float> %a, float %c, iXLen -1)
3515 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
3516 ret <vscale x 4 x i1> %2
3519 define <vscale x 4 x i1> @vmfgt_vv(<vscale x 4 x float> %a, <vscale x 4 x i1> %b, <vscale x 4 x float> %c, iXLen %vl) {
3520 ; NOVLOPT-LABEL: vmfgt_vv:
3522 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3523 ; NOVLOPT-NEXT: vmflt.vv v12, v10, v8
3524 ; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
3525 ; NOVLOPT-NEXT: vmand.mm v0, v12, v0
3528 ; VLOPT-LABEL: vmfgt_vv:
3530 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3531 ; VLOPT-NEXT: vmflt.vv v12, v10, v8
3532 ; VLOPT-NEXT: vmand.mm v0, v12, v0
3534 %1 = call <vscale x 4 x i1> @llvm.riscv.vmfgt.nxv4f32.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %c, iXLen -1)
3535 %2 = call <vscale x 4 x i1> @llvm.riscv.vmand.nxv4i1(<vscale x 4 x i1> %1, <vscale x 4 x i1> %b, iXLen %vl)
3536 ret <vscale x 4 x i1> %2
3539 define <vscale x 4 x i32> @vmerge_vvm(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %c, iXLen %vl) {
3540 ; NOVLOPT-LABEL: vmerge_vvm:
3542 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3543 ; NOVLOPT-NEXT: vmerge.vvm v8, v8, v10, v0
3544 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3545 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
3548 ; VLOPT-LABEL: vmerge_vvm:
3550 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3551 ; VLOPT-NEXT: vmerge.vvm v8, v8, v10, v0
3552 ; VLOPT-NEXT: vadd.vv v8, v8, v10
3554 %1 = call <vscale x 4 x i32> @llvm.riscv.vmerge.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %c, iXLen -1)
3555 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
3556 ret <vscale x 4 x i32> %2
3559 define <vscale x 4 x i32> @vmerge_vxm(<vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i1> %c, iXLen %vl) {
3560 ; NOVLOPT-LABEL: vmerge_vxm:
3562 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3563 ; NOVLOPT-NEXT: vmerge.vxm v8, v8, a0, v0
3564 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3565 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
3568 ; VLOPT-LABEL: vmerge_vxm:
3570 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3571 ; VLOPT-NEXT: vmerge.vxm v8, v8, a0, v0
3572 ; VLOPT-NEXT: vadd.vv v8, v8, v8
3574 %1 = call <vscale x 4 x i32> @llvm.riscv.vmerge.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i1> %c, iXLen -1)
3575 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl)
3576 ret <vscale x 4 x i32> %2
3579 define <vscale x 4 x i32> @vmerge_vim(<vscale x 4 x i32> %a, <vscale x 4 x i1> %c, iXLen %vl) {
3580 ; NOVLOPT-LABEL: vmerge_vim:
3582 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3583 ; NOVLOPT-NEXT: vmerge.vim v8, v8, 9, v0
3584 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3585 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
3588 ; VLOPT-LABEL: vmerge_vim:
3590 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3591 ; VLOPT-NEXT: vmerge.vim v8, v8, 9, v0
3592 ; VLOPT-NEXT: vadd.vv v8, v8, v8
3594 %1 = call <vscale x 4 x i32> @llvm.riscv.vmerge.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 9, <vscale x 4 x i1> %c, iXLen -1)
3595 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl)
3596 ret <vscale x 4 x i32> %2
3599 define <vscale x 4 x i32> @vadc_vvm(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %c, iXLen %vl) {
3600 ; NOVLOPT-LABEL: vadc_vvm:
3602 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3603 ; NOVLOPT-NEXT: vadc.vvm v8, v8, v10, v0
3604 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3605 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
3608 ; VLOPT-LABEL: vadc_vvm:
3610 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3611 ; VLOPT-NEXT: vadc.vvm v8, v8, v10, v0
3612 ; VLOPT-NEXT: vadd.vv v8, v8, v10
3614 %1 = call <vscale x 4 x i32> @llvm.riscv.vadc.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %c, iXLen -1)
3615 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
3616 ret <vscale x 4 x i32> %2
3619 define <vscale x 4 x i32> @vadc_vxm(<vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i1> %c, iXLen %vl) {
3620 ; NOVLOPT-LABEL: vadc_vxm:
3622 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3623 ; NOVLOPT-NEXT: vadc.vxm v8, v8, a0, v0
3624 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3625 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
3628 ; VLOPT-LABEL: vadc_vxm:
3630 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3631 ; VLOPT-NEXT: vadc.vxm v8, v8, a0, v0
3632 ; VLOPT-NEXT: vadd.vv v8, v8, v8
3634 %1 = call <vscale x 4 x i32> @llvm.riscv.vadc.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i1> %c, iXLen -1)
3635 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl)
3636 ret <vscale x 4 x i32> %2
3639 define <vscale x 4 x i32> @vadc_vim(<vscale x 4 x i32> %a, <vscale x 4 x i1> %c, iXLen %vl) {
3640 ; NOVLOPT-LABEL: vadc_vim:
3642 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3643 ; NOVLOPT-NEXT: vadc.vim v8, v8, 9, v0
3644 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3645 ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
3648 ; VLOPT-LABEL: vadc_vim:
3650 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3651 ; VLOPT-NEXT: vadc.vim v8, v8, 9, v0
3652 ; VLOPT-NEXT: vadd.vv v8, v8, v8
3654 %1 = call <vscale x 4 x i32> @llvm.riscv.vadc.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 9, <vscale x 4 x i1> %c, iXLen -1)
3655 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %1, iXLen %vl)
3656 ret <vscale x 4 x i32> %2
3659 define <vscale x 4 x i32> @vaadd_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
3660 ; NOVLOPT-LABEL: vaadd_vv:
3662 ; NOVLOPT-NEXT: csrwi vxrm, 0
3663 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3664 ; NOVLOPT-NEXT: vaadd.vv v8, v8, v10
3665 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3666 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
3669 ; VLOPT-LABEL: vaadd_vv:
3671 ; VLOPT-NEXT: csrwi vxrm, 0
3672 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3673 ; VLOPT-NEXT: vaadd.vv v8, v8, v10
3674 ; VLOPT-NEXT: vadd.vv v8, v8, v10
3676 %1 = call <vscale x 4 x i32> @llvm.riscv.vaadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen 0, iXLen -1)
3677 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
3678 ret <vscale x 4 x i32> %2
3681 define <vscale x 4 x i32> @vaadd_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
3682 ; NOVLOPT-LABEL: vaadd_vx:
3684 ; NOVLOPT-NEXT: csrwi vxrm, 0
3685 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3686 ; NOVLOPT-NEXT: vaadd.vx v10, v8, a0
3687 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3688 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
3691 ; VLOPT-LABEL: vaadd_vx:
3693 ; VLOPT-NEXT: csrwi vxrm, 0
3694 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3695 ; VLOPT-NEXT: vaadd.vx v10, v8, a0
3696 ; VLOPT-NEXT: vadd.vv v8, v10, v8
3698 %1 = call <vscale x 4 x i32> @llvm.riscv.vaadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen 0, iXLen -1)
3699 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
3700 ret <vscale x 4 x i32> %2
3703 define <vscale x 4 x i32> @vasub_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
3704 ; NOVLOPT-LABEL: vasub_vv:
3706 ; NOVLOPT-NEXT: csrwi vxrm, 0
3707 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3708 ; NOVLOPT-NEXT: vasub.vv v8, v8, v10
3709 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3710 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
3713 ; VLOPT-LABEL: vasub_vv:
3715 ; VLOPT-NEXT: csrwi vxrm, 0
3716 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3717 ; VLOPT-NEXT: vasub.vv v8, v8, v10
3718 ; VLOPT-NEXT: vadd.vv v8, v8, v10
3720 %1 = call <vscale x 4 x i32> @llvm.riscv.vasub.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen 0, iXLen -1)
3721 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
3722 ret <vscale x 4 x i32> %2
3725 define <vscale x 4 x i32> @vasub_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
3726 ; NOVLOPT-LABEL: vasub_vx:
3728 ; NOVLOPT-NEXT: csrwi vxrm, 0
3729 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3730 ; NOVLOPT-NEXT: vasub.vx v10, v8, a0
3731 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3732 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
3735 ; VLOPT-LABEL: vasub_vx:
3737 ; VLOPT-NEXT: csrwi vxrm, 0
3738 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3739 ; VLOPT-NEXT: vasub.vx v10, v8, a0
3740 ; VLOPT-NEXT: vadd.vv v8, v10, v8
3742 %1 = call <vscale x 4 x i32> @llvm.riscv.vasub.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen 0, iXLen -1)
3743 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
3744 ret <vscale x 4 x i32> %2
3747 define <vscale x 4 x i32> @vaaddu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
3748 ; NOVLOPT-LABEL: vaaddu_vv:
3750 ; NOVLOPT-NEXT: csrwi vxrm, 0
3751 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3752 ; NOVLOPT-NEXT: vaaddu.vv v8, v8, v10
3753 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3754 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
3757 ; VLOPT-LABEL: vaaddu_vv:
3759 ; VLOPT-NEXT: csrwi vxrm, 0
3760 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3761 ; VLOPT-NEXT: vaaddu.vv v8, v8, v10
3762 ; VLOPT-NEXT: vadd.vv v8, v8, v10
3764 %1 = call <vscale x 4 x i32> @llvm.riscv.vaaddu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen 0, iXLen -1)
3765 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
3766 ret <vscale x 4 x i32> %2
3769 define <vscale x 4 x i32> @vaaddu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
3770 ; NOVLOPT-LABEL: vaaddu_vx:
3772 ; NOVLOPT-NEXT: csrwi vxrm, 0
3773 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3774 ; NOVLOPT-NEXT: vaaddu.vx v10, v8, a0
3775 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3776 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
3779 ; VLOPT-LABEL: vaaddu_vx:
3781 ; VLOPT-NEXT: csrwi vxrm, 0
3782 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3783 ; VLOPT-NEXT: vaaddu.vx v10, v8, a0
3784 ; VLOPT-NEXT: vadd.vv v8, v10, v8
3786 %1 = call <vscale x 4 x i32> @llvm.riscv.vaaddu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen 0, iXLen -1)
3787 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
3788 ret <vscale x 4 x i32> %2
3791 define <vscale x 4 x i32> @vasubu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
3792 ; NOVLOPT-LABEL: vasubu_vv:
3794 ; NOVLOPT-NEXT: csrwi vxrm, 0
3795 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3796 ; NOVLOPT-NEXT: vasubu.vv v8, v8, v10
3797 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3798 ; NOVLOPT-NEXT: vadd.vv v8, v8, v10
3801 ; VLOPT-LABEL: vasubu_vv:
3803 ; VLOPT-NEXT: csrwi vxrm, 0
3804 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3805 ; VLOPT-NEXT: vasubu.vv v8, v8, v10
3806 ; VLOPT-NEXT: vadd.vv v8, v8, v10
3808 %1 = call <vscale x 4 x i32> @llvm.riscv.vasubu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen 0, iXLen -1)
3809 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
3810 ret <vscale x 4 x i32> %2
3813 define <vscale x 4 x i32> @vasubu_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
3814 ; NOVLOPT-LABEL: vasubu_vx:
3816 ; NOVLOPT-NEXT: csrwi vxrm, 0
3817 ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3818 ; NOVLOPT-NEXT: vasubu.vx v10, v8, a0
3819 ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3820 ; NOVLOPT-NEXT: vadd.vv v8, v10, v8
3823 ; VLOPT-LABEL: vasubu_vx:
3825 ; VLOPT-NEXT: csrwi vxrm, 0
3826 ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3827 ; VLOPT-NEXT: vasubu.vx v10, v8, a0
3828 ; VLOPT-NEXT: vadd.vv v8, v10, v8
3830 %1 = call <vscale x 4 x i32> @llvm.riscv.vasubu.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %b, iXLen 0, iXLen -1)
3831 %2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
3832 ret <vscale x 4 x i32> %2
3835 define <vscale x 4 x float> @vfmax_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
3836 ; NOVLOPT-LABEL: vfmax_vv:
3838 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3839 ; NOVLOPT-NEXT: vfmax.vv v8, v8, v10
3840 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3841 ; NOVLOPT-NEXT: vfadd.vv v8, v8, v10
3844 ; VLOPT-LABEL: vfmax_vv:
3846 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3847 ; VLOPT-NEXT: vfmax.vv v8, v8, v10
3848 ; VLOPT-NEXT: vfadd.vv v8, v8, v10
3850 %1 = call <vscale x 4 x float> @llvm.riscv.vfmax.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen -1)
3851 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl)
3852 ret <vscale x 4 x float> %2
3855 define <vscale x 4 x float> @vfmax_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3856 ; NOVLOPT-LABEL: vfmax_vf:
3858 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3859 ; NOVLOPT-NEXT: vfmax.vf v10, v8, fa0
3860 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3861 ; NOVLOPT-NEXT: vfadd.vv v8, v10, v8
3864 ; VLOPT-LABEL: vfmax_vf:
3866 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3867 ; VLOPT-NEXT: vfmax.vf v10, v8, fa0
3868 ; VLOPT-NEXT: vfadd.vv v8, v10, v8
3870 %1 = call <vscale x 4 x float> @llvm.riscv.vfmax.nxv4f32.f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen -1)
3871 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl)
3872 ret <vscale x 4 x float> %2
3875 define <vscale x 4 x float> @vfmin_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
3876 ; NOVLOPT-LABEL: vfmin_vv:
3878 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3879 ; NOVLOPT-NEXT: vfmin.vv v8, v8, v10
3880 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3881 ; NOVLOPT-NEXT: vfadd.vv v8, v8, v10
3884 ; VLOPT-LABEL: vfmin_vv:
3886 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3887 ; VLOPT-NEXT: vfmin.vv v8, v8, v10
3888 ; VLOPT-NEXT: vfadd.vv v8, v8, v10
3890 %1 = call <vscale x 4 x float> @llvm.riscv.vfmin.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen -1)
3891 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl)
3892 ret <vscale x 4 x float> %2
3895 define <vscale x 4 x float> @vfmin_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3896 ; NOVLOPT-LABEL: vfmin_vf:
3898 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3899 ; NOVLOPT-NEXT: vfmin.vf v10, v8, fa0
3900 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3901 ; NOVLOPT-NEXT: vfadd.vv v8, v10, v8
3904 ; VLOPT-LABEL: vfmin_vf:
3906 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3907 ; VLOPT-NEXT: vfmin.vf v10, v8, fa0
3908 ; VLOPT-NEXT: vfadd.vv v8, v10, v8
3910 %1 = call <vscale x 4 x float> @llvm.riscv.vfmin.nxv4f32.f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen -1)
3911 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl)
3912 ret <vscale x 4 x float> %2
3915 define <vscale x 4 x float> @vfsgnj_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
3916 ; NOVLOPT-LABEL: vfsgnj_vv:
3918 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3919 ; NOVLOPT-NEXT: vfsgnj.vv v8, v8, v10
3920 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3921 ; NOVLOPT-NEXT: vfadd.vv v8, v8, v10
3924 ; VLOPT-LABEL: vfsgnj_vv:
3926 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3927 ; VLOPT-NEXT: vfsgnj.vv v8, v8, v10
3928 ; VLOPT-NEXT: vfadd.vv v8, v8, v10
3930 %1 = call <vscale x 4 x float> @llvm.riscv.vfsgnj.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen -1)
3931 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl)
3932 ret <vscale x 4 x float> %2
3935 define <vscale x 4 x float> @vfsgnj_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3936 ; NOVLOPT-LABEL: vfsgnj_vf:
3938 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3939 ; NOVLOPT-NEXT: vfsgnj.vf v10, v8, fa0
3940 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3941 ; NOVLOPT-NEXT: vfadd.vv v8, v10, v8
3944 ; VLOPT-LABEL: vfsgnj_vf:
3946 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3947 ; VLOPT-NEXT: vfsgnj.vf v10, v8, fa0
3948 ; VLOPT-NEXT: vfadd.vv v8, v10, v8
3950 %1 = call <vscale x 4 x float> @llvm.riscv.vfsgnj.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen -1)
3951 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl)
3952 ret <vscale x 4 x float> %2
3955 define <vscale x 4 x float> @vfsgnjn_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
3956 ; NOVLOPT-LABEL: vfsgnjn_vv:
3958 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3959 ; NOVLOPT-NEXT: vfsgnjn.vv v8, v8, v10
3960 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3961 ; NOVLOPT-NEXT: vfadd.vv v8, v8, v10
3964 ; VLOPT-LABEL: vfsgnjn_vv:
3966 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3967 ; VLOPT-NEXT: vfsgnjn.vv v8, v8, v10
3968 ; VLOPT-NEXT: vfadd.vv v8, v8, v10
3970 %1 = call <vscale x 4 x float> @llvm.riscv.vfsgnjn.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen -1)
3971 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl)
3972 ret <vscale x 4 x float> %2
3975 define <vscale x 4 x float> @vfsgnjn_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
3976 ; NOVLOPT-LABEL: vfsgnjn_vf:
3978 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3979 ; NOVLOPT-NEXT: vfsgnjn.vf v10, v8, fa0
3980 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3981 ; NOVLOPT-NEXT: vfadd.vv v8, v10, v8
3984 ; VLOPT-LABEL: vfsgnjn_vf:
3986 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3987 ; VLOPT-NEXT: vfsgnjn.vf v10, v8, fa0
3988 ; VLOPT-NEXT: vfadd.vv v8, v10, v8
3990 %1 = call <vscale x 4 x float> @llvm.riscv.vfsgnjn.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen -1)
3991 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl)
3992 ret <vscale x 4 x float> %2
3995 define <vscale x 4 x float> @vfsgnjx_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen %vl) {
3996 ; NOVLOPT-LABEL: vfsgnjx_vv:
3998 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3999 ; NOVLOPT-NEXT: vfsgnjx.vv v8, v8, v10
4000 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
4001 ; NOVLOPT-NEXT: vfadd.vv v8, v8, v10
4004 ; VLOPT-LABEL: vfsgnjx_vv:
4006 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
4007 ; VLOPT-NEXT: vfsgnjx.vv v8, v8, v10
4008 ; VLOPT-NEXT: vfadd.vv v8, v8, v10
4010 %1 = call <vscale x 4 x float> @llvm.riscv.vfsgnjx.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, <vscale x 4 x float> %b, iXLen -1)
4011 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %b, iXLen 7, iXLen %vl)
4012 ret <vscale x 4 x float> %2
4015 define <vscale x 4 x float> @vfsgnjx_vf(<vscale x 4 x float> %a, float %b, iXLen %vl) {
4016 ; NOVLOPT-LABEL: vfsgnjx_vf:
4018 ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
4019 ; NOVLOPT-NEXT: vfsgnjx.vf v10, v8, fa0
4020 ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
4021 ; NOVLOPT-NEXT: vfadd.vv v8, v10, v8
4024 ; VLOPT-LABEL: vfsgnjx_vf:
4026 ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
4027 ; VLOPT-NEXT: vfsgnjx.vf v10, v8, fa0
4028 ; VLOPT-NEXT: vfadd.vv v8, v10, v8
4030 %1 = call <vscale x 4 x float> @llvm.riscv.vfsgnjx.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %a, float %b, iXLen -1)
4031 %2 = call <vscale x 4 x float> @llvm.riscv.vfadd.nxv4f32.nxv4f32(<vscale x 4 x float> poison, <vscale x 4 x float> %1, <vscale x 4 x float> %a, iXLen 7, iXLen %vl)
4032 ret <vscale x 4 x float> %2