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:
12 ; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma
13 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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:
22 ; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma
23 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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:
34 ; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma
35 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
43 declare <vscale x 2 x i8> @llvm.sadd.sat.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i8>)
45 define <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:
48 ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma
49 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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
55 define <vscale x 2 x i8> @sadd_nxv2i8_vx(<vscale x 2 x i8> %va, i8 %b) {
56 ; CHECK-LABEL: sadd_nxv2i8_vx:
58 ; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma
59 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
67 define <vscale x 2 x i8> @sadd_nxv2i8_vi(<vscale x 2 x i8> %va) {
68 ; CHECK-LABEL: sadd_nxv2i8_vi:
70 ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma
71 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
79 declare <vscale x 4 x i8> @llvm.sadd.sat.nxv4i8(<vscale x 4 x i8>, <vscale x 4 x i8>)
81 define <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:
84 ; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
85 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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
91 define <vscale x 4 x i8> @sadd_nxv4i8_vx(<vscale x 4 x i8> %va, i8 %b) {
92 ; CHECK-LABEL: sadd_nxv4i8_vx:
94 ; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma
95 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
103 define <vscale x 4 x i8> @sadd_nxv4i8_vi(<vscale x 4 x i8> %va) {
104 ; CHECK-LABEL: sadd_nxv4i8_vi:
106 ; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
107 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
115 declare <vscale x 8 x i8> @llvm.sadd.sat.nxv8i8(<vscale x 8 x i8>, <vscale x 8 x i8>)
117 define <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:
120 ; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma
121 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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
127 define <vscale x 8 x i8> @sadd_nxv8i8_vx(<vscale x 8 x i8> %va, i8 %b) {
128 ; CHECK-LABEL: sadd_nxv8i8_vx:
130 ; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma
131 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
139 define <vscale x 8 x i8> @sadd_nxv8i8_vi(<vscale x 8 x i8> %va) {
140 ; CHECK-LABEL: sadd_nxv8i8_vi:
142 ; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma
143 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
151 declare <vscale x 16 x i8> @llvm.sadd.sat.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>)
153 define <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:
156 ; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma
157 ; CHECK-NEXT: vsadd.vv v8, v8, v10
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
163 define <vscale x 16 x i8> @sadd_nxv16i8_vx(<vscale x 16 x i8> %va, i8 %b) {
164 ; CHECK-LABEL: sadd_nxv16i8_vx:
166 ; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma
167 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
175 define <vscale x 16 x i8> @sadd_nxv16i8_vi(<vscale x 16 x i8> %va) {
176 ; CHECK-LABEL: sadd_nxv16i8_vi:
178 ; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma
179 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
187 declare <vscale x 32 x i8> @llvm.sadd.sat.nxv32i8(<vscale x 32 x i8>, <vscale x 32 x i8>)
189 define <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:
192 ; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma
193 ; CHECK-NEXT: vsadd.vv v8, v8, v12
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
199 define <vscale x 32 x i8> @sadd_nxv32i8_vx(<vscale x 32 x i8> %va, i8 %b) {
200 ; CHECK-LABEL: sadd_nxv32i8_vx:
202 ; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma
203 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
211 define <vscale x 32 x i8> @sadd_nxv32i8_vi(<vscale x 32 x i8> %va) {
212 ; CHECK-LABEL: sadd_nxv32i8_vi:
214 ; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma
215 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
223 declare <vscale x 64 x i8> @llvm.sadd.sat.nxv64i8(<vscale x 64 x i8>, <vscale x 64 x i8>)
225 define <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:
228 ; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma
229 ; CHECK-NEXT: vsadd.vv v8, v8, v16
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
235 define <vscale x 64 x i8> @sadd_nxv64i8_vx(<vscale x 64 x i8> %va, i8 %b) {
236 ; CHECK-LABEL: sadd_nxv64i8_vx:
238 ; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma
239 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
247 define <vscale x 64 x i8> @sadd_nxv64i8_vi(<vscale x 64 x i8> %va) {
248 ; CHECK-LABEL: sadd_nxv64i8_vi:
250 ; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma
251 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
259 declare <vscale x 1 x i16> @llvm.sadd.sat.nxv1i16(<vscale x 1 x i16>, <vscale x 1 x i16>)
261 define <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:
264 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
265 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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
271 define <vscale x 1 x i16> @sadd_nxv1i16_vx(<vscale x 1 x i16> %va, i16 %b) {
272 ; CHECK-LABEL: sadd_nxv1i16_vx:
274 ; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma
275 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
283 define <vscale x 1 x i16> @sadd_nxv1i16_vi(<vscale x 1 x i16> %va) {
284 ; CHECK-LABEL: sadd_nxv1i16_vi:
286 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
287 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
295 declare <vscale x 2 x i16> @llvm.sadd.sat.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i16>)
297 define <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:
300 ; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
301 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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
307 define <vscale x 2 x i16> @sadd_nxv2i16_vx(<vscale x 2 x i16> %va, i16 %b) {
308 ; CHECK-LABEL: sadd_nxv2i16_vx:
310 ; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
311 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
319 define <vscale x 2 x i16> @sadd_nxv2i16_vi(<vscale x 2 x i16> %va) {
320 ; CHECK-LABEL: sadd_nxv2i16_vi:
322 ; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
323 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
331 declare <vscale x 4 x i16> @llvm.sadd.sat.nxv4i16(<vscale x 4 x i16>, <vscale x 4 x i16>)
333 define <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:
336 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
337 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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
343 define <vscale x 4 x i16> @sadd_nxv4i16_vx(<vscale x 4 x i16> %va, i16 %b) {
344 ; CHECK-LABEL: sadd_nxv4i16_vx:
346 ; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma
347 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
355 define <vscale x 4 x i16> @sadd_nxv4i16_vi(<vscale x 4 x i16> %va) {
356 ; CHECK-LABEL: sadd_nxv4i16_vi:
358 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
359 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
367 declare <vscale x 8 x i16> @llvm.sadd.sat.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>)
369 define <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:
372 ; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma
373 ; CHECK-NEXT: vsadd.vv v8, v8, v10
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
379 define <vscale x 8 x i16> @sadd_nxv8i16_vx(<vscale x 8 x i16> %va, i16 %b) {
380 ; CHECK-LABEL: sadd_nxv8i16_vx:
382 ; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma
383 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
391 define <vscale x 8 x i16> @sadd_nxv8i16_vi(<vscale x 8 x i16> %va) {
392 ; CHECK-LABEL: sadd_nxv8i16_vi:
394 ; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma
395 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
403 declare <vscale x 16 x i16> @llvm.sadd.sat.nxv16i16(<vscale x 16 x i16>, <vscale x 16 x i16>)
405 define <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:
408 ; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma
409 ; CHECK-NEXT: vsadd.vv v8, v8, v12
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
415 define <vscale x 16 x i16> @sadd_nxv16i16_vx(<vscale x 16 x i16> %va, i16 %b) {
416 ; CHECK-LABEL: sadd_nxv16i16_vx:
418 ; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma
419 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
427 define <vscale x 16 x i16> @sadd_nxv16i16_vi(<vscale x 16 x i16> %va) {
428 ; CHECK-LABEL: sadd_nxv16i16_vi:
430 ; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma
431 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
439 declare <vscale x 32 x i16> @llvm.sadd.sat.nxv32i16(<vscale x 32 x i16>, <vscale x 32 x i16>)
441 define <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:
444 ; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma
445 ; CHECK-NEXT: vsadd.vv v8, v8, v16
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
451 define <vscale x 32 x i16> @sadd_nxv32i16_vx(<vscale x 32 x i16> %va, i16 %b) {
452 ; CHECK-LABEL: sadd_nxv32i16_vx:
454 ; CHECK-NEXT: vsetvli a1, zero, e16, m8, ta, ma
455 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
463 define <vscale x 32 x i16> @sadd_nxv32i16_vi(<vscale x 32 x i16> %va) {
464 ; CHECK-LABEL: sadd_nxv32i16_vi:
466 ; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma
467 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
475 declare <vscale x 1 x i32> @llvm.sadd.sat.nxv1i32(<vscale x 1 x i32>, <vscale x 1 x i32>)
477 define <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:
480 ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
481 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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
487 define <vscale x 1 x i32> @sadd_nxv1i32_vx(<vscale x 1 x i32> %va, i32 %b) {
488 ; CHECK-LABEL: sadd_nxv1i32_vx:
490 ; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma
491 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
499 define <vscale x 1 x i32> @sadd_nxv1i32_vi(<vscale x 1 x i32> %va) {
500 ; CHECK-LABEL: sadd_nxv1i32_vi:
502 ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
503 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
511 declare <vscale x 2 x i32> @llvm.sadd.sat.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>)
513 define <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:
516 ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma
517 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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
523 define <vscale x 2 x i32> @sadd_nxv2i32_vx(<vscale x 2 x i32> %va, i32 %b) {
524 ; CHECK-LABEL: sadd_nxv2i32_vx:
526 ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma
527 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
535 define <vscale x 2 x i32> @sadd_nxv2i32_vi(<vscale x 2 x i32> %va) {
536 ; CHECK-LABEL: sadd_nxv2i32_vi:
538 ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma
539 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
547 declare <vscale x 4 x i32> @llvm.sadd.sat.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>)
549 define <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:
552 ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma
553 ; CHECK-NEXT: vsadd.vv v8, v8, v10
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
559 define <vscale x 4 x i32> @sadd_nxv4i32_vx(<vscale x 4 x i32> %va, i32 %b) {
560 ; CHECK-LABEL: sadd_nxv4i32_vx:
562 ; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma
563 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
571 define <vscale x 4 x i32> @sadd_nxv4i32_vi(<vscale x 4 x i32> %va) {
572 ; CHECK-LABEL: sadd_nxv4i32_vi:
574 ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma
575 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
583 declare <vscale x 8 x i32> @llvm.sadd.sat.nxv8i32(<vscale x 8 x i32>, <vscale x 8 x i32>)
585 define <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:
588 ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
589 ; CHECK-NEXT: vsadd.vv v8, v8, v12
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
595 define <vscale x 8 x i32> @sadd_nxv8i32_vx(<vscale x 8 x i32> %va, i32 %b) {
596 ; CHECK-LABEL: sadd_nxv8i32_vx:
598 ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma
599 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
607 define <vscale x 8 x i32> @sadd_nxv8i32_vi(<vscale x 8 x i32> %va) {
608 ; CHECK-LABEL: sadd_nxv8i32_vi:
610 ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
611 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
619 declare <vscale x 16 x i32> @llvm.sadd.sat.nxv16i32(<vscale x 16 x i32>, <vscale x 16 x i32>)
621 define <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:
624 ; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma
625 ; CHECK-NEXT: vsadd.vv v8, v8, v16
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
631 define <vscale x 16 x i32> @sadd_nxv16i32_vx(<vscale x 16 x i32> %va, i32 %b) {
632 ; CHECK-LABEL: sadd_nxv16i32_vx:
634 ; CHECK-NEXT: vsetvli a1, zero, e32, m8, ta, ma
635 ; CHECK-NEXT: vsadd.vx v8, v8, a0
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
643 define <vscale x 16 x i32> @sadd_nxv16i32_vi(<vscale x 16 x i32> %va) {
644 ; CHECK-LABEL: sadd_nxv16i32_vi:
646 ; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma
647 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
655 declare <vscale x 1 x i64> @llvm.sadd.sat.nxv1i64(<vscale x 1 x i64>, <vscale x 1 x i64>)
657 define <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:
660 ; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma
661 ; CHECK-NEXT: vsadd.vv v8, v8, v9
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
667 define <vscale x 1 x i64> @sadd_nxv1i64_vx(<vscale x 1 x i64> %va, i64 %b) {
668 ; RV32-LABEL: sadd_nxv1i64_vx:
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, ma
676 ; RV32-NEXT: vlse64.v v9, (a0), zero
677 ; RV32-NEXT: vsadd.vv v8, v8, v9
678 ; RV32-NEXT: addi sp, sp, 16
681 ; RV64-LABEL: sadd_nxv1i64_vx:
683 ; RV64-NEXT: vsetvli a1, zero, e64, m1, ta, ma
684 ; RV64-NEXT: vsadd.vx v8, v8, a0
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
692 define <vscale x 1 x i64> @sadd_nxv1i64_vi(<vscale x 1 x i64> %va) {
693 ; CHECK-LABEL: sadd_nxv1i64_vi:
695 ; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma
696 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
704 declare <vscale x 2 x i64> @llvm.sadd.sat.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>)
706 define <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:
709 ; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma
710 ; CHECK-NEXT: vsadd.vv v8, v8, v10
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
716 define <vscale x 2 x i64> @sadd_nxv2i64_vx(<vscale x 2 x i64> %va, i64 %b) {
717 ; RV32-LABEL: sadd_nxv2i64_vx:
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, ma
725 ; RV32-NEXT: vlse64.v v10, (a0), zero
726 ; RV32-NEXT: vsadd.vv v8, v8, v10
727 ; RV32-NEXT: addi sp, sp, 16
730 ; RV64-LABEL: sadd_nxv2i64_vx:
732 ; RV64-NEXT: vsetvli a1, zero, e64, m2, ta, ma
733 ; RV64-NEXT: vsadd.vx v8, v8, a0
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
741 define <vscale x 2 x i64> @sadd_nxv2i64_vi(<vscale x 2 x i64> %va) {
742 ; CHECK-LABEL: sadd_nxv2i64_vi:
744 ; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma
745 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
753 declare <vscale x 4 x i64> @llvm.sadd.sat.nxv4i64(<vscale x 4 x i64>, <vscale x 4 x i64>)
755 define <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:
758 ; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma
759 ; CHECK-NEXT: vsadd.vv v8, v8, v12
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
765 define <vscale x 4 x i64> @sadd_nxv4i64_vx(<vscale x 4 x i64> %va, i64 %b) {
766 ; RV32-LABEL: sadd_nxv4i64_vx:
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, ma
774 ; RV32-NEXT: vlse64.v v12, (a0), zero
775 ; RV32-NEXT: vsadd.vv v8, v8, v12
776 ; RV32-NEXT: addi sp, sp, 16
779 ; RV64-LABEL: sadd_nxv4i64_vx:
781 ; RV64-NEXT: vsetvli a1, zero, e64, m4, ta, ma
782 ; RV64-NEXT: vsadd.vx v8, v8, a0
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
790 define <vscale x 4 x i64> @sadd_nxv4i64_vi(<vscale x 4 x i64> %va) {
791 ; CHECK-LABEL: sadd_nxv4i64_vi:
793 ; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma
794 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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
802 declare <vscale x 8 x i64> @llvm.sadd.sat.nxv8i64(<vscale x 8 x i64>, <vscale x 8 x i64>)
804 define <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:
807 ; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma
808 ; CHECK-NEXT: vsadd.vv v8, v8, v16
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
814 define <vscale x 8 x i64> @sadd_nxv8i64_vx(<vscale x 8 x i64> %va, i64 %b) {
815 ; RV32-LABEL: sadd_nxv8i64_vx:
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, ma
823 ; RV32-NEXT: vlse64.v v16, (a0), zero
824 ; RV32-NEXT: vsadd.vv v8, v8, v16
825 ; RV32-NEXT: addi sp, sp, 16
828 ; RV64-LABEL: sadd_nxv8i64_vx:
830 ; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma
831 ; RV64-NEXT: vsadd.vx v8, v8, a0
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
839 define <vscale x 8 x i64> @sadd_nxv8i64_vi(<vscale x 8 x i64> %va) {
840 ; CHECK-LABEL: sadd_nxv8i64_vi:
842 ; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma
843 ; CHECK-NEXT: vsadd.vi v8, v8, 5
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