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