[libc++] Define an internal API for std::invoke and friends (#116637)
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / fixed-vectors-vsadd-vp.ll
blob7afd31fdd663cdb3d5934946c26f20219b82e64c
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
7 declare <8 x i7> @llvm.vp.sadd.sat.v8i7(<8 x i7>, <8 x i7>, <8 x i1>, i32)
9 define <8 x i7> @vsadd_vv_v8i7(<8 x i7> %va, <8 x i7> %b, <8 x i1> %m, i32 zeroext %evl) {
10 ; CHECK-LABEL: vsadd_vv_v8i7:
11 ; CHECK:       # %bb.0:
12 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
13 ; CHECK-NEXT:    vadd.vv v9, v9, v9
14 ; CHECK-NEXT:    vadd.vv v8, v8, v8
15 ; CHECK-NEXT:    li a1, 63
16 ; CHECK-NEXT:    vsra.vi v9, v9, 1
17 ; CHECK-NEXT:    vsra.vi v8, v8, 1
18 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
19 ; CHECK-NEXT:    vadd.vv v8, v8, v9, v0.t
20 ; CHECK-NEXT:    vmin.vx v8, v8, a1, v0.t
21 ; CHECK-NEXT:    li a0, 192
22 ; CHECK-NEXT:    vmax.vx v8, v8, a0, v0.t
23 ; CHECK-NEXT:    ret
24   %v = call <8 x i7> @llvm.vp.sadd.sat.v8i7(<8 x i7> %va, <8 x i7> %b, <8 x i1> %m, i32 %evl)
25   ret <8 x i7> %v
28 declare <2 x i8> @llvm.vp.sadd.sat.v2i8(<2 x i8>, <2 x i8>, <2 x i1>, i32)
30 define <2 x i8> @vsadd_vv_v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> %m, i32 zeroext %evl) {
31 ; CHECK-LABEL: vsadd_vv_v2i8:
32 ; CHECK:       # %bb.0:
33 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
34 ; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
35 ; CHECK-NEXT:    ret
36   %v = call <2 x i8> @llvm.vp.sadd.sat.v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> %m, i32 %evl)
37   ret <2 x i8> %v
40 define <2 x i8> @vsadd_vv_v2i8_unmasked(<2 x i8> %va, <2 x i8> %b, i32 zeroext %evl) {
41 ; CHECK-LABEL: vsadd_vv_v2i8_unmasked:
42 ; CHECK:       # %bb.0:
43 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
44 ; CHECK-NEXT:    vsadd.vv v8, v8, v9
45 ; CHECK-NEXT:    ret
46   %v = call <2 x i8> @llvm.vp.sadd.sat.v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> splat (i1 true), i32 %evl)
47   ret <2 x i8> %v
50 define <2 x i8> @vsadd_vx_v2i8(<2 x i8> %va, i8 %b, <2 x i1> %m, i32 zeroext %evl) {
51 ; CHECK-LABEL: vsadd_vx_v2i8:
52 ; CHECK:       # %bb.0:
53 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
54 ; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
55 ; CHECK-NEXT:    ret
56   %elt.head = insertelement <2 x i8> poison, i8 %b, i32 0
57   %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer
58   %v = call <2 x i8> @llvm.vp.sadd.sat.v2i8(<2 x i8> %va, <2 x i8> %vb, <2 x i1> %m, i32 %evl)
59   ret <2 x i8> %v
62 define <2 x i8> @vsadd_vx_v2i8_unmasked(<2 x i8> %va, i8 %b, i32 zeroext %evl) {
63 ; CHECK-LABEL: vsadd_vx_v2i8_unmasked:
64 ; CHECK:       # %bb.0:
65 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
66 ; CHECK-NEXT:    vsadd.vx v8, v8, a0
67 ; CHECK-NEXT:    ret
68   %elt.head = insertelement <2 x i8> poison, i8 %b, i32 0
69   %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer
70   %v = call <2 x i8> @llvm.vp.sadd.sat.v2i8(<2 x i8> %va, <2 x i8> %vb, <2 x i1> splat (i1 true), i32 %evl)
71   ret <2 x i8> %v
74 define <2 x i8> @vsadd_vi_v2i8(<2 x i8> %va, <2 x i1> %m, i32 zeroext %evl) {
75 ; CHECK-LABEL: vsadd_vi_v2i8:
76 ; CHECK:       # %bb.0:
77 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
78 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
79 ; CHECK-NEXT:    ret
80   %v = call <2 x i8> @llvm.vp.sadd.sat.v2i8(<2 x i8> %va, <2 x i8> splat (i8 -1), <2 x i1> %m, i32 %evl)
81   ret <2 x i8> %v
84 define <2 x i8> @vsadd_vi_v2i8_unmasked(<2 x i8> %va, i32 zeroext %evl) {
85 ; CHECK-LABEL: vsadd_vi_v2i8_unmasked:
86 ; CHECK:       # %bb.0:
87 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
88 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
89 ; CHECK-NEXT:    ret
90   %v = call <2 x i8> @llvm.vp.sadd.sat.v2i8(<2 x i8> %va, <2 x i8> splat (i8 -1), <2 x i1> splat (i1 true), i32 %evl)
91   ret <2 x i8> %v
94 declare <4 x i8> @llvm.vp.sadd.sat.v4i8(<4 x i8>, <4 x i8>, <4 x i1>, i32)
96 define <4 x i8> @vsadd_vv_v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> %m, i32 zeroext %evl) {
97 ; CHECK-LABEL: vsadd_vv_v4i8:
98 ; CHECK:       # %bb.0:
99 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
100 ; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
101 ; CHECK-NEXT:    ret
102   %v = call <4 x i8> @llvm.vp.sadd.sat.v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> %m, i32 %evl)
103   ret <4 x i8> %v
106 define <4 x i8> @vsadd_vv_v4i8_unmasked(<4 x i8> %va, <4 x i8> %b, i32 zeroext %evl) {
107 ; CHECK-LABEL: vsadd_vv_v4i8_unmasked:
108 ; CHECK:       # %bb.0:
109 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
110 ; CHECK-NEXT:    vsadd.vv v8, v8, v9
111 ; CHECK-NEXT:    ret
112   %v = call <4 x i8> @llvm.vp.sadd.sat.v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> splat (i1 true), i32 %evl)
113   ret <4 x i8> %v
116 define <4 x i8> @vsadd_vx_v4i8(<4 x i8> %va, i8 %b, <4 x i1> %m, i32 zeroext %evl) {
117 ; CHECK-LABEL: vsadd_vx_v4i8:
118 ; CHECK:       # %bb.0:
119 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
120 ; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
121 ; CHECK-NEXT:    ret
122   %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0
123   %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer
124   %v = call <4 x i8> @llvm.vp.sadd.sat.v4i8(<4 x i8> %va, <4 x i8> %vb, <4 x i1> %m, i32 %evl)
125   ret <4 x i8> %v
128 define <4 x i8> @vsadd_vx_v4i8_commute(<4 x i8> %va, i8 %b, <4 x i1> %m, i32 zeroext %evl) {
129 ; CHECK-LABEL: vsadd_vx_v4i8_commute:
130 ; CHECK:       # %bb.0:
131 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
132 ; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
133 ; CHECK-NEXT:    ret
134   %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0
135   %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer
136   %v = call <4 x i8> @llvm.vp.sadd.sat.v4i8(<4 x i8> %vb, <4 x i8> %va, <4 x i1> %m, i32 %evl)
137   ret <4 x i8> %v
140 define <4 x i8> @vsadd_vx_v4i8_unmasked(<4 x i8> %va, i8 %b, i32 zeroext %evl) {
141 ; CHECK-LABEL: vsadd_vx_v4i8_unmasked:
142 ; CHECK:       # %bb.0:
143 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
144 ; CHECK-NEXT:    vsadd.vx v8, v8, a0
145 ; CHECK-NEXT:    ret
146   %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0
147   %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer
148   %v = call <4 x i8> @llvm.vp.sadd.sat.v4i8(<4 x i8> %va, <4 x i8> %vb, <4 x i1> splat (i1 true), i32 %evl)
149   ret <4 x i8> %v
152 define <4 x i8> @vsadd_vi_v4i8(<4 x i8> %va, <4 x i1> %m, i32 zeroext %evl) {
153 ; CHECK-LABEL: vsadd_vi_v4i8:
154 ; CHECK:       # %bb.0:
155 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
156 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
157 ; CHECK-NEXT:    ret
158   %v = call <4 x i8> @llvm.vp.sadd.sat.v4i8(<4 x i8> %va, <4 x i8> splat (i8 -1), <4 x i1> %m, i32 %evl)
159   ret <4 x i8> %v
162 define <4 x i8> @vsadd_vi_v4i8_unmasked(<4 x i8> %va, i32 zeroext %evl) {
163 ; CHECK-LABEL: vsadd_vi_v4i8_unmasked:
164 ; CHECK:       # %bb.0:
165 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
166 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
167 ; CHECK-NEXT:    ret
168   %v = call <4 x i8> @llvm.vp.sadd.sat.v4i8(<4 x i8> %va, <4 x i8> splat (i8 -1), <4 x i1> splat (i1 true), i32 %evl)
169   ret <4 x i8> %v
172 declare <5 x i8> @llvm.vp.sadd.sat.v5i8(<5 x i8>, <5 x i8>, <5 x i1>, i32)
174 define <5 x i8> @vsadd_vv_v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> %m, i32 zeroext %evl) {
175 ; CHECK-LABEL: vsadd_vv_v5i8:
176 ; CHECK:       # %bb.0:
177 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
178 ; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
179 ; CHECK-NEXT:    ret
180   %v = call <5 x i8> @llvm.vp.sadd.sat.v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> %m, i32 %evl)
181   ret <5 x i8> %v
184 define <5 x i8> @vsadd_vv_v5i8_unmasked(<5 x i8> %va, <5 x i8> %b, i32 zeroext %evl) {
185 ; CHECK-LABEL: vsadd_vv_v5i8_unmasked:
186 ; CHECK:       # %bb.0:
187 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
188 ; CHECK-NEXT:    vsadd.vv v8, v8, v9
189 ; CHECK-NEXT:    ret
190   %v = call <5 x i8> @llvm.vp.sadd.sat.v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> splat (i1 true), i32 %evl)
191   ret <5 x i8> %v
194 define <5 x i8> @vsadd_vx_v5i8(<5 x i8> %va, i8 %b, <5 x i1> %m, i32 zeroext %evl) {
195 ; CHECK-LABEL: vsadd_vx_v5i8:
196 ; CHECK:       # %bb.0:
197 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
198 ; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
199 ; CHECK-NEXT:    ret
200   %elt.head = insertelement <5 x i8> poison, i8 %b, i32 0
201   %vb = shufflevector <5 x i8> %elt.head, <5 x i8> poison, <5 x i32> zeroinitializer
202   %v = call <5 x i8> @llvm.vp.sadd.sat.v5i8(<5 x i8> %va, <5 x i8> %vb, <5 x i1> %m, i32 %evl)
203   ret <5 x i8> %v
206 define <5 x i8> @vsadd_vx_v5i8_unmasked(<5 x i8> %va, i8 %b, i32 zeroext %evl) {
207 ; CHECK-LABEL: vsadd_vx_v5i8_unmasked:
208 ; CHECK:       # %bb.0:
209 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
210 ; CHECK-NEXT:    vsadd.vx v8, v8, a0
211 ; CHECK-NEXT:    ret
212   %elt.head = insertelement <5 x i8> poison, i8 %b, i32 0
213   %vb = shufflevector <5 x i8> %elt.head, <5 x i8> poison, <5 x i32> zeroinitializer
214   %v = call <5 x i8> @llvm.vp.sadd.sat.v5i8(<5 x i8> %va, <5 x i8> %vb, <5 x i1> splat (i1 true), i32 %evl)
215   ret <5 x i8> %v
218 define <5 x i8> @vsadd_vi_v5i8(<5 x i8> %va, <5 x i1> %m, i32 zeroext %evl) {
219 ; CHECK-LABEL: vsadd_vi_v5i8:
220 ; CHECK:       # %bb.0:
221 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
222 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
223 ; CHECK-NEXT:    ret
224   %v = call <5 x i8> @llvm.vp.sadd.sat.v5i8(<5 x i8> %va, <5 x i8> splat (i8 -1), <5 x i1> %m, i32 %evl)
225   ret <5 x i8> %v
228 define <5 x i8> @vsadd_vi_v5i8_unmasked(<5 x i8> %va, i32 zeroext %evl) {
229 ; CHECK-LABEL: vsadd_vi_v5i8_unmasked:
230 ; CHECK:       # %bb.0:
231 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
232 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
233 ; CHECK-NEXT:    ret
234   %v = call <5 x i8> @llvm.vp.sadd.sat.v5i8(<5 x i8> %va, <5 x i8> splat (i8 -1), <5 x i1> splat (i1 true), i32 %evl)
235   ret <5 x i8> %v
238 declare <8 x i8> @llvm.vp.sadd.sat.v8i8(<8 x i8>, <8 x i8>, <8 x i1>, i32)
240 define <8 x i8> @vsadd_vv_v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> %m, i32 zeroext %evl) {
241 ; CHECK-LABEL: vsadd_vv_v8i8:
242 ; CHECK:       # %bb.0:
243 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
244 ; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
245 ; CHECK-NEXT:    ret
246   %v = call <8 x i8> @llvm.vp.sadd.sat.v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> %m, i32 %evl)
247   ret <8 x i8> %v
250 define <8 x i8> @vsadd_vv_v8i8_unmasked(<8 x i8> %va, <8 x i8> %b, i32 zeroext %evl) {
251 ; CHECK-LABEL: vsadd_vv_v8i8_unmasked:
252 ; CHECK:       # %bb.0:
253 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
254 ; CHECK-NEXT:    vsadd.vv v8, v8, v9
255 ; CHECK-NEXT:    ret
256   %v = call <8 x i8> @llvm.vp.sadd.sat.v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> splat (i1 true), i32 %evl)
257   ret <8 x i8> %v
260 define <8 x i8> @vsadd_vx_v8i8(<8 x i8> %va, i8 %b, <8 x i1> %m, i32 zeroext %evl) {
261 ; CHECK-LABEL: vsadd_vx_v8i8:
262 ; CHECK:       # %bb.0:
263 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
264 ; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
265 ; CHECK-NEXT:    ret
266   %elt.head = insertelement <8 x i8> poison, i8 %b, i32 0
267   %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer
268   %v = call <8 x i8> @llvm.vp.sadd.sat.v8i8(<8 x i8> %va, <8 x i8> %vb, <8 x i1> %m, i32 %evl)
269   ret <8 x i8> %v
272 define <8 x i8> @vsadd_vx_v8i8_unmasked(<8 x i8> %va, i8 %b, i32 zeroext %evl) {
273 ; CHECK-LABEL: vsadd_vx_v8i8_unmasked:
274 ; CHECK:       # %bb.0:
275 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
276 ; CHECK-NEXT:    vsadd.vx v8, v8, a0
277 ; CHECK-NEXT:    ret
278   %elt.head = insertelement <8 x i8> poison, i8 %b, i32 0
279   %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer
280   %v = call <8 x i8> @llvm.vp.sadd.sat.v8i8(<8 x i8> %va, <8 x i8> %vb, <8 x i1> splat (i1 true), i32 %evl)
281   ret <8 x i8> %v
284 define <8 x i8> @vsadd_vi_v8i8(<8 x i8> %va, <8 x i1> %m, i32 zeroext %evl) {
285 ; CHECK-LABEL: vsadd_vi_v8i8:
286 ; CHECK:       # %bb.0:
287 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
288 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
289 ; CHECK-NEXT:    ret
290   %v = call <8 x i8> @llvm.vp.sadd.sat.v8i8(<8 x i8> %va, <8 x i8> splat (i8 -1), <8 x i1> %m, i32 %evl)
291   ret <8 x i8> %v
294 define <8 x i8> @vsadd_vi_v8i8_unmasked(<8 x i8> %va, i32 zeroext %evl) {
295 ; CHECK-LABEL: vsadd_vi_v8i8_unmasked:
296 ; CHECK:       # %bb.0:
297 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
298 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
299 ; CHECK-NEXT:    ret
300   %v = call <8 x i8> @llvm.vp.sadd.sat.v8i8(<8 x i8> %va, <8 x i8> splat (i8 -1), <8 x i1> splat (i1 true), i32 %evl)
301   ret <8 x i8> %v
304 declare <16 x i8> @llvm.vp.sadd.sat.v16i8(<16 x i8>, <16 x i8>, <16 x i1>, i32)
306 define <16 x i8> @vsadd_vv_v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> %m, i32 zeroext %evl) {
307 ; CHECK-LABEL: vsadd_vv_v16i8:
308 ; CHECK:       # %bb.0:
309 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
310 ; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
311 ; CHECK-NEXT:    ret
312   %v = call <16 x i8> @llvm.vp.sadd.sat.v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> %m, i32 %evl)
313   ret <16 x i8> %v
316 define <16 x i8> @vsadd_vv_v16i8_unmasked(<16 x i8> %va, <16 x i8> %b, i32 zeroext %evl) {
317 ; CHECK-LABEL: vsadd_vv_v16i8_unmasked:
318 ; CHECK:       # %bb.0:
319 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
320 ; CHECK-NEXT:    vsadd.vv v8, v8, v9
321 ; CHECK-NEXT:    ret
322   %v = call <16 x i8> @llvm.vp.sadd.sat.v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> splat (i1 true), i32 %evl)
323   ret <16 x i8> %v
326 define <16 x i8> @vsadd_vx_v16i8(<16 x i8> %va, i8 %b, <16 x i1> %m, i32 zeroext %evl) {
327 ; CHECK-LABEL: vsadd_vx_v16i8:
328 ; CHECK:       # %bb.0:
329 ; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
330 ; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
331 ; CHECK-NEXT:    ret
332   %elt.head = insertelement <16 x i8> poison, i8 %b, i32 0
333   %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer
334   %v = call <16 x i8> @llvm.vp.sadd.sat.v16i8(<16 x i8> %va, <16 x i8> %vb, <16 x i1> %m, i32 %evl)
335   ret <16 x i8> %v
338 define <16 x i8> @vsadd_vx_v16i8_unmasked(<16 x i8> %va, i8 %b, i32 zeroext %evl) {
339 ; CHECK-LABEL: vsadd_vx_v16i8_unmasked:
340 ; CHECK:       # %bb.0:
341 ; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
342 ; CHECK-NEXT:    vsadd.vx v8, v8, a0
343 ; CHECK-NEXT:    ret
344   %elt.head = insertelement <16 x i8> poison, i8 %b, i32 0
345   %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer
346   %v = call <16 x i8> @llvm.vp.sadd.sat.v16i8(<16 x i8> %va, <16 x i8> %vb, <16 x i1> splat (i1 true), i32 %evl)
347   ret <16 x i8> %v
350 define <16 x i8> @vsadd_vi_v16i8(<16 x i8> %va, <16 x i1> %m, i32 zeroext %evl) {
351 ; CHECK-LABEL: vsadd_vi_v16i8:
352 ; CHECK:       # %bb.0:
353 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
354 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
355 ; CHECK-NEXT:    ret
356   %v = call <16 x i8> @llvm.vp.sadd.sat.v16i8(<16 x i8> %va, <16 x i8> splat (i8 -1), <16 x i1> %m, i32 %evl)
357   ret <16 x i8> %v
360 define <16 x i8> @vsadd_vi_v16i8_unmasked(<16 x i8> %va, i32 zeroext %evl) {
361 ; CHECK-LABEL: vsadd_vi_v16i8_unmasked:
362 ; CHECK:       # %bb.0:
363 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
364 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
365 ; CHECK-NEXT:    ret
366   %v = call <16 x i8> @llvm.vp.sadd.sat.v16i8(<16 x i8> %va, <16 x i8> splat (i8 -1), <16 x i1> splat (i1 true), i32 %evl)
367   ret <16 x i8> %v
370 declare <256 x i8> @llvm.vp.sadd.sat.v258i8(<256 x i8>, <256 x i8>, <256 x i1>, i32)
372 define <256 x i8> @vsadd_vi_v258i8(<256 x i8> %va, <256 x i1> %m, i32 zeroext %evl) {
373 ; CHECK-LABEL: vsadd_vi_v258i8:
374 ; CHECK:       # %bb.0:
375 ; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
376 ; CHECK-NEXT:    vmv1r.v v24, v0
377 ; CHECK-NEXT:    li a2, 128
378 ; CHECK-NEXT:    vsetvli zero, a2, e8, m8, ta, ma
379 ; CHECK-NEXT:    vlm.v v0, (a0)
380 ; CHECK-NEXT:    addi a0, a1, -128
381 ; CHECK-NEXT:    sltu a3, a1, a0
382 ; CHECK-NEXT:    addi a3, a3, -1
383 ; CHECK-NEXT:    and a0, a3, a0
384 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
385 ; CHECK-NEXT:    vsadd.vi v16, v16, -1, v0.t
386 ; CHECK-NEXT:    bltu a1, a2, .LBB32_2
387 ; CHECK-NEXT:  # %bb.1:
388 ; CHECK-NEXT:    li a1, 128
389 ; CHECK-NEXT:  .LBB32_2:
390 ; CHECK-NEXT:    vmv1r.v v0, v24
391 ; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
392 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
393 ; CHECK-NEXT:    ret
394   %v = call <256 x i8> @llvm.vp.sadd.sat.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> %m, i32 %evl)
395   ret <256 x i8> %v
398 define <256 x i8> @vsadd_vi_v258i8_unmasked(<256 x i8> %va, i32 zeroext %evl) {
399 ; CHECK-LABEL: vsadd_vi_v258i8_unmasked:
400 ; CHECK:       # %bb.0:
401 ; CHECK-NEXT:    li a2, 128
402 ; CHECK-NEXT:    mv a1, a0
403 ; CHECK-NEXT:    bltu a0, a2, .LBB33_2
404 ; CHECK-NEXT:  # %bb.1:
405 ; CHECK-NEXT:    li a1, 128
406 ; CHECK-NEXT:  .LBB33_2:
407 ; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
408 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
409 ; CHECK-NEXT:    addi a1, a0, -128
410 ; CHECK-NEXT:    sltu a0, a0, a1
411 ; CHECK-NEXT:    addi a0, a0, -1
412 ; CHECK-NEXT:    and a0, a0, a1
413 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
414 ; CHECK-NEXT:    vsadd.vi v16, v16, -1
415 ; CHECK-NEXT:    ret
416   %v = call <256 x i8> @llvm.vp.sadd.sat.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> splat (i1 true), i32 %evl)
417   ret <256 x i8> %v
420 ; Test splitting when the %evl is a known constant.
422 define <256 x i8> @vsadd_vi_v258i8_evl129(<256 x i8> %va, <256 x i1> %m) {
423 ; CHECK-LABEL: vsadd_vi_v258i8_evl129:
424 ; CHECK:       # %bb.0:
425 ; CHECK-NEXT:    li a1, 128
426 ; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
427 ; CHECK-NEXT:    vlm.v v24, (a0)
428 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
429 ; CHECK-NEXT:    vmv1r.v v0, v24
430 ; CHECK-NEXT:    vsetivli zero, 1, e8, m8, ta, ma
431 ; CHECK-NEXT:    vsadd.vi v16, v16, -1, v0.t
432 ; CHECK-NEXT:    ret
433   %v = call <256 x i8> @llvm.vp.sadd.sat.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> %m, i32 129)
434   ret <256 x i8> %v
437 ; FIXME: The upper half is doing nothing.
439 define <256 x i8> @vsadd_vi_v258i8_evl128(<256 x i8> %va, <256 x i1> %m) {
440 ; CHECK-LABEL: vsadd_vi_v258i8_evl128:
441 ; CHECK:       # %bb.0:
442 ; CHECK-NEXT:    li a1, 128
443 ; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
444 ; CHECK-NEXT:    vlm.v v24, (a0)
445 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
446 ; CHECK-NEXT:    vmv1r.v v0, v24
447 ; CHECK-NEXT:    vsetivli zero, 0, e8, m8, ta, ma
448 ; CHECK-NEXT:    vsadd.vi v16, v16, -1, v0.t
449 ; CHECK-NEXT:    ret
450   %v = call <256 x i8> @llvm.vp.sadd.sat.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> %m, i32 128)
451   ret <256 x i8> %v
454 declare <2 x i16> @llvm.vp.sadd.sat.v2i16(<2 x i16>, <2 x i16>, <2 x i1>, i32)
456 define <2 x i16> @vsadd_vv_v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> %m, i32 zeroext %evl) {
457 ; CHECK-LABEL: vsadd_vv_v2i16:
458 ; CHECK:       # %bb.0:
459 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
460 ; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
461 ; CHECK-NEXT:    ret
462   %v = call <2 x i16> @llvm.vp.sadd.sat.v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> %m, i32 %evl)
463   ret <2 x i16> %v
466 define <2 x i16> @vsadd_vv_v2i16_unmasked(<2 x i16> %va, <2 x i16> %b, i32 zeroext %evl) {
467 ; CHECK-LABEL: vsadd_vv_v2i16_unmasked:
468 ; CHECK:       # %bb.0:
469 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
470 ; CHECK-NEXT:    vsadd.vv v8, v8, v9
471 ; CHECK-NEXT:    ret
472   %v = call <2 x i16> @llvm.vp.sadd.sat.v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> splat (i1 true), i32 %evl)
473   ret <2 x i16> %v
476 define <2 x i16> @vsadd_vx_v2i16(<2 x i16> %va, i16 %b, <2 x i1> %m, i32 zeroext %evl) {
477 ; CHECK-LABEL: vsadd_vx_v2i16:
478 ; CHECK:       # %bb.0:
479 ; CHECK-NEXT:    vsetvli zero, a1, e16, mf4, ta, ma
480 ; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
481 ; CHECK-NEXT:    ret
482   %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0
483   %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer
484   %v = call <2 x i16> @llvm.vp.sadd.sat.v2i16(<2 x i16> %va, <2 x i16> %vb, <2 x i1> %m, i32 %evl)
485   ret <2 x i16> %v
488 define <2 x i16> @vsadd_vx_v2i16_unmasked(<2 x i16> %va, i16 %b, i32 zeroext %evl) {
489 ; CHECK-LABEL: vsadd_vx_v2i16_unmasked:
490 ; CHECK:       # %bb.0:
491 ; CHECK-NEXT:    vsetvli zero, a1, e16, mf4, ta, ma
492 ; CHECK-NEXT:    vsadd.vx v8, v8, a0
493 ; CHECK-NEXT:    ret
494   %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0
495   %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer
496   %v = call <2 x i16> @llvm.vp.sadd.sat.v2i16(<2 x i16> %va, <2 x i16> %vb, <2 x i1> splat (i1 true), i32 %evl)
497   ret <2 x i16> %v
500 define <2 x i16> @vsadd_vi_v2i16(<2 x i16> %va, <2 x i1> %m, i32 zeroext %evl) {
501 ; CHECK-LABEL: vsadd_vi_v2i16:
502 ; CHECK:       # %bb.0:
503 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
504 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
505 ; CHECK-NEXT:    ret
506   %v = call <2 x i16> @llvm.vp.sadd.sat.v2i16(<2 x i16> %va, <2 x i16> splat (i16 -1), <2 x i1> %m, i32 %evl)
507   ret <2 x i16> %v
510 define <2 x i16> @vsadd_vi_v2i16_unmasked(<2 x i16> %va, i32 zeroext %evl) {
511 ; CHECK-LABEL: vsadd_vi_v2i16_unmasked:
512 ; CHECK:       # %bb.0:
513 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
514 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
515 ; CHECK-NEXT:    ret
516   %v = call <2 x i16> @llvm.vp.sadd.sat.v2i16(<2 x i16> %va, <2 x i16> splat (i16 -1), <2 x i1> splat (i1 true), i32 %evl)
517   ret <2 x i16> %v
520 declare <4 x i16> @llvm.vp.sadd.sat.v4i16(<4 x i16>, <4 x i16>, <4 x i1>, i32)
522 define <4 x i16> @vsadd_vv_v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> %m, i32 zeroext %evl) {
523 ; CHECK-LABEL: vsadd_vv_v4i16:
524 ; CHECK:       # %bb.0:
525 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
526 ; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
527 ; CHECK-NEXT:    ret
528   %v = call <4 x i16> @llvm.vp.sadd.sat.v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> %m, i32 %evl)
529   ret <4 x i16> %v
532 define <4 x i16> @vsadd_vv_v4i16_unmasked(<4 x i16> %va, <4 x i16> %b, i32 zeroext %evl) {
533 ; CHECK-LABEL: vsadd_vv_v4i16_unmasked:
534 ; CHECK:       # %bb.0:
535 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
536 ; CHECK-NEXT:    vsadd.vv v8, v8, v9
537 ; CHECK-NEXT:    ret
538   %v = call <4 x i16> @llvm.vp.sadd.sat.v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> splat (i1 true), i32 %evl)
539   ret <4 x i16> %v
542 define <4 x i16> @vsadd_vx_v4i16(<4 x i16> %va, i16 %b, <4 x i1> %m, i32 zeroext %evl) {
543 ; CHECK-LABEL: vsadd_vx_v4i16:
544 ; CHECK:       # %bb.0:
545 ; CHECK-NEXT:    vsetvli zero, a1, e16, mf2, ta, ma
546 ; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
547 ; CHECK-NEXT:    ret
548   %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0
549   %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer
550   %v = call <4 x i16> @llvm.vp.sadd.sat.v4i16(<4 x i16> %va, <4 x i16> %vb, <4 x i1> %m, i32 %evl)
551   ret <4 x i16> %v
554 define <4 x i16> @vsadd_vx_v4i16_unmasked(<4 x i16> %va, i16 %b, i32 zeroext %evl) {
555 ; CHECK-LABEL: vsadd_vx_v4i16_unmasked:
556 ; CHECK:       # %bb.0:
557 ; CHECK-NEXT:    vsetvli zero, a1, e16, mf2, ta, ma
558 ; CHECK-NEXT:    vsadd.vx v8, v8, a0
559 ; CHECK-NEXT:    ret
560   %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0
561   %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer
562   %v = call <4 x i16> @llvm.vp.sadd.sat.v4i16(<4 x i16> %va, <4 x i16> %vb, <4 x i1> splat (i1 true), i32 %evl)
563   ret <4 x i16> %v
566 define <4 x i16> @vsadd_vi_v4i16(<4 x i16> %va, <4 x i1> %m, i32 zeroext %evl) {
567 ; CHECK-LABEL: vsadd_vi_v4i16:
568 ; CHECK:       # %bb.0:
569 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
570 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
571 ; CHECK-NEXT:    ret
572   %v = call <4 x i16> @llvm.vp.sadd.sat.v4i16(<4 x i16> %va, <4 x i16> splat (i16 -1), <4 x i1> %m, i32 %evl)
573   ret <4 x i16> %v
576 define <4 x i16> @vsadd_vi_v4i16_unmasked(<4 x i16> %va, i32 zeroext %evl) {
577 ; CHECK-LABEL: vsadd_vi_v4i16_unmasked:
578 ; CHECK:       # %bb.0:
579 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
580 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
581 ; CHECK-NEXT:    ret
582   %v = call <4 x i16> @llvm.vp.sadd.sat.v4i16(<4 x i16> %va, <4 x i16> splat (i16 -1), <4 x i1> splat (i1 true), i32 %evl)
583   ret <4 x i16> %v
586 declare <8 x i16> @llvm.vp.sadd.sat.v8i16(<8 x i16>, <8 x i16>, <8 x i1>, i32)
588 define <8 x i16> @vsadd_vv_v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> %m, i32 zeroext %evl) {
589 ; CHECK-LABEL: vsadd_vv_v8i16:
590 ; CHECK:       # %bb.0:
591 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
592 ; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
593 ; CHECK-NEXT:    ret
594   %v = call <8 x i16> @llvm.vp.sadd.sat.v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> %m, i32 %evl)
595   ret <8 x i16> %v
598 define <8 x i16> @vsadd_vv_v8i16_unmasked(<8 x i16> %va, <8 x i16> %b, i32 zeroext %evl) {
599 ; CHECK-LABEL: vsadd_vv_v8i16_unmasked:
600 ; CHECK:       # %bb.0:
601 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
602 ; CHECK-NEXT:    vsadd.vv v8, v8, v9
603 ; CHECK-NEXT:    ret
604   %v = call <8 x i16> @llvm.vp.sadd.sat.v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> splat (i1 true), i32 %evl)
605   ret <8 x i16> %v
608 define <8 x i16> @vsadd_vx_v8i16(<8 x i16> %va, i16 %b, <8 x i1> %m, i32 zeroext %evl) {
609 ; CHECK-LABEL: vsadd_vx_v8i16:
610 ; CHECK:       # %bb.0:
611 ; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
612 ; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
613 ; CHECK-NEXT:    ret
614   %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0
615   %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer
616   %v = call <8 x i16> @llvm.vp.sadd.sat.v8i16(<8 x i16> %va, <8 x i16> %vb, <8 x i1> %m, i32 %evl)
617   ret <8 x i16> %v
620 define <8 x i16> @vsadd_vx_v8i16_unmasked(<8 x i16> %va, i16 %b, i32 zeroext %evl) {
621 ; CHECK-LABEL: vsadd_vx_v8i16_unmasked:
622 ; CHECK:       # %bb.0:
623 ; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
624 ; CHECK-NEXT:    vsadd.vx v8, v8, a0
625 ; CHECK-NEXT:    ret
626   %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0
627   %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer
628   %v = call <8 x i16> @llvm.vp.sadd.sat.v8i16(<8 x i16> %va, <8 x i16> %vb, <8 x i1> splat (i1 true), i32 %evl)
629   ret <8 x i16> %v
632 define <8 x i16> @vsadd_vi_v8i16(<8 x i16> %va, <8 x i1> %m, i32 zeroext %evl) {
633 ; CHECK-LABEL: vsadd_vi_v8i16:
634 ; CHECK:       # %bb.0:
635 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
636 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
637 ; CHECK-NEXT:    ret
638   %v = call <8 x i16> @llvm.vp.sadd.sat.v8i16(<8 x i16> %va, <8 x i16> splat (i16 -1), <8 x i1> %m, i32 %evl)
639   ret <8 x i16> %v
642 define <8 x i16> @vsadd_vi_v8i16_unmasked(<8 x i16> %va, i32 zeroext %evl) {
643 ; CHECK-LABEL: vsadd_vi_v8i16_unmasked:
644 ; CHECK:       # %bb.0:
645 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
646 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
647 ; CHECK-NEXT:    ret
648   %v = call <8 x i16> @llvm.vp.sadd.sat.v8i16(<8 x i16> %va, <8 x i16> splat (i16 -1), <8 x i1> splat (i1 true), i32 %evl)
649   ret <8 x i16> %v
652 declare <16 x i16> @llvm.vp.sadd.sat.v16i16(<16 x i16>, <16 x i16>, <16 x i1>, i32)
654 define <16 x i16> @vsadd_vv_v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> %m, i32 zeroext %evl) {
655 ; CHECK-LABEL: vsadd_vv_v16i16:
656 ; CHECK:       # %bb.0:
657 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
658 ; CHECK-NEXT:    vsadd.vv v8, v8, v10, v0.t
659 ; CHECK-NEXT:    ret
660   %v = call <16 x i16> @llvm.vp.sadd.sat.v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> %m, i32 %evl)
661   ret <16 x i16> %v
664 define <16 x i16> @vsadd_vv_v16i16_unmasked(<16 x i16> %va, <16 x i16> %b, i32 zeroext %evl) {
665 ; CHECK-LABEL: vsadd_vv_v16i16_unmasked:
666 ; CHECK:       # %bb.0:
667 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
668 ; CHECK-NEXT:    vsadd.vv v8, v8, v10
669 ; CHECK-NEXT:    ret
670   %v = call <16 x i16> @llvm.vp.sadd.sat.v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> splat (i1 true), i32 %evl)
671   ret <16 x i16> %v
674 define <16 x i16> @vsadd_vx_v16i16(<16 x i16> %va, i16 %b, <16 x i1> %m, i32 zeroext %evl) {
675 ; CHECK-LABEL: vsadd_vx_v16i16:
676 ; CHECK:       # %bb.0:
677 ; CHECK-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
678 ; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
679 ; CHECK-NEXT:    ret
680   %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0
681   %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer
682   %v = call <16 x i16> @llvm.vp.sadd.sat.v16i16(<16 x i16> %va, <16 x i16> %vb, <16 x i1> %m, i32 %evl)
683   ret <16 x i16> %v
686 define <16 x i16> @vsadd_vx_v16i16_unmasked(<16 x i16> %va, i16 %b, i32 zeroext %evl) {
687 ; CHECK-LABEL: vsadd_vx_v16i16_unmasked:
688 ; CHECK:       # %bb.0:
689 ; CHECK-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
690 ; CHECK-NEXT:    vsadd.vx v8, v8, a0
691 ; CHECK-NEXT:    ret
692   %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0
693   %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer
694   %v = call <16 x i16> @llvm.vp.sadd.sat.v16i16(<16 x i16> %va, <16 x i16> %vb, <16 x i1> splat (i1 true), i32 %evl)
695   ret <16 x i16> %v
698 define <16 x i16> @vsadd_vi_v16i16(<16 x i16> %va, <16 x i1> %m, i32 zeroext %evl) {
699 ; CHECK-LABEL: vsadd_vi_v16i16:
700 ; CHECK:       # %bb.0:
701 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
702 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
703 ; CHECK-NEXT:    ret
704   %v = call <16 x i16> @llvm.vp.sadd.sat.v16i16(<16 x i16> %va, <16 x i16> splat (i16 -1), <16 x i1> %m, i32 %evl)
705   ret <16 x i16> %v
708 define <16 x i16> @vsadd_vi_v16i16_unmasked(<16 x i16> %va, i32 zeroext %evl) {
709 ; CHECK-LABEL: vsadd_vi_v16i16_unmasked:
710 ; CHECK:       # %bb.0:
711 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
712 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
713 ; CHECK-NEXT:    ret
714   %v = call <16 x i16> @llvm.vp.sadd.sat.v16i16(<16 x i16> %va, <16 x i16> splat (i16 -1), <16 x i1> splat (i1 true), i32 %evl)
715   ret <16 x i16> %v
718 declare <2 x i32> @llvm.vp.sadd.sat.v2i32(<2 x i32>, <2 x i32>, <2 x i1>, i32)
720 define <2 x i32> @vsadd_vv_v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> %m, i32 zeroext %evl) {
721 ; CHECK-LABEL: vsadd_vv_v2i32:
722 ; CHECK:       # %bb.0:
723 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
724 ; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
725 ; CHECK-NEXT:    ret
726   %v = call <2 x i32> @llvm.vp.sadd.sat.v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> %m, i32 %evl)
727   ret <2 x i32> %v
730 define <2 x i32> @vsadd_vv_v2i32_unmasked(<2 x i32> %va, <2 x i32> %b, i32 zeroext %evl) {
731 ; CHECK-LABEL: vsadd_vv_v2i32_unmasked:
732 ; CHECK:       # %bb.0:
733 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
734 ; CHECK-NEXT:    vsadd.vv v8, v8, v9
735 ; CHECK-NEXT:    ret
736   %v = call <2 x i32> @llvm.vp.sadd.sat.v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> splat (i1 true), i32 %evl)
737   ret <2 x i32> %v
740 define <2 x i32> @vsadd_vx_v2i32(<2 x i32> %va, i32 %b, <2 x i1> %m, i32 zeroext %evl) {
741 ; CHECK-LABEL: vsadd_vx_v2i32:
742 ; CHECK:       # %bb.0:
743 ; CHECK-NEXT:    vsetvli zero, a1, e32, mf2, ta, ma
744 ; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
745 ; CHECK-NEXT:    ret
746   %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0
747   %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer
748   %v = call <2 x i32> @llvm.vp.sadd.sat.v2i32(<2 x i32> %va, <2 x i32> %vb, <2 x i1> %m, i32 %evl)
749   ret <2 x i32> %v
752 define <2 x i32> @vsadd_vx_v2i32_unmasked(<2 x i32> %va, i32 %b, i32 zeroext %evl) {
753 ; CHECK-LABEL: vsadd_vx_v2i32_unmasked:
754 ; CHECK:       # %bb.0:
755 ; CHECK-NEXT:    vsetvli zero, a1, e32, mf2, ta, ma
756 ; CHECK-NEXT:    vsadd.vx v8, v8, a0
757 ; CHECK-NEXT:    ret
758   %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0
759   %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer
760   %v = call <2 x i32> @llvm.vp.sadd.sat.v2i32(<2 x i32> %va, <2 x i32> %vb, <2 x i1> splat (i1 true), i32 %evl)
761   ret <2 x i32> %v
764 define <2 x i32> @vsadd_vi_v2i32(<2 x i32> %va, <2 x i1> %m, i32 zeroext %evl) {
765 ; CHECK-LABEL: vsadd_vi_v2i32:
766 ; CHECK:       # %bb.0:
767 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
768 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
769 ; CHECK-NEXT:    ret
770   %v = call <2 x i32> @llvm.vp.sadd.sat.v2i32(<2 x i32> %va, <2 x i32> splat (i32 -1), <2 x i1> %m, i32 %evl)
771   ret <2 x i32> %v
774 define <2 x i32> @vsadd_vi_v2i32_unmasked(<2 x i32> %va, i32 zeroext %evl) {
775 ; CHECK-LABEL: vsadd_vi_v2i32_unmasked:
776 ; CHECK:       # %bb.0:
777 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
778 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
779 ; CHECK-NEXT:    ret
780   %v = call <2 x i32> @llvm.vp.sadd.sat.v2i32(<2 x i32> %va, <2 x i32> splat (i32 -1), <2 x i1> splat (i1 true), i32 %evl)
781   ret <2 x i32> %v
784 declare <4 x i32> @llvm.vp.sadd.sat.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)
786 define <4 x i32> @vsadd_vv_v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> %m, i32 zeroext %evl) {
787 ; CHECK-LABEL: vsadd_vv_v4i32:
788 ; CHECK:       # %bb.0:
789 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
790 ; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
791 ; CHECK-NEXT:    ret
792   %v = call <4 x i32> @llvm.vp.sadd.sat.v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> %m, i32 %evl)
793   ret <4 x i32> %v
796 define <4 x i32> @vsadd_vv_v4i32_unmasked(<4 x i32> %va, <4 x i32> %b, i32 zeroext %evl) {
797 ; CHECK-LABEL: vsadd_vv_v4i32_unmasked:
798 ; CHECK:       # %bb.0:
799 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
800 ; CHECK-NEXT:    vsadd.vv v8, v8, v9
801 ; CHECK-NEXT:    ret
802   %v = call <4 x i32> @llvm.vp.sadd.sat.v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> splat (i1 true), i32 %evl)
803   ret <4 x i32> %v
806 define <4 x i32> @vsadd_vx_v4i32(<4 x i32> %va, i32 %b, <4 x i1> %m, i32 zeroext %evl) {
807 ; CHECK-LABEL: vsadd_vx_v4i32:
808 ; CHECK:       # %bb.0:
809 ; CHECK-NEXT:    vsetvli zero, a1, e32, m1, ta, ma
810 ; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
811 ; CHECK-NEXT:    ret
812   %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0
813   %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer
814   %v = call <4 x i32> @llvm.vp.sadd.sat.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 %evl)
815   ret <4 x i32> %v
818 define <4 x i32> @vsadd_vx_v4i32_unmasked(<4 x i32> %va, i32 %b, i32 zeroext %evl) {
819 ; CHECK-LABEL: vsadd_vx_v4i32_unmasked:
820 ; CHECK:       # %bb.0:
821 ; CHECK-NEXT:    vsetvli zero, a1, e32, m1, ta, ma
822 ; CHECK-NEXT:    vsadd.vx v8, v8, a0
823 ; CHECK-NEXT:    ret
824   %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0
825   %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer
826   %v = call <4 x i32> @llvm.vp.sadd.sat.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> splat (i1 true), i32 %evl)
827   ret <4 x i32> %v
830 define <4 x i32> @vsadd_vi_v4i32(<4 x i32> %va, <4 x i1> %m, i32 zeroext %evl) {
831 ; CHECK-LABEL: vsadd_vi_v4i32:
832 ; CHECK:       # %bb.0:
833 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
834 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
835 ; CHECK-NEXT:    ret
836   %v = call <4 x i32> @llvm.vp.sadd.sat.v4i32(<4 x i32> %va, <4 x i32> splat (i32 -1), <4 x i1> %m, i32 %evl)
837   ret <4 x i32> %v
840 define <4 x i32> @vsadd_vi_v4i32_unmasked(<4 x i32> %va, i32 zeroext %evl) {
841 ; CHECK-LABEL: vsadd_vi_v4i32_unmasked:
842 ; CHECK:       # %bb.0:
843 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
844 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
845 ; CHECK-NEXT:    ret
846   %v = call <4 x i32> @llvm.vp.sadd.sat.v4i32(<4 x i32> %va, <4 x i32> splat (i32 -1), <4 x i1> splat (i1 true), i32 %evl)
847   ret <4 x i32> %v
850 declare <8 x i32> @llvm.vp.sadd.sat.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
852 define <8 x i32> @vsadd_vv_v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> %m, i32 zeroext %evl) {
853 ; CHECK-LABEL: vsadd_vv_v8i32:
854 ; CHECK:       # %bb.0:
855 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
856 ; CHECK-NEXT:    vsadd.vv v8, v8, v10, v0.t
857 ; CHECK-NEXT:    ret
858   %v = call <8 x i32> @llvm.vp.sadd.sat.v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> %m, i32 %evl)
859   ret <8 x i32> %v
862 define <8 x i32> @vsadd_vv_v8i32_unmasked(<8 x i32> %va, <8 x i32> %b, i32 zeroext %evl) {
863 ; CHECK-LABEL: vsadd_vv_v8i32_unmasked:
864 ; CHECK:       # %bb.0:
865 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
866 ; CHECK-NEXT:    vsadd.vv v8, v8, v10
867 ; CHECK-NEXT:    ret
868   %v = call <8 x i32> @llvm.vp.sadd.sat.v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> splat (i1 true), i32 %evl)
869   ret <8 x i32> %v
872 define <8 x i32> @vsadd_vx_v8i32(<8 x i32> %va, i32 %b, <8 x i1> %m, i32 zeroext %evl) {
873 ; CHECK-LABEL: vsadd_vx_v8i32:
874 ; CHECK:       # %bb.0:
875 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
876 ; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
877 ; CHECK-NEXT:    ret
878   %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0
879   %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer
880   %v = call <8 x i32> @llvm.vp.sadd.sat.v8i32(<8 x i32> %va, <8 x i32> %vb, <8 x i1> %m, i32 %evl)
881   ret <8 x i32> %v
884 define <8 x i32> @vsadd_vx_v8i32_unmasked(<8 x i32> %va, i32 %b, i32 zeroext %evl) {
885 ; CHECK-LABEL: vsadd_vx_v8i32_unmasked:
886 ; CHECK:       # %bb.0:
887 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
888 ; CHECK-NEXT:    vsadd.vx v8, v8, a0
889 ; CHECK-NEXT:    ret
890   %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0
891   %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer
892   %v = call <8 x i32> @llvm.vp.sadd.sat.v8i32(<8 x i32> %va, <8 x i32> %vb, <8 x i1> splat (i1 true), i32 %evl)
893   ret <8 x i32> %v
896 define <8 x i32> @vsadd_vi_v8i32(<8 x i32> %va, <8 x i1> %m, i32 zeroext %evl) {
897 ; CHECK-LABEL: vsadd_vi_v8i32:
898 ; CHECK:       # %bb.0:
899 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
900 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
901 ; CHECK-NEXT:    ret
902   %v = call <8 x i32> @llvm.vp.sadd.sat.v8i32(<8 x i32> %va, <8 x i32> splat (i32 -1), <8 x i1> %m, i32 %evl)
903   ret <8 x i32> %v
906 define <8 x i32> @vsadd_vi_v8i32_unmasked(<8 x i32> %va, i32 zeroext %evl) {
907 ; CHECK-LABEL: vsadd_vi_v8i32_unmasked:
908 ; CHECK:       # %bb.0:
909 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
910 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
911 ; CHECK-NEXT:    ret
912   %v = call <8 x i32> @llvm.vp.sadd.sat.v8i32(<8 x i32> %va, <8 x i32> splat (i32 -1), <8 x i1> splat (i1 true), i32 %evl)
913   ret <8 x i32> %v
916 declare <16 x i32> @llvm.vp.sadd.sat.v16i32(<16 x i32>, <16 x i32>, <16 x i1>, i32)
918 define <16 x i32> @vsadd_vv_v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> %m, i32 zeroext %evl) {
919 ; CHECK-LABEL: vsadd_vv_v16i32:
920 ; CHECK:       # %bb.0:
921 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
922 ; CHECK-NEXT:    vsadd.vv v8, v8, v12, v0.t
923 ; CHECK-NEXT:    ret
924   %v = call <16 x i32> @llvm.vp.sadd.sat.v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> %m, i32 %evl)
925   ret <16 x i32> %v
928 define <16 x i32> @vsadd_vv_v16i32_unmasked(<16 x i32> %va, <16 x i32> %b, i32 zeroext %evl) {
929 ; CHECK-LABEL: vsadd_vv_v16i32_unmasked:
930 ; CHECK:       # %bb.0:
931 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
932 ; CHECK-NEXT:    vsadd.vv v8, v8, v12
933 ; CHECK-NEXT:    ret
934   %v = call <16 x i32> @llvm.vp.sadd.sat.v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> splat (i1 true), i32 %evl)
935   ret <16 x i32> %v
938 define <16 x i32> @vsadd_vx_v16i32(<16 x i32> %va, i32 %b, <16 x i1> %m, i32 zeroext %evl) {
939 ; CHECK-LABEL: vsadd_vx_v16i32:
940 ; CHECK:       # %bb.0:
941 ; CHECK-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
942 ; CHECK-NEXT:    vsadd.vx v8, v8, a0, v0.t
943 ; CHECK-NEXT:    ret
944   %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0
945   %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer
946   %v = call <16 x i32> @llvm.vp.sadd.sat.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i1> %m, i32 %evl)
947   ret <16 x i32> %v
950 define <16 x i32> @vsadd_vx_v16i32_unmasked(<16 x i32> %va, i32 %b, i32 zeroext %evl) {
951 ; CHECK-LABEL: vsadd_vx_v16i32_unmasked:
952 ; CHECK:       # %bb.0:
953 ; CHECK-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
954 ; CHECK-NEXT:    vsadd.vx v8, v8, a0
955 ; CHECK-NEXT:    ret
956   %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0
957   %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer
958   %v = call <16 x i32> @llvm.vp.sadd.sat.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i1> splat (i1 true), i32 %evl)
959   ret <16 x i32> %v
962 define <16 x i32> @vsadd_vi_v16i32(<16 x i32> %va, <16 x i1> %m, i32 zeroext %evl) {
963 ; CHECK-LABEL: vsadd_vi_v16i32:
964 ; CHECK:       # %bb.0:
965 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
966 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
967 ; CHECK-NEXT:    ret
968   %v = call <16 x i32> @llvm.vp.sadd.sat.v16i32(<16 x i32> %va, <16 x i32> splat (i32 -1), <16 x i1> %m, i32 %evl)
969   ret <16 x i32> %v
972 define <16 x i32> @vsadd_vi_v16i32_unmasked(<16 x i32> %va, i32 zeroext %evl) {
973 ; CHECK-LABEL: vsadd_vi_v16i32_unmasked:
974 ; CHECK:       # %bb.0:
975 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
976 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
977 ; CHECK-NEXT:    ret
978   %v = call <16 x i32> @llvm.vp.sadd.sat.v16i32(<16 x i32> %va, <16 x i32> splat (i32 -1), <16 x i1> splat (i1 true), i32 %evl)
979   ret <16 x i32> %v
982 declare <2 x i64> @llvm.vp.sadd.sat.v2i64(<2 x i64>, <2 x i64>, <2 x i1>, i32)
984 define <2 x i64> @vsadd_vv_v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> %m, i32 zeroext %evl) {
985 ; CHECK-LABEL: vsadd_vv_v2i64:
986 ; CHECK:       # %bb.0:
987 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
988 ; CHECK-NEXT:    vsadd.vv v8, v8, v9, v0.t
989 ; CHECK-NEXT:    ret
990   %v = call <2 x i64> @llvm.vp.sadd.sat.v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> %m, i32 %evl)
991   ret <2 x i64> %v
994 define <2 x i64> @vsadd_vv_v2i64_unmasked(<2 x i64> %va, <2 x i64> %b, i32 zeroext %evl) {
995 ; CHECK-LABEL: vsadd_vv_v2i64_unmasked:
996 ; CHECK:       # %bb.0:
997 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
998 ; CHECK-NEXT:    vsadd.vv v8, v8, v9
999 ; CHECK-NEXT:    ret
1000   %v = call <2 x i64> @llvm.vp.sadd.sat.v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> splat (i1 true), i32 %evl)
1001   ret <2 x i64> %v
1004 define <2 x i64> @vsadd_vx_v2i64(<2 x i64> %va, i64 %b, <2 x i1> %m, i32 zeroext %evl) {
1005 ; RV32-LABEL: vsadd_vx_v2i64:
1006 ; RV32:       # %bb.0:
1007 ; RV32-NEXT:    addi sp, sp, -16
1008 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1009 ; RV32-NEXT:    sw a0, 8(sp)
1010 ; RV32-NEXT:    sw a1, 12(sp)
1011 ; RV32-NEXT:    addi a0, sp, 8
1012 ; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1013 ; RV32-NEXT:    vlse64.v v9, (a0), zero
1014 ; RV32-NEXT:    vsetvli zero, a2, e64, m1, ta, ma
1015 ; RV32-NEXT:    vsadd.vv v8, v8, v9, v0.t
1016 ; RV32-NEXT:    addi sp, sp, 16
1017 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1018 ; RV32-NEXT:    ret
1020 ; RV64-LABEL: vsadd_vx_v2i64:
1021 ; RV64:       # %bb.0:
1022 ; RV64-NEXT:    vsetvli zero, a1, e64, m1, ta, ma
1023 ; RV64-NEXT:    vsadd.vx v8, v8, a0, v0.t
1024 ; RV64-NEXT:    ret
1025   %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0
1026   %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer
1027   %v = call <2 x i64> @llvm.vp.sadd.sat.v2i64(<2 x i64> %va, <2 x i64> %vb, <2 x i1> %m, i32 %evl)
1028   ret <2 x i64> %v
1031 define <2 x i64> @vsadd_vx_v2i64_unmasked(<2 x i64> %va, i64 %b, i32 zeroext %evl) {
1032 ; RV32-LABEL: vsadd_vx_v2i64_unmasked:
1033 ; RV32:       # %bb.0:
1034 ; RV32-NEXT:    addi sp, sp, -16
1035 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1036 ; RV32-NEXT:    sw a0, 8(sp)
1037 ; RV32-NEXT:    sw a1, 12(sp)
1038 ; RV32-NEXT:    addi a0, sp, 8
1039 ; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1040 ; RV32-NEXT:    vlse64.v v9, (a0), zero
1041 ; RV32-NEXT:    vsetvli zero, a2, e64, m1, ta, ma
1042 ; RV32-NEXT:    vsadd.vv v8, v8, v9
1043 ; RV32-NEXT:    addi sp, sp, 16
1044 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1045 ; RV32-NEXT:    ret
1047 ; RV64-LABEL: vsadd_vx_v2i64_unmasked:
1048 ; RV64:       # %bb.0:
1049 ; RV64-NEXT:    vsetvli zero, a1, e64, m1, ta, ma
1050 ; RV64-NEXT:    vsadd.vx v8, v8, a0
1051 ; RV64-NEXT:    ret
1052   %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0
1053   %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer
1054   %v = call <2 x i64> @llvm.vp.sadd.sat.v2i64(<2 x i64> %va, <2 x i64> %vb, <2 x i1> splat (i1 true), i32 %evl)
1055   ret <2 x i64> %v
1058 define <2 x i64> @vsadd_vi_v2i64(<2 x i64> %va, <2 x i1> %m, i32 zeroext %evl) {
1059 ; CHECK-LABEL: vsadd_vi_v2i64:
1060 ; CHECK:       # %bb.0:
1061 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1062 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1063 ; CHECK-NEXT:    ret
1064   %v = call <2 x i64> @llvm.vp.sadd.sat.v2i64(<2 x i64> %va, <2 x i64> splat (i64 -1), <2 x i1> %m, i32 %evl)
1065   ret <2 x i64> %v
1068 define <2 x i64> @vsadd_vi_v2i64_unmasked(<2 x i64> %va, i32 zeroext %evl) {
1069 ; CHECK-LABEL: vsadd_vi_v2i64_unmasked:
1070 ; CHECK:       # %bb.0:
1071 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1072 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
1073 ; CHECK-NEXT:    ret
1074   %v = call <2 x i64> @llvm.vp.sadd.sat.v2i64(<2 x i64> %va, <2 x i64> splat (i64 -1), <2 x i1> splat (i1 true), i32 %evl)
1075   ret <2 x i64> %v
1078 declare <4 x i64> @llvm.vp.sadd.sat.v4i64(<4 x i64>, <4 x i64>, <4 x i1>, i32)
1080 define <4 x i64> @vsadd_vv_v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> %m, i32 zeroext %evl) {
1081 ; CHECK-LABEL: vsadd_vv_v4i64:
1082 ; CHECK:       # %bb.0:
1083 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1084 ; CHECK-NEXT:    vsadd.vv v8, v8, v10, v0.t
1085 ; CHECK-NEXT:    ret
1086   %v = call <4 x i64> @llvm.vp.sadd.sat.v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> %m, i32 %evl)
1087   ret <4 x i64> %v
1090 define <4 x i64> @vsadd_vv_v4i64_unmasked(<4 x i64> %va, <4 x i64> %b, i32 zeroext %evl) {
1091 ; CHECK-LABEL: vsadd_vv_v4i64_unmasked:
1092 ; CHECK:       # %bb.0:
1093 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1094 ; CHECK-NEXT:    vsadd.vv v8, v8, v10
1095 ; CHECK-NEXT:    ret
1096   %v = call <4 x i64> @llvm.vp.sadd.sat.v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> splat (i1 true), i32 %evl)
1097   ret <4 x i64> %v
1100 define <4 x i64> @vsadd_vx_v4i64(<4 x i64> %va, i64 %b, <4 x i1> %m, i32 zeroext %evl) {
1101 ; RV32-LABEL: vsadd_vx_v4i64:
1102 ; RV32:       # %bb.0:
1103 ; RV32-NEXT:    addi sp, sp, -16
1104 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1105 ; RV32-NEXT:    sw a0, 8(sp)
1106 ; RV32-NEXT:    sw a1, 12(sp)
1107 ; RV32-NEXT:    addi a0, sp, 8
1108 ; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1109 ; RV32-NEXT:    vlse64.v v10, (a0), zero
1110 ; RV32-NEXT:    vsetvli zero, a2, e64, m2, ta, ma
1111 ; RV32-NEXT:    vsadd.vv v8, v8, v10, v0.t
1112 ; RV32-NEXT:    addi sp, sp, 16
1113 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1114 ; RV32-NEXT:    ret
1116 ; RV64-LABEL: vsadd_vx_v4i64:
1117 ; RV64:       # %bb.0:
1118 ; RV64-NEXT:    vsetvli zero, a1, e64, m2, ta, ma
1119 ; RV64-NEXT:    vsadd.vx v8, v8, a0, v0.t
1120 ; RV64-NEXT:    ret
1121   %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0
1122   %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer
1123   %v = call <4 x i64> @llvm.vp.sadd.sat.v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> %m, i32 %evl)
1124   ret <4 x i64> %v
1127 define <4 x i64> @vsadd_vx_v4i64_unmasked(<4 x i64> %va, i64 %b, i32 zeroext %evl) {
1128 ; RV32-LABEL: vsadd_vx_v4i64_unmasked:
1129 ; RV32:       # %bb.0:
1130 ; RV32-NEXT:    addi sp, sp, -16
1131 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1132 ; RV32-NEXT:    sw a0, 8(sp)
1133 ; RV32-NEXT:    sw a1, 12(sp)
1134 ; RV32-NEXT:    addi a0, sp, 8
1135 ; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1136 ; RV32-NEXT:    vlse64.v v10, (a0), zero
1137 ; RV32-NEXT:    vsetvli zero, a2, e64, m2, ta, ma
1138 ; RV32-NEXT:    vsadd.vv v8, v8, v10
1139 ; RV32-NEXT:    addi sp, sp, 16
1140 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1141 ; RV32-NEXT:    ret
1143 ; RV64-LABEL: vsadd_vx_v4i64_unmasked:
1144 ; RV64:       # %bb.0:
1145 ; RV64-NEXT:    vsetvli zero, a1, e64, m2, ta, ma
1146 ; RV64-NEXT:    vsadd.vx v8, v8, a0
1147 ; RV64-NEXT:    ret
1148   %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0
1149   %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer
1150   %v = call <4 x i64> @llvm.vp.sadd.sat.v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> splat (i1 true), i32 %evl)
1151   ret <4 x i64> %v
1154 define <4 x i64> @vsadd_vi_v4i64(<4 x i64> %va, <4 x i1> %m, i32 zeroext %evl) {
1155 ; CHECK-LABEL: vsadd_vi_v4i64:
1156 ; CHECK:       # %bb.0:
1157 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1158 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1159 ; CHECK-NEXT:    ret
1160   %v = call <4 x i64> @llvm.vp.sadd.sat.v4i64(<4 x i64> %va, <4 x i64> splat (i64 -1), <4 x i1> %m, i32 %evl)
1161   ret <4 x i64> %v
1164 define <4 x i64> @vsadd_vi_v4i64_unmasked(<4 x i64> %va, i32 zeroext %evl) {
1165 ; CHECK-LABEL: vsadd_vi_v4i64_unmasked:
1166 ; CHECK:       # %bb.0:
1167 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1168 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
1169 ; CHECK-NEXT:    ret
1170   %v = call <4 x i64> @llvm.vp.sadd.sat.v4i64(<4 x i64> %va, <4 x i64> splat (i64 -1), <4 x i1> splat (i1 true), i32 %evl)
1171   ret <4 x i64> %v
1174 declare <8 x i64> @llvm.vp.sadd.sat.v8i64(<8 x i64>, <8 x i64>, <8 x i1>, i32)
1176 define <8 x i64> @vsadd_vv_v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> %m, i32 zeroext %evl) {
1177 ; CHECK-LABEL: vsadd_vv_v8i64:
1178 ; CHECK:       # %bb.0:
1179 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1180 ; CHECK-NEXT:    vsadd.vv v8, v8, v12, v0.t
1181 ; CHECK-NEXT:    ret
1182   %v = call <8 x i64> @llvm.vp.sadd.sat.v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> %m, i32 %evl)
1183   ret <8 x i64> %v
1186 define <8 x i64> @vsadd_vv_v8i64_unmasked(<8 x i64> %va, <8 x i64> %b, i32 zeroext %evl) {
1187 ; CHECK-LABEL: vsadd_vv_v8i64_unmasked:
1188 ; CHECK:       # %bb.0:
1189 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1190 ; CHECK-NEXT:    vsadd.vv v8, v8, v12
1191 ; CHECK-NEXT:    ret
1192   %v = call <8 x i64> @llvm.vp.sadd.sat.v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> splat (i1 true), i32 %evl)
1193   ret <8 x i64> %v
1196 define <8 x i64> @vsadd_vx_v8i64(<8 x i64> %va, i64 %b, <8 x i1> %m, i32 zeroext %evl) {
1197 ; RV32-LABEL: vsadd_vx_v8i64:
1198 ; RV32:       # %bb.0:
1199 ; RV32-NEXT:    addi sp, sp, -16
1200 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1201 ; RV32-NEXT:    sw a0, 8(sp)
1202 ; RV32-NEXT:    sw a1, 12(sp)
1203 ; RV32-NEXT:    addi a0, sp, 8
1204 ; RV32-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1205 ; RV32-NEXT:    vlse64.v v12, (a0), zero
1206 ; RV32-NEXT:    vsetvli zero, a2, e64, m4, ta, ma
1207 ; RV32-NEXT:    vsadd.vv v8, v8, v12, v0.t
1208 ; RV32-NEXT:    addi sp, sp, 16
1209 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1210 ; RV32-NEXT:    ret
1212 ; RV64-LABEL: vsadd_vx_v8i64:
1213 ; RV64:       # %bb.0:
1214 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1215 ; RV64-NEXT:    vsadd.vx v8, v8, a0, v0.t
1216 ; RV64-NEXT:    ret
1217   %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0
1218   %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer
1219   %v = call <8 x i64> @llvm.vp.sadd.sat.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl)
1220   ret <8 x i64> %v
1223 define <8 x i64> @vsadd_vx_v8i64_unmasked(<8 x i64> %va, i64 %b, i32 zeroext %evl) {
1224 ; RV32-LABEL: vsadd_vx_v8i64_unmasked:
1225 ; RV32:       # %bb.0:
1226 ; RV32-NEXT:    addi sp, sp, -16
1227 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1228 ; RV32-NEXT:    sw a0, 8(sp)
1229 ; RV32-NEXT:    sw a1, 12(sp)
1230 ; RV32-NEXT:    addi a0, sp, 8
1231 ; RV32-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1232 ; RV32-NEXT:    vlse64.v v12, (a0), zero
1233 ; RV32-NEXT:    vsetvli zero, a2, e64, m4, ta, ma
1234 ; RV32-NEXT:    vsadd.vv v8, v8, v12
1235 ; RV32-NEXT:    addi sp, sp, 16
1236 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1237 ; RV32-NEXT:    ret
1239 ; RV64-LABEL: vsadd_vx_v8i64_unmasked:
1240 ; RV64:       # %bb.0:
1241 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1242 ; RV64-NEXT:    vsadd.vx v8, v8, a0
1243 ; RV64-NEXT:    ret
1244   %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0
1245   %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer
1246   %v = call <8 x i64> @llvm.vp.sadd.sat.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> splat (i1 true), i32 %evl)
1247   ret <8 x i64> %v
1250 define <8 x i64> @vsadd_vi_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) {
1251 ; CHECK-LABEL: vsadd_vi_v8i64:
1252 ; CHECK:       # %bb.0:
1253 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1254 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1255 ; CHECK-NEXT:    ret
1256   %v = call <8 x i64> @llvm.vp.sadd.sat.v8i64(<8 x i64> %va, <8 x i64> splat (i64 -1), <8 x i1> %m, i32 %evl)
1257   ret <8 x i64> %v
1260 define <8 x i64> @vsadd_vi_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) {
1261 ; CHECK-LABEL: vsadd_vi_v8i64_unmasked:
1262 ; CHECK:       # %bb.0:
1263 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1264 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
1265 ; CHECK-NEXT:    ret
1266   %v = call <8 x i64> @llvm.vp.sadd.sat.v8i64(<8 x i64> %va, <8 x i64> splat (i64 -1), <8 x i1> splat (i1 true), i32 %evl)
1267   ret <8 x i64> %v
1270 declare <16 x i64> @llvm.vp.sadd.sat.v16i64(<16 x i64>, <16 x i64>, <16 x i1>, i32)
1272 define <16 x i64> @vsadd_vv_v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> %m, i32 zeroext %evl) {
1273 ; CHECK-LABEL: vsadd_vv_v16i64:
1274 ; CHECK:       # %bb.0:
1275 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1276 ; CHECK-NEXT:    vsadd.vv v8, v8, v16, v0.t
1277 ; CHECK-NEXT:    ret
1278   %v = call <16 x i64> @llvm.vp.sadd.sat.v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> %m, i32 %evl)
1279   ret <16 x i64> %v
1282 define <16 x i64> @vsadd_vv_v16i64_unmasked(<16 x i64> %va, <16 x i64> %b, i32 zeroext %evl) {
1283 ; CHECK-LABEL: vsadd_vv_v16i64_unmasked:
1284 ; CHECK:       # %bb.0:
1285 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1286 ; CHECK-NEXT:    vsadd.vv v8, v8, v16
1287 ; CHECK-NEXT:    ret
1288   %v = call <16 x i64> @llvm.vp.sadd.sat.v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> splat (i1 true), i32 %evl)
1289   ret <16 x i64> %v
1292 define <16 x i64> @vsadd_vx_v16i64(<16 x i64> %va, i64 %b, <16 x i1> %m, i32 zeroext %evl) {
1293 ; RV32-LABEL: vsadd_vx_v16i64:
1294 ; RV32:       # %bb.0:
1295 ; RV32-NEXT:    addi sp, sp, -16
1296 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1297 ; RV32-NEXT:    sw a0, 8(sp)
1298 ; RV32-NEXT:    sw a1, 12(sp)
1299 ; RV32-NEXT:    addi a0, sp, 8
1300 ; RV32-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1301 ; RV32-NEXT:    vlse64.v v16, (a0), zero
1302 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
1303 ; RV32-NEXT:    vsadd.vv v8, v8, v16, v0.t
1304 ; RV32-NEXT:    addi sp, sp, 16
1305 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1306 ; RV32-NEXT:    ret
1308 ; RV64-LABEL: vsadd_vx_v16i64:
1309 ; RV64:       # %bb.0:
1310 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1311 ; RV64-NEXT:    vsadd.vx v8, v8, a0, v0.t
1312 ; RV64-NEXT:    ret
1313   %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0
1314   %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer
1315   %v = call <16 x i64> @llvm.vp.sadd.sat.v16i64(<16 x i64> %va, <16 x i64> %vb, <16 x i1> %m, i32 %evl)
1316   ret <16 x i64> %v
1319 define <16 x i64> @vsadd_vx_v16i64_unmasked(<16 x i64> %va, i64 %b, i32 zeroext %evl) {
1320 ; RV32-LABEL: vsadd_vx_v16i64_unmasked:
1321 ; RV32:       # %bb.0:
1322 ; RV32-NEXT:    addi sp, sp, -16
1323 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1324 ; RV32-NEXT:    sw a0, 8(sp)
1325 ; RV32-NEXT:    sw a1, 12(sp)
1326 ; RV32-NEXT:    addi a0, sp, 8
1327 ; RV32-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1328 ; RV32-NEXT:    vlse64.v v16, (a0), zero
1329 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
1330 ; RV32-NEXT:    vsadd.vv v8, v8, v16
1331 ; RV32-NEXT:    addi sp, sp, 16
1332 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1333 ; RV32-NEXT:    ret
1335 ; RV64-LABEL: vsadd_vx_v16i64_unmasked:
1336 ; RV64:       # %bb.0:
1337 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1338 ; RV64-NEXT:    vsadd.vx v8, v8, a0
1339 ; RV64-NEXT:    ret
1340   %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0
1341   %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer
1342   %v = call <16 x i64> @llvm.vp.sadd.sat.v16i64(<16 x i64> %va, <16 x i64> %vb, <16 x i1> splat (i1 true), i32 %evl)
1343   ret <16 x i64> %v
1346 define <16 x i64> @vsadd_vi_v16i64(<16 x i64> %va, <16 x i1> %m, i32 zeroext %evl) {
1347 ; CHECK-LABEL: vsadd_vi_v16i64:
1348 ; CHECK:       # %bb.0:
1349 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1350 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1351 ; CHECK-NEXT:    ret
1352   %v = call <16 x i64> @llvm.vp.sadd.sat.v16i64(<16 x i64> %va, <16 x i64> splat (i64 -1), <16 x i1> %m, i32 %evl)
1353   ret <16 x i64> %v
1356 define <16 x i64> @vsadd_vi_v16i64_unmasked(<16 x i64> %va, i32 zeroext %evl) {
1357 ; CHECK-LABEL: vsadd_vi_v16i64_unmasked:
1358 ; CHECK:       # %bb.0:
1359 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1360 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
1361 ; CHECK-NEXT:    ret
1362   %v = call <16 x i64> @llvm.vp.sadd.sat.v16i64(<16 x i64> %va, <16 x i64> splat (i64 -1), <16 x i1> splat (i1 true), i32 %evl)
1363   ret <16 x i64> %v
1366 ; Test that split-legalization works as expected.
1368 declare <32 x i64> @llvm.vp.sadd.sat.v32i64(<32 x i64>, <32 x i64>, <32 x i1>, i32)
1370 define <32 x i64> @vsadd_vx_v32i64(<32 x i64> %va, <32 x i1> %m, i32 zeroext %evl) {
1371 ; CHECK-LABEL: vsadd_vx_v32i64:
1372 ; CHECK:       # %bb.0:
1373 ; CHECK-NEXT:    li a2, 16
1374 ; CHECK-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1375 ; CHECK-NEXT:    vslidedown.vi v24, v0, 2
1376 ; CHECK-NEXT:    mv a1, a0
1377 ; CHECK-NEXT:    bltu a0, a2, .LBB108_2
1378 ; CHECK-NEXT:  # %bb.1:
1379 ; CHECK-NEXT:    li a1, 16
1380 ; CHECK-NEXT:  .LBB108_2:
1381 ; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1382 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1383 ; CHECK-NEXT:    addi a1, a0, -16
1384 ; CHECK-NEXT:    sltu a0, a0, a1
1385 ; CHECK-NEXT:    addi a0, a0, -1
1386 ; CHECK-NEXT:    and a0, a0, a1
1387 ; CHECK-NEXT:    vmv1r.v v0, v24
1388 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1389 ; CHECK-NEXT:    vsadd.vi v16, v16, -1, v0.t
1390 ; CHECK-NEXT:    ret
1391   %v = call <32 x i64> @llvm.vp.sadd.sat.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> %m, i32 %evl)
1392   ret <32 x i64> %v
1395 define <32 x i64> @vsadd_vi_v32i64_unmasked(<32 x i64> %va, i32 zeroext %evl) {
1396 ; CHECK-LABEL: vsadd_vi_v32i64_unmasked:
1397 ; CHECK:       # %bb.0:
1398 ; CHECK-NEXT:    li a2, 16
1399 ; CHECK-NEXT:    mv a1, a0
1400 ; CHECK-NEXT:    bltu a0, a2, .LBB109_2
1401 ; CHECK-NEXT:  # %bb.1:
1402 ; CHECK-NEXT:    li a1, 16
1403 ; CHECK-NEXT:  .LBB109_2:
1404 ; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1405 ; CHECK-NEXT:    vsadd.vi v8, v8, -1
1406 ; CHECK-NEXT:    addi a1, a0, -16
1407 ; CHECK-NEXT:    sltu a0, a0, a1
1408 ; CHECK-NEXT:    addi a0, a0, -1
1409 ; CHECK-NEXT:    and a0, a0, a1
1410 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1411 ; CHECK-NEXT:    vsadd.vi v16, v16, -1
1412 ; CHECK-NEXT:    ret
1413   %v = call <32 x i64> @llvm.vp.sadd.sat.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> splat (i1 true), i32 %evl)
1414   ret <32 x i64> %v
1417 define <32 x i64> @vsadd_vx_v32i64_evl12(<32 x i64> %va, <32 x i1> %m) {
1418 ; CHECK-LABEL: vsadd_vx_v32i64_evl12:
1419 ; CHECK:       # %bb.0:
1420 ; CHECK-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1421 ; CHECK-NEXT:    vslidedown.vi v24, v0, 2
1422 ; CHECK-NEXT:    vsetivli zero, 12, e64, m8, ta, ma
1423 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1424 ; CHECK-NEXT:    vmv1r.v v0, v24
1425 ; CHECK-NEXT:    vsetivli zero, 0, e64, m8, ta, ma
1426 ; CHECK-NEXT:    vsadd.vi v16, v16, -1, v0.t
1427 ; CHECK-NEXT:    ret
1428   %v = call <32 x i64> @llvm.vp.sadd.sat.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> %m, i32 12)
1429   ret <32 x i64> %v
1432 define <32 x i64> @vsadd_vx_v32i64_evl27(<32 x i64> %va, <32 x i1> %m) {
1433 ; CHECK-LABEL: vsadd_vx_v32i64_evl27:
1434 ; CHECK:       # %bb.0:
1435 ; CHECK-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1436 ; CHECK-NEXT:    vslidedown.vi v24, v0, 2
1437 ; CHECK-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1438 ; CHECK-NEXT:    vsadd.vi v8, v8, -1, v0.t
1439 ; CHECK-NEXT:    vmv1r.v v0, v24
1440 ; CHECK-NEXT:    vsetivli zero, 11, e64, m8, ta, ma
1441 ; CHECK-NEXT:    vsadd.vi v16, v16, -1, v0.t
1442 ; CHECK-NEXT:    ret
1443   %v = call <32 x i64> @llvm.vp.sadd.sat.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> %m, i32 27)
1444   ret <32 x i64> %v