[RISCV] Support postRA vsetvl insertion pass (#70549)
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vsadd-sdnode.ll
blob6a8b801254057bb3c2f82d16aef28dbcc5bfa1f9
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck %s --check-prefixes=CHECK,RV32
4 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck %s --check-prefixes=CHECK,RV64
7 declare <vscale x 1 x i8> @llvm.sadd.sat.nxv1i8(<vscale x 1 x i8>, <vscale x 1 x i8>)
9 define <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
19 define <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
31 define <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
41 declare <vscale x 2 x i8> @llvm.sadd.sat.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i8>)
43 define <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
53 define <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
65 define <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
75 declare <vscale x 4 x i8> @llvm.sadd.sat.nxv4i8(<vscale x 4 x i8>, <vscale x 4 x i8>)
77 define <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
87 define <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
99 define <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
109 declare <vscale x 8 x i8> @llvm.sadd.sat.nxv8i8(<vscale x 8 x i8>, <vscale x 8 x i8>)
111 define <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
121 define <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
133 define <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
143 declare <vscale x 16 x i8> @llvm.sadd.sat.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>)
145 define <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
155 define <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
167 define <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
177 declare <vscale x 32 x i8> @llvm.sadd.sat.nxv32i8(<vscale x 32 x i8>, <vscale x 32 x i8>)
179 define <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
189 define <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
201 define <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
211 declare <vscale x 64 x i8> @llvm.sadd.sat.nxv64i8(<vscale x 64 x i8>, <vscale x 64 x i8>)
213 define <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
223 define <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
235 define <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
245 declare <vscale x 1 x i16> @llvm.sadd.sat.nxv1i16(<vscale x 1 x i16>, <vscale x 1 x i16>)
247 define <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
257 define <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
269 define <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
279 declare <vscale x 2 x i16> @llvm.sadd.sat.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i16>)
281 define <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
291 define <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
303 define <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
313 declare <vscale x 4 x i16> @llvm.sadd.sat.nxv4i16(<vscale x 4 x i16>, <vscale x 4 x i16>)
315 define <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
325 define <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
337 define <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
347 declare <vscale x 8 x i16> @llvm.sadd.sat.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>)
349 define <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
359 define <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
371 define <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
381 declare <vscale x 16 x i16> @llvm.sadd.sat.nxv16i16(<vscale x 16 x i16>, <vscale x 16 x i16>)
383 define <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
393 define <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
405 define <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
415 declare <vscale x 32 x i16> @llvm.sadd.sat.nxv32i16(<vscale x 32 x i16>, <vscale x 32 x i16>)
417 define <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
427 define <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
439 define <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
449 declare <vscale x 1 x i32> @llvm.sadd.sat.nxv1i32(<vscale x 1 x i32>, <vscale x 1 x i32>)
451 define <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
461 define <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
473 define <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
483 declare <vscale x 2 x i32> @llvm.sadd.sat.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>)
485 define <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
495 define <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
507 define <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
517 declare <vscale x 4 x i32> @llvm.sadd.sat.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>)
519 define <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
529 define <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
541 define <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
551 declare <vscale x 8 x i32> @llvm.sadd.sat.nxv8i32(<vscale x 8 x i32>, <vscale x 8 x i32>)
553 define <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
563 define <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
575 define <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
585 declare <vscale x 16 x i32> @llvm.sadd.sat.nxv16i32(<vscale x 16 x i32>, <vscale x 16 x i32>)
587 define <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
597 define <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
609 define <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
619 declare <vscale x 1 x i64> @llvm.sadd.sat.nxv1i64(<vscale x 1 x i64>, <vscale x 1 x i64>)
621 define <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
631 define <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 a1, 12(sp)
637 ; RV32-NEXT:    sw a0, 8(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:    ret
645 ; RV64-LABEL: sadd_nxv1i64_vx:
646 ; RV64:       # %bb.0:
647 ; RV64-NEXT:    vsetvli a1, zero, e64, m1, ta, ma
648 ; RV64-NEXT:    vsadd.vx v8, v8, a0
649 ; RV64-NEXT:    ret
650   %elt.head = insertelement <vscale x 1 x i64> poison, i64 %b, i32 0
651   %vb = shufflevector <vscale x 1 x i64> %elt.head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
652   %v = call <vscale x 1 x i64> @llvm.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %vb)
653   ret <vscale x 1 x i64> %v
656 define <vscale x 1 x i64> @sadd_nxv1i64_vi(<vscale x 1 x i64> %va) {
657 ; CHECK-LABEL: sadd_nxv1i64_vi:
658 ; CHECK:       # %bb.0:
659 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
660 ; CHECK-NEXT:    vsadd.vi v8, v8, 5
661 ; CHECK-NEXT:    ret
662   %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))
663   ret <vscale x 1 x i64> %v
666 declare <vscale x 2 x i64> @llvm.sadd.sat.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>)
668 define <vscale x 2 x i64> @sadd_nxv2i64_vv(<vscale x 2 x i64> %va, <vscale x 2 x i64> %b) {
669 ; CHECK-LABEL: sadd_nxv2i64_vv:
670 ; CHECK:       # %bb.0:
671 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
672 ; CHECK-NEXT:    vsadd.vv v8, v8, v10
673 ; CHECK-NEXT:    ret
674   %v = call <vscale x 2 x i64> @llvm.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %b)
675   ret <vscale x 2 x i64> %v
678 define <vscale x 2 x i64> @sadd_nxv2i64_vx(<vscale x 2 x i64> %va, i64 %b) {
679 ; RV32-LABEL: sadd_nxv2i64_vx:
680 ; RV32:       # %bb.0:
681 ; RV32-NEXT:    addi sp, sp, -16
682 ; RV32-NEXT:    .cfi_def_cfa_offset 16
683 ; RV32-NEXT:    sw a1, 12(sp)
684 ; RV32-NEXT:    sw a0, 8(sp)
685 ; RV32-NEXT:    addi a0, sp, 8
686 ; RV32-NEXT:    vsetvli a1, zero, e64, m2, ta, ma
687 ; RV32-NEXT:    vlse64.v v10, (a0), zero
688 ; RV32-NEXT:    vsadd.vv v8, v8, v10
689 ; RV32-NEXT:    addi sp, sp, 16
690 ; RV32-NEXT:    ret
692 ; RV64-LABEL: sadd_nxv2i64_vx:
693 ; RV64:       # %bb.0:
694 ; RV64-NEXT:    vsetvli a1, zero, e64, m2, ta, ma
695 ; RV64-NEXT:    vsadd.vx v8, v8, a0
696 ; RV64-NEXT:    ret
697   %elt.head = insertelement <vscale x 2 x i64> poison, i64 %b, i32 0
698   %vb = shufflevector <vscale x 2 x i64> %elt.head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
699   %v = call <vscale x 2 x i64> @llvm.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %vb)
700   ret <vscale x 2 x i64> %v
703 define <vscale x 2 x i64> @sadd_nxv2i64_vi(<vscale x 2 x i64> %va) {
704 ; CHECK-LABEL: sadd_nxv2i64_vi:
705 ; CHECK:       # %bb.0:
706 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
707 ; CHECK-NEXT:    vsadd.vi v8, v8, 5
708 ; CHECK-NEXT:    ret
709   %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))
710   ret <vscale x 2 x i64> %v
713 declare <vscale x 4 x i64> @llvm.sadd.sat.nxv4i64(<vscale x 4 x i64>, <vscale x 4 x i64>)
715 define <vscale x 4 x i64> @sadd_nxv4i64_vv(<vscale x 4 x i64> %va, <vscale x 4 x i64> %b) {
716 ; CHECK-LABEL: sadd_nxv4i64_vv:
717 ; CHECK:       # %bb.0:
718 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
719 ; CHECK-NEXT:    vsadd.vv v8, v8, v12
720 ; CHECK-NEXT:    ret
721   %v = call <vscale x 4 x i64> @llvm.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %b)
722   ret <vscale x 4 x i64> %v
725 define <vscale x 4 x i64> @sadd_nxv4i64_vx(<vscale x 4 x i64> %va, i64 %b) {
726 ; RV32-LABEL: sadd_nxv4i64_vx:
727 ; RV32:       # %bb.0:
728 ; RV32-NEXT:    addi sp, sp, -16
729 ; RV32-NEXT:    .cfi_def_cfa_offset 16
730 ; RV32-NEXT:    sw a1, 12(sp)
731 ; RV32-NEXT:    sw a0, 8(sp)
732 ; RV32-NEXT:    addi a0, sp, 8
733 ; RV32-NEXT:    vsetvli a1, zero, e64, m4, ta, ma
734 ; RV32-NEXT:    vlse64.v v12, (a0), zero
735 ; RV32-NEXT:    vsadd.vv v8, v8, v12
736 ; RV32-NEXT:    addi sp, sp, 16
737 ; RV32-NEXT:    ret
739 ; RV64-LABEL: sadd_nxv4i64_vx:
740 ; RV64:       # %bb.0:
741 ; RV64-NEXT:    vsetvli a1, zero, e64, m4, ta, ma
742 ; RV64-NEXT:    vsadd.vx v8, v8, a0
743 ; RV64-NEXT:    ret
744   %elt.head = insertelement <vscale x 4 x i64> poison, i64 %b, i32 0
745   %vb = shufflevector <vscale x 4 x i64> %elt.head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
746   %v = call <vscale x 4 x i64> @llvm.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %vb)
747   ret <vscale x 4 x i64> %v
750 define <vscale x 4 x i64> @sadd_nxv4i64_vi(<vscale x 4 x i64> %va) {
751 ; CHECK-LABEL: sadd_nxv4i64_vi:
752 ; CHECK:       # %bb.0:
753 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
754 ; CHECK-NEXT:    vsadd.vi v8, v8, 5
755 ; CHECK-NEXT:    ret
756   %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))
757   ret <vscale x 4 x i64> %v
760 declare <vscale x 8 x i64> @llvm.sadd.sat.nxv8i64(<vscale x 8 x i64>, <vscale x 8 x i64>)
762 define <vscale x 8 x i64> @sadd_nxv8i64_vv(<vscale x 8 x i64> %va, <vscale x 8 x i64> %b) {
763 ; CHECK-LABEL: sadd_nxv8i64_vv:
764 ; CHECK:       # %bb.0:
765 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
766 ; CHECK-NEXT:    vsadd.vv v8, v8, v16
767 ; CHECK-NEXT:    ret
768   %v = call <vscale x 8 x i64> @llvm.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %b)
769   ret <vscale x 8 x i64> %v
772 define <vscale x 8 x i64> @sadd_nxv8i64_vx(<vscale x 8 x i64> %va, i64 %b) {
773 ; RV32-LABEL: sadd_nxv8i64_vx:
774 ; RV32:       # %bb.0:
775 ; RV32-NEXT:    addi sp, sp, -16
776 ; RV32-NEXT:    .cfi_def_cfa_offset 16
777 ; RV32-NEXT:    sw a1, 12(sp)
778 ; RV32-NEXT:    sw a0, 8(sp)
779 ; RV32-NEXT:    addi a0, sp, 8
780 ; RV32-NEXT:    vsetvli a1, zero, e64, m8, ta, ma
781 ; RV32-NEXT:    vlse64.v v16, (a0), zero
782 ; RV32-NEXT:    vsadd.vv v8, v8, v16
783 ; RV32-NEXT:    addi sp, sp, 16
784 ; RV32-NEXT:    ret
786 ; RV64-LABEL: sadd_nxv8i64_vx:
787 ; RV64:       # %bb.0:
788 ; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma
789 ; RV64-NEXT:    vsadd.vx v8, v8, a0
790 ; RV64-NEXT:    ret
791   %elt.head = insertelement <vscale x 8 x i64> poison, i64 %b, i32 0
792   %vb = shufflevector <vscale x 8 x i64> %elt.head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
793   %v = call <vscale x 8 x i64> @llvm.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb)
794   ret <vscale x 8 x i64> %v
797 define <vscale x 8 x i64> @sadd_nxv8i64_vi(<vscale x 8 x i64> %va) {
798 ; CHECK-LABEL: sadd_nxv8i64_vi:
799 ; CHECK:       # %bb.0:
800 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
801 ; CHECK-NEXT:    vsadd.vi v8, v8, 5
802 ; CHECK-NEXT:    ret
803   %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))
804   ret <vscale x 8 x i64> %v