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:
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
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)
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:
33 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
34 ; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t
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)
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:
43 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
44 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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)
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:
53 ; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma
54 ; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
65 ; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma
66 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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)
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:
77 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
78 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
84 define <2 x i8> @vsadd_vi_v2i8_unmasked(<2 x i8> %va, i32 zeroext %evl) {
85 ; CHECK-LABEL: vsadd_vi_v2i8_unmasked:
87 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
88 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
99 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
100 ; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t
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)
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:
109 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
110 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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)
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:
119 ; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma
120 ; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
131 ; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma
132 ; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
143 ; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma
144 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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)
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:
155 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
156 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
162 define <4 x i8> @vsadd_vi_v4i8_unmasked(<4 x i8> %va, i32 zeroext %evl) {
163 ; CHECK-LABEL: vsadd_vi_v4i8_unmasked:
165 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
166 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
177 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
178 ; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t
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)
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:
187 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
188 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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)
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:
197 ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
198 ; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
209 ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
210 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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)
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:
221 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
222 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
228 define <5 x i8> @vsadd_vi_v5i8_unmasked(<5 x i8> %va, i32 zeroext %evl) {
229 ; CHECK-LABEL: vsadd_vi_v5i8_unmasked:
231 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
232 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
243 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
244 ; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t
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)
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:
253 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
254 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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)
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:
263 ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
264 ; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
275 ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
276 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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)
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:
287 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
288 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
294 define <8 x i8> @vsadd_vi_v8i8_unmasked(<8 x i8> %va, i32 zeroext %evl) {
295 ; CHECK-LABEL: vsadd_vi_v8i8_unmasked:
297 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
298 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
309 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
310 ; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t
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)
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:
319 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
320 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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)
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:
329 ; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma
330 ; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
341 ; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma
342 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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)
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:
353 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
354 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
360 define <16 x i8> @vsadd_vi_v16i8_unmasked(<16 x i8> %va, i32 zeroext %evl) {
361 ; CHECK-LABEL: vsadd_vi_v16i8_unmasked:
363 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
364 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
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
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)
398 define <256 x i8> @vsadd_vi_v258i8_unmasked(<256 x i8> %va, i32 zeroext %evl) {
399 ; CHECK-LABEL: vsadd_vi_v258i8_unmasked:
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
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)
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:
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
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)
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:
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
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)
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:
459 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
460 ; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t
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)
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:
469 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
470 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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)
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:
479 ; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, ma
480 ; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
491 ; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, ma
492 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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)
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:
503 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
504 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
510 define <2 x i16> @vsadd_vi_v2i16_unmasked(<2 x i16> %va, i32 zeroext %evl) {
511 ; CHECK-LABEL: vsadd_vi_v2i16_unmasked:
513 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
514 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
525 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
526 ; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t
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)
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:
535 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
536 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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)
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:
545 ; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma
546 ; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
557 ; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma
558 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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)
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:
569 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
570 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
576 define <4 x i16> @vsadd_vi_v4i16_unmasked(<4 x i16> %va, i32 zeroext %evl) {
577 ; CHECK-LABEL: vsadd_vi_v4i16_unmasked:
579 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
580 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
591 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma
592 ; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t
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)
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:
601 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma
602 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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)
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:
611 ; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma
612 ; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
623 ; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma
624 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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)
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:
635 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma
636 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
642 define <8 x i16> @vsadd_vi_v8i16_unmasked(<8 x i16> %va, i32 zeroext %evl) {
643 ; CHECK-LABEL: vsadd_vi_v8i16_unmasked:
645 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma
646 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
657 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma
658 ; CHECK-NEXT: vsadd.vv v8, v8, v10, v0.t
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)
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:
667 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma
668 ; CHECK-NEXT: vsadd.vv v8, v8, v10
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)
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:
677 ; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma
678 ; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
689 ; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma
690 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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)
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:
701 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma
702 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
708 define <16 x i16> @vsadd_vi_v16i16_unmasked(<16 x i16> %va, i32 zeroext %evl) {
709 ; CHECK-LABEL: vsadd_vi_v16i16_unmasked:
711 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma
712 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
723 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
724 ; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t
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)
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:
733 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
734 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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)
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:
743 ; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, ma
744 ; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
755 ; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, ma
756 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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)
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:
767 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
768 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
774 define <2 x i32> @vsadd_vi_v2i32_unmasked(<2 x i32> %va, i32 zeroext %evl) {
775 ; CHECK-LABEL: vsadd_vi_v2i32_unmasked:
777 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
778 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
789 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
790 ; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t
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)
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:
799 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
800 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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)
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:
809 ; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma
810 ; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
821 ; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma
822 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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)
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:
833 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
834 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
840 define <4 x i32> @vsadd_vi_v4i32_unmasked(<4 x i32> %va, i32 zeroext %evl) {
841 ; CHECK-LABEL: vsadd_vi_v4i32_unmasked:
843 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
844 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
855 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
856 ; CHECK-NEXT: vsadd.vv v8, v8, v10, v0.t
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)
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:
865 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
866 ; CHECK-NEXT: vsadd.vv v8, v8, v10
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)
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:
875 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
876 ; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
887 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
888 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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)
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:
899 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
900 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
906 define <8 x i32> @vsadd_vi_v8i32_unmasked(<8 x i32> %va, i32 zeroext %evl) {
907 ; CHECK-LABEL: vsadd_vi_v8i32_unmasked:
909 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
910 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
921 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
922 ; CHECK-NEXT: vsadd.vv v8, v8, v12, v0.t
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)
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:
931 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
932 ; CHECK-NEXT: vsadd.vv v8, v8, v12
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)
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:
941 ; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, ma
942 ; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
953 ; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, ma
954 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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)
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:
965 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
966 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
972 define <16 x i32> @vsadd_vi_v16i32_unmasked(<16 x i32> %va, i32 zeroext %evl) {
973 ; CHECK-LABEL: vsadd_vi_v16i32_unmasked:
975 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
976 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
987 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
988 ; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t
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)
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:
997 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
998 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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)
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:
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
1020 ; RV64-LABEL: vsadd_vx_v2i64:
1022 ; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma
1023 ; RV64-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
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
1047 ; RV64-LABEL: vsadd_vx_v2i64_unmasked:
1049 ; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma
1050 ; RV64-NEXT: vsadd.vx v8, v8, a0
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)
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:
1061 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1062 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
1068 define <2 x i64> @vsadd_vi_v2i64_unmasked(<2 x i64> %va, i32 zeroext %evl) {
1069 ; CHECK-LABEL: vsadd_vi_v2i64_unmasked:
1071 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1072 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
1083 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1084 ; CHECK-NEXT: vsadd.vv v8, v8, v10, v0.t
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)
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:
1093 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1094 ; CHECK-NEXT: vsadd.vv v8, v8, v10
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)
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:
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
1116 ; RV64-LABEL: vsadd_vx_v4i64:
1118 ; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, ma
1119 ; RV64-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
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
1143 ; RV64-LABEL: vsadd_vx_v4i64_unmasked:
1145 ; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, ma
1146 ; RV64-NEXT: vsadd.vx v8, v8, a0
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)
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:
1157 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1158 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
1164 define <4 x i64> @vsadd_vi_v4i64_unmasked(<4 x i64> %va, i32 zeroext %evl) {
1165 ; CHECK-LABEL: vsadd_vi_v4i64_unmasked:
1167 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1168 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
1179 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1180 ; CHECK-NEXT: vsadd.vv v8, v8, v12, v0.t
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)
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:
1189 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1190 ; CHECK-NEXT: vsadd.vv v8, v8, v12
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)
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:
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
1212 ; RV64-LABEL: vsadd_vx_v8i64:
1214 ; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, ma
1215 ; RV64-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
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
1239 ; RV64-LABEL: vsadd_vx_v8i64_unmasked:
1241 ; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, ma
1242 ; RV64-NEXT: vsadd.vx v8, v8, a0
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)
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:
1253 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1254 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
1260 define <8 x i64> @vsadd_vi_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) {
1261 ; CHECK-LABEL: vsadd_vi_v8i64_unmasked:
1263 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1264 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
1275 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1276 ; CHECK-NEXT: vsadd.vv v8, v8, v16, v0.t
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)
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:
1285 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1286 ; CHECK-NEXT: vsadd.vv v8, v8, v16
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)
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:
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
1308 ; RV64-LABEL: vsadd_vx_v16i64:
1310 ; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma
1311 ; RV64-NEXT: vsadd.vx v8, v8, a0, v0.t
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)
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:
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
1335 ; RV64-LABEL: vsadd_vx_v16i64_unmasked:
1337 ; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma
1338 ; RV64-NEXT: vsadd.vx v8, v8, a0
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)
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:
1349 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1350 ; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t
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)
1356 define <16 x i64> @vsadd_vi_v16i64_unmasked(<16 x i64> %va, i32 zeroext %evl) {
1357 ; CHECK-LABEL: vsadd_vi_v16i64_unmasked:
1359 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1360 ; CHECK-NEXT: vsadd.vi v8, v8, -1
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)
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:
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
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)
1395 define <32 x i64> @vsadd_vi_v32i64_unmasked(<32 x i64> %va, i32 zeroext %evl) {
1396 ; CHECK-LABEL: vsadd_vi_v32i64_unmasked:
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
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)
1417 define <32 x i64> @vsadd_vx_v32i64_evl12(<32 x i64> %va, <32 x i1> %m) {
1418 ; CHECK-LABEL: vsadd_vx_v32i64_evl12:
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
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)
1432 define <32 x i64> @vsadd_vx_v32i64_evl27(<32 x i64> %va, <32 x i1> %m) {
1433 ; CHECK-LABEL: vsadd_vx_v32i64_evl27:
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
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)