xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/vsadd-sdnode.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 <vscale x 1 x i8> @llvm.sadd.sat.nxv1i8(<vscale x 1 x i8>, <vscale x 1 x i8>)
8
9define <vscale x 1 x i8> @sadd_nxv1i8_vv(<vscale x 1 x i8> %va, <vscale x 1 x i8> %b) {
10; CHECK-LABEL: sadd_nxv1i8_vv:
11; CHECK:       # %bb.0:
12; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
13; CHECK-NEXT:    vsadd.vv v8, v8, v9
14; CHECK-NEXT:    ret
15  %v = call <vscale x 1 x i8> @llvm.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %b)
16  ret <vscale x 1 x i8> %v
17}
18
19define <vscale x 1 x i8> @sadd_nxv1i8_vx(<vscale x 1 x i8> %va, i8 %b) {
20; CHECK-LABEL: sadd_nxv1i8_vx:
21; CHECK:       # %bb.0:
22; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, ma
23; CHECK-NEXT:    vsadd.vx v8, v8, a0
24; CHECK-NEXT:    ret
25  %elt.head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0
26  %vb = shufflevector <vscale x 1 x i8> %elt.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer
27  %v = call <vscale x 1 x i8> @llvm.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %vb)
28  ret <vscale x 1 x i8> %v
29}
30
31define <vscale x 1 x i8> @sadd_nxv1i8_vi(<vscale x 1 x i8> %va) {
32; CHECK-LABEL: sadd_nxv1i8_vi:
33; CHECK:       # %bb.0:
34; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
35; CHECK-NEXT:    vsadd.vi v8, v8, 5
36; CHECK-NEXT:    ret
37  %v = call <vscale x 1 x i8> @llvm.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> splat (i8 5))
38  ret <vscale x 1 x i8> %v
39}
40
41declare <vscale x 2 x i8> @llvm.sadd.sat.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i8>)
42
43define <vscale x 2 x i8> @sadd_nxv2i8_vv(<vscale x 2 x i8> %va, <vscale x 2 x i8> %b) {
44; CHECK-LABEL: sadd_nxv2i8_vv:
45; CHECK:       # %bb.0:
46; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
47; CHECK-NEXT:    vsadd.vv v8, v8, v9
48; CHECK-NEXT:    ret
49  %v = call <vscale x 2 x i8> @llvm.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %b)
50  ret <vscale x 2 x i8> %v
51}
52
53define <vscale x 2 x i8> @sadd_nxv2i8_vx(<vscale x 2 x i8> %va, i8 %b) {
54; CHECK-LABEL: sadd_nxv2i8_vx:
55; CHECK:       # %bb.0:
56; CHECK-NEXT:    vsetvli a1, zero, e8, mf4, ta, ma
57; CHECK-NEXT:    vsadd.vx v8, v8, a0
58; CHECK-NEXT:    ret
59  %elt.head = insertelement <vscale x 2 x i8> poison, i8 %b, i32 0
60  %vb = shufflevector <vscale x 2 x i8> %elt.head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer
61  %v = call <vscale x 2 x i8> @llvm.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %vb)
62  ret <vscale x 2 x i8> %v
63}
64
65define <vscale x 2 x i8> @sadd_nxv2i8_vi(<vscale x 2 x i8> %va) {
66; CHECK-LABEL: sadd_nxv2i8_vi:
67; CHECK:       # %bb.0:
68; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
69; CHECK-NEXT:    vsadd.vi v8, v8, 5
70; CHECK-NEXT:    ret
71  %v = call <vscale x 2 x i8> @llvm.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> splat (i8 5))
72  ret <vscale x 2 x i8> %v
73}
74
75declare <vscale x 4 x i8> @llvm.sadd.sat.nxv4i8(<vscale x 4 x i8>, <vscale x 4 x i8>)
76
77define <vscale x 4 x i8> @sadd_nxv4i8_vv(<vscale x 4 x i8> %va, <vscale x 4 x i8> %b) {
78; CHECK-LABEL: sadd_nxv4i8_vv:
79; CHECK:       # %bb.0:
80; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
81; CHECK-NEXT:    vsadd.vv v8, v8, v9
82; CHECK-NEXT:    ret
83  %v = call <vscale x 4 x i8> @llvm.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %b)
84  ret <vscale x 4 x i8> %v
85}
86
87define <vscale x 4 x i8> @sadd_nxv4i8_vx(<vscale x 4 x i8> %va, i8 %b) {
88; CHECK-LABEL: sadd_nxv4i8_vx:
89; CHECK:       # %bb.0:
90; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, ma
91; CHECK-NEXT:    vsadd.vx v8, v8, a0
92; CHECK-NEXT:    ret
93  %elt.head = insertelement <vscale x 4 x i8> poison, i8 %b, i32 0
94  %vb = shufflevector <vscale x 4 x i8> %elt.head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer
95  %v = call <vscale x 4 x i8> @llvm.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %vb)
96  ret <vscale x 4 x i8> %v
97}
98
99define <vscale x 4 x i8> @sadd_nxv4i8_vi(<vscale x 4 x i8> %va) {
100; CHECK-LABEL: sadd_nxv4i8_vi:
101; CHECK:       # %bb.0:
102; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
103; CHECK-NEXT:    vsadd.vi v8, v8, 5
104; CHECK-NEXT:    ret
105  %v = call <vscale x 4 x i8> @llvm.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> splat (i8 5))
106  ret <vscale x 4 x i8> %v
107}
108
109declare <vscale x 8 x i8> @llvm.sadd.sat.nxv8i8(<vscale x 8 x i8>, <vscale x 8 x i8>)
110
111define <vscale x 8 x i8> @sadd_nxv8i8_vv(<vscale x 8 x i8> %va, <vscale x 8 x i8> %b) {
112; CHECK-LABEL: sadd_nxv8i8_vv:
113; CHECK:       # %bb.0:
114; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
115; CHECK-NEXT:    vsadd.vv v8, v8, v9
116; CHECK-NEXT:    ret
117  %v = call <vscale x 8 x i8> @llvm.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %b)
118  ret <vscale x 8 x i8> %v
119}
120
121define <vscale x 8 x i8> @sadd_nxv8i8_vx(<vscale x 8 x i8> %va, i8 %b) {
122; CHECK-LABEL: sadd_nxv8i8_vx:
123; CHECK:       # %bb.0:
124; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma
125; CHECK-NEXT:    vsadd.vx v8, v8, a0
126; CHECK-NEXT:    ret
127  %elt.head = insertelement <vscale x 8 x i8> poison, i8 %b, i32 0
128  %vb = shufflevector <vscale x 8 x i8> %elt.head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer
129  %v = call <vscale x 8 x i8> @llvm.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %vb)
130  ret <vscale x 8 x i8> %v
131}
132
133define <vscale x 8 x i8> @sadd_nxv8i8_vi(<vscale x 8 x i8> %va) {
134; CHECK-LABEL: sadd_nxv8i8_vi:
135; CHECK:       # %bb.0:
136; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
137; CHECK-NEXT:    vsadd.vi v8, v8, 5
138; CHECK-NEXT:    ret
139  %v = call <vscale x 8 x i8> @llvm.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> splat (i8 5))
140  ret <vscale x 8 x i8> %v
141}
142
143declare <vscale x 16 x i8> @llvm.sadd.sat.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>)
144
145define <vscale x 16 x i8> @sadd_nxv16i8_vv(<vscale x 16 x i8> %va, <vscale x 16 x i8> %b) {
146; CHECK-LABEL: sadd_nxv16i8_vv:
147; CHECK:       # %bb.0:
148; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
149; CHECK-NEXT:    vsadd.vv v8, v8, v10
150; CHECK-NEXT:    ret
151  %v = call <vscale x 16 x i8> @llvm.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %b)
152  ret <vscale x 16 x i8> %v
153}
154
155define <vscale x 16 x i8> @sadd_nxv16i8_vx(<vscale x 16 x i8> %va, i8 %b) {
156; CHECK-LABEL: sadd_nxv16i8_vx:
157; CHECK:       # %bb.0:
158; CHECK-NEXT:    vsetvli a1, zero, e8, m2, ta, ma
159; CHECK-NEXT:    vsadd.vx v8, v8, a0
160; CHECK-NEXT:    ret
161  %elt.head = insertelement <vscale x 16 x i8> poison, i8 %b, i32 0
162  %vb = shufflevector <vscale x 16 x i8> %elt.head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
163  %v = call <vscale x 16 x i8> @llvm.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %vb)
164  ret <vscale x 16 x i8> %v
165}
166
167define <vscale x 16 x i8> @sadd_nxv16i8_vi(<vscale x 16 x i8> %va) {
168; CHECK-LABEL: sadd_nxv16i8_vi:
169; CHECK:       # %bb.0:
170; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
171; CHECK-NEXT:    vsadd.vi v8, v8, 5
172; CHECK-NEXT:    ret
173  %v = call <vscale x 16 x i8> @llvm.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> splat (i8 5))
174  ret <vscale x 16 x i8> %v
175}
176
177declare <vscale x 32 x i8> @llvm.sadd.sat.nxv32i8(<vscale x 32 x i8>, <vscale x 32 x i8>)
178
179define <vscale x 32 x i8> @sadd_nxv32i8_vv(<vscale x 32 x i8> %va, <vscale x 32 x i8> %b) {
180; CHECK-LABEL: sadd_nxv32i8_vv:
181; CHECK:       # %bb.0:
182; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
183; CHECK-NEXT:    vsadd.vv v8, v8, v12
184; CHECK-NEXT:    ret
185  %v = call <vscale x 32 x i8> @llvm.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %b)
186  ret <vscale x 32 x i8> %v
187}
188
189define <vscale x 32 x i8> @sadd_nxv32i8_vx(<vscale x 32 x i8> %va, i8 %b) {
190; CHECK-LABEL: sadd_nxv32i8_vx:
191; CHECK:       # %bb.0:
192; CHECK-NEXT:    vsetvli a1, zero, e8, m4, ta, ma
193; CHECK-NEXT:    vsadd.vx v8, v8, a0
194; CHECK-NEXT:    ret
195  %elt.head = insertelement <vscale x 32 x i8> poison, i8 %b, i32 0
196  %vb = shufflevector <vscale x 32 x i8> %elt.head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer
197  %v = call <vscale x 32 x i8> @llvm.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %vb)
198  ret <vscale x 32 x i8> %v
199}
200
201define <vscale x 32 x i8> @sadd_nxv32i8_vi(<vscale x 32 x i8> %va) {
202; CHECK-LABEL: sadd_nxv32i8_vi:
203; CHECK:       # %bb.0:
204; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, ma
205; CHECK-NEXT:    vsadd.vi v8, v8, 5
206; CHECK-NEXT:    ret
207  %v = call <vscale x 32 x i8> @llvm.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> splat (i8 5))
208  ret <vscale x 32 x i8> %v
209}
210
211declare <vscale x 64 x i8> @llvm.sadd.sat.nxv64i8(<vscale x 64 x i8>, <vscale x 64 x i8>)
212
213define <vscale x 64 x i8> @sadd_nxv64i8_vv(<vscale x 64 x i8> %va, <vscale x 64 x i8> %b) {
214; CHECK-LABEL: sadd_nxv64i8_vv:
215; CHECK:       # %bb.0:
216; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
217; CHECK-NEXT:    vsadd.vv v8, v8, v16
218; CHECK-NEXT:    ret
219  %v = call <vscale x 64 x i8> @llvm.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %b)
220  ret <vscale x 64 x i8> %v
221}
222
223define <vscale x 64 x i8> @sadd_nxv64i8_vx(<vscale x 64 x i8> %va, i8 %b) {
224; CHECK-LABEL: sadd_nxv64i8_vx:
225; CHECK:       # %bb.0:
226; CHECK-NEXT:    vsetvli a1, zero, e8, m8, ta, ma
227; CHECK-NEXT:    vsadd.vx v8, v8, a0
228; CHECK-NEXT:    ret
229  %elt.head = insertelement <vscale x 64 x i8> poison, i8 %b, i32 0
230  %vb = shufflevector <vscale x 64 x i8> %elt.head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer
231  %v = call <vscale x 64 x i8> @llvm.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %vb)
232  ret <vscale x 64 x i8> %v
233}
234
235define <vscale x 64 x i8> @sadd_nxv64i8_vi(<vscale x 64 x i8> %va) {
236; CHECK-LABEL: sadd_nxv64i8_vi:
237; CHECK:       # %bb.0:
238; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, ma
239; CHECK-NEXT:    vsadd.vi v8, v8, 5
240; CHECK-NEXT:    ret
241  %v = call <vscale x 64 x i8> @llvm.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> splat (i8 5))
242  ret <vscale x 64 x i8> %v
243}
244
245declare <vscale x 1 x i16> @llvm.sadd.sat.nxv1i16(<vscale x 1 x i16>, <vscale x 1 x i16>)
246
247define <vscale x 1 x i16> @sadd_nxv1i16_vv(<vscale x 1 x i16> %va, <vscale x 1 x i16> %b) {
248; CHECK-LABEL: sadd_nxv1i16_vv:
249; CHECK:       # %bb.0:
250; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
251; CHECK-NEXT:    vsadd.vv v8, v8, v9
252; CHECK-NEXT:    ret
253  %v = call <vscale x 1 x i16> @llvm.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %b)
254  ret <vscale x 1 x i16> %v
255}
256
257define <vscale x 1 x i16> @sadd_nxv1i16_vx(<vscale x 1 x i16> %va, i16 %b) {
258; CHECK-LABEL: sadd_nxv1i16_vx:
259; CHECK:       # %bb.0:
260; CHECK-NEXT:    vsetvli a1, zero, e16, mf4, ta, ma
261; CHECK-NEXT:    vsadd.vx v8, v8, a0
262; CHECK-NEXT:    ret
263  %elt.head = insertelement <vscale x 1 x i16> poison, i16 %b, i32 0
264  %vb = shufflevector <vscale x 1 x i16> %elt.head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer
265  %v = call <vscale x 1 x i16> @llvm.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %vb)
266  ret <vscale x 1 x i16> %v
267}
268
269define <vscale x 1 x i16> @sadd_nxv1i16_vi(<vscale x 1 x i16> %va) {
270; CHECK-LABEL: sadd_nxv1i16_vi:
271; CHECK:       # %bb.0:
272; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
273; CHECK-NEXT:    vsadd.vi v8, v8, 5
274; CHECK-NEXT:    ret
275  %v = call <vscale x 1 x i16> @llvm.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> splat (i16 5))
276  ret <vscale x 1 x i16> %v
277}
278
279declare <vscale x 2 x i16> @llvm.sadd.sat.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i16>)
280
281define <vscale x 2 x i16> @sadd_nxv2i16_vv(<vscale x 2 x i16> %va, <vscale x 2 x i16> %b) {
282; CHECK-LABEL: sadd_nxv2i16_vv:
283; CHECK:       # %bb.0:
284; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
285; CHECK-NEXT:    vsadd.vv v8, v8, v9
286; CHECK-NEXT:    ret
287  %v = call <vscale x 2 x i16> @llvm.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %b)
288  ret <vscale x 2 x i16> %v
289}
290
291define <vscale x 2 x i16> @sadd_nxv2i16_vx(<vscale x 2 x i16> %va, i16 %b) {
292; CHECK-LABEL: sadd_nxv2i16_vx:
293; CHECK:       # %bb.0:
294; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma
295; CHECK-NEXT:    vsadd.vx v8, v8, a0
296; CHECK-NEXT:    ret
297  %elt.head = insertelement <vscale x 2 x i16> poison, i16 %b, i32 0
298  %vb = shufflevector <vscale x 2 x i16> %elt.head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer
299  %v = call <vscale x 2 x i16> @llvm.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %vb)
300  ret <vscale x 2 x i16> %v
301}
302
303define <vscale x 2 x i16> @sadd_nxv2i16_vi(<vscale x 2 x i16> %va) {
304; CHECK-LABEL: sadd_nxv2i16_vi:
305; CHECK:       # %bb.0:
306; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
307; CHECK-NEXT:    vsadd.vi v8, v8, 5
308; CHECK-NEXT:    ret
309  %v = call <vscale x 2 x i16> @llvm.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> splat (i16 5))
310  ret <vscale x 2 x i16> %v
311}
312
313declare <vscale x 4 x i16> @llvm.sadd.sat.nxv4i16(<vscale x 4 x i16>, <vscale x 4 x i16>)
314
315define <vscale x 4 x i16> @sadd_nxv4i16_vv(<vscale x 4 x i16> %va, <vscale x 4 x i16> %b) {
316; CHECK-LABEL: sadd_nxv4i16_vv:
317; CHECK:       # %bb.0:
318; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
319; CHECK-NEXT:    vsadd.vv v8, v8, v9
320; CHECK-NEXT:    ret
321  %v = call <vscale x 4 x i16> @llvm.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %b)
322  ret <vscale x 4 x i16> %v
323}
324
325define <vscale x 4 x i16> @sadd_nxv4i16_vx(<vscale x 4 x i16> %va, i16 %b) {
326; CHECK-LABEL: sadd_nxv4i16_vx:
327; CHECK:       # %bb.0:
328; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, ma
329; CHECK-NEXT:    vsadd.vx v8, v8, a0
330; CHECK-NEXT:    ret
331  %elt.head = insertelement <vscale x 4 x i16> poison, i16 %b, i32 0
332  %vb = shufflevector <vscale x 4 x i16> %elt.head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer
333  %v = call <vscale x 4 x i16> @llvm.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %vb)
334  ret <vscale x 4 x i16> %v
335}
336
337define <vscale x 4 x i16> @sadd_nxv4i16_vi(<vscale x 4 x i16> %va) {
338; CHECK-LABEL: sadd_nxv4i16_vi:
339; CHECK:       # %bb.0:
340; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
341; CHECK-NEXT:    vsadd.vi v8, v8, 5
342; CHECK-NEXT:    ret
343  %v = call <vscale x 4 x i16> @llvm.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> splat (i16 5))
344  ret <vscale x 4 x i16> %v
345}
346
347declare <vscale x 8 x i16> @llvm.sadd.sat.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>)
348
349define <vscale x 8 x i16> @sadd_nxv8i16_vv(<vscale x 8 x i16> %va, <vscale x 8 x i16> %b) {
350; CHECK-LABEL: sadd_nxv8i16_vv:
351; CHECK:       # %bb.0:
352; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
353; CHECK-NEXT:    vsadd.vv v8, v8, v10
354; CHECK-NEXT:    ret
355  %v = call <vscale x 8 x i16> @llvm.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %b)
356  ret <vscale x 8 x i16> %v
357}
358
359define <vscale x 8 x i16> @sadd_nxv8i16_vx(<vscale x 8 x i16> %va, i16 %b) {
360; CHECK-LABEL: sadd_nxv8i16_vx:
361; CHECK:       # %bb.0:
362; CHECK-NEXT:    vsetvli a1, zero, e16, m2, ta, ma
363; CHECK-NEXT:    vsadd.vx v8, v8, a0
364; CHECK-NEXT:    ret
365  %elt.head = insertelement <vscale x 8 x i16> poison, i16 %b, i32 0
366  %vb = shufflevector <vscale x 8 x i16> %elt.head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
367  %v = call <vscale x 8 x i16> @llvm.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %vb)
368  ret <vscale x 8 x i16> %v
369}
370
371define <vscale x 8 x i16> @sadd_nxv8i16_vi(<vscale x 8 x i16> %va) {
372; CHECK-LABEL: sadd_nxv8i16_vi:
373; CHECK:       # %bb.0:
374; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
375; CHECK-NEXT:    vsadd.vi v8, v8, 5
376; CHECK-NEXT:    ret
377  %v = call <vscale x 8 x i16> @llvm.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> splat (i16 5))
378  ret <vscale x 8 x i16> %v
379}
380
381declare <vscale x 16 x i16> @llvm.sadd.sat.nxv16i16(<vscale x 16 x i16>, <vscale x 16 x i16>)
382
383define <vscale x 16 x i16> @sadd_nxv16i16_vv(<vscale x 16 x i16> %va, <vscale x 16 x i16> %b) {
384; CHECK-LABEL: sadd_nxv16i16_vv:
385; CHECK:       # %bb.0:
386; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
387; CHECK-NEXT:    vsadd.vv v8, v8, v12
388; CHECK-NEXT:    ret
389  %v = call <vscale x 16 x i16> @llvm.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %b)
390  ret <vscale x 16 x i16> %v
391}
392
393define <vscale x 16 x i16> @sadd_nxv16i16_vx(<vscale x 16 x i16> %va, i16 %b) {
394; CHECK-LABEL: sadd_nxv16i16_vx:
395; CHECK:       # %bb.0:
396; CHECK-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
397; CHECK-NEXT:    vsadd.vx v8, v8, a0
398; CHECK-NEXT:    ret
399  %elt.head = insertelement <vscale x 16 x i16> poison, i16 %b, i32 0
400  %vb = shufflevector <vscale x 16 x i16> %elt.head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer
401  %v = call <vscale x 16 x i16> @llvm.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %vb)
402  ret <vscale x 16 x i16> %v
403}
404
405define <vscale x 16 x i16> @sadd_nxv16i16_vi(<vscale x 16 x i16> %va) {
406; CHECK-LABEL: sadd_nxv16i16_vi:
407; CHECK:       # %bb.0:
408; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
409; CHECK-NEXT:    vsadd.vi v8, v8, 5
410; CHECK-NEXT:    ret
411  %v = call <vscale x 16 x i16> @llvm.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> splat (i16 5))
412  ret <vscale x 16 x i16> %v
413}
414
415declare <vscale x 32 x i16> @llvm.sadd.sat.nxv32i16(<vscale x 32 x i16>, <vscale x 32 x i16>)
416
417define <vscale x 32 x i16> @sadd_nxv32i16_vv(<vscale x 32 x i16> %va, <vscale x 32 x i16> %b) {
418; CHECK-LABEL: sadd_nxv32i16_vv:
419; CHECK:       # %bb.0:
420; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
421; CHECK-NEXT:    vsadd.vv v8, v8, v16
422; CHECK-NEXT:    ret
423  %v = call <vscale x 32 x i16> @llvm.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %b)
424  ret <vscale x 32 x i16> %v
425}
426
427define <vscale x 32 x i16> @sadd_nxv32i16_vx(<vscale x 32 x i16> %va, i16 %b) {
428; CHECK-LABEL: sadd_nxv32i16_vx:
429; CHECK:       # %bb.0:
430; CHECK-NEXT:    vsetvli a1, zero, e16, m8, ta, ma
431; CHECK-NEXT:    vsadd.vx v8, v8, a0
432; CHECK-NEXT:    ret
433  %elt.head = insertelement <vscale x 32 x i16> poison, i16 %b, i32 0
434  %vb = shufflevector <vscale x 32 x i16> %elt.head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer
435  %v = call <vscale x 32 x i16> @llvm.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %vb)
436  ret <vscale x 32 x i16> %v
437}
438
439define <vscale x 32 x i16> @sadd_nxv32i16_vi(<vscale x 32 x i16> %va) {
440; CHECK-LABEL: sadd_nxv32i16_vi:
441; CHECK:       # %bb.0:
442; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
443; CHECK-NEXT:    vsadd.vi v8, v8, 5
444; CHECK-NEXT:    ret
445  %v = call <vscale x 32 x i16> @llvm.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> splat (i16 5))
446  ret <vscale x 32 x i16> %v
447}
448
449declare <vscale x 1 x i32> @llvm.sadd.sat.nxv1i32(<vscale x 1 x i32>, <vscale x 1 x i32>)
450
451define <vscale x 1 x i32> @sadd_nxv1i32_vv(<vscale x 1 x i32> %va, <vscale x 1 x i32> %b) {
452; CHECK-LABEL: sadd_nxv1i32_vv:
453; CHECK:       # %bb.0:
454; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
455; CHECK-NEXT:    vsadd.vv v8, v8, v9
456; CHECK-NEXT:    ret
457  %v = call <vscale x 1 x i32> @llvm.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %b)
458  ret <vscale x 1 x i32> %v
459}
460
461define <vscale x 1 x i32> @sadd_nxv1i32_vx(<vscale x 1 x i32> %va, i32 %b) {
462; CHECK-LABEL: sadd_nxv1i32_vx:
463; CHECK:       # %bb.0:
464; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, ma
465; CHECK-NEXT:    vsadd.vx v8, v8, a0
466; CHECK-NEXT:    ret
467  %elt.head = insertelement <vscale x 1 x i32> poison, i32 %b, i32 0
468  %vb = shufflevector <vscale x 1 x i32> %elt.head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
469  %v = call <vscale x 1 x i32> @llvm.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %vb)
470  ret <vscale x 1 x i32> %v
471}
472
473define <vscale x 1 x i32> @sadd_nxv1i32_vi(<vscale x 1 x i32> %va) {
474; CHECK-LABEL: sadd_nxv1i32_vi:
475; CHECK:       # %bb.0:
476; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
477; CHECK-NEXT:    vsadd.vi v8, v8, 5
478; CHECK-NEXT:    ret
479  %v = call <vscale x 1 x i32> @llvm.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> splat (i32 5))
480  ret <vscale x 1 x i32> %v
481}
482
483declare <vscale x 2 x i32> @llvm.sadd.sat.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>)
484
485define <vscale x 2 x i32> @sadd_nxv2i32_vv(<vscale x 2 x i32> %va, <vscale x 2 x i32> %b) {
486; CHECK-LABEL: sadd_nxv2i32_vv:
487; CHECK:       # %bb.0:
488; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
489; CHECK-NEXT:    vsadd.vv v8, v8, v9
490; CHECK-NEXT:    ret
491  %v = call <vscale x 2 x i32> @llvm.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %b)
492  ret <vscale x 2 x i32> %v
493}
494
495define <vscale x 2 x i32> @sadd_nxv2i32_vx(<vscale x 2 x i32> %va, i32 %b) {
496; CHECK-LABEL: sadd_nxv2i32_vx:
497; CHECK:       # %bb.0:
498; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
499; CHECK-NEXT:    vsadd.vx v8, v8, a0
500; CHECK-NEXT:    ret
501  %elt.head = insertelement <vscale x 2 x i32> poison, i32 %b, i32 0
502  %vb = shufflevector <vscale x 2 x i32> %elt.head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
503  %v = call <vscale x 2 x i32> @llvm.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %vb)
504  ret <vscale x 2 x i32> %v
505}
506
507define <vscale x 2 x i32> @sadd_nxv2i32_vi(<vscale x 2 x i32> %va) {
508; CHECK-LABEL: sadd_nxv2i32_vi:
509; CHECK:       # %bb.0:
510; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
511; CHECK-NEXT:    vsadd.vi v8, v8, 5
512; CHECK-NEXT:    ret
513  %v = call <vscale x 2 x i32> @llvm.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> splat (i32 5))
514  ret <vscale x 2 x i32> %v
515}
516
517declare <vscale x 4 x i32> @llvm.sadd.sat.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>)
518
519define <vscale x 4 x i32> @sadd_nxv4i32_vv(<vscale x 4 x i32> %va, <vscale x 4 x i32> %b) {
520; CHECK-LABEL: sadd_nxv4i32_vv:
521; CHECK:       # %bb.0:
522; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
523; CHECK-NEXT:    vsadd.vv v8, v8, v10
524; CHECK-NEXT:    ret
525  %v = call <vscale x 4 x i32> @llvm.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %b)
526  ret <vscale x 4 x i32> %v
527}
528
529define <vscale x 4 x i32> @sadd_nxv4i32_vx(<vscale x 4 x i32> %va, i32 %b) {
530; CHECK-LABEL: sadd_nxv4i32_vx:
531; CHECK:       # %bb.0:
532; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
533; CHECK-NEXT:    vsadd.vx v8, v8, a0
534; CHECK-NEXT:    ret
535  %elt.head = insertelement <vscale x 4 x i32> poison, i32 %b, i32 0
536  %vb = shufflevector <vscale x 4 x i32> %elt.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
537  %v = call <vscale x 4 x i32> @llvm.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %vb)
538  ret <vscale x 4 x i32> %v
539}
540
541define <vscale x 4 x i32> @sadd_nxv4i32_vi(<vscale x 4 x i32> %va) {
542; CHECK-LABEL: sadd_nxv4i32_vi:
543; CHECK:       # %bb.0:
544; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
545; CHECK-NEXT:    vsadd.vi v8, v8, 5
546; CHECK-NEXT:    ret
547  %v = call <vscale x 4 x i32> @llvm.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> splat (i32 5))
548  ret <vscale x 4 x i32> %v
549}
550
551declare <vscale x 8 x i32> @llvm.sadd.sat.nxv8i32(<vscale x 8 x i32>, <vscale x 8 x i32>)
552
553define <vscale x 8 x i32> @sadd_nxv8i32_vv(<vscale x 8 x i32> %va, <vscale x 8 x i32> %b) {
554; CHECK-LABEL: sadd_nxv8i32_vv:
555; CHECK:       # %bb.0:
556; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
557; CHECK-NEXT:    vsadd.vv v8, v8, v12
558; CHECK-NEXT:    ret
559  %v = call <vscale x 8 x i32> @llvm.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %b)
560  ret <vscale x 8 x i32> %v
561}
562
563define <vscale x 8 x i32> @sadd_nxv8i32_vx(<vscale x 8 x i32> %va, i32 %b) {
564; CHECK-LABEL: sadd_nxv8i32_vx:
565; CHECK:       # %bb.0:
566; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
567; CHECK-NEXT:    vsadd.vx v8, v8, a0
568; CHECK-NEXT:    ret
569  %elt.head = insertelement <vscale x 8 x i32> poison, i32 %b, i32 0
570  %vb = shufflevector <vscale x 8 x i32> %elt.head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
571  %v = call <vscale x 8 x i32> @llvm.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %vb)
572  ret <vscale x 8 x i32> %v
573}
574
575define <vscale x 8 x i32> @sadd_nxv8i32_vi(<vscale x 8 x i32> %va) {
576; CHECK-LABEL: sadd_nxv8i32_vi:
577; CHECK:       # %bb.0:
578; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
579; CHECK-NEXT:    vsadd.vi v8, v8, 5
580; CHECK-NEXT:    ret
581  %v = call <vscale x 8 x i32> @llvm.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> splat (i32 5))
582  ret <vscale x 8 x i32> %v
583}
584
585declare <vscale x 16 x i32> @llvm.sadd.sat.nxv16i32(<vscale x 16 x i32>, <vscale x 16 x i32>)
586
587define <vscale x 16 x i32> @sadd_nxv16i32_vv(<vscale x 16 x i32> %va, <vscale x 16 x i32> %b) {
588; CHECK-LABEL: sadd_nxv16i32_vv:
589; CHECK:       # %bb.0:
590; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
591; CHECK-NEXT:    vsadd.vv v8, v8, v16
592; CHECK-NEXT:    ret
593  %v = call <vscale x 16 x i32> @llvm.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %b)
594  ret <vscale x 16 x i32> %v
595}
596
597define <vscale x 16 x i32> @sadd_nxv16i32_vx(<vscale x 16 x i32> %va, i32 %b) {
598; CHECK-LABEL: sadd_nxv16i32_vx:
599; CHECK:       # %bb.0:
600; CHECK-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
601; CHECK-NEXT:    vsadd.vx v8, v8, a0
602; CHECK-NEXT:    ret
603  %elt.head = insertelement <vscale x 16 x i32> poison, i32 %b, i32 0
604  %vb = shufflevector <vscale x 16 x i32> %elt.head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer
605  %v = call <vscale x 16 x i32> @llvm.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %vb)
606  ret <vscale x 16 x i32> %v
607}
608
609define <vscale x 16 x i32> @sadd_nxv16i32_vi(<vscale x 16 x i32> %va) {
610; CHECK-LABEL: sadd_nxv16i32_vi:
611; CHECK:       # %bb.0:
612; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
613; CHECK-NEXT:    vsadd.vi v8, v8, 5
614; CHECK-NEXT:    ret
615  %v = call <vscale x 16 x i32> @llvm.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> splat (i32 5))
616  ret <vscale x 16 x i32> %v
617}
618
619declare <vscale x 1 x i64> @llvm.sadd.sat.nxv1i64(<vscale x 1 x i64>, <vscale x 1 x i64>)
620
621define <vscale x 1 x i64> @sadd_nxv1i64_vv(<vscale x 1 x i64> %va, <vscale x 1 x i64> %b) {
622; CHECK-LABEL: sadd_nxv1i64_vv:
623; CHECK:       # %bb.0:
624; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
625; CHECK-NEXT:    vsadd.vv v8, v8, v9
626; CHECK-NEXT:    ret
627  %v = call <vscale x 1 x i64> @llvm.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %b)
628  ret <vscale x 1 x i64> %v
629}
630
631define <vscale x 1 x i64> @sadd_nxv1i64_vx(<vscale x 1 x i64> %va, i64 %b) {
632; RV32-LABEL: sadd_nxv1i64_vx:
633; RV32:       # %bb.0:
634; RV32-NEXT:    addi sp, sp, -16
635; RV32-NEXT:    .cfi_def_cfa_offset 16
636; RV32-NEXT:    sw a0, 8(sp)
637; RV32-NEXT:    sw a1, 12(sp)
638; RV32-NEXT:    addi a0, sp, 8
639; RV32-NEXT:    vsetvli a1, zero, e64, m1, ta, ma
640; RV32-NEXT:    vlse64.v v9, (a0), zero
641; RV32-NEXT:    vsadd.vv v8, v8, v9
642; RV32-NEXT:    addi sp, sp, 16
643; RV32-NEXT:    .cfi_def_cfa_offset 0
644; RV32-NEXT:    ret
645;
646; RV64-LABEL: sadd_nxv1i64_vx:
647; RV64:       # %bb.0:
648; RV64-NEXT:    vsetvli a1, zero, e64, m1, ta, ma
649; RV64-NEXT:    vsadd.vx v8, v8, a0
650; RV64-NEXT:    ret
651  %elt.head = insertelement <vscale x 1 x i64> poison, i64 %b, i32 0
652  %vb = shufflevector <vscale x 1 x i64> %elt.head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
653  %v = call <vscale x 1 x i64> @llvm.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %vb)
654  ret <vscale x 1 x i64> %v
655}
656
657define <vscale x 1 x i64> @sadd_nxv1i64_vi(<vscale x 1 x i64> %va) {
658; CHECK-LABEL: sadd_nxv1i64_vi:
659; CHECK:       # %bb.0:
660; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
661; CHECK-NEXT:    vsadd.vi v8, v8, 5
662; CHECK-NEXT:    ret
663  %v = call <vscale x 1 x i64> @llvm.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> splat (i64 5))
664  ret <vscale x 1 x i64> %v
665}
666
667declare <vscale x 2 x i64> @llvm.sadd.sat.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>)
668
669define <vscale x 2 x i64> @sadd_nxv2i64_vv(<vscale x 2 x i64> %va, <vscale x 2 x i64> %b) {
670; CHECK-LABEL: sadd_nxv2i64_vv:
671; CHECK:       # %bb.0:
672; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
673; CHECK-NEXT:    vsadd.vv v8, v8, v10
674; CHECK-NEXT:    ret
675  %v = call <vscale x 2 x i64> @llvm.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %b)
676  ret <vscale x 2 x i64> %v
677}
678
679define <vscale x 2 x i64> @sadd_nxv2i64_vx(<vscale x 2 x i64> %va, i64 %b) {
680; RV32-LABEL: sadd_nxv2i64_vx:
681; RV32:       # %bb.0:
682; RV32-NEXT:    addi sp, sp, -16
683; RV32-NEXT:    .cfi_def_cfa_offset 16
684; RV32-NEXT:    sw a0, 8(sp)
685; RV32-NEXT:    sw a1, 12(sp)
686; RV32-NEXT:    addi a0, sp, 8
687; RV32-NEXT:    vsetvli a1, zero, e64, m2, ta, ma
688; RV32-NEXT:    vlse64.v v10, (a0), zero
689; RV32-NEXT:    vsadd.vv v8, v8, v10
690; RV32-NEXT:    addi sp, sp, 16
691; RV32-NEXT:    .cfi_def_cfa_offset 0
692; RV32-NEXT:    ret
693;
694; RV64-LABEL: sadd_nxv2i64_vx:
695; RV64:       # %bb.0:
696; RV64-NEXT:    vsetvli a1, zero, e64, m2, ta, ma
697; RV64-NEXT:    vsadd.vx v8, v8, a0
698; RV64-NEXT:    ret
699  %elt.head = insertelement <vscale x 2 x i64> poison, i64 %b, i32 0
700  %vb = shufflevector <vscale x 2 x i64> %elt.head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
701  %v = call <vscale x 2 x i64> @llvm.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %vb)
702  ret <vscale x 2 x i64> %v
703}
704
705define <vscale x 2 x i64> @sadd_nxv2i64_vi(<vscale x 2 x i64> %va) {
706; CHECK-LABEL: sadd_nxv2i64_vi:
707; CHECK:       # %bb.0:
708; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
709; CHECK-NEXT:    vsadd.vi v8, v8, 5
710; CHECK-NEXT:    ret
711  %v = call <vscale x 2 x i64> @llvm.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> splat (i64 5))
712  ret <vscale x 2 x i64> %v
713}
714
715declare <vscale x 4 x i64> @llvm.sadd.sat.nxv4i64(<vscale x 4 x i64>, <vscale x 4 x i64>)
716
717define <vscale x 4 x i64> @sadd_nxv4i64_vv(<vscale x 4 x i64> %va, <vscale x 4 x i64> %b) {
718; CHECK-LABEL: sadd_nxv4i64_vv:
719; CHECK:       # %bb.0:
720; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
721; CHECK-NEXT:    vsadd.vv v8, v8, v12
722; CHECK-NEXT:    ret
723  %v = call <vscale x 4 x i64> @llvm.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %b)
724  ret <vscale x 4 x i64> %v
725}
726
727define <vscale x 4 x i64> @sadd_nxv4i64_vx(<vscale x 4 x i64> %va, i64 %b) {
728; RV32-LABEL: sadd_nxv4i64_vx:
729; RV32:       # %bb.0:
730; RV32-NEXT:    addi sp, sp, -16
731; RV32-NEXT:    .cfi_def_cfa_offset 16
732; RV32-NEXT:    sw a0, 8(sp)
733; RV32-NEXT:    sw a1, 12(sp)
734; RV32-NEXT:    addi a0, sp, 8
735; RV32-NEXT:    vsetvli a1, zero, e64, m4, ta, ma
736; RV32-NEXT:    vlse64.v v12, (a0), zero
737; RV32-NEXT:    vsadd.vv v8, v8, v12
738; RV32-NEXT:    addi sp, sp, 16
739; RV32-NEXT:    .cfi_def_cfa_offset 0
740; RV32-NEXT:    ret
741;
742; RV64-LABEL: sadd_nxv4i64_vx:
743; RV64:       # %bb.0:
744; RV64-NEXT:    vsetvli a1, zero, e64, m4, ta, ma
745; RV64-NEXT:    vsadd.vx v8, v8, a0
746; RV64-NEXT:    ret
747  %elt.head = insertelement <vscale x 4 x i64> poison, i64 %b, i32 0
748  %vb = shufflevector <vscale x 4 x i64> %elt.head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
749  %v = call <vscale x 4 x i64> @llvm.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %vb)
750  ret <vscale x 4 x i64> %v
751}
752
753define <vscale x 4 x i64> @sadd_nxv4i64_vi(<vscale x 4 x i64> %va) {
754; CHECK-LABEL: sadd_nxv4i64_vi:
755; CHECK:       # %bb.0:
756; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
757; CHECK-NEXT:    vsadd.vi v8, v8, 5
758; CHECK-NEXT:    ret
759  %v = call <vscale x 4 x i64> @llvm.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> splat (i64 5))
760  ret <vscale x 4 x i64> %v
761}
762
763declare <vscale x 8 x i64> @llvm.sadd.sat.nxv8i64(<vscale x 8 x i64>, <vscale x 8 x i64>)
764
765define <vscale x 8 x i64> @sadd_nxv8i64_vv(<vscale x 8 x i64> %va, <vscale x 8 x i64> %b) {
766; CHECK-LABEL: sadd_nxv8i64_vv:
767; CHECK:       # %bb.0:
768; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
769; CHECK-NEXT:    vsadd.vv v8, v8, v16
770; CHECK-NEXT:    ret
771  %v = call <vscale x 8 x i64> @llvm.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %b)
772  ret <vscale x 8 x i64> %v
773}
774
775define <vscale x 8 x i64> @sadd_nxv8i64_vx(<vscale x 8 x i64> %va, i64 %b) {
776; RV32-LABEL: sadd_nxv8i64_vx:
777; RV32:       # %bb.0:
778; RV32-NEXT:    addi sp, sp, -16
779; RV32-NEXT:    .cfi_def_cfa_offset 16
780; RV32-NEXT:    sw a0, 8(sp)
781; RV32-NEXT:    sw a1, 12(sp)
782; RV32-NEXT:    addi a0, sp, 8
783; RV32-NEXT:    vsetvli a1, zero, e64, m8, ta, ma
784; RV32-NEXT:    vlse64.v v16, (a0), zero
785; RV32-NEXT:    vsadd.vv v8, v8, v16
786; RV32-NEXT:    addi sp, sp, 16
787; RV32-NEXT:    .cfi_def_cfa_offset 0
788; RV32-NEXT:    ret
789;
790; RV64-LABEL: sadd_nxv8i64_vx:
791; RV64:       # %bb.0:
792; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma
793; RV64-NEXT:    vsadd.vx v8, v8, a0
794; RV64-NEXT:    ret
795  %elt.head = insertelement <vscale x 8 x i64> poison, i64 %b, i32 0
796  %vb = shufflevector <vscale x 8 x i64> %elt.head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
797  %v = call <vscale x 8 x i64> @llvm.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb)
798  ret <vscale x 8 x i64> %v
799}
800
801define <vscale x 8 x i64> @sadd_nxv8i64_vi(<vscale x 8 x i64> %va) {
802; CHECK-LABEL: sadd_nxv8i64_vi:
803; CHECK:       # %bb.0:
804; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
805; CHECK-NEXT:    vsadd.vi v8, v8, 5
806; CHECK-NEXT:    ret
807  %v = call <vscale x 8 x i64> @llvm.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> splat (i64 5))
808  ret <vscale x 8 x i64> %v
809}
810