xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/vsadd-vp.ll (revision 36e4176f1d83d04cdebb4e1870561099b2478d80)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s \
3; RUN:   | FileCheck %s --check-prefixes=CHECK,RV32
4; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s \
5; RUN:   | FileCheck %s --check-prefixes=CHECK,RV64
6
7declare <vscale x 8 x i7> @llvm.vp.sadd.sat.nxv8i7(<vscale x 8 x i7>, <vscale x 8 x i7>, <vscale x 8 x i1>, i32)
8
9define <vscale x 8 x i7> @vsadd_vx_nxv8i7(<vscale x 8 x i7> %a, i7 signext %b, <vscale x 8 x i1> %mask, i32 zeroext %evl) {
10; CHECK-LABEL: vsadd_vx_nxv8i7:
11; CHECK:       # %bb.0:
12; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
13; CHECK-NEXT:    vadd.vv v8, v8, v8
14; CHECK-NEXT:    vsra.vi v8, v8, 1
15; CHECK-NEXT:    vadd.vx v8, v8, a0, v0.t
16; CHECK-NEXT:    li a0, 63
17; CHECK-NEXT:    vmin.vx v8, v8, a0, v0.t
18; CHECK-NEXT:    li a0, 192
19; CHECK-NEXT:    vmax.vx v8, v8, a0, v0.t
20; CHECK-NEXT:    ret
21  %elt.head = insertelement <vscale x 8 x i7> poison, i7 %b, i32 0
22  %vb = shufflevector <vscale x 8 x i7> %elt.head, <vscale x 8 x i7> poison, <vscale x 8 x i32> zeroinitializer
23  %v = call <vscale x 8 x i7> @llvm.vp.sadd.sat.nxv8i7(<vscale x 8 x i7> %a, <vscale x 8 x i7> %vb, <vscale x 8 x i1> %mask, i32 %evl)
24  ret <vscale x 8 x i7> %v
25}
26
27declare <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8>, <vscale x 1 x i8>, <vscale x 1 x i1>, i32)
28
29define <vscale x 1 x i8> @vsadd_vv_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %b, <vscale x 1 x i1> %m, i32 zeroext %evl) {
30; CHECK-LABEL: vsadd_vv_nxv1i8:
31; CHECK:       # %bb.0:
32; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
33; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
34; CHECK-NEXT:    ret
35  %v = call <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %b, <vscale x 1 x i1> %m, i32 %evl)
36  ret <vscale x 1 x i8> %v
37}
38
39define <vscale x 1 x i8> @vsadd_vv_nxv1i8_unmasked(<vscale x 1 x i8> %va, <vscale x 1 x i8> %b, i32 zeroext %evl) {
40; CHECK-LABEL: vsadd_vv_nxv1i8_unmasked:
41; CHECK:       # %bb.0:
42; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
43; CHECK-NEXT:    vsadd.vv v8, v8, v9
44; CHECK-NEXT:    ret
45  %v = call <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %b, <vscale x 1 x i1> splat (i1 true), i32 %evl)
46  ret <vscale x 1 x i8> %v
47}
48
49define <vscale x 1 x i8> @vsadd_vx_nxv1i8(<vscale x 1 x i8> %va, i8 %b, <vscale x 1 x i1> %m, i32 zeroext %evl) {
50; CHECK-LABEL: vsadd_vx_nxv1i8:
51; CHECK:       # %bb.0:
52; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
53; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
54; CHECK-NEXT:    ret
55  %elt.head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0
56  %vb = shufflevector <vscale x 1 x i8> %elt.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer
57  %v = call <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %vb, <vscale x 1 x i1> %m, i32 %evl)
58  ret <vscale x 1 x i8> %v
59}
60
61define <vscale x 1 x i8> @vsadd_vx_nxv1i8_commute(<vscale x 1 x i8> %va, i8 %b, <vscale x 1 x i1> %m, i32 zeroext %evl) {
62; CHECK-LABEL: vsadd_vx_nxv1i8_commute:
63; CHECK:       # %bb.0:
64; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
65; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
66; CHECK-NEXT:    ret
67  %elt.head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0
68  %vb = shufflevector <vscale x 1 x i8> %elt.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer
69  %v = call <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8> %vb, <vscale x 1 x i8> %va, <vscale x 1 x i1> %m, i32 %evl)
70  ret <vscale x 1 x i8> %v
71}
72
73define <vscale x 1 x i8> @vsadd_vx_nxv1i8_unmasked(<vscale x 1 x i8> %va, i8 %b, i32 zeroext %evl) {
74; CHECK-LABEL: vsadd_vx_nxv1i8_unmasked:
75; CHECK:       # %bb.0:
76; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
77; CHECK-NEXT:    vsadd.vx v8, v8, a0
78; CHECK-NEXT:    ret
79  %elt.head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0
80  %vb = shufflevector <vscale x 1 x i8> %elt.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer
81  %v = call <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %vb, <vscale x 1 x i1> splat (i1 true), i32 %evl)
82  ret <vscale x 1 x i8> %v
83}
84
85define <vscale x 1 x i8> @vsadd_vi_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
86; CHECK-LABEL: vsadd_vi_nxv1i8:
87; CHECK:       # %bb.0:
88; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
89; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
90; CHECK-NEXT:    ret
91  %v = call <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> splat (i8 -1), <vscale x 1 x i1> %m, i32 %evl)
92  ret <vscale x 1 x i8> %v
93}
94
95define <vscale x 1 x i8> @vsadd_vi_nxv1i8_unmasked(<vscale x 1 x i8> %va, i32 zeroext %evl) {
96; CHECK-LABEL: vsadd_vi_nxv1i8_unmasked:
97; CHECK:       # %bb.0:
98; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
99; CHECK-NEXT:    vsadd.vi v8, v8, -1
100; CHECK-NEXT:    ret
101  %v = call <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> splat (i8 -1), <vscale x 1 x i1> splat (i1 true), i32 %evl)
102  ret <vscale x 1 x i8> %v
103}
104
105declare <vscale x 2 x i8> @llvm.vp.sadd.sat.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i8>, <vscale x 2 x i1>, i32)
106
107define <vscale x 2 x i8> @vsadd_vv_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %b, <vscale x 2 x i1> %m, i32 zeroext %evl) {
108; CHECK-LABEL: vsadd_vv_nxv2i8:
109; CHECK:       # %bb.0:
110; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
111; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
112; CHECK-NEXT:    ret
113  %v = call <vscale x 2 x i8> @llvm.vp.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %b, <vscale x 2 x i1> %m, i32 %evl)
114  ret <vscale x 2 x i8> %v
115}
116
117define <vscale x 2 x i8> @vsadd_vv_nxv2i8_unmasked(<vscale x 2 x i8> %va, <vscale x 2 x i8> %b, i32 zeroext %evl) {
118; CHECK-LABEL: vsadd_vv_nxv2i8_unmasked:
119; CHECK:       # %bb.0:
120; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
121; CHECK-NEXT:    vsadd.vv v8, v8, v9
122; CHECK-NEXT:    ret
123  %v = call <vscale x 2 x i8> @llvm.vp.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %b, <vscale x 2 x i1> splat (i1 true), i32 %evl)
124  ret <vscale x 2 x i8> %v
125}
126
127define <vscale x 2 x i8> @vsadd_vx_nxv2i8(<vscale x 2 x i8> %va, i8 %b, <vscale x 2 x i1> %m, i32 zeroext %evl) {
128; CHECK-LABEL: vsadd_vx_nxv2i8:
129; CHECK:       # %bb.0:
130; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
131; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
132; CHECK-NEXT:    ret
133  %elt.head = insertelement <vscale x 2 x i8> poison, i8 %b, i32 0
134  %vb = shufflevector <vscale x 2 x i8> %elt.head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer
135  %v = call <vscale x 2 x i8> @llvm.vp.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %vb, <vscale x 2 x i1> %m, i32 %evl)
136  ret <vscale x 2 x i8> %v
137}
138
139define <vscale x 2 x i8> @vsadd_vx_nxv2i8_unmasked(<vscale x 2 x i8> %va, i8 %b, i32 zeroext %evl) {
140; CHECK-LABEL: vsadd_vx_nxv2i8_unmasked:
141; CHECK:       # %bb.0:
142; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
143; CHECK-NEXT:    vsadd.vx v8, v8, a0
144; CHECK-NEXT:    ret
145  %elt.head = insertelement <vscale x 2 x i8> poison, i8 %b, i32 0
146  %vb = shufflevector <vscale x 2 x i8> %elt.head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer
147  %v = call <vscale x 2 x i8> @llvm.vp.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %vb, <vscale x 2 x i1> splat (i1 true), i32 %evl)
148  ret <vscale x 2 x i8> %v
149}
150
151define <vscale x 2 x i8> @vsadd_vi_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
152; CHECK-LABEL: vsadd_vi_nxv2i8:
153; CHECK:       # %bb.0:
154; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
155; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
156; CHECK-NEXT:    ret
157  %v = call <vscale x 2 x i8> @llvm.vp.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> splat (i8 -1), <vscale x 2 x i1> %m, i32 %evl)
158  ret <vscale x 2 x i8> %v
159}
160
161define <vscale x 2 x i8> @vsadd_vi_nxv2i8_unmasked(<vscale x 2 x i8> %va, i32 zeroext %evl) {
162; CHECK-LABEL: vsadd_vi_nxv2i8_unmasked:
163; CHECK:       # %bb.0:
164; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
165; CHECK-NEXT:    vsadd.vi v8, v8, -1
166; CHECK-NEXT:    ret
167  %v = call <vscale x 2 x i8> @llvm.vp.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> splat (i8 -1), <vscale x 2 x i1> splat (i1 true), i32 %evl)
168  ret <vscale x 2 x i8> %v
169}
170
171declare <vscale x 3 x i8> @llvm.vp.sadd.sat.nxv3i8(<vscale x 3 x i8>, <vscale x 3 x i8>, <vscale x 3 x i1>, i32)
172
173define <vscale x 3 x i8> @vsadd_vv_nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> %b, <vscale x 3 x i1> %m, i32 zeroext %evl) {
174; CHECK-LABEL: vsadd_vv_nxv3i8:
175; CHECK:       # %bb.0:
176; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
177; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
178; CHECK-NEXT:    ret
179  %v = call <vscale x 3 x i8> @llvm.vp.sadd.sat.nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> %b, <vscale x 3 x i1> %m, i32 %evl)
180  ret <vscale x 3 x i8> %v
181}
182
183define <vscale x 3 x i8> @vsadd_vv_nxv3i8_unmasked(<vscale x 3 x i8> %va, <vscale x 3 x i8> %b, i32 zeroext %evl) {
184; CHECK-LABEL: vsadd_vv_nxv3i8_unmasked:
185; CHECK:       # %bb.0:
186; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
187; CHECK-NEXT:    vsadd.vv v8, v8, v9
188; CHECK-NEXT:    ret
189  %v = call <vscale x 3 x i8> @llvm.vp.sadd.sat.nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> %b, <vscale x 3 x i1> splat (i1 true), i32 %evl)
190  ret <vscale x 3 x i8> %v
191}
192
193define <vscale x 3 x i8> @vsadd_vx_nxv3i8(<vscale x 3 x i8> %va, i8 %b, <vscale x 3 x i1> %m, i32 zeroext %evl) {
194; CHECK-LABEL: vsadd_vx_nxv3i8:
195; CHECK:       # %bb.0:
196; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
197; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
198; CHECK-NEXT:    ret
199  %elt.head = insertelement <vscale x 3 x i8> poison, i8 %b, i32 0
200  %vb = shufflevector <vscale x 3 x i8> %elt.head, <vscale x 3 x i8> poison, <vscale x 3 x i32> zeroinitializer
201  %v = call <vscale x 3 x i8> @llvm.vp.sadd.sat.nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> %vb, <vscale x 3 x i1> %m, i32 %evl)
202  ret <vscale x 3 x i8> %v
203}
204
205define <vscale x 3 x i8> @vsadd_vx_nxv3i8_unmasked(<vscale x 3 x i8> %va, i8 %b, i32 zeroext %evl) {
206; CHECK-LABEL: vsadd_vx_nxv3i8_unmasked:
207; CHECK:       # %bb.0:
208; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
209; CHECK-NEXT:    vsadd.vx v8, v8, a0
210; CHECK-NEXT:    ret
211  %elt.head = insertelement <vscale x 3 x i8> poison, i8 %b, i32 0
212  %vb = shufflevector <vscale x 3 x i8> %elt.head, <vscale x 3 x i8> poison, <vscale x 3 x i32> zeroinitializer
213  %v = call <vscale x 3 x i8> @llvm.vp.sadd.sat.nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> %vb, <vscale x 3 x i1> splat (i1 true), i32 %evl)
214  ret <vscale x 3 x i8> %v
215}
216
217define <vscale x 3 x i8> @vsadd_vi_nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i1> %m, i32 zeroext %evl) {
218; CHECK-LABEL: vsadd_vi_nxv3i8:
219; CHECK:       # %bb.0:
220; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
221; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
222; CHECK-NEXT:    ret
223  %v = call <vscale x 3 x i8> @llvm.vp.sadd.sat.nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> splat (i8 -1), <vscale x 3 x i1> %m, i32 %evl)
224  ret <vscale x 3 x i8> %v
225}
226
227define <vscale x 3 x i8> @vsadd_vi_nxv3i8_unmasked(<vscale x 3 x i8> %va, i32 zeroext %evl) {
228; CHECK-LABEL: vsadd_vi_nxv3i8_unmasked:
229; CHECK:       # %bb.0:
230; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
231; CHECK-NEXT:    vsadd.vi v8, v8, -1
232; CHECK-NEXT:    ret
233  %v = call <vscale x 3 x i8> @llvm.vp.sadd.sat.nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> splat (i8 -1), <vscale x 3 x i1> splat (i1 true), i32 %evl)
234  ret <vscale x 3 x i8> %v
235}
236
237declare <vscale x 4 x i8> @llvm.vp.sadd.sat.nxv4i8(<vscale x 4 x i8>, <vscale x 4 x i8>, <vscale x 4 x i1>, i32)
238
239define <vscale x 4 x i8> @vsadd_vv_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %b, <vscale x 4 x i1> %m, i32 zeroext %evl) {
240; CHECK-LABEL: vsadd_vv_nxv4i8:
241; CHECK:       # %bb.0:
242; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
243; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
244; CHECK-NEXT:    ret
245  %v = call <vscale x 4 x i8> @llvm.vp.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %b, <vscale x 4 x i1> %m, i32 %evl)
246  ret <vscale x 4 x i8> %v
247}
248
249define <vscale x 4 x i8> @vsadd_vv_nxv4i8_unmasked(<vscale x 4 x i8> %va, <vscale x 4 x i8> %b, i32 zeroext %evl) {
250; CHECK-LABEL: vsadd_vv_nxv4i8_unmasked:
251; CHECK:       # %bb.0:
252; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
253; CHECK-NEXT:    vsadd.vv v8, v8, v9
254; CHECK-NEXT:    ret
255  %v = call <vscale x 4 x i8> @llvm.vp.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %b, <vscale x 4 x i1> splat (i1 true), i32 %evl)
256  ret <vscale x 4 x i8> %v
257}
258
259define <vscale x 4 x i8> @vsadd_vx_nxv4i8(<vscale x 4 x i8> %va, i8 %b, <vscale x 4 x i1> %m, i32 zeroext %evl) {
260; CHECK-LABEL: vsadd_vx_nxv4i8:
261; CHECK:       # %bb.0:
262; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
263; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
264; CHECK-NEXT:    ret
265  %elt.head = insertelement <vscale x 4 x i8> poison, i8 %b, i32 0
266  %vb = shufflevector <vscale x 4 x i8> %elt.head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer
267  %v = call <vscale x 4 x i8> @llvm.vp.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %vb, <vscale x 4 x i1> %m, i32 %evl)
268  ret <vscale x 4 x i8> %v
269}
270
271define <vscale x 4 x i8> @vsadd_vx_nxv4i8_unmasked(<vscale x 4 x i8> %va, i8 %b, i32 zeroext %evl) {
272; CHECK-LABEL: vsadd_vx_nxv4i8_unmasked:
273; CHECK:       # %bb.0:
274; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
275; CHECK-NEXT:    vsadd.vx v8, v8, a0
276; CHECK-NEXT:    ret
277  %elt.head = insertelement <vscale x 4 x i8> poison, i8 %b, i32 0
278  %vb = shufflevector <vscale x 4 x i8> %elt.head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer
279  %v = call <vscale x 4 x i8> @llvm.vp.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %vb, <vscale x 4 x i1> splat (i1 true), i32 %evl)
280  ret <vscale x 4 x i8> %v
281}
282
283define <vscale x 4 x i8> @vsadd_vi_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
284; CHECK-LABEL: vsadd_vi_nxv4i8:
285; CHECK:       # %bb.0:
286; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
287; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
288; CHECK-NEXT:    ret
289  %v = call <vscale x 4 x i8> @llvm.vp.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> splat (i8 -1), <vscale x 4 x i1> %m, i32 %evl)
290  ret <vscale x 4 x i8> %v
291}
292
293define <vscale x 4 x i8> @vsadd_vi_nxv4i8_unmasked(<vscale x 4 x i8> %va, i32 zeroext %evl) {
294; CHECK-LABEL: vsadd_vi_nxv4i8_unmasked:
295; CHECK:       # %bb.0:
296; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
297; CHECK-NEXT:    vsadd.vi v8, v8, -1
298; CHECK-NEXT:    ret
299  %v = call <vscale x 4 x i8> @llvm.vp.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> splat (i8 -1), <vscale x 4 x i1> splat (i1 true), i32 %evl)
300  ret <vscale x 4 x i8> %v
301}
302
303declare <vscale x 8 x i8> @llvm.vp.sadd.sat.nxv8i8(<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i1>, i32)
304
305define <vscale x 8 x i8> @vsadd_vv_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %b, <vscale x 8 x i1> %m, i32 zeroext %evl) {
306; CHECK-LABEL: vsadd_vv_nxv8i8:
307; CHECK:       # %bb.0:
308; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
309; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
310; CHECK-NEXT:    ret
311  %v = call <vscale x 8 x i8> @llvm.vp.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %b, <vscale x 8 x i1> %m, i32 %evl)
312  ret <vscale x 8 x i8> %v
313}
314
315define <vscale x 8 x i8> @vsadd_vv_nxv8i8_unmasked(<vscale x 8 x i8> %va, <vscale x 8 x i8> %b, i32 zeroext %evl) {
316; CHECK-LABEL: vsadd_vv_nxv8i8_unmasked:
317; CHECK:       # %bb.0:
318; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
319; CHECK-NEXT:    vsadd.vv v8, v8, v9
320; CHECK-NEXT:    ret
321  %v = call <vscale x 8 x i8> @llvm.vp.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %b, <vscale x 8 x i1> splat (i1 true), i32 %evl)
322  ret <vscale x 8 x i8> %v
323}
324
325define <vscale x 8 x i8> @vsadd_vx_nxv8i8(<vscale x 8 x i8> %va, i8 %b, <vscale x 8 x i1> %m, i32 zeroext %evl) {
326; CHECK-LABEL: vsadd_vx_nxv8i8:
327; CHECK:       # %bb.0:
328; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
329; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
330; CHECK-NEXT:    ret
331  %elt.head = insertelement <vscale x 8 x i8> poison, i8 %b, i32 0
332  %vb = shufflevector <vscale x 8 x i8> %elt.head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer
333  %v = call <vscale x 8 x i8> @llvm.vp.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %vb, <vscale x 8 x i1> %m, i32 %evl)
334  ret <vscale x 8 x i8> %v
335}
336
337define <vscale x 8 x i8> @vsadd_vx_nxv8i8_unmasked(<vscale x 8 x i8> %va, i8 %b, i32 zeroext %evl) {
338; CHECK-LABEL: vsadd_vx_nxv8i8_unmasked:
339; CHECK:       # %bb.0:
340; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
341; CHECK-NEXT:    vsadd.vx v8, v8, a0
342; CHECK-NEXT:    ret
343  %elt.head = insertelement <vscale x 8 x i8> poison, i8 %b, i32 0
344  %vb = shufflevector <vscale x 8 x i8> %elt.head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer
345  %v = call <vscale x 8 x i8> @llvm.vp.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %vb, <vscale x 8 x i1> splat (i1 true), i32 %evl)
346  ret <vscale x 8 x i8> %v
347}
348
349define <vscale x 8 x i8> @vsadd_vi_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
350; CHECK-LABEL: vsadd_vi_nxv8i8:
351; CHECK:       # %bb.0:
352; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
353; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
354; CHECK-NEXT:    ret
355  %v = call <vscale x 8 x i8> @llvm.vp.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> splat (i8 -1), <vscale x 8 x i1> %m, i32 %evl)
356  ret <vscale x 8 x i8> %v
357}
358
359define <vscale x 8 x i8> @vsadd_vi_nxv8i8_unmasked(<vscale x 8 x i8> %va, i32 zeroext %evl) {
360; CHECK-LABEL: vsadd_vi_nxv8i8_unmasked:
361; CHECK:       # %bb.0:
362; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
363; CHECK-NEXT:    vsadd.vi v8, v8, -1
364; CHECK-NEXT:    ret
365  %v = call <vscale x 8 x i8> @llvm.vp.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> splat (i8 -1), <vscale x 8 x i1> splat (i1 true), i32 %evl)
366  ret <vscale x 8 x i8> %v
367}
368
369declare <vscale x 16 x i8> @llvm.vp.sadd.sat.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i1>, i32)
370
371define <vscale x 16 x i8> @vsadd_vv_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %b, <vscale x 16 x i1> %m, i32 zeroext %evl) {
372; CHECK-LABEL: vsadd_vv_nxv16i8:
373; CHECK:       # %bb.0:
374; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
375; CHECK-NEXT:    vsadd.vv v8, v8, v10, v0.t
376; CHECK-NEXT:    ret
377  %v = call <vscale x 16 x i8> @llvm.vp.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %b, <vscale x 16 x i1> %m, i32 %evl)
378  ret <vscale x 16 x i8> %v
379}
380
381define <vscale x 16 x i8> @vsadd_vv_nxv16i8_unmasked(<vscale x 16 x i8> %va, <vscale x 16 x i8> %b, i32 zeroext %evl) {
382; CHECK-LABEL: vsadd_vv_nxv16i8_unmasked:
383; CHECK:       # %bb.0:
384; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
385; CHECK-NEXT:    vsadd.vv v8, v8, v10
386; CHECK-NEXT:    ret
387  %v = call <vscale x 16 x i8> @llvm.vp.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %b, <vscale x 16 x i1> splat (i1 true), i32 %evl)
388  ret <vscale x 16 x i8> %v
389}
390
391define <vscale x 16 x i8> @vsadd_vx_nxv16i8(<vscale x 16 x i8> %va, i8 %b, <vscale x 16 x i1> %m, i32 zeroext %evl) {
392; CHECK-LABEL: vsadd_vx_nxv16i8:
393; CHECK:       # %bb.0:
394; CHECK-NEXT:    vsetvli zero, a1, e8, m2, ta, ma
395; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
396; CHECK-NEXT:    ret
397  %elt.head = insertelement <vscale x 16 x i8> poison, i8 %b, i32 0
398  %vb = shufflevector <vscale x 16 x i8> %elt.head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
399  %v = call <vscale x 16 x i8> @llvm.vp.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %vb, <vscale x 16 x i1> %m, i32 %evl)
400  ret <vscale x 16 x i8> %v
401}
402
403define <vscale x 16 x i8> @vsadd_vx_nxv16i8_unmasked(<vscale x 16 x i8> %va, i8 %b, i32 zeroext %evl) {
404; CHECK-LABEL: vsadd_vx_nxv16i8_unmasked:
405; CHECK:       # %bb.0:
406; CHECK-NEXT:    vsetvli zero, a1, e8, m2, ta, ma
407; CHECK-NEXT:    vsadd.vx v8, v8, a0
408; CHECK-NEXT:    ret
409  %elt.head = insertelement <vscale x 16 x i8> poison, i8 %b, i32 0
410  %vb = shufflevector <vscale x 16 x i8> %elt.head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
411  %v = call <vscale x 16 x i8> @llvm.vp.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %vb, <vscale x 16 x i1> splat (i1 true), i32 %evl)
412  ret <vscale x 16 x i8> %v
413}
414
415define <vscale x 16 x i8> @vsadd_vi_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
416; CHECK-LABEL: vsadd_vi_nxv16i8:
417; CHECK:       # %bb.0:
418; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
419; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
420; CHECK-NEXT:    ret
421  %v = call <vscale x 16 x i8> @llvm.vp.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> splat (i8 -1), <vscale x 16 x i1> %m, i32 %evl)
422  ret <vscale x 16 x i8> %v
423}
424
425define <vscale x 16 x i8> @vsadd_vi_nxv16i8_unmasked(<vscale x 16 x i8> %va, i32 zeroext %evl) {
426; CHECK-LABEL: vsadd_vi_nxv16i8_unmasked:
427; CHECK:       # %bb.0:
428; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
429; CHECK-NEXT:    vsadd.vi v8, v8, -1
430; CHECK-NEXT:    ret
431  %v = call <vscale x 16 x i8> @llvm.vp.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> splat (i8 -1), <vscale x 16 x i1> splat (i1 true), i32 %evl)
432  ret <vscale x 16 x i8> %v
433}
434
435declare <vscale x 32 x i8> @llvm.vp.sadd.sat.nxv32i8(<vscale x 32 x i8>, <vscale x 32 x i8>, <vscale x 32 x i1>, i32)
436
437define <vscale x 32 x i8> @vsadd_vv_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %b, <vscale x 32 x i1> %m, i32 zeroext %evl) {
438; CHECK-LABEL: vsadd_vv_nxv32i8:
439; CHECK:       # %bb.0:
440; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
441; CHECK-NEXT:    vsadd.vv v8, v8, v12, v0.t
442; CHECK-NEXT:    ret
443  %v = call <vscale x 32 x i8> @llvm.vp.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %b, <vscale x 32 x i1> %m, i32 %evl)
444  ret <vscale x 32 x i8> %v
445}
446
447define <vscale x 32 x i8> @vsadd_vv_nxv32i8_unmasked(<vscale x 32 x i8> %va, <vscale x 32 x i8> %b, i32 zeroext %evl) {
448; CHECK-LABEL: vsadd_vv_nxv32i8_unmasked:
449; CHECK:       # %bb.0:
450; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
451; CHECK-NEXT:    vsadd.vv v8, v8, v12
452; CHECK-NEXT:    ret
453  %v = call <vscale x 32 x i8> @llvm.vp.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %b, <vscale x 32 x i1> splat (i1 true), i32 %evl)
454  ret <vscale x 32 x i8> %v
455}
456
457define <vscale x 32 x i8> @vsadd_vx_nxv32i8(<vscale x 32 x i8> %va, i8 %b, <vscale x 32 x i1> %m, i32 zeroext %evl) {
458; CHECK-LABEL: vsadd_vx_nxv32i8:
459; CHECK:       # %bb.0:
460; CHECK-NEXT:    vsetvli zero, a1, e8, m4, ta, ma
461; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
462; CHECK-NEXT:    ret
463  %elt.head = insertelement <vscale x 32 x i8> poison, i8 %b, i32 0
464  %vb = shufflevector <vscale x 32 x i8> %elt.head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer
465  %v = call <vscale x 32 x i8> @llvm.vp.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %vb, <vscale x 32 x i1> %m, i32 %evl)
466  ret <vscale x 32 x i8> %v
467}
468
469define <vscale x 32 x i8> @vsadd_vx_nxv32i8_unmasked(<vscale x 32 x i8> %va, i8 %b, i32 zeroext %evl) {
470; CHECK-LABEL: vsadd_vx_nxv32i8_unmasked:
471; CHECK:       # %bb.0:
472; CHECK-NEXT:    vsetvli zero, a1, e8, m4, ta, ma
473; CHECK-NEXT:    vsadd.vx v8, v8, a0
474; CHECK-NEXT:    ret
475  %elt.head = insertelement <vscale x 32 x i8> poison, i8 %b, i32 0
476  %vb = shufflevector <vscale x 32 x i8> %elt.head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer
477  %v = call <vscale x 32 x i8> @llvm.vp.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %vb, <vscale x 32 x i1> splat (i1 true), i32 %evl)
478  ret <vscale x 32 x i8> %v
479}
480
481define <vscale x 32 x i8> @vsadd_vi_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) {
482; CHECK-LABEL: vsadd_vi_nxv32i8:
483; CHECK:       # %bb.0:
484; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
485; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
486; CHECK-NEXT:    ret
487  %v = call <vscale x 32 x i8> @llvm.vp.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> splat (i8 -1), <vscale x 32 x i1> %m, i32 %evl)
488  ret <vscale x 32 x i8> %v
489}
490
491define <vscale x 32 x i8> @vsadd_vi_nxv32i8_unmasked(<vscale x 32 x i8> %va, i32 zeroext %evl) {
492; CHECK-LABEL: vsadd_vi_nxv32i8_unmasked:
493; CHECK:       # %bb.0:
494; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
495; CHECK-NEXT:    vsadd.vi v8, v8, -1
496; CHECK-NEXT:    ret
497  %v = call <vscale x 32 x i8> @llvm.vp.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> splat (i8 -1), <vscale x 32 x i1> splat (i1 true), i32 %evl)
498  ret <vscale x 32 x i8> %v
499}
500
501declare <vscale x 64 x i8> @llvm.vp.sadd.sat.nxv64i8(<vscale x 64 x i8>, <vscale x 64 x i8>, <vscale x 64 x i1>, i32)
502
503define <vscale x 64 x i8> @vsadd_vv_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %b, <vscale x 64 x i1> %m, i32 zeroext %evl) {
504; CHECK-LABEL: vsadd_vv_nxv64i8:
505; CHECK:       # %bb.0:
506; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
507; CHECK-NEXT:    vsadd.vv v8, v8, v16, v0.t
508; CHECK-NEXT:    ret
509  %v = call <vscale x 64 x i8> @llvm.vp.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %b, <vscale x 64 x i1> %m, i32 %evl)
510  ret <vscale x 64 x i8> %v
511}
512
513define <vscale x 64 x i8> @vsadd_vv_nxv64i8_unmasked(<vscale x 64 x i8> %va, <vscale x 64 x i8> %b, i32 zeroext %evl) {
514; CHECK-LABEL: vsadd_vv_nxv64i8_unmasked:
515; CHECK:       # %bb.0:
516; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
517; CHECK-NEXT:    vsadd.vv v8, v8, v16
518; CHECK-NEXT:    ret
519  %v = call <vscale x 64 x i8> @llvm.vp.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %b, <vscale x 64 x i1> splat (i1 true), i32 %evl)
520  ret <vscale x 64 x i8> %v
521}
522
523define <vscale x 64 x i8> @vsadd_vx_nxv64i8(<vscale x 64 x i8> %va, i8 %b, <vscale x 64 x i1> %m, i32 zeroext %evl) {
524; CHECK-LABEL: vsadd_vx_nxv64i8:
525; CHECK:       # %bb.0:
526; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
527; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
528; CHECK-NEXT:    ret
529  %elt.head = insertelement <vscale x 64 x i8> poison, i8 %b, i32 0
530  %vb = shufflevector <vscale x 64 x i8> %elt.head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer
531  %v = call <vscale x 64 x i8> @llvm.vp.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %vb, <vscale x 64 x i1> %m, i32 %evl)
532  ret <vscale x 64 x i8> %v
533}
534
535define <vscale x 64 x i8> @vsadd_vx_nxv64i8_unmasked(<vscale x 64 x i8> %va, i8 %b, i32 zeroext %evl) {
536; CHECK-LABEL: vsadd_vx_nxv64i8_unmasked:
537; CHECK:       # %bb.0:
538; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
539; CHECK-NEXT:    vsadd.vx v8, v8, a0
540; CHECK-NEXT:    ret
541  %elt.head = insertelement <vscale x 64 x i8> poison, i8 %b, i32 0
542  %vb = shufflevector <vscale x 64 x i8> %elt.head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer
543  %v = call <vscale x 64 x i8> @llvm.vp.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %vb, <vscale x 64 x i1> splat (i1 true), i32 %evl)
544  ret <vscale x 64 x i8> %v
545}
546
547define <vscale x 64 x i8> @vsadd_vi_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i1> %m, i32 zeroext %evl) {
548; CHECK-LABEL: vsadd_vi_nxv64i8:
549; CHECK:       # %bb.0:
550; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
551; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
552; CHECK-NEXT:    ret
553  %v = call <vscale x 64 x i8> @llvm.vp.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> splat (i8 -1), <vscale x 64 x i1> %m, i32 %evl)
554  ret <vscale x 64 x i8> %v
555}
556
557define <vscale x 64 x i8> @vsadd_vi_nxv64i8_unmasked(<vscale x 64 x i8> %va, i32 zeroext %evl) {
558; CHECK-LABEL: vsadd_vi_nxv64i8_unmasked:
559; CHECK:       # %bb.0:
560; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
561; CHECK-NEXT:    vsadd.vi v8, v8, -1
562; CHECK-NEXT:    ret
563  %v = call <vscale x 64 x i8> @llvm.vp.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> splat (i8 -1), <vscale x 64 x i1> splat (i1 true), i32 %evl)
564  ret <vscale x 64 x i8> %v
565}
566
567; Test that split-legalization works when the mask itself needs splitting.
568
569declare <vscale x 128 x i8> @llvm.vp.sadd.sat.nxv128i8(<vscale x 128 x i8>, <vscale x 128 x i8>, <vscale x 128 x i1>, i32)
570
571define <vscale x 128 x i8> @vsadd_vi_nxv128i8(<vscale x 128 x i8> %va, <vscale x 128 x i1> %m, i32 zeroext %evl) {
572; CHECK-LABEL: vsadd_vi_nxv128i8:
573; CHECK:       # %bb.0:
574; CHECK-NEXT:    vsetvli a2, zero, e8, m8, ta, ma
575; CHECK-NEXT:    vmv1r.v v24, v0
576; CHECK-NEXT:    vlm.v v0, (a0)
577; CHECK-NEXT:    csrr a0, vlenb
578; CHECK-NEXT:    slli a0, a0, 3
579; CHECK-NEXT:    sub a2, a1, a0
580; CHECK-NEXT:    sltu a3, a1, a2
581; CHECK-NEXT:    addi a3, a3, -1
582; CHECK-NEXT:    and a2, a3, a2
583; CHECK-NEXT:    vsetvli zero, a2, e8, m8, ta, ma
584; CHECK-NEXT:    vsadd.vi v16, v16, -1, v0.t
585; CHECK-NEXT:    bltu a1, a0, .LBB50_2
586; CHECK-NEXT:  # %bb.1:
587; CHECK-NEXT:    mv a1, a0
588; CHECK-NEXT:  .LBB50_2:
589; CHECK-NEXT:    vmv1r.v v0, v24
590; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
591; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
592; CHECK-NEXT:    ret
593  %v = call <vscale x 128 x i8> @llvm.vp.sadd.sat.nxv128i8(<vscale x 128 x i8> %va, <vscale x 128 x i8> splat (i8 -1), <vscale x 128 x i1> %m, i32 %evl)
594  ret <vscale x 128 x i8> %v
595}
596
597define <vscale x 128 x i8> @vsadd_vi_nxv128i8_unmasked(<vscale x 128 x i8> %va, i32 zeroext %evl) {
598; CHECK-LABEL: vsadd_vi_nxv128i8_unmasked:
599; CHECK:       # %bb.0:
600; CHECK-NEXT:    csrr a1, vlenb
601; CHECK-NEXT:    slli a1, a1, 3
602; CHECK-NEXT:    sub a2, a0, a1
603; CHECK-NEXT:    sltu a3, a0, a2
604; CHECK-NEXT:    addi a3, a3, -1
605; CHECK-NEXT:    and a2, a3, a2
606; CHECK-NEXT:    vsetvli zero, a2, e8, m8, ta, ma
607; CHECK-NEXT:    vsadd.vi v16, v16, -1
608; CHECK-NEXT:    bltu a0, a1, .LBB51_2
609; CHECK-NEXT:  # %bb.1:
610; CHECK-NEXT:    mv a0, a1
611; CHECK-NEXT:  .LBB51_2:
612; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
613; CHECK-NEXT:    vsadd.vi v8, v8, -1
614; CHECK-NEXT:    ret
615  %v = call <vscale x 128 x i8> @llvm.vp.sadd.sat.nxv128i8(<vscale x 128 x i8> %va, <vscale x 128 x i8> splat (i8 -1), <vscale x 128 x i1> splat (i1 true), i32 %evl)
616  ret <vscale x 128 x i8> %v
617}
618
619declare <vscale x 1 x i16> @llvm.vp.sadd.sat.nxv1i16(<vscale x 1 x i16>, <vscale x 1 x i16>, <vscale x 1 x i1>, i32)
620
621define <vscale x 1 x i16> @vsadd_vv_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %b, <vscale x 1 x i1> %m, i32 zeroext %evl) {
622; CHECK-LABEL: vsadd_vv_nxv1i16:
623; CHECK:       # %bb.0:
624; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
625; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
626; CHECK-NEXT:    ret
627  %v = call <vscale x 1 x i16> @llvm.vp.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %b, <vscale x 1 x i1> %m, i32 %evl)
628  ret <vscale x 1 x i16> %v
629}
630
631define <vscale x 1 x i16> @vsadd_vv_nxv1i16_unmasked(<vscale x 1 x i16> %va, <vscale x 1 x i16> %b, i32 zeroext %evl) {
632; CHECK-LABEL: vsadd_vv_nxv1i16_unmasked:
633; CHECK:       # %bb.0:
634; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
635; CHECK-NEXT:    vsadd.vv v8, v8, v9
636; CHECK-NEXT:    ret
637  %v = call <vscale x 1 x i16> @llvm.vp.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %b, <vscale x 1 x i1> splat (i1 true), i32 %evl)
638  ret <vscale x 1 x i16> %v
639}
640
641define <vscale x 1 x i16> @vsadd_vx_nxv1i16(<vscale x 1 x i16> %va, i16 %b, <vscale x 1 x i1> %m, i32 zeroext %evl) {
642; CHECK-LABEL: vsadd_vx_nxv1i16:
643; CHECK:       # %bb.0:
644; CHECK-NEXT:    vsetvli zero, a1, e16, mf4, ta, ma
645; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
646; CHECK-NEXT:    ret
647  %elt.head = insertelement <vscale x 1 x i16> poison, i16 %b, i32 0
648  %vb = shufflevector <vscale x 1 x i16> %elt.head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer
649  %v = call <vscale x 1 x i16> @llvm.vp.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %vb, <vscale x 1 x i1> %m, i32 %evl)
650  ret <vscale x 1 x i16> %v
651}
652
653define <vscale x 1 x i16> @vsadd_vx_nxv1i16_unmasked(<vscale x 1 x i16> %va, i16 %b, i32 zeroext %evl) {
654; CHECK-LABEL: vsadd_vx_nxv1i16_unmasked:
655; CHECK:       # %bb.0:
656; CHECK-NEXT:    vsetvli zero, a1, e16, mf4, ta, ma
657; CHECK-NEXT:    vsadd.vx v8, v8, a0
658; CHECK-NEXT:    ret
659  %elt.head = insertelement <vscale x 1 x i16> poison, i16 %b, i32 0
660  %vb = shufflevector <vscale x 1 x i16> %elt.head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer
661  %v = call <vscale x 1 x i16> @llvm.vp.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %vb, <vscale x 1 x i1> splat (i1 true), i32 %evl)
662  ret <vscale x 1 x i16> %v
663}
664
665define <vscale x 1 x i16> @vsadd_vi_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
666; CHECK-LABEL: vsadd_vi_nxv1i16:
667; CHECK:       # %bb.0:
668; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
669; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
670; CHECK-NEXT:    ret
671  %v = call <vscale x 1 x i16> @llvm.vp.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> splat (i16 -1), <vscale x 1 x i1> %m, i32 %evl)
672  ret <vscale x 1 x i16> %v
673}
674
675define <vscale x 1 x i16> @vsadd_vi_nxv1i16_unmasked(<vscale x 1 x i16> %va, i32 zeroext %evl) {
676; CHECK-LABEL: vsadd_vi_nxv1i16_unmasked:
677; CHECK:       # %bb.0:
678; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
679; CHECK-NEXT:    vsadd.vi v8, v8, -1
680; CHECK-NEXT:    ret
681  %v = call <vscale x 1 x i16> @llvm.vp.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> splat (i16 -1), <vscale x 1 x i1> splat (i1 true), i32 %evl)
682  ret <vscale x 1 x i16> %v
683}
684
685declare <vscale x 2 x i16> @llvm.vp.sadd.sat.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i16>, <vscale x 2 x i1>, i32)
686
687define <vscale x 2 x i16> @vsadd_vv_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %b, <vscale x 2 x i1> %m, i32 zeroext %evl) {
688; CHECK-LABEL: vsadd_vv_nxv2i16:
689; CHECK:       # %bb.0:
690; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
691; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
692; CHECK-NEXT:    ret
693  %v = call <vscale x 2 x i16> @llvm.vp.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %b, <vscale x 2 x i1> %m, i32 %evl)
694  ret <vscale x 2 x i16> %v
695}
696
697define <vscale x 2 x i16> @vsadd_vv_nxv2i16_unmasked(<vscale x 2 x i16> %va, <vscale x 2 x i16> %b, i32 zeroext %evl) {
698; CHECK-LABEL: vsadd_vv_nxv2i16_unmasked:
699; CHECK:       # %bb.0:
700; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
701; CHECK-NEXT:    vsadd.vv v8, v8, v9
702; CHECK-NEXT:    ret
703  %v = call <vscale x 2 x i16> @llvm.vp.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %b, <vscale x 2 x i1> splat (i1 true), i32 %evl)
704  ret <vscale x 2 x i16> %v
705}
706
707define <vscale x 2 x i16> @vsadd_vx_nxv2i16(<vscale x 2 x i16> %va, i16 %b, <vscale x 2 x i1> %m, i32 zeroext %evl) {
708; CHECK-LABEL: vsadd_vx_nxv2i16:
709; CHECK:       # %bb.0:
710; CHECK-NEXT:    vsetvli zero, a1, e16, mf2, ta, ma
711; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
712; CHECK-NEXT:    ret
713  %elt.head = insertelement <vscale x 2 x i16> poison, i16 %b, i32 0
714  %vb = shufflevector <vscale x 2 x i16> %elt.head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer
715  %v = call <vscale x 2 x i16> @llvm.vp.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %vb, <vscale x 2 x i1> %m, i32 %evl)
716  ret <vscale x 2 x i16> %v
717}
718
719define <vscale x 2 x i16> @vsadd_vx_nxv2i16_unmasked(<vscale x 2 x i16> %va, i16 %b, i32 zeroext %evl) {
720; CHECK-LABEL: vsadd_vx_nxv2i16_unmasked:
721; CHECK:       # %bb.0:
722; CHECK-NEXT:    vsetvli zero, a1, e16, mf2, ta, ma
723; CHECK-NEXT:    vsadd.vx v8, v8, a0
724; CHECK-NEXT:    ret
725  %elt.head = insertelement <vscale x 2 x i16> poison, i16 %b, i32 0
726  %vb = shufflevector <vscale x 2 x i16> %elt.head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer
727  %v = call <vscale x 2 x i16> @llvm.vp.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %vb, <vscale x 2 x i1> splat (i1 true), i32 %evl)
728  ret <vscale x 2 x i16> %v
729}
730
731define <vscale x 2 x i16> @vsadd_vi_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
732; CHECK-LABEL: vsadd_vi_nxv2i16:
733; CHECK:       # %bb.0:
734; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
735; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
736; CHECK-NEXT:    ret
737  %v = call <vscale x 2 x i16> @llvm.vp.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> splat (i16 -1), <vscale x 2 x i1> %m, i32 %evl)
738  ret <vscale x 2 x i16> %v
739}
740
741define <vscale x 2 x i16> @vsadd_vi_nxv2i16_unmasked(<vscale x 2 x i16> %va, i32 zeroext %evl) {
742; CHECK-LABEL: vsadd_vi_nxv2i16_unmasked:
743; CHECK:       # %bb.0:
744; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
745; CHECK-NEXT:    vsadd.vi v8, v8, -1
746; CHECK-NEXT:    ret
747  %v = call <vscale x 2 x i16> @llvm.vp.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> splat (i16 -1), <vscale x 2 x i1> splat (i1 true), i32 %evl)
748  ret <vscale x 2 x i16> %v
749}
750
751declare <vscale x 4 x i16> @llvm.vp.sadd.sat.nxv4i16(<vscale x 4 x i16>, <vscale x 4 x i16>, <vscale x 4 x i1>, i32)
752
753define <vscale x 4 x i16> @vsadd_vv_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %b, <vscale x 4 x i1> %m, i32 zeroext %evl) {
754; CHECK-LABEL: vsadd_vv_nxv4i16:
755; CHECK:       # %bb.0:
756; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
757; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
758; CHECK-NEXT:    ret
759  %v = call <vscale x 4 x i16> @llvm.vp.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %b, <vscale x 4 x i1> %m, i32 %evl)
760  ret <vscale x 4 x i16> %v
761}
762
763define <vscale x 4 x i16> @vsadd_vv_nxv4i16_unmasked(<vscale x 4 x i16> %va, <vscale x 4 x i16> %b, i32 zeroext %evl) {
764; CHECK-LABEL: vsadd_vv_nxv4i16_unmasked:
765; CHECK:       # %bb.0:
766; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
767; CHECK-NEXT:    vsadd.vv v8, v8, v9
768; CHECK-NEXT:    ret
769  %v = call <vscale x 4 x i16> @llvm.vp.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %b, <vscale x 4 x i1> splat (i1 true), i32 %evl)
770  ret <vscale x 4 x i16> %v
771}
772
773define <vscale x 4 x i16> @vsadd_vx_nxv4i16(<vscale x 4 x i16> %va, i16 %b, <vscale x 4 x i1> %m, i32 zeroext %evl) {
774; CHECK-LABEL: vsadd_vx_nxv4i16:
775; CHECK:       # %bb.0:
776; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
777; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
778; CHECK-NEXT:    ret
779  %elt.head = insertelement <vscale x 4 x i16> poison, i16 %b, i32 0
780  %vb = shufflevector <vscale x 4 x i16> %elt.head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer
781  %v = call <vscale x 4 x i16> @llvm.vp.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %vb, <vscale x 4 x i1> %m, i32 %evl)
782  ret <vscale x 4 x i16> %v
783}
784
785define <vscale x 4 x i16> @vsadd_vx_nxv4i16_unmasked(<vscale x 4 x i16> %va, i16 %b, i32 zeroext %evl) {
786; CHECK-LABEL: vsadd_vx_nxv4i16_unmasked:
787; CHECK:       # %bb.0:
788; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
789; CHECK-NEXT:    vsadd.vx v8, v8, a0
790; CHECK-NEXT:    ret
791  %elt.head = insertelement <vscale x 4 x i16> poison, i16 %b, i32 0
792  %vb = shufflevector <vscale x 4 x i16> %elt.head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer
793  %v = call <vscale x 4 x i16> @llvm.vp.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %vb, <vscale x 4 x i1> splat (i1 true), i32 %evl)
794  ret <vscale x 4 x i16> %v
795}
796
797define <vscale x 4 x i16> @vsadd_vi_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
798; CHECK-LABEL: vsadd_vi_nxv4i16:
799; CHECK:       # %bb.0:
800; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
801; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
802; CHECK-NEXT:    ret
803  %v = call <vscale x 4 x i16> @llvm.vp.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> splat (i16 -1), <vscale x 4 x i1> %m, i32 %evl)
804  ret <vscale x 4 x i16> %v
805}
806
807define <vscale x 4 x i16> @vsadd_vi_nxv4i16_unmasked(<vscale x 4 x i16> %va, i32 zeroext %evl) {
808; CHECK-LABEL: vsadd_vi_nxv4i16_unmasked:
809; CHECK:       # %bb.0:
810; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
811; CHECK-NEXT:    vsadd.vi v8, v8, -1
812; CHECK-NEXT:    ret
813  %v = call <vscale x 4 x i16> @llvm.vp.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> splat (i16 -1), <vscale x 4 x i1> splat (i1 true), i32 %evl)
814  ret <vscale x 4 x i16> %v
815}
816
817declare <vscale x 8 x i16> @llvm.vp.sadd.sat.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i1>, i32)
818
819define <vscale x 8 x i16> @vsadd_vv_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %b, <vscale x 8 x i1> %m, i32 zeroext %evl) {
820; CHECK-LABEL: vsadd_vv_nxv8i16:
821; CHECK:       # %bb.0:
822; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
823; CHECK-NEXT:    vsadd.vv v8, v8, v10, v0.t
824; CHECK-NEXT:    ret
825  %v = call <vscale x 8 x i16> @llvm.vp.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %b, <vscale x 8 x i1> %m, i32 %evl)
826  ret <vscale x 8 x i16> %v
827}
828
829define <vscale x 8 x i16> @vsadd_vv_nxv8i16_unmasked(<vscale x 8 x i16> %va, <vscale x 8 x i16> %b, i32 zeroext %evl) {
830; CHECK-LABEL: vsadd_vv_nxv8i16_unmasked:
831; CHECK:       # %bb.0:
832; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
833; CHECK-NEXT:    vsadd.vv v8, v8, v10
834; CHECK-NEXT:    ret
835  %v = call <vscale x 8 x i16> @llvm.vp.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %b, <vscale x 8 x i1> splat (i1 true), i32 %evl)
836  ret <vscale x 8 x i16> %v
837}
838
839define <vscale x 8 x i16> @vsadd_vx_nxv8i16(<vscale x 8 x i16> %va, i16 %b, <vscale x 8 x i1> %m, i32 zeroext %evl) {
840; CHECK-LABEL: vsadd_vx_nxv8i16:
841; CHECK:       # %bb.0:
842; CHECK-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
843; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
844; CHECK-NEXT:    ret
845  %elt.head = insertelement <vscale x 8 x i16> poison, i16 %b, i32 0
846  %vb = shufflevector <vscale x 8 x i16> %elt.head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
847  %v = call <vscale x 8 x i16> @llvm.vp.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %vb, <vscale x 8 x i1> %m, i32 %evl)
848  ret <vscale x 8 x i16> %v
849}
850
851define <vscale x 8 x i16> @vsadd_vx_nxv8i16_unmasked(<vscale x 8 x i16> %va, i16 %b, i32 zeroext %evl) {
852; CHECK-LABEL: vsadd_vx_nxv8i16_unmasked:
853; CHECK:       # %bb.0:
854; CHECK-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
855; CHECK-NEXT:    vsadd.vx v8, v8, a0
856; CHECK-NEXT:    ret
857  %elt.head = insertelement <vscale x 8 x i16> poison, i16 %b, i32 0
858  %vb = shufflevector <vscale x 8 x i16> %elt.head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
859  %v = call <vscale x 8 x i16> @llvm.vp.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %vb, <vscale x 8 x i1> splat (i1 true), i32 %evl)
860  ret <vscale x 8 x i16> %v
861}
862
863define <vscale x 8 x i16> @vsadd_vi_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
864; CHECK-LABEL: vsadd_vi_nxv8i16:
865; CHECK:       # %bb.0:
866; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
867; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
868; CHECK-NEXT:    ret
869  %v = call <vscale x 8 x i16> @llvm.vp.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> splat (i16 -1), <vscale x 8 x i1> %m, i32 %evl)
870  ret <vscale x 8 x i16> %v
871}
872
873define <vscale x 8 x i16> @vsadd_vi_nxv8i16_unmasked(<vscale x 8 x i16> %va, i32 zeroext %evl) {
874; CHECK-LABEL: vsadd_vi_nxv8i16_unmasked:
875; CHECK:       # %bb.0:
876; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
877; CHECK-NEXT:    vsadd.vi v8, v8, -1
878; CHECK-NEXT:    ret
879  %v = call <vscale x 8 x i16> @llvm.vp.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> splat (i16 -1), <vscale x 8 x i1> splat (i1 true), i32 %evl)
880  ret <vscale x 8 x i16> %v
881}
882
883declare <vscale x 16 x i16> @llvm.vp.sadd.sat.nxv16i16(<vscale x 16 x i16>, <vscale x 16 x i16>, <vscale x 16 x i1>, i32)
884
885define <vscale x 16 x i16> @vsadd_vv_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %b, <vscale x 16 x i1> %m, i32 zeroext %evl) {
886; CHECK-LABEL: vsadd_vv_nxv16i16:
887; CHECK:       # %bb.0:
888; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
889; CHECK-NEXT:    vsadd.vv v8, v8, v12, v0.t
890; CHECK-NEXT:    ret
891  %v = call <vscale x 16 x i16> @llvm.vp.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %b, <vscale x 16 x i1> %m, i32 %evl)
892  ret <vscale x 16 x i16> %v
893}
894
895define <vscale x 16 x i16> @vsadd_vv_nxv16i16_unmasked(<vscale x 16 x i16> %va, <vscale x 16 x i16> %b, i32 zeroext %evl) {
896; CHECK-LABEL: vsadd_vv_nxv16i16_unmasked:
897; CHECK:       # %bb.0:
898; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
899; CHECK-NEXT:    vsadd.vv v8, v8, v12
900; CHECK-NEXT:    ret
901  %v = call <vscale x 16 x i16> @llvm.vp.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %b, <vscale x 16 x i1> splat (i1 true), i32 %evl)
902  ret <vscale x 16 x i16> %v
903}
904
905define <vscale x 16 x i16> @vsadd_vx_nxv16i16(<vscale x 16 x i16> %va, i16 %b, <vscale x 16 x i1> %m, i32 zeroext %evl) {
906; CHECK-LABEL: vsadd_vx_nxv16i16:
907; CHECK:       # %bb.0:
908; CHECK-NEXT:    vsetvli zero, a1, e16, m4, ta, ma
909; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
910; CHECK-NEXT:    ret
911  %elt.head = insertelement <vscale x 16 x i16> poison, i16 %b, i32 0
912  %vb = shufflevector <vscale x 16 x i16> %elt.head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer
913  %v = call <vscale x 16 x i16> @llvm.vp.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %vb, <vscale x 16 x i1> %m, i32 %evl)
914  ret <vscale x 16 x i16> %v
915}
916
917define <vscale x 16 x i16> @vsadd_vx_nxv16i16_unmasked(<vscale x 16 x i16> %va, i16 %b, i32 zeroext %evl) {
918; CHECK-LABEL: vsadd_vx_nxv16i16_unmasked:
919; CHECK:       # %bb.0:
920; CHECK-NEXT:    vsetvli zero, a1, e16, m4, ta, ma
921; CHECK-NEXT:    vsadd.vx v8, v8, a0
922; CHECK-NEXT:    ret
923  %elt.head = insertelement <vscale x 16 x i16> poison, i16 %b, i32 0
924  %vb = shufflevector <vscale x 16 x i16> %elt.head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer
925  %v = call <vscale x 16 x i16> @llvm.vp.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %vb, <vscale x 16 x i1> splat (i1 true), i32 %evl)
926  ret <vscale x 16 x i16> %v
927}
928
929define <vscale x 16 x i16> @vsadd_vi_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
930; CHECK-LABEL: vsadd_vi_nxv16i16:
931; CHECK:       # %bb.0:
932; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
933; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
934; CHECK-NEXT:    ret
935  %v = call <vscale x 16 x i16> @llvm.vp.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> splat (i16 -1), <vscale x 16 x i1> %m, i32 %evl)
936  ret <vscale x 16 x i16> %v
937}
938
939define <vscale x 16 x i16> @vsadd_vi_nxv16i16_unmasked(<vscale x 16 x i16> %va, i32 zeroext %evl) {
940; CHECK-LABEL: vsadd_vi_nxv16i16_unmasked:
941; CHECK:       # %bb.0:
942; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
943; CHECK-NEXT:    vsadd.vi v8, v8, -1
944; CHECK-NEXT:    ret
945  %v = call <vscale x 16 x i16> @llvm.vp.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> splat (i16 -1), <vscale x 16 x i1> splat (i1 true), i32 %evl)
946  ret <vscale x 16 x i16> %v
947}
948
949declare <vscale x 32 x i16> @llvm.vp.sadd.sat.nxv32i16(<vscale x 32 x i16>, <vscale x 32 x i16>, <vscale x 32 x i1>, i32)
950
951define <vscale x 32 x i16> @vsadd_vv_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %b, <vscale x 32 x i1> %m, i32 zeroext %evl) {
952; CHECK-LABEL: vsadd_vv_nxv32i16:
953; CHECK:       # %bb.0:
954; CHECK-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
955; CHECK-NEXT:    vsadd.vv v8, v8, v16, v0.t
956; CHECK-NEXT:    ret
957  %v = call <vscale x 32 x i16> @llvm.vp.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %b, <vscale x 32 x i1> %m, i32 %evl)
958  ret <vscale x 32 x i16> %v
959}
960
961define <vscale x 32 x i16> @vsadd_vv_nxv32i16_unmasked(<vscale x 32 x i16> %va, <vscale x 32 x i16> %b, i32 zeroext %evl) {
962; CHECK-LABEL: vsadd_vv_nxv32i16_unmasked:
963; CHECK:       # %bb.0:
964; CHECK-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
965; CHECK-NEXT:    vsadd.vv v8, v8, v16
966; CHECK-NEXT:    ret
967  %v = call <vscale x 32 x i16> @llvm.vp.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %b, <vscale x 32 x i1> splat (i1 true), i32 %evl)
968  ret <vscale x 32 x i16> %v
969}
970
971define <vscale x 32 x i16> @vsadd_vx_nxv32i16(<vscale x 32 x i16> %va, i16 %b, <vscale x 32 x i1> %m, i32 zeroext %evl) {
972; CHECK-LABEL: vsadd_vx_nxv32i16:
973; CHECK:       # %bb.0:
974; CHECK-NEXT:    vsetvli zero, a1, e16, m8, ta, ma
975; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
976; CHECK-NEXT:    ret
977  %elt.head = insertelement <vscale x 32 x i16> poison, i16 %b, i32 0
978  %vb = shufflevector <vscale x 32 x i16> %elt.head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer
979  %v = call <vscale x 32 x i16> @llvm.vp.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %vb, <vscale x 32 x i1> %m, i32 %evl)
980  ret <vscale x 32 x i16> %v
981}
982
983define <vscale x 32 x i16> @vsadd_vx_nxv32i16_unmasked(<vscale x 32 x i16> %va, i16 %b, i32 zeroext %evl) {
984; CHECK-LABEL: vsadd_vx_nxv32i16_unmasked:
985; CHECK:       # %bb.0:
986; CHECK-NEXT:    vsetvli zero, a1, e16, m8, ta, ma
987; CHECK-NEXT:    vsadd.vx v8, v8, a0
988; CHECK-NEXT:    ret
989  %elt.head = insertelement <vscale x 32 x i16> poison, i16 %b, i32 0
990  %vb = shufflevector <vscale x 32 x i16> %elt.head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer
991  %v = call <vscale x 32 x i16> @llvm.vp.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %vb, <vscale x 32 x i1> splat (i1 true), i32 %evl)
992  ret <vscale x 32 x i16> %v
993}
994
995define <vscale x 32 x i16> @vsadd_vi_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) {
996; CHECK-LABEL: vsadd_vi_nxv32i16:
997; CHECK:       # %bb.0:
998; CHECK-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
999; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1000; CHECK-NEXT:    ret
1001  %v = call <vscale x 32 x i16> @llvm.vp.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> splat (i16 -1), <vscale x 32 x i1> %m, i32 %evl)
1002  ret <vscale x 32 x i16> %v
1003}
1004
1005define <vscale x 32 x i16> @vsadd_vi_nxv32i16_unmasked(<vscale x 32 x i16> %va, i32 zeroext %evl) {
1006; CHECK-LABEL: vsadd_vi_nxv32i16_unmasked:
1007; CHECK:       # %bb.0:
1008; CHECK-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
1009; CHECK-NEXT:    vsadd.vi v8, v8, -1
1010; CHECK-NEXT:    ret
1011  %v = call <vscale x 32 x i16> @llvm.vp.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> splat (i16 -1), <vscale x 32 x i1> splat (i1 true), i32 %evl)
1012  ret <vscale x 32 x i16> %v
1013}
1014
1015declare <vscale x 1 x i32> @llvm.vp.sadd.sat.nxv1i32(<vscale x 1 x i32>, <vscale x 1 x i32>, <vscale x 1 x i1>, i32)
1016
1017define <vscale x 1 x i32> @vsadd_vv_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %b, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1018; CHECK-LABEL: vsadd_vv_nxv1i32:
1019; CHECK:       # %bb.0:
1020; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
1021; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
1022; CHECK-NEXT:    ret
1023  %v = call <vscale x 1 x i32> @llvm.vp.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %b, <vscale x 1 x i1> %m, i32 %evl)
1024  ret <vscale x 1 x i32> %v
1025}
1026
1027define <vscale x 1 x i32> @vsadd_vv_nxv1i32_unmasked(<vscale x 1 x i32> %va, <vscale x 1 x i32> %b, i32 zeroext %evl) {
1028; CHECK-LABEL: vsadd_vv_nxv1i32_unmasked:
1029; CHECK:       # %bb.0:
1030; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
1031; CHECK-NEXT:    vsadd.vv v8, v8, v9
1032; CHECK-NEXT:    ret
1033  %v = call <vscale x 1 x i32> @llvm.vp.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %b, <vscale x 1 x i1> splat (i1 true), i32 %evl)
1034  ret <vscale x 1 x i32> %v
1035}
1036
1037define <vscale x 1 x i32> @vsadd_vx_nxv1i32(<vscale x 1 x i32> %va, i32 %b, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1038; CHECK-LABEL: vsadd_vx_nxv1i32:
1039; CHECK:       # %bb.0:
1040; CHECK-NEXT:    vsetvli zero, a1, e32, mf2, ta, ma
1041; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
1042; CHECK-NEXT:    ret
1043  %elt.head = insertelement <vscale x 1 x i32> poison, i32 %b, i32 0
1044  %vb = shufflevector <vscale x 1 x i32> %elt.head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
1045  %v = call <vscale x 1 x i32> @llvm.vp.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %vb, <vscale x 1 x i1> %m, i32 %evl)
1046  ret <vscale x 1 x i32> %v
1047}
1048
1049define <vscale x 1 x i32> @vsadd_vx_nxv1i32_unmasked(<vscale x 1 x i32> %va, i32 %b, i32 zeroext %evl) {
1050; CHECK-LABEL: vsadd_vx_nxv1i32_unmasked:
1051; CHECK:       # %bb.0:
1052; CHECK-NEXT:    vsetvli zero, a1, e32, mf2, ta, ma
1053; CHECK-NEXT:    vsadd.vx v8, v8, a0
1054; CHECK-NEXT:    ret
1055  %elt.head = insertelement <vscale x 1 x i32> poison, i32 %b, i32 0
1056  %vb = shufflevector <vscale x 1 x i32> %elt.head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
1057  %v = call <vscale x 1 x i32> @llvm.vp.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %vb, <vscale x 1 x i1> splat (i1 true), i32 %evl)
1058  ret <vscale x 1 x i32> %v
1059}
1060
1061define <vscale x 1 x i32> @vsadd_vi_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1062; CHECK-LABEL: vsadd_vi_nxv1i32:
1063; CHECK:       # %bb.0:
1064; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
1065; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1066; CHECK-NEXT:    ret
1067  %v = call <vscale x 1 x i32> @llvm.vp.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> splat (i32 -1), <vscale x 1 x i1> %m, i32 %evl)
1068  ret <vscale x 1 x i32> %v
1069}
1070
1071define <vscale x 1 x i32> @vsadd_vi_nxv1i32_unmasked(<vscale x 1 x i32> %va, i32 zeroext %evl) {
1072; CHECK-LABEL: vsadd_vi_nxv1i32_unmasked:
1073; CHECK:       # %bb.0:
1074; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
1075; CHECK-NEXT:    vsadd.vi v8, v8, -1
1076; CHECK-NEXT:    ret
1077  %v = call <vscale x 1 x i32> @llvm.vp.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> splat (i32 -1), <vscale x 1 x i1> splat (i1 true), i32 %evl)
1078  ret <vscale x 1 x i32> %v
1079}
1080
1081declare <vscale x 2 x i32> @llvm.vp.sadd.sat.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i1>, i32)
1082
1083define <vscale x 2 x i32> @vsadd_vv_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %b, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1084; CHECK-LABEL: vsadd_vv_nxv2i32:
1085; CHECK:       # %bb.0:
1086; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
1087; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
1088; CHECK-NEXT:    ret
1089  %v = call <vscale x 2 x i32> @llvm.vp.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %b, <vscale x 2 x i1> %m, i32 %evl)
1090  ret <vscale x 2 x i32> %v
1091}
1092
1093define <vscale x 2 x i32> @vsadd_vv_nxv2i32_unmasked(<vscale x 2 x i32> %va, <vscale x 2 x i32> %b, i32 zeroext %evl) {
1094; CHECK-LABEL: vsadd_vv_nxv2i32_unmasked:
1095; CHECK:       # %bb.0:
1096; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
1097; CHECK-NEXT:    vsadd.vv v8, v8, v9
1098; CHECK-NEXT:    ret
1099  %v = call <vscale x 2 x i32> @llvm.vp.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %b, <vscale x 2 x i1> splat (i1 true), i32 %evl)
1100  ret <vscale x 2 x i32> %v
1101}
1102
1103define <vscale x 2 x i32> @vsadd_vx_nxv2i32(<vscale x 2 x i32> %va, i32 %b, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1104; CHECK-LABEL: vsadd_vx_nxv2i32:
1105; CHECK:       # %bb.0:
1106; CHECK-NEXT:    vsetvli zero, a1, e32, m1, ta, ma
1107; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
1108; CHECK-NEXT:    ret
1109  %elt.head = insertelement <vscale x 2 x i32> poison, i32 %b, i32 0
1110  %vb = shufflevector <vscale x 2 x i32> %elt.head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
1111  %v = call <vscale x 2 x i32> @llvm.vp.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %vb, <vscale x 2 x i1> %m, i32 %evl)
1112  ret <vscale x 2 x i32> %v
1113}
1114
1115define <vscale x 2 x i32> @vsadd_vx_nxv2i32_unmasked(<vscale x 2 x i32> %va, i32 %b, i32 zeroext %evl) {
1116; CHECK-LABEL: vsadd_vx_nxv2i32_unmasked:
1117; CHECK:       # %bb.0:
1118; CHECK-NEXT:    vsetvli zero, a1, e32, m1, ta, ma
1119; CHECK-NEXT:    vsadd.vx v8, v8, a0
1120; CHECK-NEXT:    ret
1121  %elt.head = insertelement <vscale x 2 x i32> poison, i32 %b, i32 0
1122  %vb = shufflevector <vscale x 2 x i32> %elt.head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
1123  %v = call <vscale x 2 x i32> @llvm.vp.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %vb, <vscale x 2 x i1> splat (i1 true), i32 %evl)
1124  ret <vscale x 2 x i32> %v
1125}
1126
1127define <vscale x 2 x i32> @vsadd_vi_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1128; CHECK-LABEL: vsadd_vi_nxv2i32:
1129; CHECK:       # %bb.0:
1130; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
1131; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1132; CHECK-NEXT:    ret
1133  %v = call <vscale x 2 x i32> @llvm.vp.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> splat (i32 -1), <vscale x 2 x i1> %m, i32 %evl)
1134  ret <vscale x 2 x i32> %v
1135}
1136
1137define <vscale x 2 x i32> @vsadd_vi_nxv2i32_unmasked(<vscale x 2 x i32> %va, i32 zeroext %evl) {
1138; CHECK-LABEL: vsadd_vi_nxv2i32_unmasked:
1139; CHECK:       # %bb.0:
1140; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
1141; CHECK-NEXT:    vsadd.vi v8, v8, -1
1142; CHECK-NEXT:    ret
1143  %v = call <vscale x 2 x i32> @llvm.vp.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> splat (i32 -1), <vscale x 2 x i1> splat (i1 true), i32 %evl)
1144  ret <vscale x 2 x i32> %v
1145}
1146
1147declare <vscale x 4 x i32> @llvm.vp.sadd.sat.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i1>, i32)
1148
1149define <vscale x 4 x i32> @vsadd_vv_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %b, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1150; CHECK-LABEL: vsadd_vv_nxv4i32:
1151; CHECK:       # %bb.0:
1152; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1153; CHECK-NEXT:    vsadd.vv v8, v8, v10, v0.t
1154; CHECK-NEXT:    ret
1155  %v = call <vscale x 4 x i32> @llvm.vp.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %b, <vscale x 4 x i1> %m, i32 %evl)
1156  ret <vscale x 4 x i32> %v
1157}
1158
1159define <vscale x 4 x i32> @vsadd_vv_nxv4i32_unmasked(<vscale x 4 x i32> %va, <vscale x 4 x i32> %b, i32 zeroext %evl) {
1160; CHECK-LABEL: vsadd_vv_nxv4i32_unmasked:
1161; CHECK:       # %bb.0:
1162; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1163; CHECK-NEXT:    vsadd.vv v8, v8, v10
1164; CHECK-NEXT:    ret
1165  %v = call <vscale x 4 x i32> @llvm.vp.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %b, <vscale x 4 x i1> splat (i1 true), i32 %evl)
1166  ret <vscale x 4 x i32> %v
1167}
1168
1169define <vscale x 4 x i32> @vsadd_vx_nxv4i32(<vscale x 4 x i32> %va, i32 %b, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1170; CHECK-LABEL: vsadd_vx_nxv4i32:
1171; CHECK:       # %bb.0:
1172; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1173; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
1174; CHECK-NEXT:    ret
1175  %elt.head = insertelement <vscale x 4 x i32> poison, i32 %b, i32 0
1176  %vb = shufflevector <vscale x 4 x i32> %elt.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
1177  %v = call <vscale x 4 x i32> @llvm.vp.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %vb, <vscale x 4 x i1> %m, i32 %evl)
1178  ret <vscale x 4 x i32> %v
1179}
1180
1181define <vscale x 4 x i32> @vsadd_vx_nxv4i32_unmasked(<vscale x 4 x i32> %va, i32 %b, i32 zeroext %evl) {
1182; CHECK-LABEL: vsadd_vx_nxv4i32_unmasked:
1183; CHECK:       # %bb.0:
1184; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1185; CHECK-NEXT:    vsadd.vx v8, v8, a0
1186; CHECK-NEXT:    ret
1187  %elt.head = insertelement <vscale x 4 x i32> poison, i32 %b, i32 0
1188  %vb = shufflevector <vscale x 4 x i32> %elt.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
1189  %v = call <vscale x 4 x i32> @llvm.vp.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %vb, <vscale x 4 x i1> splat (i1 true), i32 %evl)
1190  ret <vscale x 4 x i32> %v
1191}
1192
1193define <vscale x 4 x i32> @vsadd_vi_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1194; CHECK-LABEL: vsadd_vi_nxv4i32:
1195; CHECK:       # %bb.0:
1196; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1197; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1198; CHECK-NEXT:    ret
1199  %v = call <vscale x 4 x i32> @llvm.vp.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> splat (i32 -1), <vscale x 4 x i1> %m, i32 %evl)
1200  ret <vscale x 4 x i32> %v
1201}
1202
1203define <vscale x 4 x i32> @vsadd_vi_nxv4i32_unmasked(<vscale x 4 x i32> %va, i32 zeroext %evl) {
1204; CHECK-LABEL: vsadd_vi_nxv4i32_unmasked:
1205; CHECK:       # %bb.0:
1206; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1207; CHECK-NEXT:    vsadd.vi v8, v8, -1
1208; CHECK-NEXT:    ret
1209  %v = call <vscale x 4 x i32> @llvm.vp.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> splat (i32 -1), <vscale x 4 x i1> splat (i1 true), i32 %evl)
1210  ret <vscale x 4 x i32> %v
1211}
1212
1213declare <vscale x 8 x i32> @llvm.vp.sadd.sat.nxv8i32(<vscale x 8 x i32>, <vscale x 8 x i32>, <vscale x 8 x i1>, i32)
1214
1215define <vscale x 8 x i32> @vsadd_vv_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %b, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1216; CHECK-LABEL: vsadd_vv_nxv8i32:
1217; CHECK:       # %bb.0:
1218; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
1219; CHECK-NEXT:    vsadd.vv v8, v8, v12, v0.t
1220; CHECK-NEXT:    ret
1221  %v = call <vscale x 8 x i32> @llvm.vp.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %b, <vscale x 8 x i1> %m, i32 %evl)
1222  ret <vscale x 8 x i32> %v
1223}
1224
1225define <vscale x 8 x i32> @vsadd_vv_nxv8i32_unmasked(<vscale x 8 x i32> %va, <vscale x 8 x i32> %b, i32 zeroext %evl) {
1226; CHECK-LABEL: vsadd_vv_nxv8i32_unmasked:
1227; CHECK:       # %bb.0:
1228; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
1229; CHECK-NEXT:    vsadd.vv v8, v8, v12
1230; CHECK-NEXT:    ret
1231  %v = call <vscale x 8 x i32> @llvm.vp.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %b, <vscale x 8 x i1> splat (i1 true), i32 %evl)
1232  ret <vscale x 8 x i32> %v
1233}
1234
1235define <vscale x 8 x i32> @vsadd_vx_nxv8i32(<vscale x 8 x i32> %va, i32 %b, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1236; CHECK-LABEL: vsadd_vx_nxv8i32:
1237; CHECK:       # %bb.0:
1238; CHECK-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1239; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
1240; CHECK-NEXT:    ret
1241  %elt.head = insertelement <vscale x 8 x i32> poison, i32 %b, i32 0
1242  %vb = shufflevector <vscale x 8 x i32> %elt.head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
1243  %v = call <vscale x 8 x i32> @llvm.vp.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %vb, <vscale x 8 x i1> %m, i32 %evl)
1244  ret <vscale x 8 x i32> %v
1245}
1246
1247define <vscale x 8 x i32> @vsadd_vx_nxv8i32_unmasked(<vscale x 8 x i32> %va, i32 %b, i32 zeroext %evl) {
1248; CHECK-LABEL: vsadd_vx_nxv8i32_unmasked:
1249; CHECK:       # %bb.0:
1250; CHECK-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1251; CHECK-NEXT:    vsadd.vx v8, v8, a0
1252; CHECK-NEXT:    ret
1253  %elt.head = insertelement <vscale x 8 x i32> poison, i32 %b, i32 0
1254  %vb = shufflevector <vscale x 8 x i32> %elt.head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
1255  %v = call <vscale x 8 x i32> @llvm.vp.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %vb, <vscale x 8 x i1> splat (i1 true), i32 %evl)
1256  ret <vscale x 8 x i32> %v
1257}
1258
1259define <vscale x 8 x i32> @vsadd_vi_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1260; CHECK-LABEL: vsadd_vi_nxv8i32:
1261; CHECK:       # %bb.0:
1262; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
1263; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1264; CHECK-NEXT:    ret
1265  %v = call <vscale x 8 x i32> @llvm.vp.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> splat (i32 -1), <vscale x 8 x i1> %m, i32 %evl)
1266  ret <vscale x 8 x i32> %v
1267}
1268
1269define <vscale x 8 x i32> @vsadd_vi_nxv8i32_unmasked(<vscale x 8 x i32> %va, i32 zeroext %evl) {
1270; CHECK-LABEL: vsadd_vi_nxv8i32_unmasked:
1271; CHECK:       # %bb.0:
1272; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
1273; CHECK-NEXT:    vsadd.vi v8, v8, -1
1274; CHECK-NEXT:    ret
1275  %v = call <vscale x 8 x i32> @llvm.vp.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> splat (i32 -1), <vscale x 8 x i1> splat (i1 true), i32 %evl)
1276  ret <vscale x 8 x i32> %v
1277}
1278
1279declare <vscale x 16 x i32> @llvm.vp.sadd.sat.nxv16i32(<vscale x 16 x i32>, <vscale x 16 x i32>, <vscale x 16 x i1>, i32)
1280
1281define <vscale x 16 x i32> @vsadd_vv_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %b, <vscale x 16 x i1> %m, i32 zeroext %evl) {
1282; CHECK-LABEL: vsadd_vv_nxv16i32:
1283; CHECK:       # %bb.0:
1284; CHECK-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1285; CHECK-NEXT:    vsadd.vv v8, v8, v16, v0.t
1286; CHECK-NEXT:    ret
1287  %v = call <vscale x 16 x i32> @llvm.vp.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %b, <vscale x 16 x i1> %m, i32 %evl)
1288  ret <vscale x 16 x i32> %v
1289}
1290
1291define <vscale x 16 x i32> @vsadd_vv_nxv16i32_unmasked(<vscale x 16 x i32> %va, <vscale x 16 x i32> %b, i32 zeroext %evl) {
1292; CHECK-LABEL: vsadd_vv_nxv16i32_unmasked:
1293; CHECK:       # %bb.0:
1294; CHECK-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1295; CHECK-NEXT:    vsadd.vv v8, v8, v16
1296; CHECK-NEXT:    ret
1297  %v = call <vscale x 16 x i32> @llvm.vp.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %b, <vscale x 16 x i1> splat (i1 true), i32 %evl)
1298  ret <vscale x 16 x i32> %v
1299}
1300
1301define <vscale x 16 x i32> @vsadd_vx_nxv16i32(<vscale x 16 x i32> %va, i32 %b, <vscale x 16 x i1> %m, i32 zeroext %evl) {
1302; CHECK-LABEL: vsadd_vx_nxv16i32:
1303; CHECK:       # %bb.0:
1304; CHECK-NEXT:    vsetvli zero, a1, e32, m8, ta, ma
1305; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
1306; CHECK-NEXT:    ret
1307  %elt.head = insertelement <vscale x 16 x i32> poison, i32 %b, i32 0
1308  %vb = shufflevector <vscale x 16 x i32> %elt.head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer
1309  %v = call <vscale x 16 x i32> @llvm.vp.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %vb, <vscale x 16 x i1> %m, i32 %evl)
1310  ret <vscale x 16 x i32> %v
1311}
1312
1313define <vscale x 16 x i32> @vsadd_vx_nxv16i32_unmasked(<vscale x 16 x i32> %va, i32 %b, i32 zeroext %evl) {
1314; CHECK-LABEL: vsadd_vx_nxv16i32_unmasked:
1315; CHECK:       # %bb.0:
1316; CHECK-NEXT:    vsetvli zero, a1, e32, m8, ta, ma
1317; CHECK-NEXT:    vsadd.vx v8, v8, a0
1318; CHECK-NEXT:    ret
1319  %elt.head = insertelement <vscale x 16 x i32> poison, i32 %b, i32 0
1320  %vb = shufflevector <vscale x 16 x i32> %elt.head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer
1321  %v = call <vscale x 16 x i32> @llvm.vp.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %vb, <vscale x 16 x i1> splat (i1 true), i32 %evl)
1322  ret <vscale x 16 x i32> %v
1323}
1324
1325define <vscale x 16 x i32> @vsadd_vi_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) {
1326; CHECK-LABEL: vsadd_vi_nxv16i32:
1327; CHECK:       # %bb.0:
1328; CHECK-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1329; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1330; CHECK-NEXT:    ret
1331  %v = call <vscale x 16 x i32> @llvm.vp.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> splat (i32 -1), <vscale x 16 x i1> %m, i32 %evl)
1332  ret <vscale x 16 x i32> %v
1333}
1334
1335define <vscale x 16 x i32> @vsadd_vi_nxv16i32_unmasked(<vscale x 16 x i32> %va, i32 zeroext %evl) {
1336; CHECK-LABEL: vsadd_vi_nxv16i32_unmasked:
1337; CHECK:       # %bb.0:
1338; CHECK-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1339; CHECK-NEXT:    vsadd.vi v8, v8, -1
1340; CHECK-NEXT:    ret
1341  %v = call <vscale x 16 x i32> @llvm.vp.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> splat (i32 -1), <vscale x 16 x i1> splat (i1 true), i32 %evl)
1342  ret <vscale x 16 x i32> %v
1343}
1344
1345; Test that split-legalization works then the mask needs manual splitting.
1346
1347declare <vscale x 32 x i32> @llvm.vp.sadd.sat.nxv32i32(<vscale x 32 x i32>, <vscale x 32 x i32>, <vscale x 32 x i1>, i32)
1348
1349define <vscale x 32 x i32> @vsadd_vi_nxv32i32(<vscale x 32 x i32> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) {
1350; CHECK-LABEL: vsadd_vi_nxv32i32:
1351; CHECK:       # %bb.0:
1352; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, ma
1353; CHECK-NEXT:    vmv1r.v v24, v0
1354; CHECK-NEXT:    csrr a1, vlenb
1355; CHECK-NEXT:    srli a2, a1, 2
1356; CHECK-NEXT:    slli a1, a1, 1
1357; CHECK-NEXT:    vslidedown.vx v0, v0, a2
1358; CHECK-NEXT:    sub a2, a0, a1
1359; CHECK-NEXT:    sltu a3, a0, a2
1360; CHECK-NEXT:    addi a3, a3, -1
1361; CHECK-NEXT:    and a2, a3, a2
1362; CHECK-NEXT:    vsetvli zero, a2, e32, m8, ta, ma
1363; CHECK-NEXT:    vsadd.vi v16, v16, -1, v0.t
1364; CHECK-NEXT:    bltu a0, a1, .LBB118_2
1365; CHECK-NEXT:  # %bb.1:
1366; CHECK-NEXT:    mv a0, a1
1367; CHECK-NEXT:  .LBB118_2:
1368; CHECK-NEXT:    vmv1r.v v0, v24
1369; CHECK-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1370; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1371; CHECK-NEXT:    ret
1372  %v = call <vscale x 32 x i32> @llvm.vp.sadd.sat.nxv32i32(<vscale x 32 x i32> %va, <vscale x 32 x i32> splat (i32 -1), <vscale x 32 x i1> %m, i32 %evl)
1373  ret <vscale x 32 x i32> %v
1374}
1375
1376define <vscale x 32 x i32> @vsadd_vi_nxv32i32_unmasked(<vscale x 32 x i32> %va, i32 zeroext %evl) {
1377; CHECK-LABEL: vsadd_vi_nxv32i32_unmasked:
1378; CHECK:       # %bb.0:
1379; CHECK-NEXT:    csrr a1, vlenb
1380; CHECK-NEXT:    slli a1, a1, 1
1381; CHECK-NEXT:    sub a2, a0, a1
1382; CHECK-NEXT:    sltu a3, a0, a2
1383; CHECK-NEXT:    addi a3, a3, -1
1384; CHECK-NEXT:    and a2, a3, a2
1385; CHECK-NEXT:    vsetvli zero, a2, e32, m8, ta, ma
1386; CHECK-NEXT:    vsadd.vi v16, v16, -1
1387; CHECK-NEXT:    bltu a0, a1, .LBB119_2
1388; CHECK-NEXT:  # %bb.1:
1389; CHECK-NEXT:    mv a0, a1
1390; CHECK-NEXT:  .LBB119_2:
1391; CHECK-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1392; CHECK-NEXT:    vsadd.vi v8, v8, -1
1393; CHECK-NEXT:    ret
1394  %v = call <vscale x 32 x i32> @llvm.vp.sadd.sat.nxv32i32(<vscale x 32 x i32> %va, <vscale x 32 x i32> splat (i32 -1), <vscale x 32 x i1> splat (i1 true), i32 %evl)
1395  ret <vscale x 32 x i32> %v
1396}
1397
1398declare <vscale x 1 x i64> @llvm.vp.sadd.sat.nxv1i64(<vscale x 1 x i64>, <vscale x 1 x i64>, <vscale x 1 x i1>, i32)
1399
1400define <vscale x 1 x i64> @vsadd_vv_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %b, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1401; CHECK-LABEL: vsadd_vv_nxv1i64:
1402; CHECK:       # %bb.0:
1403; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1404; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
1405; CHECK-NEXT:    ret
1406  %v = call <vscale x 1 x i64> @llvm.vp.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %b, <vscale x 1 x i1> %m, i32 %evl)
1407  ret <vscale x 1 x i64> %v
1408}
1409
1410define <vscale x 1 x i64> @vsadd_vv_nxv1i64_unmasked(<vscale x 1 x i64> %va, <vscale x 1 x i64> %b, i32 zeroext %evl) {
1411; CHECK-LABEL: vsadd_vv_nxv1i64_unmasked:
1412; CHECK:       # %bb.0:
1413; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1414; CHECK-NEXT:    vsadd.vv v8, v8, v9
1415; CHECK-NEXT:    ret
1416  %v = call <vscale x 1 x i64> @llvm.vp.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %b, <vscale x 1 x i1> splat (i1 true), i32 %evl)
1417  ret <vscale x 1 x i64> %v
1418}
1419
1420define <vscale x 1 x i64> @vsadd_vx_nxv1i64(<vscale x 1 x i64> %va, i64 %b, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1421; RV32-LABEL: vsadd_vx_nxv1i64:
1422; RV32:       # %bb.0:
1423; RV32-NEXT:    addi sp, sp, -16
1424; RV32-NEXT:    .cfi_def_cfa_offset 16
1425; RV32-NEXT:    sw a0, 8(sp)
1426; RV32-NEXT:    sw a1, 12(sp)
1427; RV32-NEXT:    addi a0, sp, 8
1428; RV32-NEXT:    vsetvli zero, a2, e64, m1, ta, ma
1429; RV32-NEXT:    vlse64.v v9, (a0), zero
1430; RV32-NEXT:    vsadd.vv v8, v8, v9, v0.t
1431; RV32-NEXT:    addi sp, sp, 16
1432; RV32-NEXT:    .cfi_def_cfa_offset 0
1433; RV32-NEXT:    ret
1434;
1435; RV64-LABEL: vsadd_vx_nxv1i64:
1436; RV64:       # %bb.0:
1437; RV64-NEXT:    vsetvli zero, a1, e64, m1, ta, ma
1438; RV64-NEXT:    vsadd.vx v8, v8, a0, v0.t
1439; RV64-NEXT:    ret
1440  %elt.head = insertelement <vscale x 1 x i64> poison, i64 %b, i32 0
1441  %vb = shufflevector <vscale x 1 x i64> %elt.head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
1442  %v = call <vscale x 1 x i64> @llvm.vp.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %vb, <vscale x 1 x i1> %m, i32 %evl)
1443  ret <vscale x 1 x i64> %v
1444}
1445
1446define <vscale x 1 x i64> @vsadd_vx_nxv1i64_unmasked(<vscale x 1 x i64> %va, i64 %b, i32 zeroext %evl) {
1447; RV32-LABEL: vsadd_vx_nxv1i64_unmasked:
1448; RV32:       # %bb.0:
1449; RV32-NEXT:    addi sp, sp, -16
1450; RV32-NEXT:    .cfi_def_cfa_offset 16
1451; RV32-NEXT:    sw a0, 8(sp)
1452; RV32-NEXT:    sw a1, 12(sp)
1453; RV32-NEXT:    addi a0, sp, 8
1454; RV32-NEXT:    vsetvli zero, a2, e64, m1, ta, ma
1455; RV32-NEXT:    vlse64.v v9, (a0), zero
1456; RV32-NEXT:    vsadd.vv v8, v8, v9
1457; RV32-NEXT:    addi sp, sp, 16
1458; RV32-NEXT:    .cfi_def_cfa_offset 0
1459; RV32-NEXT:    ret
1460;
1461; RV64-LABEL: vsadd_vx_nxv1i64_unmasked:
1462; RV64:       # %bb.0:
1463; RV64-NEXT:    vsetvli zero, a1, e64, m1, ta, ma
1464; RV64-NEXT:    vsadd.vx v8, v8, a0
1465; RV64-NEXT:    ret
1466  %elt.head = insertelement <vscale x 1 x i64> poison, i64 %b, i32 0
1467  %vb = shufflevector <vscale x 1 x i64> %elt.head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
1468  %v = call <vscale x 1 x i64> @llvm.vp.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %vb, <vscale x 1 x i1> splat (i1 true), i32 %evl)
1469  ret <vscale x 1 x i64> %v
1470}
1471
1472define <vscale x 1 x i64> @vsadd_vi_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1473; CHECK-LABEL: vsadd_vi_nxv1i64:
1474; CHECK:       # %bb.0:
1475; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1476; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1477; CHECK-NEXT:    ret
1478  %v = call <vscale x 1 x i64> @llvm.vp.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> splat (i64 -1), <vscale x 1 x i1> %m, i32 %evl)
1479  ret <vscale x 1 x i64> %v
1480}
1481
1482define <vscale x 1 x i64> @vsadd_vi_nxv1i64_unmasked(<vscale x 1 x i64> %va, i32 zeroext %evl) {
1483; CHECK-LABEL: vsadd_vi_nxv1i64_unmasked:
1484; CHECK:       # %bb.0:
1485; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1486; CHECK-NEXT:    vsadd.vi v8, v8, -1
1487; CHECK-NEXT:    ret
1488  %v = call <vscale x 1 x i64> @llvm.vp.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> splat (i64 -1), <vscale x 1 x i1> splat (i1 true), i32 %evl)
1489  ret <vscale x 1 x i64> %v
1490}
1491
1492declare <vscale x 2 x i64> @llvm.vp.sadd.sat.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i1>, i32)
1493
1494define <vscale x 2 x i64> @vsadd_vv_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %b, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1495; CHECK-LABEL: vsadd_vv_nxv2i64:
1496; CHECK:       # %bb.0:
1497; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1498; CHECK-NEXT:    vsadd.vv v8, v8, v10, v0.t
1499; CHECK-NEXT:    ret
1500  %v = call <vscale x 2 x i64> @llvm.vp.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %b, <vscale x 2 x i1> %m, i32 %evl)
1501  ret <vscale x 2 x i64> %v
1502}
1503
1504define <vscale x 2 x i64> @vsadd_vv_nxv2i64_unmasked(<vscale x 2 x i64> %va, <vscale x 2 x i64> %b, i32 zeroext %evl) {
1505; CHECK-LABEL: vsadd_vv_nxv2i64_unmasked:
1506; CHECK:       # %bb.0:
1507; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1508; CHECK-NEXT:    vsadd.vv v8, v8, v10
1509; CHECK-NEXT:    ret
1510  %v = call <vscale x 2 x i64> @llvm.vp.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %b, <vscale x 2 x i1> splat (i1 true), i32 %evl)
1511  ret <vscale x 2 x i64> %v
1512}
1513
1514define <vscale x 2 x i64> @vsadd_vx_nxv2i64(<vscale x 2 x i64> %va, i64 %b, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1515; RV32-LABEL: vsadd_vx_nxv2i64:
1516; RV32:       # %bb.0:
1517; RV32-NEXT:    addi sp, sp, -16
1518; RV32-NEXT:    .cfi_def_cfa_offset 16
1519; RV32-NEXT:    sw a0, 8(sp)
1520; RV32-NEXT:    sw a1, 12(sp)
1521; RV32-NEXT:    addi a0, sp, 8
1522; RV32-NEXT:    vsetvli zero, a2, e64, m2, ta, ma
1523; RV32-NEXT:    vlse64.v v10, (a0), zero
1524; RV32-NEXT:    vsadd.vv v8, v8, v10, v0.t
1525; RV32-NEXT:    addi sp, sp, 16
1526; RV32-NEXT:    .cfi_def_cfa_offset 0
1527; RV32-NEXT:    ret
1528;
1529; RV64-LABEL: vsadd_vx_nxv2i64:
1530; RV64:       # %bb.0:
1531; RV64-NEXT:    vsetvli zero, a1, e64, m2, ta, ma
1532; RV64-NEXT:    vsadd.vx v8, v8, a0, v0.t
1533; RV64-NEXT:    ret
1534  %elt.head = insertelement <vscale x 2 x i64> poison, i64 %b, i32 0
1535  %vb = shufflevector <vscale x 2 x i64> %elt.head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
1536  %v = call <vscale x 2 x i64> @llvm.vp.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %vb, <vscale x 2 x i1> %m, i32 %evl)
1537  ret <vscale x 2 x i64> %v
1538}
1539
1540define <vscale x 2 x i64> @vsadd_vx_nxv2i64_unmasked(<vscale x 2 x i64> %va, i64 %b, i32 zeroext %evl) {
1541; RV32-LABEL: vsadd_vx_nxv2i64_unmasked:
1542; RV32:       # %bb.0:
1543; RV32-NEXT:    addi sp, sp, -16
1544; RV32-NEXT:    .cfi_def_cfa_offset 16
1545; RV32-NEXT:    sw a0, 8(sp)
1546; RV32-NEXT:    sw a1, 12(sp)
1547; RV32-NEXT:    addi a0, sp, 8
1548; RV32-NEXT:    vsetvli zero, a2, e64, m2, ta, ma
1549; RV32-NEXT:    vlse64.v v10, (a0), zero
1550; RV32-NEXT:    vsadd.vv v8, v8, v10
1551; RV32-NEXT:    addi sp, sp, 16
1552; RV32-NEXT:    .cfi_def_cfa_offset 0
1553; RV32-NEXT:    ret
1554;
1555; RV64-LABEL: vsadd_vx_nxv2i64_unmasked:
1556; RV64:       # %bb.0:
1557; RV64-NEXT:    vsetvli zero, a1, e64, m2, ta, ma
1558; RV64-NEXT:    vsadd.vx v8, v8, a0
1559; RV64-NEXT:    ret
1560  %elt.head = insertelement <vscale x 2 x i64> poison, i64 %b, i32 0
1561  %vb = shufflevector <vscale x 2 x i64> %elt.head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
1562  %v = call <vscale x 2 x i64> @llvm.vp.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %vb, <vscale x 2 x i1> splat (i1 true), i32 %evl)
1563  ret <vscale x 2 x i64> %v
1564}
1565
1566define <vscale x 2 x i64> @vsadd_vi_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1567; CHECK-LABEL: vsadd_vi_nxv2i64:
1568; CHECK:       # %bb.0:
1569; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1570; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1571; CHECK-NEXT:    ret
1572  %v = call <vscale x 2 x i64> @llvm.vp.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> splat (i64 -1), <vscale x 2 x i1> %m, i32 %evl)
1573  ret <vscale x 2 x i64> %v
1574}
1575
1576define <vscale x 2 x i64> @vsadd_vi_nxv2i64_unmasked(<vscale x 2 x i64> %va, i32 zeroext %evl) {
1577; CHECK-LABEL: vsadd_vi_nxv2i64_unmasked:
1578; CHECK:       # %bb.0:
1579; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1580; CHECK-NEXT:    vsadd.vi v8, v8, -1
1581; CHECK-NEXT:    ret
1582  %v = call <vscale x 2 x i64> @llvm.vp.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> splat (i64 -1), <vscale x 2 x i1> splat (i1 true), i32 %evl)
1583  ret <vscale x 2 x i64> %v
1584}
1585
1586declare <vscale x 4 x i64> @llvm.vp.sadd.sat.nxv4i64(<vscale x 4 x i64>, <vscale x 4 x i64>, <vscale x 4 x i1>, i32)
1587
1588define <vscale x 4 x i64> @vsadd_vv_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %b, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1589; CHECK-LABEL: vsadd_vv_nxv4i64:
1590; CHECK:       # %bb.0:
1591; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1592; CHECK-NEXT:    vsadd.vv v8, v8, v12, v0.t
1593; CHECK-NEXT:    ret
1594  %v = call <vscale x 4 x i64> @llvm.vp.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %b, <vscale x 4 x i1> %m, i32 %evl)
1595  ret <vscale x 4 x i64> %v
1596}
1597
1598define <vscale x 4 x i64> @vsadd_vv_nxv4i64_unmasked(<vscale x 4 x i64> %va, <vscale x 4 x i64> %b, i32 zeroext %evl) {
1599; CHECK-LABEL: vsadd_vv_nxv4i64_unmasked:
1600; CHECK:       # %bb.0:
1601; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1602; CHECK-NEXT:    vsadd.vv v8, v8, v12
1603; CHECK-NEXT:    ret
1604  %v = call <vscale x 4 x i64> @llvm.vp.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %b, <vscale x 4 x i1> splat (i1 true), i32 %evl)
1605  ret <vscale x 4 x i64> %v
1606}
1607
1608define <vscale x 4 x i64> @vsadd_vx_nxv4i64(<vscale x 4 x i64> %va, i64 %b, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1609; RV32-LABEL: vsadd_vx_nxv4i64:
1610; RV32:       # %bb.0:
1611; RV32-NEXT:    addi sp, sp, -16
1612; RV32-NEXT:    .cfi_def_cfa_offset 16
1613; RV32-NEXT:    sw a0, 8(sp)
1614; RV32-NEXT:    sw a1, 12(sp)
1615; RV32-NEXT:    addi a0, sp, 8
1616; RV32-NEXT:    vsetvli zero, a2, e64, m4, ta, ma
1617; RV32-NEXT:    vlse64.v v12, (a0), zero
1618; RV32-NEXT:    vsadd.vv v8, v8, v12, v0.t
1619; RV32-NEXT:    addi sp, sp, 16
1620; RV32-NEXT:    .cfi_def_cfa_offset 0
1621; RV32-NEXT:    ret
1622;
1623; RV64-LABEL: vsadd_vx_nxv4i64:
1624; RV64:       # %bb.0:
1625; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1626; RV64-NEXT:    vsadd.vx v8, v8, a0, v0.t
1627; RV64-NEXT:    ret
1628  %elt.head = insertelement <vscale x 4 x i64> poison, i64 %b, i32 0
1629  %vb = shufflevector <vscale x 4 x i64> %elt.head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
1630  %v = call <vscale x 4 x i64> @llvm.vp.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %vb, <vscale x 4 x i1> %m, i32 %evl)
1631  ret <vscale x 4 x i64> %v
1632}
1633
1634define <vscale x 4 x i64> @vsadd_vx_nxv4i64_unmasked(<vscale x 4 x i64> %va, i64 %b, i32 zeroext %evl) {
1635; RV32-LABEL: vsadd_vx_nxv4i64_unmasked:
1636; RV32:       # %bb.0:
1637; RV32-NEXT:    addi sp, sp, -16
1638; RV32-NEXT:    .cfi_def_cfa_offset 16
1639; RV32-NEXT:    sw a0, 8(sp)
1640; RV32-NEXT:    sw a1, 12(sp)
1641; RV32-NEXT:    addi a0, sp, 8
1642; RV32-NEXT:    vsetvli zero, a2, e64, m4, ta, ma
1643; RV32-NEXT:    vlse64.v v12, (a0), zero
1644; RV32-NEXT:    vsadd.vv v8, v8, v12
1645; RV32-NEXT:    addi sp, sp, 16
1646; RV32-NEXT:    .cfi_def_cfa_offset 0
1647; RV32-NEXT:    ret
1648;
1649; RV64-LABEL: vsadd_vx_nxv4i64_unmasked:
1650; RV64:       # %bb.0:
1651; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1652; RV64-NEXT:    vsadd.vx v8, v8, a0
1653; RV64-NEXT:    ret
1654  %elt.head = insertelement <vscale x 4 x i64> poison, i64 %b, i32 0
1655  %vb = shufflevector <vscale x 4 x i64> %elt.head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
1656  %v = call <vscale x 4 x i64> @llvm.vp.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %vb, <vscale x 4 x i1> splat (i1 true), i32 %evl)
1657  ret <vscale x 4 x i64> %v
1658}
1659
1660define <vscale x 4 x i64> @vsadd_vi_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1661; CHECK-LABEL: vsadd_vi_nxv4i64:
1662; CHECK:       # %bb.0:
1663; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1664; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1665; CHECK-NEXT:    ret
1666  %v = call <vscale x 4 x i64> @llvm.vp.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> splat (i64 -1), <vscale x 4 x i1> %m, i32 %evl)
1667  ret <vscale x 4 x i64> %v
1668}
1669
1670define <vscale x 4 x i64> @vsadd_vi_nxv4i64_unmasked(<vscale x 4 x i64> %va, i32 zeroext %evl) {
1671; CHECK-LABEL: vsadd_vi_nxv4i64_unmasked:
1672; CHECK:       # %bb.0:
1673; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1674; CHECK-NEXT:    vsadd.vi v8, v8, -1
1675; CHECK-NEXT:    ret
1676  %v = call <vscale x 4 x i64> @llvm.vp.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> splat (i64 -1), <vscale x 4 x i1> splat (i1 true), i32 %evl)
1677  ret <vscale x 4 x i64> %v
1678}
1679
1680declare <vscale x 8 x i64> @llvm.vp.sadd.sat.nxv8i64(<vscale x 8 x i64>, <vscale x 8 x i64>, <vscale x 8 x i1>, i32)
1681
1682define <vscale x 8 x i64> @vsadd_vv_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %b, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1683; CHECK-LABEL: vsadd_vv_nxv8i64:
1684; CHECK:       # %bb.0:
1685; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1686; CHECK-NEXT:    vsadd.vv v8, v8, v16, v0.t
1687; CHECK-NEXT:    ret
1688  %v = call <vscale x 8 x i64> @llvm.vp.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %b, <vscale x 8 x i1> %m, i32 %evl)
1689  ret <vscale x 8 x i64> %v
1690}
1691
1692define <vscale x 8 x i64> @vsadd_vv_nxv8i64_unmasked(<vscale x 8 x i64> %va, <vscale x 8 x i64> %b, i32 zeroext %evl) {
1693; CHECK-LABEL: vsadd_vv_nxv8i64_unmasked:
1694; CHECK:       # %bb.0:
1695; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1696; CHECK-NEXT:    vsadd.vv v8, v8, v16
1697; CHECK-NEXT:    ret
1698  %v = call <vscale x 8 x i64> @llvm.vp.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %b, <vscale x 8 x i1> splat (i1 true), i32 %evl)
1699  ret <vscale x 8 x i64> %v
1700}
1701
1702define <vscale x 8 x i64> @vsadd_vx_nxv8i64(<vscale x 8 x i64> %va, i64 %b, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1703; RV32-LABEL: vsadd_vx_nxv8i64:
1704; RV32:       # %bb.0:
1705; RV32-NEXT:    addi sp, sp, -16
1706; RV32-NEXT:    .cfi_def_cfa_offset 16
1707; RV32-NEXT:    sw a0, 8(sp)
1708; RV32-NEXT:    sw a1, 12(sp)
1709; RV32-NEXT:    addi a0, sp, 8
1710; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
1711; RV32-NEXT:    vlse64.v v16, (a0), zero
1712; RV32-NEXT:    vsadd.vv v8, v8, v16, v0.t
1713; RV32-NEXT:    addi sp, sp, 16
1714; RV32-NEXT:    .cfi_def_cfa_offset 0
1715; RV32-NEXT:    ret
1716;
1717; RV64-LABEL: vsadd_vx_nxv8i64:
1718; RV64:       # %bb.0:
1719; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1720; RV64-NEXT:    vsadd.vx v8, v8, a0, v0.t
1721; RV64-NEXT:    ret
1722  %elt.head = insertelement <vscale x 8 x i64> poison, i64 %b, i32 0
1723  %vb = shufflevector <vscale x 8 x i64> %elt.head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
1724  %v = call <vscale x 8 x i64> @llvm.vp.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb, <vscale x 8 x i1> %m, i32 %evl)
1725  ret <vscale x 8 x i64> %v
1726}
1727
1728define <vscale x 8 x i64> @vsadd_vx_nxv8i64_unmasked(<vscale x 8 x i64> %va, i64 %b, i32 zeroext %evl) {
1729; RV32-LABEL: vsadd_vx_nxv8i64_unmasked:
1730; RV32:       # %bb.0:
1731; RV32-NEXT:    addi sp, sp, -16
1732; RV32-NEXT:    .cfi_def_cfa_offset 16
1733; RV32-NEXT:    sw a0, 8(sp)
1734; RV32-NEXT:    sw a1, 12(sp)
1735; RV32-NEXT:    addi a0, sp, 8
1736; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
1737; RV32-NEXT:    vlse64.v v16, (a0), zero
1738; RV32-NEXT:    vsadd.vv v8, v8, v16
1739; RV32-NEXT:    addi sp, sp, 16
1740; RV32-NEXT:    .cfi_def_cfa_offset 0
1741; RV32-NEXT:    ret
1742;
1743; RV64-LABEL: vsadd_vx_nxv8i64_unmasked:
1744; RV64:       # %bb.0:
1745; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1746; RV64-NEXT:    vsadd.vx v8, v8, a0
1747; RV64-NEXT:    ret
1748  %elt.head = insertelement <vscale x 8 x i64> poison, i64 %b, i32 0
1749  %vb = shufflevector <vscale x 8 x i64> %elt.head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
1750  %v = call <vscale x 8 x i64> @llvm.vp.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb, <vscale x 8 x i1> splat (i1 true), i32 %evl)
1751  ret <vscale x 8 x i64> %v
1752}
1753
1754define <vscale x 8 x i64> @vsadd_vi_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1755; CHECK-LABEL: vsadd_vi_nxv8i64:
1756; CHECK:       # %bb.0:
1757; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1758; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1759; CHECK-NEXT:    ret
1760  %v = call <vscale x 8 x i64> @llvm.vp.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> splat (i64 -1), <vscale x 8 x i1> %m, i32 %evl)
1761  ret <vscale x 8 x i64> %v
1762}
1763
1764define <vscale x 8 x i64> @vsadd_vi_nxv8i64_unmasked(<vscale x 8 x i64> %va, i32 zeroext %evl) {
1765; CHECK-LABEL: vsadd_vi_nxv8i64_unmasked:
1766; CHECK:       # %bb.0:
1767; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1768; CHECK-NEXT:    vsadd.vi v8, v8, -1
1769; CHECK-NEXT:    ret
1770  %v = call <vscale x 8 x i64> @llvm.vp.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> splat (i64 -1), <vscale x 8 x i1> splat (i1 true), i32 %evl)
1771  ret <vscale x 8 x i64> %v
1772}
1773