xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/vl-opt-instrs.ll (revision f5bd623d060051f6f6715c153aa60a577df6f540)
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
6
7; The purpose of this file is to check the behavior of specific instructions as it relates to the VL optimizer
8
9define <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
17;
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
27}
28
29define <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
37;
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
47}
48
49define <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
57;
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
67}
68
69define <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
77;
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
87}
88
89define <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
97;
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
107}
108
109define <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
117;
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
127}
128
129define <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
137;
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
147}
148
149define <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
157;
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
167}
168
169define <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
177;
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
187}
188
189define <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
197;
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
207}
208
209define <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
217;
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
227}
228
229define <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
237;
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
247}
248
249define <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
257;
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
267}
268
269define <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
277;
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
287}
288
289define <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
297;
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
307}
308
309define <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
317;
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
327}
328
329define <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
337;
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
347}
348
349define <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
357;
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
367}
368
369define <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
377;
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
387}
388
389define <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
397;
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
408}
409
410define <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
418;
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
428}
429
430define <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
438;
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
448}
449
450define <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
458;
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
468}
469
470define <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
478;
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
488}
489
490define <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
498;
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
508}
509
510define <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
518;
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
528}
529
530define <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
538;
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
549}
550
551define <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
559;
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
570}
571
572define <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
580;
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
591}
592
593define <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
601;
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
612}
613
614define <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
622;
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
633}
634
635define <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
643;
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
654}
655
656define <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
664;
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
675}
676
677define <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
685;
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
696}
697
698define <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
706;
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
717}
718
719define <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
727;
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
738}
739
740define <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
748;
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
759}
760
761define <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
769;
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
780}
781
782define <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
790;
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
801}
802
803define <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
811;
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
822}
823
824define <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
832;
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
843}
844
845define <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
853;
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
863}
864
865define <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
873;
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
883}
884
885define <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
893;
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
903}
904
905define <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
913;
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
923}
924
925define <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
933;
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
943}
944
945define <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
953;
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
963}
964
965define <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
973;
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
983}
984
985define <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
993;
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
1003}
1004
1005define <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
1013;
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
1023}
1024
1025define <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
1033;
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
1043}
1044
1045define <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
1053;
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
1063}
1064
1065define <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
1073;
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
1083}
1084
1085define <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
1093;
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
1103}
1104
1105define <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
1113;
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
1123}
1124
1125define <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
1133;
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
1143}
1144
1145define <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
1153;
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
1163}
1164
1165define <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
1173;
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
1183}
1184
1185define <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
1193;
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
1203}
1204
1205define <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
1213;
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
1223}
1224
1225define <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
1233;
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
1243}
1244
1245define <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
1253;
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
1263}
1264
1265define <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
1273;
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
1283}
1284
1285define <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
1293;
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
1303}
1304
1305define <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
1313;
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
1323}
1324
1325define <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
1333;
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
1343}
1344
1345define <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
1353;
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
1363}
1364
1365define <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
1373;
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
1383}
1384
1385define <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
1393;
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
1403}
1404
1405define <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
1413;
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
1423}
1424
1425define <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
1433;
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
1443}
1444
1445define <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
1453;
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
1463}
1464
1465define <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
1473;
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
1483}
1484
1485define <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
1493;
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
1503}
1504
1505define <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
1513;
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
1523}
1524
1525define <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
1533;
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
1543}
1544
1545define <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
1553;
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
1563}
1564
1565define <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
1573;
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
1583}
1584
1585define <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
1593;
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
1603}
1604
1605define <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
1613;
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
1623}
1624
1625define <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
1633;
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
1643}
1644
1645define <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
1653;
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
1663}
1664
1665define <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
1673;
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
1683}
1684
1685define <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
1693;
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
1703}
1704
1705define <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
1713;
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
1723}
1724
1725define <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
1733;
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
1743}
1744
1745define <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
1753;
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
1763}
1764
1765define <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
1773;
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
1783}
1784
1785define <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
1793;
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
1803}
1804
1805define <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
1813;
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
1823}
1824
1825define <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
1833;
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
1843}
1844
1845define <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
1853;
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
1863}
1864
1865define <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
1873;
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
1883}
1884
1885define <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
1893;
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
1903}
1904
1905define <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
1913;
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
1923}
1924
1925define <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
1933;
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
1943}
1944
1945define <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
1953;
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
1963}
1964
1965define <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
1973;
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
1983}
1984
1985define <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
1993;
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
2003}
2004
2005define <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
2013;
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
2023}
2024
2025define <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
2033;
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
2043}
2044
2045define <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
2053;
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
2063}
2064
2065define <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
2073;
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
2084}
2085
2086define <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
2094;
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
2105}
2106
2107define <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
2115;
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
2126}
2127
2128define <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
2136;
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
2147}
2148
2149define <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
2157;
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
2168}
2169
2170define <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
2178;
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
2189}
2190
2191define <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
2199;
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
2210}
2211
2212define <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
2220;
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
2231}
2232
2233define <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
2242;
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
2254}
2255
2256define <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
2264;
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
2275}
2276
2277define <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
2286;
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
2298}
2299
2300define <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
2308;
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
2319}
2320
2321define <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
2330;
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
2342}
2343
2344define <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
2352;
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
2363}
2364
2365define <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
2374;
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
2386}
2387
2388define <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
2396;
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
2407}
2408
2409define <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
2417;
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
2428}
2429
2430define <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
2438;
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
2449}
2450
2451define <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
2459;
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
2470}
2471
2472define <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
2480;
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
2491}
2492
2493define <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
2501;
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
2512}
2513
2514define <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
2522;
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
2532}
2533
2534define <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
2542;
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
2552}
2553
2554; The vmv.v.v is optimized away if we use a vadd as the user.
2555define <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
2563;
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
2574}
2575
2576define <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
2584;
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
2595}
2596
2597define <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
2608;
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
2622}
2623
2624define <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
2635;
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
2649}
2650
2651define <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
2662;
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
2676}
2677
2678define <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
2689;
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
2703}
2704
2705define <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
2716;
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
2730}
2731
2732
2733define <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
2744;
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
2758}
2759
2760define <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
2771;
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
2785}
2786
2787define <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
2798;
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
2812}
2813
2814define <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
2824;
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
2837}
2838
2839define <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
2849;
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
2862}
2863
2864define <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
2874;
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
2887}
2888
2889define <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
2897;
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
2907}
2908
2909define <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
2917;
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
2927}
2928
2929define <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
2937;
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
2947}
2948
2949define <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
2957;
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
2967}
2968
2969define <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
2977;
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
2987}
2988
2989define <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
2997;
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
3007}
3008
3009define <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
3017;
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
3027}
3028
3029define <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
3037;
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
3048}
3049
3050define <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
3058;
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
3069}
3070
3071define <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
3079;
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
3090}
3091
3092define <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
3100;
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
3111}
3112
3113define <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
3121;
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
3132}
3133
3134define <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
3142;
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
3153}
3154
3155define <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
3163;
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
3174}
3175
3176define <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
3184;
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
3195}
3196
3197define <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
3205;
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
3215}
3216
3217define <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
3225;
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
3235}
3236
3237define <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
3245;
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
3255}
3256
3257define <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
3265;
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
3275}
3276
3277define <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
3285;
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
3295}
3296
3297define <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
3305;
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
3316}
3317
3318define <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
3326;
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
3337}
3338
3339define <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
3347;
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
3357}
3358
3359define <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
3367;
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
3377}
3378
3379define <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
3387;
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
3397}
3398
3399define <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
3407;
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
3417}
3418
3419define <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
3427;
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
3437}
3438
3439define <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
3447;
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
3457}
3458
3459define <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
3467;
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
3477}
3478
3479define <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
3487;
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
3497}
3498
3499define <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
3507;
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
3517}
3518
3519define <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
3527;
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
3537}
3538
3539define <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
3547;
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
3557}
3558
3559define <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
3567;
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
3577}
3578
3579define <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
3587;
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
3597}
3598
3599define <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
3607;
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
3617}
3618
3619define <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
3627;
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
3637}
3638
3639define <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
3647;
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
3657}
3658
3659define <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
3668;
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
3679}
3680
3681define <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
3690;
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
3701}
3702
3703define <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
3712;
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
3723}
3724
3725define <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
3734;
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
3745}
3746
3747define <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
3756;
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
3767}
3768
3769define <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
3778;
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
3789}
3790
3791define <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
3800;
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
3811}
3812
3813define <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
3822;
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
3833}
3834
3835define <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
3843;
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
3853}
3854
3855define <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
3863;
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
3873}
3874
3875define <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
3883;
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
3893}
3894
3895define <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
3903;
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
3913}
3914
3915define <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
3923;
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
3933}
3934
3935define <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
3943;
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
3953}
3954
3955define <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
3963;
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
3973}
3974
3975define <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
3983;
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
3993}
3994
3995define <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
4003;
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
4013}
4014
4015define <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
4023;
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
4033}
4034