xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vsadd.ll (revision 97982a8c605fac7c86d02e641a6cd7898b3ca343)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s \
3; RUN:   | FileCheck %s --check-prefixes=CHECK,RV32
4; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s \
5; RUN:   | FileCheck %s --check-prefixes=CHECK,RV64
6
7declare <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8>, <2 x i8>)
8
9define <2 x i8> @sadd_v2i8_vv(<2 x i8> %va, <2 x i8> %b) {
10; CHECK-LABEL: sadd_v2i8_vv:
11; CHECK:       # %bb.0:
12; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
13; CHECK-NEXT:    vsadd.vv v8, v8, v9
14; CHECK-NEXT:    ret
15  %v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %va, <2 x i8> %b)
16  ret <2 x i8> %v
17}
18
19define <2 x i8> @sadd_v2i8_vx(<2 x i8> %va, i8 %b) {
20; CHECK-LABEL: sadd_v2i8_vx:
21; CHECK:       # %bb.0:
22; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
23; CHECK-NEXT:    vsadd.vx v8, v8, a0
24; CHECK-NEXT:    ret
25  %elt.head = insertelement <2 x i8> poison, i8 %b, i32 0
26  %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer
27  %v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %va, <2 x i8> %vb)
28  ret <2 x i8> %v
29}
30
31define <2 x i8> @sadd_v2i8_vi(<2 x i8> %va) {
32; CHECK-LABEL: sadd_v2i8_vi:
33; CHECK:       # %bb.0:
34; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
35; CHECK-NEXT:    vsadd.vi v8, v8, 5
36; CHECK-NEXT:    ret
37  %v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %va, <2 x i8> splat (i8 5))
38  ret <2 x i8> %v
39}
40
41declare <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8>, <4 x i8>)
42
43define <4 x i8> @sadd_v4i8_vv(<4 x i8> %va, <4 x i8> %b) {
44; CHECK-LABEL: sadd_v4i8_vv:
45; CHECK:       # %bb.0:
46; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
47; CHECK-NEXT:    vsadd.vv v8, v8, v9
48; CHECK-NEXT:    ret
49  %v = call <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8> %va, <4 x i8> %b)
50  ret <4 x i8> %v
51}
52
53define <4 x i8> @sadd_v4i8_vx(<4 x i8> %va, i8 %b) {
54; CHECK-LABEL: sadd_v4i8_vx:
55; CHECK:       # %bb.0:
56; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
57; CHECK-NEXT:    vsadd.vx v8, v8, a0
58; CHECK-NEXT:    ret
59  %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0
60  %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer
61  %v = call <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8> %va, <4 x i8> %vb)
62  ret <4 x i8> %v
63}
64
65define <4 x i8> @sadd_v4i8_vi(<4 x i8> %va) {
66; CHECK-LABEL: sadd_v4i8_vi:
67; CHECK:       # %bb.0:
68; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
69; CHECK-NEXT:    vsadd.vi v8, v8, 5
70; CHECK-NEXT:    ret
71  %v = call <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8> %va, <4 x i8> splat (i8 5))
72  ret <4 x i8> %v
73}
74
75declare <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8>, <8 x i8>)
76
77define <8 x i8> @sadd_v8i8_vv(<8 x i8> %va, <8 x i8> %b) {
78; CHECK-LABEL: sadd_v8i8_vv:
79; CHECK:       # %bb.0:
80; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
81; CHECK-NEXT:    vsadd.vv v8, v8, v9
82; CHECK-NEXT:    ret
83  %v = call <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8> %va, <8 x i8> %b)
84  ret <8 x i8> %v
85}
86
87define <8 x i8> @sadd_v8i8_vx(<8 x i8> %va, i8 %b) {
88; CHECK-LABEL: sadd_v8i8_vx:
89; CHECK:       # %bb.0:
90; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
91; CHECK-NEXT:    vsadd.vx v8, v8, a0
92; CHECK-NEXT:    ret
93  %elt.head = insertelement <8 x i8> poison, i8 %b, i32 0
94  %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer
95  %v = call <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8> %va, <8 x i8> %vb)
96  ret <8 x i8> %v
97}
98
99define <8 x i8> @sadd_v8i8_vi(<8 x i8> %va) {
100; CHECK-LABEL: sadd_v8i8_vi:
101; CHECK:       # %bb.0:
102; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
103; CHECK-NEXT:    vsadd.vi v8, v8, 5
104; CHECK-NEXT:    ret
105  %v = call <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8> %va, <8 x i8> splat (i8 5))
106  ret <8 x i8> %v
107}
108
109declare <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8>, <16 x i8>)
110
111define <16 x i8> @sadd_v16i8_vv(<16 x i8> %va, <16 x i8> %b) {
112; CHECK-LABEL: sadd_v16i8_vv:
113; CHECK:       # %bb.0:
114; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
115; CHECK-NEXT:    vsadd.vv v8, v8, v9
116; CHECK-NEXT:    ret
117  %v = call <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8> %va, <16 x i8> %b)
118  ret <16 x i8> %v
119}
120
121define <16 x i8> @sadd_v16i8_vx(<16 x i8> %va, i8 %b) {
122; CHECK-LABEL: sadd_v16i8_vx:
123; CHECK:       # %bb.0:
124; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
125; CHECK-NEXT:    vsadd.vx v8, v8, a0
126; CHECK-NEXT:    ret
127  %elt.head = insertelement <16 x i8> poison, i8 %b, i32 0
128  %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer
129  %v = call <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8> %va, <16 x i8> %vb)
130  ret <16 x i8> %v
131}
132
133define <16 x i8> @sadd_v16i8_vi(<16 x i8> %va) {
134; CHECK-LABEL: sadd_v16i8_vi:
135; CHECK:       # %bb.0:
136; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
137; CHECK-NEXT:    vsadd.vi v8, v8, 5
138; CHECK-NEXT:    ret
139  %v = call <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8> %va, <16 x i8> splat (i8 5))
140  ret <16 x i8> %v
141}
142
143declare <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16>, <2 x i16>)
144
145define <2 x i16> @sadd_v2i16_vv(<2 x i16> %va, <2 x i16> %b) {
146; CHECK-LABEL: sadd_v2i16_vv:
147; CHECK:       # %bb.0:
148; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
149; CHECK-NEXT:    vsadd.vv v8, v8, v9
150; CHECK-NEXT:    ret
151  %v = call <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16> %va, <2 x i16> %b)
152  ret <2 x i16> %v
153}
154
155define <2 x i16> @sadd_v2i16_vx(<2 x i16> %va, i16 %b) {
156; CHECK-LABEL: sadd_v2i16_vx:
157; CHECK:       # %bb.0:
158; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
159; CHECK-NEXT:    vsadd.vx v8, v8, a0
160; CHECK-NEXT:    ret
161  %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0
162  %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer
163  %v = call <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16> %va, <2 x i16> %vb)
164  ret <2 x i16> %v
165}
166
167define <2 x i16> @sadd_v2i16_vi(<2 x i16> %va) {
168; CHECK-LABEL: sadd_v2i16_vi:
169; CHECK:       # %bb.0:
170; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
171; CHECK-NEXT:    vsadd.vi v8, v8, 5
172; CHECK-NEXT:    ret
173  %v = call <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16> %va, <2 x i16> splat (i16 5))
174  ret <2 x i16> %v
175}
176
177declare <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16>, <4 x i16>)
178
179define <4 x i16> @sadd_v4i16_vv(<4 x i16> %va, <4 x i16> %b) {
180; CHECK-LABEL: sadd_v4i16_vv:
181; CHECK:       # %bb.0:
182; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
183; CHECK-NEXT:    vsadd.vv v8, v8, v9
184; CHECK-NEXT:    ret
185  %v = call <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16> %va, <4 x i16> %b)
186  ret <4 x i16> %v
187}
188
189define <4 x i16> @sadd_v4i16_vx(<4 x i16> %va, i16 %b) {
190; CHECK-LABEL: sadd_v4i16_vx:
191; CHECK:       # %bb.0:
192; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
193; CHECK-NEXT:    vsadd.vx v8, v8, a0
194; CHECK-NEXT:    ret
195  %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0
196  %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer
197  %v = call <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16> %va, <4 x i16> %vb)
198  ret <4 x i16> %v
199}
200
201define <4 x i16> @sadd_v4i16_vi(<4 x i16> %va) {
202; CHECK-LABEL: sadd_v4i16_vi:
203; CHECK:       # %bb.0:
204; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
205; CHECK-NEXT:    vsadd.vi v8, v8, 5
206; CHECK-NEXT:    ret
207  %v = call <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16> %va, <4 x i16> splat (i16 5))
208  ret <4 x i16> %v
209}
210
211declare <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16>, <8 x i16>)
212
213define <8 x i16> @sadd_v8i16_vv(<8 x i16> %va, <8 x i16> %b) {
214; CHECK-LABEL: sadd_v8i16_vv:
215; CHECK:       # %bb.0:
216; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
217; CHECK-NEXT:    vsadd.vv v8, v8, v9
218; CHECK-NEXT:    ret
219  %v = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %va, <8 x i16> %b)
220  ret <8 x i16> %v
221}
222
223define <8 x i16> @sadd_v8i16_vx(<8 x i16> %va, i16 %b) {
224; CHECK-LABEL: sadd_v8i16_vx:
225; CHECK:       # %bb.0:
226; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
227; CHECK-NEXT:    vsadd.vx v8, v8, a0
228; CHECK-NEXT:    ret
229  %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0
230  %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer
231  %v = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %va, <8 x i16> %vb)
232  ret <8 x i16> %v
233}
234
235define <8 x i16> @sadd_v8i16_vi(<8 x i16> %va) {
236; CHECK-LABEL: sadd_v8i16_vi:
237; CHECK:       # %bb.0:
238; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
239; CHECK-NEXT:    vsadd.vi v8, v8, 5
240; CHECK-NEXT:    ret
241  %v = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %va, <8 x i16> splat (i16 5))
242  ret <8 x i16> %v
243}
244
245declare <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16>, <16 x i16>)
246
247define <16 x i16> @sadd_v16i16_vv(<16 x i16> %va, <16 x i16> %b) {
248; CHECK-LABEL: sadd_v16i16_vv:
249; CHECK:       # %bb.0:
250; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
251; CHECK-NEXT:    vsadd.vv v8, v8, v10
252; CHECK-NEXT:    ret
253  %v = call <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16> %va, <16 x i16> %b)
254  ret <16 x i16> %v
255}
256
257define <16 x i16> @sadd_v16i16_vx(<16 x i16> %va, i16 %b) {
258; CHECK-LABEL: sadd_v16i16_vx:
259; CHECK:       # %bb.0:
260; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
261; CHECK-NEXT:    vsadd.vx v8, v8, a0
262; CHECK-NEXT:    ret
263  %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0
264  %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer
265  %v = call <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16> %va, <16 x i16> %vb)
266  ret <16 x i16> %v
267}
268
269define <16 x i16> @sadd_v16i16_vi(<16 x i16> %va) {
270; CHECK-LABEL: sadd_v16i16_vi:
271; CHECK:       # %bb.0:
272; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
273; CHECK-NEXT:    vsadd.vi v8, v8, 5
274; CHECK-NEXT:    ret
275  %v = call <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16> %va, <16 x i16> splat (i16 5))
276  ret <16 x i16> %v
277}
278
279declare <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32>, <2 x i32>)
280
281define <2 x i32> @sadd_v2i32_vv(<2 x i32> %va, <2 x i32> %b) {
282; CHECK-LABEL: sadd_v2i32_vv:
283; CHECK:       # %bb.0:
284; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
285; CHECK-NEXT:    vsadd.vv v8, v8, v9
286; CHECK-NEXT:    ret
287  %v = call <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32> %va, <2 x i32> %b)
288  ret <2 x i32> %v
289}
290
291define <2 x i32> @sadd_v2i32_vx(<2 x i32> %va, i32 %b) {
292; CHECK-LABEL: sadd_v2i32_vx:
293; CHECK:       # %bb.0:
294; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
295; CHECK-NEXT:    vsadd.vx v8, v8, a0
296; CHECK-NEXT:    ret
297  %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0
298  %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer
299  %v = call <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32> %va, <2 x i32> %vb)
300  ret <2 x i32> %v
301}
302
303define <2 x i32> @sadd_v2i32_vx_commute(<2 x i32> %va, i32 %b) {
304; CHECK-LABEL: sadd_v2i32_vx_commute:
305; CHECK:       # %bb.0:
306; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
307; CHECK-NEXT:    vsadd.vx v8, v8, a0
308; CHECK-NEXT:    ret
309  %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0
310  %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer
311  %v = call <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32> %vb, <2 x i32> %va)
312  ret <2 x i32> %v
313}
314
315define <2 x i32> @sadd_v2i32_vi(<2 x i32> %va) {
316; CHECK-LABEL: sadd_v2i32_vi:
317; CHECK:       # %bb.0:
318; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
319; CHECK-NEXT:    vsadd.vi v8, v8, 5
320; CHECK-NEXT:    ret
321  %v = call <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32> %va, <2 x i32> splat (i32 5))
322  ret <2 x i32> %v
323}
324
325declare <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32>, <4 x i32>)
326
327define <4 x i32> @sadd_v4i32_vv(<4 x i32> %va, <4 x i32> %b) {
328; CHECK-LABEL: sadd_v4i32_vv:
329; CHECK:       # %bb.0:
330; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
331; CHECK-NEXT:    vsadd.vv v8, v8, v9
332; CHECK-NEXT:    ret
333  %v = call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %va, <4 x i32> %b)
334  ret <4 x i32> %v
335}
336
337define <4 x i32> @sadd_v4i32_vx(<4 x i32> %va, i32 %b) {
338; CHECK-LABEL: sadd_v4i32_vx:
339; CHECK:       # %bb.0:
340; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
341; CHECK-NEXT:    vsadd.vx v8, v8, a0
342; CHECK-NEXT:    ret
343  %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0
344  %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer
345  %v = call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %va, <4 x i32> %vb)
346  ret <4 x i32> %v
347}
348
349define <4 x i32> @sadd_v4i32_vi(<4 x i32> %va) {
350; CHECK-LABEL: sadd_v4i32_vi:
351; CHECK:       # %bb.0:
352; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
353; CHECK-NEXT:    vsadd.vi v8, v8, 5
354; CHECK-NEXT:    ret
355  %v = call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %va, <4 x i32> splat (i32 5))
356  ret <4 x i32> %v
357}
358
359declare <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32>, <8 x i32>)
360
361define <8 x i32> @sadd_v8i32_vv(<8 x i32> %va, <8 x i32> %b) {
362; CHECK-LABEL: sadd_v8i32_vv:
363; CHECK:       # %bb.0:
364; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
365; CHECK-NEXT:    vsadd.vv v8, v8, v10
366; CHECK-NEXT:    ret
367  %v = call <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32> %va, <8 x i32> %b)
368  ret <8 x i32> %v
369}
370
371define <8 x i32> @sadd_v8i32_vx(<8 x i32> %va, i32 %b) {
372; CHECK-LABEL: sadd_v8i32_vx:
373; CHECK:       # %bb.0:
374; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
375; CHECK-NEXT:    vsadd.vx v8, v8, a0
376; CHECK-NEXT:    ret
377  %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0
378  %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer
379  %v = call <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32> %va, <8 x i32> %vb)
380  ret <8 x i32> %v
381}
382
383define <8 x i32> @sadd_v8i32_vi(<8 x i32> %va) {
384; CHECK-LABEL: sadd_v8i32_vi:
385; CHECK:       # %bb.0:
386; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
387; CHECK-NEXT:    vsadd.vi v8, v8, 5
388; CHECK-NEXT:    ret
389  %v = call <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32> %va, <8 x i32> splat (i32 5))
390  ret <8 x i32> %v
391}
392
393declare <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32>, <16 x i32>)
394
395define <16 x i32> @sadd_v16i32_vv(<16 x i32> %va, <16 x i32> %b) {
396; CHECK-LABEL: sadd_v16i32_vv:
397; CHECK:       # %bb.0:
398; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
399; CHECK-NEXT:    vsadd.vv v8, v8, v12
400; CHECK-NEXT:    ret
401  %v = call <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32> %va, <16 x i32> %b)
402  ret <16 x i32> %v
403}
404
405define <16 x i32> @sadd_v16i32_vx(<16 x i32> %va, i32 %b) {
406; CHECK-LABEL: sadd_v16i32_vx:
407; CHECK:       # %bb.0:
408; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
409; CHECK-NEXT:    vsadd.vx v8, v8, a0
410; CHECK-NEXT:    ret
411  %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0
412  %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer
413  %v = call <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32> %va, <16 x i32> %vb)
414  ret <16 x i32> %v
415}
416
417define <16 x i32> @sadd_v16i32_vi(<16 x i32> %va) {
418; CHECK-LABEL: sadd_v16i32_vi:
419; CHECK:       # %bb.0:
420; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
421; CHECK-NEXT:    vsadd.vi v8, v8, 5
422; CHECK-NEXT:    ret
423  %v = call <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32> %va, <16 x i32> splat (i32 5))
424  ret <16 x i32> %v
425}
426
427declare <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64>, <2 x i64>)
428
429define <2 x i64> @sadd_v2i64_vv(<2 x i64> %va, <2 x i64> %b) {
430; CHECK-LABEL: sadd_v2i64_vv:
431; CHECK:       # %bb.0:
432; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
433; CHECK-NEXT:    vsadd.vv v8, v8, v9
434; CHECK-NEXT:    ret
435  %v = call <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64> %va, <2 x i64> %b)
436  ret <2 x i64> %v
437}
438
439define <2 x i64> @sadd_v2i64_vx(<2 x i64> %va, i64 %b) {
440; RV32-LABEL: sadd_v2i64_vx:
441; RV32:       # %bb.0:
442; RV32-NEXT:    addi sp, sp, -16
443; RV32-NEXT:    .cfi_def_cfa_offset 16
444; RV32-NEXT:    sw a0, 8(sp)
445; RV32-NEXT:    sw a1, 12(sp)
446; RV32-NEXT:    addi a0, sp, 8
447; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
448; RV32-NEXT:    vlse64.v v9, (a0), zero
449; RV32-NEXT:    vsadd.vv v8, v8, v9
450; RV32-NEXT:    addi sp, sp, 16
451; RV32-NEXT:    .cfi_def_cfa_offset 0
452; RV32-NEXT:    ret
453;
454; RV64-LABEL: sadd_v2i64_vx:
455; RV64:       # %bb.0:
456; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
457; RV64-NEXT:    vsadd.vx v8, v8, a0
458; RV64-NEXT:    ret
459  %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0
460  %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer
461  %v = call <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64> %va, <2 x i64> %vb)
462  ret <2 x i64> %v
463}
464
465define <2 x i64> @sadd_v2i64_vi(<2 x i64> %va) {
466; CHECK-LABEL: sadd_v2i64_vi:
467; CHECK:       # %bb.0:
468; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
469; CHECK-NEXT:    vsadd.vi v8, v8, 5
470; CHECK-NEXT:    ret
471  %v = call <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64> %va, <2 x i64> splat (i64 5))
472  ret <2 x i64> %v
473}
474
475declare <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64>, <4 x i64>)
476
477define <4 x i64> @sadd_v4i64_vv(<4 x i64> %va, <4 x i64> %b) {
478; CHECK-LABEL: sadd_v4i64_vv:
479; CHECK:       # %bb.0:
480; CHECK-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
481; CHECK-NEXT:    vsadd.vv v8, v8, v10
482; CHECK-NEXT:    ret
483  %v = call <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64> %va, <4 x i64> %b)
484  ret <4 x i64> %v
485}
486
487define <4 x i64> @sadd_v4i64_vx(<4 x i64> %va, i64 %b) {
488; RV32-LABEL: sadd_v4i64_vx:
489; RV32:       # %bb.0:
490; RV32-NEXT:    addi sp, sp, -16
491; RV32-NEXT:    .cfi_def_cfa_offset 16
492; RV32-NEXT:    sw a0, 8(sp)
493; RV32-NEXT:    sw a1, 12(sp)
494; RV32-NEXT:    addi a0, sp, 8
495; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
496; RV32-NEXT:    vlse64.v v10, (a0), zero
497; RV32-NEXT:    vsadd.vv v8, v8, v10
498; RV32-NEXT:    addi sp, sp, 16
499; RV32-NEXT:    .cfi_def_cfa_offset 0
500; RV32-NEXT:    ret
501;
502; RV64-LABEL: sadd_v4i64_vx:
503; RV64:       # %bb.0:
504; RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
505; RV64-NEXT:    vsadd.vx v8, v8, a0
506; RV64-NEXT:    ret
507  %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0
508  %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer
509  %v = call <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64> %va, <4 x i64> %vb)
510  ret <4 x i64> %v
511}
512
513define <4 x i64> @sadd_v4i64_vi(<4 x i64> %va) {
514; CHECK-LABEL: sadd_v4i64_vi:
515; CHECK:       # %bb.0:
516; CHECK-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
517; CHECK-NEXT:    vsadd.vi v8, v8, 5
518; CHECK-NEXT:    ret
519  %v = call <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64> %va, <4 x i64> splat (i64 5))
520  ret <4 x i64> %v
521}
522
523declare <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64>, <8 x i64>)
524
525define <8 x i64> @sadd_v8i64_vv(<8 x i64> %va, <8 x i64> %b) {
526; CHECK-LABEL: sadd_v8i64_vv:
527; CHECK:       # %bb.0:
528; CHECK-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
529; CHECK-NEXT:    vsadd.vv v8, v8, v12
530; CHECK-NEXT:    ret
531  %v = call <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64> %va, <8 x i64> %b)
532  ret <8 x i64> %v
533}
534
535define <8 x i64> @sadd_v8i64_vx(<8 x i64> %va, i64 %b) {
536; RV32-LABEL: sadd_v8i64_vx:
537; RV32:       # %bb.0:
538; RV32-NEXT:    addi sp, sp, -16
539; RV32-NEXT:    .cfi_def_cfa_offset 16
540; RV32-NEXT:    sw a0, 8(sp)
541; RV32-NEXT:    sw a1, 12(sp)
542; RV32-NEXT:    addi a0, sp, 8
543; RV32-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
544; RV32-NEXT:    vlse64.v v12, (a0), zero
545; RV32-NEXT:    vsadd.vv v8, v8, v12
546; RV32-NEXT:    addi sp, sp, 16
547; RV32-NEXT:    .cfi_def_cfa_offset 0
548; RV32-NEXT:    ret
549;
550; RV64-LABEL: sadd_v8i64_vx:
551; RV64:       # %bb.0:
552; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
553; RV64-NEXT:    vsadd.vx v8, v8, a0
554; RV64-NEXT:    ret
555  %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0
556  %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer
557  %v = call <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64> %va, <8 x i64> %vb)
558  ret <8 x i64> %v
559}
560
561define <8 x i64> @sadd_v8i64_vi(<8 x i64> %va) {
562; CHECK-LABEL: sadd_v8i64_vi:
563; CHECK:       # %bb.0:
564; CHECK-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
565; CHECK-NEXT:    vsadd.vi v8, v8, 5
566; CHECK-NEXT:    ret
567  %v = call <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64> %va, <8 x i64> splat (i64 5))
568  ret <8 x i64> %v
569}
570
571declare <16 x i64> @llvm.sadd.sat.v16i64(<16 x i64>, <16 x i64>)
572
573define <16 x i64> @sadd_v16i64_vv(<16 x i64> %va, <16 x i64> %b) {
574; CHECK-LABEL: sadd_v16i64_vv:
575; CHECK:       # %bb.0:
576; CHECK-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
577; CHECK-NEXT:    vsadd.vv v8, v8, v16
578; CHECK-NEXT:    ret
579  %v = call <16 x i64> @llvm.sadd.sat.v16i64(<16 x i64> %va, <16 x i64> %b)
580  ret <16 x i64> %v
581}
582
583define <16 x i64> @sadd_v16i64_vx(<16 x i64> %va, i64 %b) {
584; RV32-LABEL: sadd_v16i64_vx:
585; RV32:       # %bb.0:
586; RV32-NEXT:    addi sp, sp, -16
587; RV32-NEXT:    .cfi_def_cfa_offset 16
588; RV32-NEXT:    sw a0, 8(sp)
589; RV32-NEXT:    sw a1, 12(sp)
590; RV32-NEXT:    addi a0, sp, 8
591; RV32-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
592; RV32-NEXT:    vlse64.v v16, (a0), zero
593; RV32-NEXT:    vsadd.vv v8, v8, v16
594; RV32-NEXT:    addi sp, sp, 16
595; RV32-NEXT:    .cfi_def_cfa_offset 0
596; RV32-NEXT:    ret
597;
598; RV64-LABEL: sadd_v16i64_vx:
599; RV64:       # %bb.0:
600; RV64-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
601; RV64-NEXT:    vsadd.vx v8, v8, a0
602; RV64-NEXT:    ret
603  %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0
604  %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer
605  %v = call <16 x i64> @llvm.sadd.sat.v16i64(<16 x i64> %va, <16 x i64> %vb)
606  ret <16 x i64> %v
607}
608
609define <16 x i64> @sadd_v16i64_vi(<16 x i64> %va) {
610; CHECK-LABEL: sadd_v16i64_vi:
611; CHECK:       # %bb.0:
612; CHECK-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
613; CHECK-NEXT:    vsadd.vi v8, v8, 5
614; CHECK-NEXT:    ret
615  %v = call <16 x i64> @llvm.sadd.sat.v16i64(<16 x i64> %va, <16 x i64> splat (i64 5))
616  ret <16 x i64> %v
617}
618