[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vl-opt-instrs.ll
blob163166c1df7434b7a46b6ea96140794dcb1e99ac
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:
11 ; NOVLOPT:       # %bb.0:
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
16 ; NOVLOPT-NEXT:    ret
18 ; VLOPT-LABEL: vadd_vi:
19 ; VLOPT:       # %bb.0:
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
23 ; VLOPT-NEXT:    ret
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:
31 ; NOVLOPT:       # %bb.0:
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
36 ; NOVLOPT-NEXT:    ret
38 ; VLOPT-LABEL: vadd_vv:
39 ; VLOPT:       # %bb.0:
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
43 ; VLOPT-NEXT:    ret
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:
51 ; NOVLOPT:       # %bb.0:
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
56 ; NOVLOPT-NEXT:    ret
58 ; VLOPT-LABEL: vadd_vx:
59 ; VLOPT:       # %bb.0:
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
63 ; VLOPT-NEXT:    ret
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:
71 ; NOVLOPT:       # %bb.0:
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
76 ; NOVLOPT-NEXT:    ret
78 ; VLOPT-LABEL: vsub_vv:
79 ; VLOPT:       # %bb.0:
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
83 ; VLOPT-NEXT:    ret
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:
91 ; NOVLOPT:       # %bb.0:
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
96 ; NOVLOPT-NEXT:    ret
98 ; VLOPT-LABEL: vsub_vx:
99 ; VLOPT:       # %bb.0:
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
103 ; VLOPT-NEXT:    ret
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:
111 ; NOVLOPT:       # %bb.0:
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
116 ; NOVLOPT-NEXT:    ret
118 ; VLOPT-LABEL: vrsub_vi:
119 ; VLOPT:       # %bb.0:
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
123 ; VLOPT-NEXT:    ret
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:
131 ; NOVLOPT:       # %bb.0:
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
136 ; NOVLOPT-NEXT:    ret
138 ; VLOPT-LABEL: vrsub_vx:
139 ; VLOPT:       # %bb.0:
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
143 ; VLOPT-NEXT:    ret
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:
151 ; NOVLOPT:       # %bb.0:
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
156 ; NOVLOPT-NEXT:    ret
158 ; VLOPT-LABEL: vand_vi:
159 ; VLOPT:       # %bb.0:
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
163 ; VLOPT-NEXT:    ret
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:
171 ; NOVLOPT:       # %bb.0:
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
176 ; NOVLOPT-NEXT:    ret
178 ; VLOPT-LABEL: vand_vv:
179 ; VLOPT:       # %bb.0:
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
183 ; VLOPT-NEXT:    ret
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:
191 ; NOVLOPT:       # %bb.0:
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
196 ; NOVLOPT-NEXT:    ret
198 ; VLOPT-LABEL: vand_vx:
199 ; VLOPT:       # %bb.0:
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
203 ; VLOPT-NEXT:    ret
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:
211 ; NOVLOPT:       # %bb.0:
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
216 ; NOVLOPT-NEXT:    ret
218 ; VLOPT-LABEL: vor_vi:
219 ; VLOPT:       # %bb.0:
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
223 ; VLOPT-NEXT:    ret
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:
231 ; NOVLOPT:       # %bb.0:
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
236 ; NOVLOPT-NEXT:    ret
238 ; VLOPT-LABEL: vor_vv:
239 ; VLOPT:       # %bb.0:
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
243 ; VLOPT-NEXT:    ret
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:
251 ; NOVLOPT:       # %bb.0:
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
256 ; NOVLOPT-NEXT:    ret
258 ; VLOPT-LABEL: vor_vx:
259 ; VLOPT:       # %bb.0:
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
263 ; VLOPT-NEXT:    ret
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:
271 ; NOVLOPT:       # %bb.0:
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
276 ; NOVLOPT-NEXT:    ret
278 ; VLOPT-LABEL: vxor_vi:
279 ; VLOPT:       # %bb.0:
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
283 ; VLOPT-NEXT:    ret
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:
291 ; NOVLOPT:       # %bb.0:
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
296 ; NOVLOPT-NEXT:    ret
298 ; VLOPT-LABEL: vxor_vv:
299 ; VLOPT:       # %bb.0:
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
303 ; VLOPT-NEXT:    ret
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:
311 ; NOVLOPT:       # %bb.0:
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
316 ; NOVLOPT-NEXT:    ret
318 ; VLOPT-LABEL: vxor_vx:
319 ; VLOPT:       # %bb.0:
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
323 ; VLOPT-NEXT:    ret
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:
331 ; NOVLOPT:       # %bb.0:
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
336 ; NOVLOPT-NEXT:    ret
338 ; VLOPT-LABEL: vsll_vi:
339 ; VLOPT:       # %bb.0:
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
343 ; VLOPT-NEXT:    ret
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:
351 ; NOVLOPT:       # %bb.0:
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
356 ; NOVLOPT-NEXT:    ret
358 ; VLOPT-LABEL: vsll_vv:
359 ; VLOPT:       # %bb.0:
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
363 ; VLOPT-NEXT:    ret
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:
371 ; NOVLOPT:       # %bb.0:
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
376 ; NOVLOPT-NEXT:    ret
378 ; VLOPT-LABEL: vsll_vx:
379 ; VLOPT:       # %bb.0:
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
383 ; VLOPT-NEXT:    ret
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:
391 ; NOVLOPT:       # %bb.0:
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
396 ; NOVLOPT-NEXT:    ret
398 ; VLOPT-LABEL: vwaddu_vv:
399 ; VLOPT:       # %bb.0:
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
404 ; VLOPT-NEXT:    ret
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:
412 ; NOVLOPT:       # %bb.0:
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
417 ; NOVLOPT-NEXT:    ret
419 ; VLOPT-LABEL: vsrl_vi:
420 ; VLOPT:       # %bb.0:
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
424 ; VLOPT-NEXT:    ret
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:
432 ; NOVLOPT:       # %bb.0:
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
437 ; NOVLOPT-NEXT:    ret
439 ; VLOPT-LABEL: vsrl_vv:
440 ; VLOPT:       # %bb.0:
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
444 ; VLOPT-NEXT:    ret
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:
452 ; NOVLOPT:       # %bb.0:
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
457 ; NOVLOPT-NEXT:    ret
459 ; VLOPT-LABEL: vsrl_vx:
460 ; VLOPT:       # %bb.0:
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
464 ; VLOPT-NEXT:    ret
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:
472 ; NOVLOPT:       # %bb.0:
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
477 ; NOVLOPT-NEXT:    ret
479 ; VLOPT-LABEL: vsra_vi:
480 ; VLOPT:       # %bb.0:
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
484 ; VLOPT-NEXT:    ret
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:
492 ; NOVLOPT:       # %bb.0:
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
497 ; NOVLOPT-NEXT:    ret
499 ; VLOPT-LABEL: vsra_vv:
500 ; VLOPT:       # %bb.0:
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
504 ; VLOPT-NEXT:    ret
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:
512 ; NOVLOPT:       # %bb.0:
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
517 ; NOVLOPT-NEXT:    ret
519 ; VLOPT-LABEL: vsra_vx:
520 ; VLOPT:       # %bb.0:
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
524 ; VLOPT-NEXT:    ret
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:
532 ; NOVLOPT:       # %bb.0:
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
537 ; NOVLOPT-NEXT:    ret
539 ; VLOPT-LABEL: vwaddu_vx:
540 ; VLOPT:       # %bb.0:
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
545 ; VLOPT-NEXT:    ret
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:
553 ; NOVLOPT:       # %bb.0:
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
558 ; NOVLOPT-NEXT:    ret
560 ; VLOPT-LABEL: vwsubu_vv:
561 ; VLOPT:       # %bb.0:
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
566 ; VLOPT-NEXT:    ret
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:
574 ; NOVLOPT:       # %bb.0:
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
579 ; NOVLOPT-NEXT:    ret
581 ; VLOPT-LABEL: vwsubu_vx:
582 ; VLOPT:       # %bb.0:
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
587 ; VLOPT-NEXT:    ret
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:
595 ; NOVLOPT:       # %bb.0:
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
600 ; NOVLOPT-NEXT:    ret
602 ; VLOPT-LABEL: vwadd_vv:
603 ; VLOPT:       # %bb.0:
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
608 ; VLOPT-NEXT:    ret
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:
616 ; NOVLOPT:       # %bb.0:
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
621 ; NOVLOPT-NEXT:    ret
623 ; VLOPT-LABEL: vwadd_vx:
624 ; VLOPT:       # %bb.0:
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
629 ; VLOPT-NEXT:    ret
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:
637 ; NOVLOPT:       # %bb.0:
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
642 ; NOVLOPT-NEXT:    ret
644 ; VLOPT-LABEL: vwsub_vv:
645 ; VLOPT:       # %bb.0:
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
650 ; VLOPT-NEXT:    ret
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:
658 ; NOVLOPT:       # %bb.0:
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
663 ; NOVLOPT-NEXT:    ret
665 ; VLOPT-LABEL: vwsub_vx:
666 ; VLOPT:       # %bb.0:
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
671 ; VLOPT-NEXT:    ret
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:
679 ; NOVLOPT:       # %bb.0:
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
684 ; NOVLOPT-NEXT:    ret
686 ; VLOPT-LABEL: vwaddu_wv:
687 ; VLOPT:       # %bb.0:
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
692 ; VLOPT-NEXT:    ret
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:
700 ; NOVLOPT:       # %bb.0:
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
705 ; NOVLOPT-NEXT:    ret
707 ; VLOPT-LABEL: vwaddu_wx:
708 ; VLOPT:       # %bb.0:
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
713 ; VLOPT-NEXT:    ret
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:
721 ; NOVLOPT:       # %bb.0:
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
726 ; NOVLOPT-NEXT:    ret
728 ; VLOPT-LABEL: vwsubu_wv:
729 ; VLOPT:       # %bb.0:
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
734 ; VLOPT-NEXT:    ret
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:
742 ; NOVLOPT:       # %bb.0:
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
747 ; NOVLOPT-NEXT:    ret
749 ; VLOPT-LABEL: vwsubu_wx:
750 ; VLOPT:       # %bb.0:
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
755 ; VLOPT-NEXT:    ret
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:
763 ; NOVLOPT:       # %bb.0:
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
768 ; NOVLOPT-NEXT:    ret
770 ; VLOPT-LABEL: vwadd_wv:
771 ; VLOPT:       # %bb.0:
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
776 ; VLOPT-NEXT:    ret
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:
784 ; NOVLOPT:       # %bb.0:
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
789 ; NOVLOPT-NEXT:    ret
791 ; VLOPT-LABEL: vwadd_wx:
792 ; VLOPT:       # %bb.0:
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
797 ; VLOPT-NEXT:    ret
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:
805 ; NOVLOPT:       # %bb.0:
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
810 ; NOVLOPT-NEXT:    ret
812 ; VLOPT-LABEL: vwsub_wv:
813 ; VLOPT:       # %bb.0:
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
818 ; VLOPT-NEXT:    ret
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:
826 ; NOVLOPT:       # %bb.0:
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
831 ; NOVLOPT-NEXT:    ret
833 ; VLOPT-LABEL: vwsub_wx:
834 ; VLOPT:       # %bb.0:
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
839 ; VLOPT-NEXT:    ret
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:
847 ; NOVLOPT:       # %bb.0:
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
852 ; NOVLOPT-NEXT:    ret
854 ; VLOPT-LABEL: vsext_vf2:
855 ; VLOPT:       # %bb.0:
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
859 ; VLOPT-NEXT:    ret
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:
867 ; NOVLOPT:       # %bb.0:
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
872 ; NOVLOPT-NEXT:    ret
874 ; VLOPT-LABEL: vsext_vf4:
875 ; VLOPT:       # %bb.0:
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
879 ; VLOPT-NEXT:    ret
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:
887 ; NOVLOPT:       # %bb.0:
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
892 ; NOVLOPT-NEXT:    ret
894 ; VLOPT-LABEL: vsext_vf8:
895 ; VLOPT:       # %bb.0:
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
899 ; VLOPT-NEXT:    ret
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:
907 ; NOVLOPT:       # %bb.0:
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
912 ; NOVLOPT-NEXT:    ret
914 ; VLOPT-LABEL: vzext_vf2:
915 ; VLOPT:       # %bb.0:
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
919 ; VLOPT-NEXT:    ret
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:
927 ; NOVLOPT:       # %bb.0:
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
932 ; NOVLOPT-NEXT:    ret
934 ; VLOPT-LABEL: vzext_vf4:
935 ; VLOPT:       # %bb.0:
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
939 ; VLOPT-NEXT:    ret
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:
947 ; NOVLOPT:       # %bb.0:
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
952 ; NOVLOPT-NEXT:    ret
954 ; VLOPT-LABEL: vzext_vf8:
955 ; VLOPT:       # %bb.0:
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
959 ; VLOPT-NEXT:    ret
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:
967 ; NOVLOPT:       # %bb.0:
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
972 ; NOVLOPT-NEXT:    ret
974 ; VLOPT-LABEL: vmadc_vi:
975 ; VLOPT:       # %bb.0:
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
979 ; VLOPT-NEXT:    ret
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:
987 ; NOVLOPT:       # %bb.0:
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
992 ; NOVLOPT-NEXT:    ret
994 ; VLOPT-LABEL: vmadc_vx:
995 ; VLOPT:       # %bb.0:
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
999 ; VLOPT-NEXT:    ret
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:
1007 ; NOVLOPT:       # %bb.0:
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
1012 ; NOVLOPT-NEXT:    ret
1014 ; VLOPT-LABEL: vmadc_vv:
1015 ; VLOPT:       # %bb.0:
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
1019 ; VLOPT-NEXT:    ret
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:
1027 ; NOVLOPT:       # %bb.0:
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
1032 ; NOVLOPT-NEXT:    ret
1034 ; VLOPT-LABEL: vmsbc_vx:
1035 ; VLOPT:       # %bb.0:
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
1039 ; VLOPT-NEXT:    ret
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:
1047 ; NOVLOPT:       # %bb.0:
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
1052 ; NOVLOPT-NEXT:    ret
1054 ; VLOPT-LABEL: vmsbc_vv:
1055 ; VLOPT:       # %bb.0:
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
1059 ; VLOPT-NEXT:    ret
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:
1067 ; NOVLOPT:       # %bb.0:
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
1072 ; NOVLOPT-NEXT:    ret
1074 ; VLOPT-LABEL: vnsrl_wi:
1075 ; VLOPT:       # %bb.0:
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
1079 ; VLOPT-NEXT:    ret
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:
1087 ; NOVLOPT:       # %bb.0:
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
1092 ; NOVLOPT-NEXT:    ret
1094 ; VLOPT-LABEL: vnsrl_wx:
1095 ; VLOPT:       # %bb.0:
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
1099 ; VLOPT-NEXT:    ret
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:
1107 ; NOVLOPT:       # %bb.0:
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
1112 ; NOVLOPT-NEXT:    ret
1114 ; VLOPT-LABEL: vnsrl_wv:
1115 ; VLOPT:       # %bb.0:
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
1119 ; VLOPT-NEXT:    ret
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:
1127 ; NOVLOPT:       # %bb.0:
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
1132 ; NOVLOPT-NEXT:    ret
1134 ; VLOPT-LABEL: vnsra_wi:
1135 ; VLOPT:       # %bb.0:
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
1139 ; VLOPT-NEXT:    ret
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:
1147 ; NOVLOPT:       # %bb.0:
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
1152 ; NOVLOPT-NEXT:    ret
1154 ; VLOPT-LABEL: vnsra_wx:
1155 ; VLOPT:       # %bb.0:
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
1159 ; VLOPT-NEXT:    ret
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:
1167 ; NOVLOPT:       # %bb.0:
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
1172 ; NOVLOPT-NEXT:    ret
1174 ; VLOPT-LABEL: vnsra_wv:
1175 ; VLOPT:       # %bb.0:
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
1179 ; VLOPT-NEXT:    ret
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:
1187 ; NOVLOPT:       # %bb.0:
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
1192 ; NOVLOPT-NEXT:    ret
1194 ; VLOPT-LABEL: vmseq_vi:
1195 ; VLOPT:       # %bb.0:
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
1199 ; VLOPT-NEXT:    ret
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:
1207 ; NOVLOPT:       # %bb.0:
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
1212 ; NOVLOPT-NEXT:    ret
1214 ; VLOPT-LABEL: vmseq_vx:
1215 ; VLOPT:       # %bb.0:
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
1219 ; VLOPT-NEXT:    ret
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:
1227 ; NOVLOPT:       # %bb.0:
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
1232 ; NOVLOPT-NEXT:    ret
1234 ; VLOPT-LABEL: vmseq_vv:
1235 ; VLOPT:       # %bb.0:
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
1239 ; VLOPT-NEXT:    ret
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:
1247 ; NOVLOPT:       # %bb.0:
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
1252 ; NOVLOPT-NEXT:    ret
1254 ; VLOPT-LABEL: vmsne_vi:
1255 ; VLOPT:       # %bb.0:
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
1259 ; VLOPT-NEXT:    ret
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:
1267 ; NOVLOPT:       # %bb.0:
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
1272 ; NOVLOPT-NEXT:    ret
1274 ; VLOPT-LABEL: vmsne_vx:
1275 ; VLOPT:       # %bb.0:
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
1279 ; VLOPT-NEXT:    ret
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:
1287 ; NOVLOPT:       # %bb.0:
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
1292 ; NOVLOPT-NEXT:    ret
1294 ; VLOPT-LABEL: vmsne_vv:
1295 ; VLOPT:       # %bb.0:
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
1299 ; VLOPT-NEXT:    ret
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:
1307 ; NOVLOPT:       # %bb.0:
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
1312 ; NOVLOPT-NEXT:    ret
1314 ; VLOPT-LABEL: vmsltu_vx:
1315 ; VLOPT:       # %bb.0:
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
1319 ; VLOPT-NEXT:    ret
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:
1327 ; NOVLOPT:       # %bb.0:
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
1332 ; NOVLOPT-NEXT:    ret
1334 ; VLOPT-LABEL: vmsltu_vv:
1335 ; VLOPT:       # %bb.0:
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
1339 ; VLOPT-NEXT:    ret
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:
1347 ; NOVLOPT:       # %bb.0:
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
1352 ; NOVLOPT-NEXT:    ret
1354 ; VLOPT-LABEL: vmslt_vx:
1355 ; VLOPT:       # %bb.0:
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
1359 ; VLOPT-NEXT:    ret
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:
1367 ; NOVLOPT:       # %bb.0:
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
1372 ; NOVLOPT-NEXT:    ret
1374 ; VLOPT-LABEL: vmslt_vv:
1375 ; VLOPT:       # %bb.0:
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
1379 ; VLOPT-NEXT:    ret
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:
1387 ; NOVLOPT:       # %bb.0:
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
1392 ; NOVLOPT-NEXT:    ret
1394 ; VLOPT-LABEL: vmsleu_vi:
1395 ; VLOPT:       # %bb.0:
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
1399 ; VLOPT-NEXT:    ret
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:
1407 ; NOVLOPT:       # %bb.0:
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
1412 ; NOVLOPT-NEXT:    ret
1414 ; VLOPT-LABEL: vmsleu_vx:
1415 ; VLOPT:       # %bb.0:
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
1419 ; VLOPT-NEXT:    ret
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:
1427 ; NOVLOPT:       # %bb.0:
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
1432 ; NOVLOPT-NEXT:    ret
1434 ; VLOPT-LABEL: vmsleu_vv:
1435 ; VLOPT:       # %bb.0:
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
1439 ; VLOPT-NEXT:    ret
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:
1447 ; NOVLOPT:       # %bb.0:
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
1452 ; NOVLOPT-NEXT:    ret
1454 ; VLOPT-LABEL: vmsle_vi:
1455 ; VLOPT:       # %bb.0:
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
1459 ; VLOPT-NEXT:    ret
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:
1467 ; NOVLOPT:       # %bb.0:
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
1472 ; NOVLOPT-NEXT:    ret
1474 ; VLOPT-LABEL: vmsle_vx:
1475 ; VLOPT:       # %bb.0:
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
1479 ; VLOPT-NEXT:    ret
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:
1487 ; NOVLOPT:       # %bb.0:
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
1492 ; NOVLOPT-NEXT:    ret
1494 ; VLOPT-LABEL: vmsle_vv:
1495 ; VLOPT:       # %bb.0:
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
1499 ; VLOPT-NEXT:    ret
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:
1507 ; NOVLOPT:       # %bb.0:
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
1512 ; NOVLOPT-NEXT:    ret
1514 ; VLOPT-LABEL: vmsgtu_vi:
1515 ; VLOPT:       # %bb.0:
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
1519 ; VLOPT-NEXT:    ret
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:
1527 ; NOVLOPT:       # %bb.0:
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
1532 ; NOVLOPT-NEXT:    ret
1534 ; VLOPT-LABEL: vmsgtu_vx:
1535 ; VLOPT:       # %bb.0:
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
1539 ; VLOPT-NEXT:    ret
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:
1547 ; NOVLOPT:       # %bb.0:
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
1552 ; NOVLOPT-NEXT:    ret
1554 ; VLOPT-LABEL: vmsgt_vi:
1555 ; VLOPT:       # %bb.0:
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
1559 ; VLOPT-NEXT:    ret
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:
1567 ; NOVLOPT:       # %bb.0:
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
1572 ; NOVLOPT-NEXT:    ret
1574 ; VLOPT-LABEL: vmsgt_vx:
1575 ; VLOPT:       # %bb.0:
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
1579 ; VLOPT-NEXT:    ret
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:
1587 ; NOVLOPT:       # %bb.0:
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
1592 ; NOVLOPT-NEXT:    ret
1594 ; VLOPT-LABEL: vminu_vv:
1595 ; VLOPT:       # %bb.0:
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
1599 ; VLOPT-NEXT:    ret
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:
1607 ; NOVLOPT:       # %bb.0:
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
1612 ; NOVLOPT-NEXT:    ret
1614 ; VLOPT-LABEL: vminu_vx:
1615 ; VLOPT:       # %bb.0:
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
1619 ; VLOPT-NEXT:    ret
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:
1627 ; NOVLOPT:       # %bb.0:
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
1632 ; NOVLOPT-NEXT:    ret
1634 ; VLOPT-LABEL: vmin_vv:
1635 ; VLOPT:       # %bb.0:
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
1639 ; VLOPT-NEXT:    ret
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:
1647 ; NOVLOPT:       # %bb.0:
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
1652 ; NOVLOPT-NEXT:    ret
1654 ; VLOPT-LABEL: vmin_vx:
1655 ; VLOPT:       # %bb.0:
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
1659 ; VLOPT-NEXT:    ret
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:
1667 ; NOVLOPT:       # %bb.0:
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
1672 ; NOVLOPT-NEXT:    ret
1674 ; VLOPT-LABEL: vmaxu_vv:
1675 ; VLOPT:       # %bb.0:
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
1679 ; VLOPT-NEXT:    ret
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:
1687 ; NOVLOPT:       # %bb.0:
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
1692 ; NOVLOPT-NEXT:    ret
1694 ; VLOPT-LABEL: vmaxu_vx:
1695 ; VLOPT:       # %bb.0:
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
1699 ; VLOPT-NEXT:    ret
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:
1707 ; NOVLOPT:       # %bb.0:
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
1712 ; NOVLOPT-NEXT:    ret
1714 ; VLOPT-LABEL: vmax_vv:
1715 ; VLOPT:       # %bb.0:
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
1719 ; VLOPT-NEXT:    ret
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:
1727 ; NOVLOPT:       # %bb.0:
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
1732 ; NOVLOPT-NEXT:    ret
1734 ; VLOPT-LABEL: vmax_vx:
1735 ; VLOPT:       # %bb.0:
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
1739 ; VLOPT-NEXT:    ret
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:
1747 ; NOVLOPT:       # %bb.0:
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
1752 ; NOVLOPT-NEXT:    ret
1754 ; VLOPT-LABEL: vmul_vv:
1755 ; VLOPT:       # %bb.0:
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
1759 ; VLOPT-NEXT:    ret
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:
1767 ; NOVLOPT:       # %bb.0:
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
1772 ; NOVLOPT-NEXT:    ret
1774 ; VLOPT-LABEL: vmul_vx:
1775 ; VLOPT:       # %bb.0:
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
1779 ; VLOPT-NEXT:    ret
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:
1787 ; NOVLOPT:       # %bb.0:
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
1792 ; NOVLOPT-NEXT:    ret
1794 ; VLOPT-LABEL: vmulh_vv:
1795 ; VLOPT:       # %bb.0:
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
1799 ; VLOPT-NEXT:    ret
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:
1807 ; NOVLOPT:       # %bb.0:
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
1812 ; NOVLOPT-NEXT:    ret
1814 ; VLOPT-LABEL: vmulh_vx:
1815 ; VLOPT:       # %bb.0:
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
1819 ; VLOPT-NEXT:    ret
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:
1827 ; NOVLOPT:       # %bb.0:
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
1832 ; NOVLOPT-NEXT:    ret
1834 ; VLOPT-LABEL: vmulhu_vv:
1835 ; VLOPT:       # %bb.0:
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
1839 ; VLOPT-NEXT:    ret
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:
1847 ; NOVLOPT:       # %bb.0:
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
1852 ; NOVLOPT-NEXT:    ret
1854 ; VLOPT-LABEL: vmulhu_vx:
1855 ; VLOPT:       # %bb.0:
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
1859 ; VLOPT-NEXT:    ret
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:
1867 ; NOVLOPT:       # %bb.0:
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
1872 ; NOVLOPT-NEXT:    ret
1874 ; VLOPT-LABEL: vmulhsu_vv:
1875 ; VLOPT:       # %bb.0:
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
1879 ; VLOPT-NEXT:    ret
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:
1887 ; NOVLOPT:       # %bb.0:
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
1892 ; NOVLOPT-NEXT:    ret
1894 ; VLOPT-LABEL: vmulhsu_vx:
1895 ; VLOPT:       # %bb.0:
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
1899 ; VLOPT-NEXT:    ret
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:
1907 ; NOVLOPT:       # %bb.0:
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
1912 ; NOVLOPT-NEXT:    ret
1914 ; VLOPT-LABEL: vdivu_vv:
1915 ; VLOPT:       # %bb.0:
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
1919 ; VLOPT-NEXT:    ret
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:
1927 ; NOVLOPT:       # %bb.0:
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
1932 ; NOVLOPT-NEXT:    ret
1934 ; VLOPT-LABEL: vdivu_vx:
1935 ; VLOPT:       # %bb.0:
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
1939 ; VLOPT-NEXT:    ret
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:
1947 ; NOVLOPT:       # %bb.0:
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
1952 ; NOVLOPT-NEXT:    ret
1954 ; VLOPT-LABEL: vdiv_vv:
1955 ; VLOPT:       # %bb.0:
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
1959 ; VLOPT-NEXT:    ret
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:
1967 ; NOVLOPT:       # %bb.0:
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
1972 ; NOVLOPT-NEXT:    ret
1974 ; VLOPT-LABEL: vdiv_vx:
1975 ; VLOPT:       # %bb.0:
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
1979 ; VLOPT-NEXT:    ret
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:
1987 ; NOVLOPT:       # %bb.0:
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
1992 ; NOVLOPT-NEXT:    ret
1994 ; VLOPT-LABEL: vremu_vv:
1995 ; VLOPT:       # %bb.0:
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
1999 ; VLOPT-NEXT:    ret
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:
2007 ; NOVLOPT:       # %bb.0:
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
2012 ; NOVLOPT-NEXT:    ret
2014 ; VLOPT-LABEL: vremu_vx:
2015 ; VLOPT:       # %bb.0:
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
2019 ; VLOPT-NEXT:    ret
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:
2027 ; NOVLOPT:       # %bb.0:
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
2032 ; NOVLOPT-NEXT:    ret
2034 ; VLOPT-LABEL: vrem_vv:
2035 ; VLOPT:       # %bb.0:
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
2039 ; VLOPT-NEXT:    ret
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:
2047 ; NOVLOPT:       # %bb.0:
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
2052 ; NOVLOPT-NEXT:    ret
2054 ; VLOPT-LABEL: vrem_vx:
2055 ; VLOPT:       # %bb.0:
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
2059 ; VLOPT-NEXT:    ret
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:
2067 ; NOVLOPT:       # %bb.0:
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
2072 ; NOVLOPT-NEXT:    ret
2074 ; VLOPT-LABEL: vwmul_vv:
2075 ; VLOPT:       # %bb.0:
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
2080 ; VLOPT-NEXT:    ret
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:
2088 ; NOVLOPT:       # %bb.0:
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
2093 ; NOVLOPT-NEXT:    ret
2095 ; VLOPT-LABEL: vwmul_vx:
2096 ; VLOPT:       # %bb.0:
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
2101 ; VLOPT-NEXT:    ret
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:
2109 ; NOVLOPT:       # %bb.0:
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
2114 ; NOVLOPT-NEXT:    ret
2116 ; VLOPT-LABEL: vwmulsu_vv:
2117 ; VLOPT:       # %bb.0:
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
2122 ; VLOPT-NEXT:    ret
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:
2130 ; NOVLOPT:       # %bb.0:
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
2135 ; NOVLOPT-NEXT:    ret
2137 ; VLOPT-LABEL: vwmulsu_vx:
2138 ; VLOPT:       # %bb.0:
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
2143 ; VLOPT-NEXT:    ret
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:
2151 ; NOVLOPT:       # %bb.0:
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
2156 ; NOVLOPT-NEXT:    ret
2158 ; VLOPT-LABEL: vwmulu_vv:
2159 ; VLOPT:       # %bb.0:
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
2164 ; VLOPT-NEXT:    ret
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:
2172 ; NOVLOPT:       # %bb.0:
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
2177 ; NOVLOPT-NEXT:    ret
2179 ; VLOPT-LABEL: vwmulu_vx:
2180 ; VLOPT:       # %bb.0:
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
2185 ; VLOPT-NEXT:    ret
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:
2193 ; NOVLOPT:       # %bb.0:
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
2198 ; NOVLOPT-NEXT:    ret
2200 ; VLOPT-LABEL: vwmacc_vv:
2201 ; VLOPT:       # %bb.0:
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
2206 ; VLOPT-NEXT:    ret
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:
2214 ; NOVLOPT:       # %bb.0:
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
2219 ; NOVLOPT-NEXT:    ret
2221 ; VLOPT-LABEL: vmacc_vv:
2222 ; VLOPT:       # %bb.0:
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
2227 ; VLOPT-NEXT:    ret
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:
2235 ; NOVLOPT:       # %bb.0:
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
2241 ; NOVLOPT-NEXT:    ret
2243 ; VLOPT-LABEL: vmacc_vx:
2244 ; VLOPT:       # %bb.0:
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
2250 ; VLOPT-NEXT:    ret
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:
2258 ; NOVLOPT:       # %bb.0:
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
2263 ; NOVLOPT-NEXT:    ret
2265 ; VLOPT-LABEL: vmadd_vv:
2266 ; VLOPT:       # %bb.0:
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
2271 ; VLOPT-NEXT:    ret
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:
2279 ; NOVLOPT:       # %bb.0:
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
2285 ; NOVLOPT-NEXT:    ret
2287 ; VLOPT-LABEL: vmadd_vx:
2288 ; VLOPT:       # %bb.0:
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
2294 ; VLOPT-NEXT:    ret
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:
2302 ; NOVLOPT:       # %bb.0:
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
2307 ; NOVLOPT-NEXT:    ret
2309 ; VLOPT-LABEL: vnmsac_vv:
2310 ; VLOPT:       # %bb.0:
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
2315 ; VLOPT-NEXT:    ret
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:
2323 ; NOVLOPT:       # %bb.0:
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
2329 ; NOVLOPT-NEXT:    ret
2331 ; VLOPT-LABEL: vnmsac_vx:
2332 ; VLOPT:       # %bb.0:
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
2338 ; VLOPT-NEXT:    ret
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:
2346 ; NOVLOPT:       # %bb.0:
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
2351 ; NOVLOPT-NEXT:    ret
2353 ; VLOPT-LABEL: vnmsub_vv:
2354 ; VLOPT:       # %bb.0:
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
2359 ; VLOPT-NEXT:    ret
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:
2367 ; NOVLOPT:       # %bb.0:
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
2373 ; NOVLOPT-NEXT:    ret
2375 ; VLOPT-LABEL: vnmsub_vx:
2376 ; VLOPT:       # %bb.0:
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
2382 ; VLOPT-NEXT:    ret
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:
2390 ; NOVLOPT:       # %bb.0:
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
2395 ; NOVLOPT-NEXT:    ret
2397 ; VLOPT-LABEL: vwmacc_vx:
2398 ; VLOPT:       # %bb.0:
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
2403 ; VLOPT-NEXT:    ret
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:
2411 ; NOVLOPT:       # %bb.0:
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
2416 ; NOVLOPT-NEXT:    ret
2418 ; VLOPT-LABEL: vwmaccu_vv:
2419 ; VLOPT:       # %bb.0:
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
2424 ; VLOPT-NEXT:    ret
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:
2432 ; NOVLOPT:       # %bb.0:
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
2437 ; NOVLOPT-NEXT:    ret
2439 ; VLOPT-LABEL: vwmaccu_vx:
2440 ; VLOPT:       # %bb.0:
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
2445 ; VLOPT-NEXT:    ret
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:
2453 ; NOVLOPT:       # %bb.0:
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
2458 ; NOVLOPT-NEXT:    ret
2460 ; VLOPT-LABEL: vwmaccsu_vv:
2461 ; VLOPT:       # %bb.0:
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
2466 ; VLOPT-NEXT:    ret
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:
2474 ; NOVLOPT:       # %bb.0:
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
2479 ; NOVLOPT-NEXT:    ret
2481 ; VLOPT-LABEL: vwmaccsu_vx:
2482 ; VLOPT:       # %bb.0:
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
2487 ; VLOPT-NEXT:    ret
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:
2495 ; NOVLOPT:       # %bb.0:
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
2500 ; NOVLOPT-NEXT:    ret
2502 ; VLOPT-LABEL: vwmaccus_vx:
2503 ; VLOPT:       # %bb.0:
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
2508 ; VLOPT-NEXT:    ret
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:
2516 ; NOVLOPT:       # %bb.0:
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
2521 ; NOVLOPT-NEXT:    ret
2523 ; VLOPT-LABEL: vmv_v_i:
2524 ; VLOPT:       # %bb.0:
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
2528 ; VLOPT-NEXT:    ret
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:
2536 ; NOVLOPT:       # %bb.0:
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
2541 ; NOVLOPT-NEXT:    ret
2543 ; VLOPT-LABEL: vmv_v_x:
2544 ; VLOPT:       # %bb.0:
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
2548 ; VLOPT-NEXT:    ret
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:
2557 ; NOVLOPT:       # %bb.0:
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
2562 ; NOVLOPT-NEXT:    ret
2564 ; VLOPT-LABEL: vmv_v_v:
2565 ; VLOPT:       # %bb.0:
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
2570 ; VLOPT-NEXT:    ret
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:
2578 ; NOVLOPT:       # %bb.0:
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
2583 ; NOVLOPT-NEXT:    ret
2585 ; VLOPT-LABEL: vwsll_vi:
2586 ; VLOPT:       # %bb.0:
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
2591 ; VLOPT-NEXT:    ret
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:
2599 ; NOVLOPT:       # %bb.0:
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
2607 ; NOVLOPT-NEXT:    ret
2609 ; VLOPT-LABEL: vmand_mm:
2610 ; VLOPT:       # %bb.0:
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
2617 ; VLOPT-NEXT:    ret
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:
2626 ; NOVLOPT:       # %bb.0:
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
2634 ; NOVLOPT-NEXT:    ret
2636 ; VLOPT-LABEL: vmnand_mm:
2637 ; VLOPT:       # %bb.0:
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
2644 ; VLOPT-NEXT:    ret
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:
2653 ; NOVLOPT:       # %bb.0:
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
2661 ; NOVLOPT-NEXT:    ret
2663 ; VLOPT-LABEL: vmandn_mm:
2664 ; VLOPT:       # %bb.0:
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
2671 ; VLOPT-NEXT:    ret
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:
2680 ; NOVLOPT:       # %bb.0:
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
2688 ; NOVLOPT-NEXT:    ret
2690 ; VLOPT-LABEL: vmxor_mm:
2691 ; VLOPT:       # %bb.0:
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
2698 ; VLOPT-NEXT:    ret
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:
2707 ; NOVLOPT:       # %bb.0:
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
2715 ; NOVLOPT-NEXT:    ret
2717 ; VLOPT-LABEL: vmor_mm:
2718 ; VLOPT:       # %bb.0:
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
2725 ; VLOPT-NEXT:    ret
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:
2735 ; NOVLOPT:       # %bb.0:
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
2743 ; NOVLOPT-NEXT:    ret
2745 ; VLOPT-LABEL: vmnor_mm:
2746 ; VLOPT:       # %bb.0:
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
2753 ; VLOPT-NEXT:    ret
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:
2762 ; NOVLOPT:       # %bb.0:
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
2770 ; NOVLOPT-NEXT:    ret
2772 ; VLOPT-LABEL: vmorn_mm:
2773 ; VLOPT:       # %bb.0:
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
2780 ; VLOPT-NEXT:    ret
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:
2789 ; NOVLOPT:       # %bb.0:
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
2797 ; NOVLOPT-NEXT:    ret
2799 ; VLOPT-LABEL: vmxnor_mm:
2800 ; VLOPT:       # %bb.0:
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
2807 ; VLOPT-NEXT:    ret
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:
2816 ; NOVLOPT:       # %bb.0:
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
2823 ; NOVLOPT-NEXT:    ret
2825 ; VLOPT-LABEL: vmsbf_m:
2826 ; VLOPT:       # %bb.0:
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
2832 ; VLOPT-NEXT:    ret
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:
2841 ; NOVLOPT:       # %bb.0:
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
2848 ; NOVLOPT-NEXT:    ret
2850 ; VLOPT-LABEL: vmsif_m:
2851 ; VLOPT:       # %bb.0:
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
2857 ; VLOPT-NEXT:    ret
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:
2866 ; NOVLOPT:       # %bb.0:
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
2873 ; NOVLOPT-NEXT:    ret
2875 ; VLOPT-LABEL: vmsof_m:
2876 ; VLOPT:       # %bb.0:
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
2882 ; VLOPT-NEXT:    ret
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:
2891 ; NOVLOPT:       # %bb.0:
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
2896 ; NOVLOPT-NEXT:    ret
2898 ; VLOPT-LABEL: viota_m:
2899 ; VLOPT:       # %bb.0:
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
2903 ; VLOPT-NEXT:    ret
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:
2911 ; NOVLOPT:       # %bb.0:
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
2916 ; NOVLOPT-NEXT:    ret
2918 ; VLOPT-LABEL: vid.v:
2919 ; VLOPT:       # %bb.0:
2920 ; VLOPT-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
2921 ; VLOPT-NEXT:    vid.v v10
2922 ; VLOPT-NEXT:    vadd.vv v8, v10, v8
2923 ; VLOPT-NEXT:    ret
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:
2931 ; NOVLOPT:       # %bb.0:
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
2936 ; NOVLOPT-NEXT:    ret
2938 ; VLOPT-LABEL: vfadd_vv:
2939 ; VLOPT:       # %bb.0:
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
2943 ; VLOPT-NEXT:    ret
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:
2951 ; NOVLOPT:       # %bb.0:
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
2956 ; NOVLOPT-NEXT:    ret
2958 ; VLOPT-LABEL: vfadd_vf:
2959 ; VLOPT:       # %bb.0:
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
2963 ; VLOPT-NEXT:    ret
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:
2971 ; NOVLOPT:       # %bb.0:
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
2976 ; NOVLOPT-NEXT:    ret
2978 ; VLOPT-LABEL: vfsub_vv:
2979 ; VLOPT:       # %bb.0:
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
2983 ; VLOPT-NEXT:    ret
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:
2991 ; NOVLOPT:       # %bb.0:
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
2996 ; NOVLOPT-NEXT:    ret
2998 ; VLOPT-LABEL: vfsub_vf:
2999 ; VLOPT:       # %bb.0:
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
3003 ; VLOPT-NEXT:    ret
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:
3011 ; NOVLOPT:       # %bb.0:
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
3016 ; NOVLOPT-NEXT:    ret
3018 ; VLOPT-LABEL: vfrsub_vf:
3019 ; VLOPT:       # %bb.0:
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
3023 ; VLOPT-NEXT:    ret
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:
3031 ; NOVLOPT:       # %bb.0:
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
3036 ; NOVLOPT-NEXT:    ret
3038 ; VLOPT-LABEL: vfwadd_vv:
3039 ; VLOPT:       # %bb.0:
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
3044 ; VLOPT-NEXT:    ret
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:
3052 ; NOVLOPT:       # %bb.0:
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
3057 ; NOVLOPT-NEXT:    ret
3059 ; VLOPT-LABEL: vfwadd_vf:
3060 ; VLOPT:       # %bb.0:
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
3065 ; VLOPT-NEXT:    ret
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:
3073 ; NOVLOPT:       # %bb.0:
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
3078 ; NOVLOPT-NEXT:    ret
3080 ; VLOPT-LABEL: vfwsub_vv:
3081 ; VLOPT:       # %bb.0:
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
3086 ; VLOPT-NEXT:    ret
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:
3094 ; NOVLOPT:       # %bb.0:
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
3099 ; NOVLOPT-NEXT:    ret
3101 ; VLOPT-LABEL: vfwsub_vf:
3102 ; VLOPT:       # %bb.0:
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
3107 ; VLOPT-NEXT:    ret
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:
3115 ; NOVLOPT:       # %bb.0:
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
3120 ; NOVLOPT-NEXT:    ret
3122 ; VLOPT-LABEL: vfwadd_wv:
3123 ; VLOPT:       # %bb.0:
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
3128 ; VLOPT-NEXT:    ret
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:
3136 ; NOVLOPT:       # %bb.0:
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
3141 ; NOVLOPT-NEXT:    ret
3143 ; VLOPT-LABEL: vfwadd_wf:
3144 ; VLOPT:       # %bb.0:
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
3149 ; VLOPT-NEXT:    ret
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:
3157 ; NOVLOPT:       # %bb.0:
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
3162 ; NOVLOPT-NEXT:    ret
3164 ; VLOPT-LABEL: vfwsub_wv:
3165 ; VLOPT:       # %bb.0:
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
3170 ; VLOPT-NEXT:    ret
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:
3178 ; NOVLOPT:       # %bb.0:
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
3183 ; NOVLOPT-NEXT:    ret
3185 ; VLOPT-LABEL: vfwsub_wf:
3186 ; VLOPT:       # %bb.0:
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
3191 ; VLOPT-NEXT:    ret
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:
3199 ; NOVLOPT:       # %bb.0:
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
3204 ; NOVLOPT-NEXT:    ret
3206 ; VLOPT-LABEL: vfmul_vv:
3207 ; VLOPT:       # %bb.0:
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
3211 ; VLOPT-NEXT:    ret
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:
3219 ; NOVLOPT:       # %bb.0:
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
3224 ; NOVLOPT-NEXT:    ret
3226 ; VLOPT-LABEL: vfmul_vf:
3227 ; VLOPT:       # %bb.0:
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
3231 ; VLOPT-NEXT:    ret
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:
3239 ; NOVLOPT:       # %bb.0:
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
3244 ; NOVLOPT-NEXT:    ret
3246 ; VLOPT-LABEL: vfdiv_vv:
3247 ; VLOPT:       # %bb.0:
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
3251 ; VLOPT-NEXT:    ret
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:
3259 ; NOVLOPT:       # %bb.0:
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
3264 ; NOVLOPT-NEXT:    ret
3266 ; VLOPT-LABEL: vfdiv_vf:
3267 ; VLOPT:       # %bb.0:
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
3271 ; VLOPT-NEXT:    ret
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:
3279 ; NOVLOPT:       # %bb.0:
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
3284 ; NOVLOPT-NEXT:    ret
3286 ; VLOPT-LABEL: vfrdiv_vf:
3287 ; VLOPT:       # %bb.0:
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
3291 ; VLOPT-NEXT:    ret
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:
3299 ; NOVLOPT:       # %bb.0:
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
3304 ; NOVLOPT-NEXT:    ret
3306 ; VLOPT-LABEL: vfwmul_vv:
3307 ; VLOPT:       # %bb.0:
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
3312 ; VLOPT-NEXT:    ret
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:
3320 ; NOVLOPT:       # %bb.0:
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
3325 ; NOVLOPT-NEXT:    ret
3327 ; VLOPT-LABEL: vfwmul_vf:
3328 ; VLOPT:       # %bb.0:
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
3333 ; VLOPT-NEXT:    ret
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:
3341 ; NOVLOPT:       # %bb.0:
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
3346 ; NOVLOPT-NEXT:    ret
3348 ; VLOPT-LABEL: vmfeq_vf:
3349 ; VLOPT:       # %bb.0:
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
3353 ; VLOPT-NEXT:    ret
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:
3361 ; NOVLOPT:       # %bb.0:
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
3366 ; NOVLOPT-NEXT:    ret
3368 ; VLOPT-LABEL: vmfeq_vv:
3369 ; VLOPT:       # %bb.0:
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
3373 ; VLOPT-NEXT:    ret
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:
3381 ; NOVLOPT:       # %bb.0:
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
3386 ; NOVLOPT-NEXT:    ret
3388 ; VLOPT-LABEL: vmfne_vf:
3389 ; VLOPT:       # %bb.0:
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
3393 ; VLOPT-NEXT:    ret
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:
3401 ; NOVLOPT:       # %bb.0:
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
3406 ; NOVLOPT-NEXT:    ret
3408 ; VLOPT-LABEL: vmfne_vv:
3409 ; VLOPT:       # %bb.0:
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
3413 ; VLOPT-NEXT:    ret
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:
3421 ; NOVLOPT:       # %bb.0:
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
3426 ; NOVLOPT-NEXT:    ret
3428 ; VLOPT-LABEL: vmflt_vf:
3429 ; VLOPT:       # %bb.0:
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
3433 ; VLOPT-NEXT:    ret
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:
3441 ; NOVLOPT:       # %bb.0:
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
3446 ; NOVLOPT-NEXT:    ret
3448 ; VLOPT-LABEL: vmflt_vv:
3449 ; VLOPT:       # %bb.0:
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
3453 ; VLOPT-NEXT:    ret
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:
3461 ; NOVLOPT:       # %bb.0:
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
3466 ; NOVLOPT-NEXT:    ret
3468 ; VLOPT-LABEL: vmfle_vf:
3469 ; VLOPT:       # %bb.0:
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
3473 ; VLOPT-NEXT:    ret
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:
3481 ; NOVLOPT:       # %bb.0:
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
3486 ; NOVLOPT-NEXT:    ret
3488 ; VLOPT-LABEL: vmfle_vv:
3489 ; VLOPT:       # %bb.0:
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
3493 ; VLOPT-NEXT:    ret
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:
3501 ; NOVLOPT:       # %bb.0:
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
3506 ; NOVLOPT-NEXT:    ret
3508 ; VLOPT-LABEL: vmfgt_vf:
3509 ; VLOPT:       # %bb.0:
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
3513 ; VLOPT-NEXT:    ret
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:
3521 ; NOVLOPT:       # %bb.0:
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
3526 ; NOVLOPT-NEXT:    ret
3528 ; VLOPT-LABEL: vmfgt_vv:
3529 ; VLOPT:       # %bb.0:
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
3533 ; VLOPT-NEXT:    ret
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:
3541 ; NOVLOPT:       # %bb.0:
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
3546 ; NOVLOPT-NEXT:    ret
3548 ; VLOPT-LABEL: vmerge_vvm:
3549 ; VLOPT:       # %bb.0:
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
3553 ; VLOPT-NEXT:    ret
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:
3561 ; NOVLOPT:       # %bb.0:
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
3566 ; NOVLOPT-NEXT:    ret
3568 ; VLOPT-LABEL: vmerge_vxm:
3569 ; VLOPT:       # %bb.0:
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
3573 ; VLOPT-NEXT:    ret
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:
3581 ; NOVLOPT:       # %bb.0:
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
3586 ; NOVLOPT-NEXT:    ret
3588 ; VLOPT-LABEL: vmerge_vim:
3589 ; VLOPT:       # %bb.0:
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
3593 ; VLOPT-NEXT:    ret
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:
3601 ; NOVLOPT:       # %bb.0:
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
3606 ; NOVLOPT-NEXT:    ret
3608 ; VLOPT-LABEL: vadc_vvm:
3609 ; VLOPT:       # %bb.0:
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
3613 ; VLOPT-NEXT:    ret
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:
3621 ; NOVLOPT:       # %bb.0:
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
3626 ; NOVLOPT-NEXT:    ret
3628 ; VLOPT-LABEL: vadc_vxm:
3629 ; VLOPT:       # %bb.0:
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
3633 ; VLOPT-NEXT:    ret
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:
3641 ; NOVLOPT:       # %bb.0:
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
3646 ; NOVLOPT-NEXT:    ret
3648 ; VLOPT-LABEL: vadc_vim:
3649 ; VLOPT:       # %bb.0:
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
3653 ; VLOPT-NEXT:    ret
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:
3661 ; NOVLOPT:       # %bb.0:
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
3667 ; NOVLOPT-NEXT:    ret
3669 ; VLOPT-LABEL: vaadd_vv:
3670 ; VLOPT:       # %bb.0:
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
3675 ; VLOPT-NEXT:    ret
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:
3683 ; NOVLOPT:       # %bb.0:
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
3689 ; NOVLOPT-NEXT:    ret
3691 ; VLOPT-LABEL: vaadd_vx:
3692 ; VLOPT:       # %bb.0:
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
3697 ; VLOPT-NEXT:    ret
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:
3705 ; NOVLOPT:       # %bb.0:
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
3711 ; NOVLOPT-NEXT:    ret
3713 ; VLOPT-LABEL: vasub_vv:
3714 ; VLOPT:       # %bb.0:
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
3719 ; VLOPT-NEXT:    ret
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:
3727 ; NOVLOPT:       # %bb.0:
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
3733 ; NOVLOPT-NEXT:    ret
3735 ; VLOPT-LABEL: vasub_vx:
3736 ; VLOPT:       # %bb.0:
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
3741 ; VLOPT-NEXT:    ret
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:
3749 ; NOVLOPT:       # %bb.0:
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
3755 ; NOVLOPT-NEXT:    ret
3757 ; VLOPT-LABEL: vaaddu_vv:
3758 ; VLOPT:       # %bb.0:
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
3763 ; VLOPT-NEXT:    ret
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:
3771 ; NOVLOPT:       # %bb.0:
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
3777 ; NOVLOPT-NEXT:    ret
3779 ; VLOPT-LABEL: vaaddu_vx:
3780 ; VLOPT:       # %bb.0:
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
3785 ; VLOPT-NEXT:    ret
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:
3793 ; NOVLOPT:       # %bb.0:
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
3799 ; NOVLOPT-NEXT:    ret
3801 ; VLOPT-LABEL: vasubu_vv:
3802 ; VLOPT:       # %bb.0:
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
3807 ; VLOPT-NEXT:    ret
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:
3815 ; NOVLOPT:       # %bb.0:
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
3821 ; NOVLOPT-NEXT:    ret
3823 ; VLOPT-LABEL: vasubu_vx:
3824 ; VLOPT:       # %bb.0:
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
3829 ; VLOPT-NEXT:    ret
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:
3837 ; NOVLOPT:       # %bb.0:
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
3842 ; NOVLOPT-NEXT:    ret
3844 ; VLOPT-LABEL: vfmax_vv:
3845 ; VLOPT:       # %bb.0:
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
3849 ; VLOPT-NEXT:    ret
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:
3857 ; NOVLOPT:       # %bb.0:
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
3862 ; NOVLOPT-NEXT:    ret
3864 ; VLOPT-LABEL: vfmax_vf:
3865 ; VLOPT:       # %bb.0:
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
3869 ; VLOPT-NEXT:    ret
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:
3877 ; NOVLOPT:       # %bb.0:
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
3882 ; NOVLOPT-NEXT:    ret
3884 ; VLOPT-LABEL: vfmin_vv:
3885 ; VLOPT:       # %bb.0:
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
3889 ; VLOPT-NEXT:    ret
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:
3897 ; NOVLOPT:       # %bb.0:
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
3902 ; NOVLOPT-NEXT:    ret
3904 ; VLOPT-LABEL: vfmin_vf:
3905 ; VLOPT:       # %bb.0:
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
3909 ; VLOPT-NEXT:    ret
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:
3917 ; NOVLOPT:       # %bb.0:
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
3922 ; NOVLOPT-NEXT:    ret
3924 ; VLOPT-LABEL: vfsgnj_vv:
3925 ; VLOPT:       # %bb.0:
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
3929 ; VLOPT-NEXT:    ret
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:
3937 ; NOVLOPT:       # %bb.0:
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
3942 ; NOVLOPT-NEXT:    ret
3944 ; VLOPT-LABEL: vfsgnj_vf:
3945 ; VLOPT:       # %bb.0:
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
3949 ; VLOPT-NEXT:    ret
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:
3957 ; NOVLOPT:       # %bb.0:
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
3962 ; NOVLOPT-NEXT:    ret
3964 ; VLOPT-LABEL: vfsgnjn_vv:
3965 ; VLOPT:       # %bb.0:
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
3969 ; VLOPT-NEXT:    ret
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:
3977 ; NOVLOPT:       # %bb.0:
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
3982 ; NOVLOPT-NEXT:    ret
3984 ; VLOPT-LABEL: vfsgnjn_vf:
3985 ; VLOPT:       # %bb.0:
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
3989 ; VLOPT-NEXT:    ret
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:
3997 ; NOVLOPT:       # %bb.0:
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
4002 ; NOVLOPT-NEXT:    ret
4004 ; VLOPT-LABEL: vfsgnjx_vv:
4005 ; VLOPT:       # %bb.0:
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
4009 ; VLOPT-NEXT:    ret
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:
4017 ; NOVLOPT:       # %bb.0:
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
4022 ; NOVLOPT-NEXT:    ret
4024 ; VLOPT-LABEL: vfsgnjx_vf:
4025 ; VLOPT:       # %bb.0:
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
4029 ; VLOPT-NEXT:    ret
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