Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-streaming-mode-fixed-length-int-arith.ll
blobe3c4b6f1cb53f938f0bc105e500f4a2a35828d9d
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve -force-streaming-compatible-sve  < %s | FileCheck %s --check-prefixes=CHECK,SVE
3 ; RUN: llc -mattr=+sve2 -force-streaming-compatible-sve  < %s | FileCheck %s --check-prefixes=CHECK,SVE2
4 ; RUN: llc -mattr=+sme -force-streaming-compatible-sve  < %s | FileCheck %s --check-prefixes=CHECK,SVE2
6 target triple = "aarch64-unknown-linux-gnu"
9 ; ADD
11 define <4 x i8> @add_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
12 ; CHECK-LABEL: add_v4i8:
13 ; CHECK:       // %bb.0:
14 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
15 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
16 ; CHECK-NEXT:    add z0.h, z0.h, z1.h
17 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
18 ; CHECK-NEXT:    ret
19   %res = add <4 x i8> %op1, %op2
20   ret <4 x i8> %res
23 define <8 x i8> @add_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
24 ; CHECK-LABEL: add_v8i8:
25 ; CHECK:       // %bb.0:
26 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
27 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
28 ; CHECK-NEXT:    add z0.b, z0.b, z1.b
29 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
30 ; CHECK-NEXT:    ret
31   %res = add <8 x i8> %op1, %op2
32   ret <8 x i8> %res
35 define <16 x i8> @add_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
36 ; CHECK-LABEL: add_v16i8:
37 ; CHECK:       // %bb.0:
38 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
39 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
40 ; CHECK-NEXT:    add z0.b, z0.b, z1.b
41 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
42 ; CHECK-NEXT:    ret
43   %res = add <16 x i8> %op1, %op2
44   ret <16 x i8> %res
47 define void @add_v32i8(ptr %a, ptr %b) {
48 ; CHECK-LABEL: add_v32i8:
49 ; CHECK:       // %bb.0:
50 ; CHECK-NEXT:    ldp q0, q3, [x1]
51 ; CHECK-NEXT:    ldp q1, q2, [x0]
52 ; CHECK-NEXT:    add z0.b, z1.b, z0.b
53 ; CHECK-NEXT:    add z1.b, z2.b, z3.b
54 ; CHECK-NEXT:    stp q0, q1, [x0]
55 ; CHECK-NEXT:    ret
56   %op1 = load <32 x i8>, ptr %a
57   %op2 = load <32 x i8>, ptr %b
58   %res = add <32 x i8> %op1, %op2
59   store <32 x i8> %res, ptr %a
60   ret void
63 define <2 x i16> @add_v2i16(<2 x i16> %op1, <2 x i16> %op2) {
64 ; CHECK-LABEL: add_v2i16:
65 ; CHECK:       // %bb.0:
66 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
67 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
68 ; CHECK-NEXT:    add z0.s, z0.s, z1.s
69 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
70 ; CHECK-NEXT:    ret
71   %res = add <2 x i16> %op1, %op2
72   ret <2 x i16> %res
75 define <4 x i16> @add_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
76 ; CHECK-LABEL: add_v4i16:
77 ; CHECK:       // %bb.0:
78 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
79 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
80 ; CHECK-NEXT:    add z0.h, z0.h, z1.h
81 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
82 ; CHECK-NEXT:    ret
83   %res = add <4 x i16> %op1, %op2
84   ret <4 x i16> %res
87 define <8 x i16> @add_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
88 ; CHECK-LABEL: add_v8i16:
89 ; CHECK:       // %bb.0:
90 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
91 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
92 ; CHECK-NEXT:    add z0.h, z0.h, z1.h
93 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
94 ; CHECK-NEXT:    ret
95   %res = add <8 x i16> %op1, %op2
96   ret <8 x i16> %res
99 define void @add_v16i16(ptr %a, ptr %b) {
100 ; CHECK-LABEL: add_v16i16:
101 ; CHECK:       // %bb.0:
102 ; CHECK-NEXT:    ldp q0, q3, [x1]
103 ; CHECK-NEXT:    ldp q1, q2, [x0]
104 ; CHECK-NEXT:    add z0.h, z1.h, z0.h
105 ; CHECK-NEXT:    add z1.h, z2.h, z3.h
106 ; CHECK-NEXT:    stp q0, q1, [x0]
107 ; CHECK-NEXT:    ret
108   %op1 = load <16 x i16>, ptr %a
109   %op2 = load <16 x i16>, ptr %b
110   %res = add <16 x i16> %op1, %op2
111   store <16 x i16> %res, ptr %a
112   ret void
115 define <2 x i32> @add_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
116 ; CHECK-LABEL: add_v2i32:
117 ; CHECK:       // %bb.0:
118 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
119 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
120 ; CHECK-NEXT:    add z0.s, z0.s, z1.s
121 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
122 ; CHECK-NEXT:    ret
123   %res = add <2 x i32> %op1, %op2
124   ret <2 x i32> %res
127 define <4 x i32> @add_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
128 ; CHECK-LABEL: add_v4i32:
129 ; CHECK:       // %bb.0:
130 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
131 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
132 ; CHECK-NEXT:    add z0.s, z0.s, z1.s
133 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
134 ; CHECK-NEXT:    ret
135   %res = add <4 x i32> %op1, %op2
136   ret <4 x i32> %res
139 define void @add_v8i32(ptr %a, ptr %b) {
140 ; CHECK-LABEL: add_v8i32:
141 ; CHECK:       // %bb.0:
142 ; CHECK-NEXT:    ldp q0, q3, [x1]
143 ; CHECK-NEXT:    ldp q1, q2, [x0]
144 ; CHECK-NEXT:    add z0.s, z1.s, z0.s
145 ; CHECK-NEXT:    add z1.s, z2.s, z3.s
146 ; CHECK-NEXT:    stp q0, q1, [x0]
147 ; CHECK-NEXT:    ret
148   %op1 = load <8 x i32>, ptr %a
149   %op2 = load <8 x i32>, ptr %b
150   %res = add <8 x i32> %op1, %op2
151   store <8 x i32> %res, ptr %a
152   ret void
155 define <1 x i64> @add_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
156 ; CHECK-LABEL: add_v1i64:
157 ; CHECK:       // %bb.0:
158 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
159 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
160 ; CHECK-NEXT:    add z0.d, z0.d, z1.d
161 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
162 ; CHECK-NEXT:    ret
163   %res = add <1 x i64> %op1, %op2
164   ret <1 x i64> %res
167 define <2 x i64> @add_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
168 ; CHECK-LABEL: add_v2i64:
169 ; CHECK:       // %bb.0:
170 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
171 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
172 ; CHECK-NEXT:    add z0.d, z0.d, z1.d
173 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
174 ; CHECK-NEXT:    ret
175   %res = add <2 x i64> %op1, %op2
176   ret <2 x i64> %res
179 define void @add_v4i64(ptr %a, ptr %b) {
180 ; CHECK-LABEL: add_v4i64:
181 ; CHECK:       // %bb.0:
182 ; CHECK-NEXT:    ldp q0, q3, [x1]
183 ; CHECK-NEXT:    ldp q1, q2, [x0]
184 ; CHECK-NEXT:    add z0.d, z1.d, z0.d
185 ; CHECK-NEXT:    add z1.d, z2.d, z3.d
186 ; CHECK-NEXT:    stp q0, q1, [x0]
187 ; CHECK-NEXT:    ret
188   %op1 = load <4 x i64>, ptr %a
189   %op2 = load <4 x i64>, ptr %b
190   %res = add <4 x i64> %op1, %op2
191   store <4 x i64> %res, ptr %a
192   ret void
196 ; MUL
199 define <4 x i8> @mul_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
200 ; SVE-LABEL: mul_v4i8:
201 ; SVE:       // %bb.0:
202 ; SVE-NEXT:    ptrue p0.h, vl4
203 ; SVE-NEXT:    // kill: def $d0 killed $d0 def $z0
204 ; SVE-NEXT:    // kill: def $d1 killed $d1 def $z1
205 ; SVE-NEXT:    mul z0.h, p0/m, z0.h, z1.h
206 ; SVE-NEXT:    // kill: def $d0 killed $d0 killed $z0
207 ; SVE-NEXT:    ret
209 ; SVE2-LABEL: mul_v4i8:
210 ; SVE2:       // %bb.0:
211 ; SVE2-NEXT:    // kill: def $d0 killed $d0 def $z0
212 ; SVE2-NEXT:    // kill: def $d1 killed $d1 def $z1
213 ; SVE2-NEXT:    mul z0.h, z0.h, z1.h
214 ; SVE2-NEXT:    // kill: def $d0 killed $d0 killed $z0
215 ; SVE2-NEXT:    ret
216   %res = mul <4 x i8> %op1, %op2
217   ret <4 x i8> %res
220 define <8 x i8> @mul_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
221 ; SVE-LABEL: mul_v8i8:
222 ; SVE:       // %bb.0:
223 ; SVE-NEXT:    ptrue p0.b, vl8
224 ; SVE-NEXT:    // kill: def $d0 killed $d0 def $z0
225 ; SVE-NEXT:    // kill: def $d1 killed $d1 def $z1
226 ; SVE-NEXT:    mul z0.b, p0/m, z0.b, z1.b
227 ; SVE-NEXT:    // kill: def $d0 killed $d0 killed $z0
228 ; SVE-NEXT:    ret
230 ; SVE2-LABEL: mul_v8i8:
231 ; SVE2:       // %bb.0:
232 ; SVE2-NEXT:    // kill: def $d0 killed $d0 def $z0
233 ; SVE2-NEXT:    // kill: def $d1 killed $d1 def $z1
234 ; SVE2-NEXT:    mul z0.b, z0.b, z1.b
235 ; SVE2-NEXT:    // kill: def $d0 killed $d0 killed $z0
236 ; SVE2-NEXT:    ret
237   %res = mul <8 x i8> %op1, %op2
238   ret <8 x i8> %res
241 define <16 x i8> @mul_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
242 ; SVE-LABEL: mul_v16i8:
243 ; SVE:       // %bb.0:
244 ; SVE-NEXT:    ptrue p0.b, vl16
245 ; SVE-NEXT:    // kill: def $q0 killed $q0 def $z0
246 ; SVE-NEXT:    // kill: def $q1 killed $q1 def $z1
247 ; SVE-NEXT:    mul z0.b, p0/m, z0.b, z1.b
248 ; SVE-NEXT:    // kill: def $q0 killed $q0 killed $z0
249 ; SVE-NEXT:    ret
251 ; SVE2-LABEL: mul_v16i8:
252 ; SVE2:       // %bb.0:
253 ; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z0
254 ; SVE2-NEXT:    // kill: def $q1 killed $q1 def $z1
255 ; SVE2-NEXT:    mul z0.b, z0.b, z1.b
256 ; SVE2-NEXT:    // kill: def $q0 killed $q0 killed $z0
257 ; SVE2-NEXT:    ret
258   %res = mul <16 x i8> %op1, %op2
259   ret <16 x i8> %res
262 define void @mul_v32i8(ptr %a, ptr %b) {
263 ; SVE-LABEL: mul_v32i8:
264 ; SVE:       // %bb.0:
265 ; SVE-NEXT:    ptrue p0.b, vl16
266 ; SVE-NEXT:    ldp q0, q3, [x1]
267 ; SVE-NEXT:    ldp q1, q2, [x0]
268 ; SVE-NEXT:    mul z0.b, p0/m, z0.b, z1.b
269 ; SVE-NEXT:    movprfx z1, z2
270 ; SVE-NEXT:    mul z1.b, p0/m, z1.b, z3.b
271 ; SVE-NEXT:    stp q0, q1, [x0]
272 ; SVE-NEXT:    ret
274 ; SVE2-LABEL: mul_v32i8:
275 ; SVE2:       // %bb.0:
276 ; SVE2-NEXT:    ldp q0, q3, [x1]
277 ; SVE2-NEXT:    ldp q1, q2, [x0]
278 ; SVE2-NEXT:    mul z0.b, z1.b, z0.b
279 ; SVE2-NEXT:    mul z1.b, z2.b, z3.b
280 ; SVE2-NEXT:    stp q0, q1, [x0]
281 ; SVE2-NEXT:    ret
282   %op1 = load <32 x i8>, ptr %a
283   %op2 = load <32 x i8>, ptr %b
284   %res = mul <32 x i8> %op1, %op2
285   store <32 x i8> %res, ptr %a
286   ret void
289 define <2 x i16> @mul_v2i16(<2 x i16> %op1, <2 x i16> %op2) {
290 ; SVE-LABEL: mul_v2i16:
291 ; SVE:       // %bb.0:
292 ; SVE-NEXT:    ptrue p0.s, vl2
293 ; SVE-NEXT:    // kill: def $d0 killed $d0 def $z0
294 ; SVE-NEXT:    // kill: def $d1 killed $d1 def $z1
295 ; SVE-NEXT:    mul z0.s, p0/m, z0.s, z1.s
296 ; SVE-NEXT:    // kill: def $d0 killed $d0 killed $z0
297 ; SVE-NEXT:    ret
299 ; SVE2-LABEL: mul_v2i16:
300 ; SVE2:       // %bb.0:
301 ; SVE2-NEXT:    // kill: def $d0 killed $d0 def $z0
302 ; SVE2-NEXT:    // kill: def $d1 killed $d1 def $z1
303 ; SVE2-NEXT:    mul z0.s, z0.s, z1.s
304 ; SVE2-NEXT:    // kill: def $d0 killed $d0 killed $z0
305 ; SVE2-NEXT:    ret
306   %res = mul <2 x i16> %op1, %op2
307   ret <2 x i16> %res
310 define <4 x i16> @mul_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
311 ; SVE-LABEL: mul_v4i16:
312 ; SVE:       // %bb.0:
313 ; SVE-NEXT:    ptrue p0.h, vl4
314 ; SVE-NEXT:    // kill: def $d0 killed $d0 def $z0
315 ; SVE-NEXT:    // kill: def $d1 killed $d1 def $z1
316 ; SVE-NEXT:    mul z0.h, p0/m, z0.h, z1.h
317 ; SVE-NEXT:    // kill: def $d0 killed $d0 killed $z0
318 ; SVE-NEXT:    ret
320 ; SVE2-LABEL: mul_v4i16:
321 ; SVE2:       // %bb.0:
322 ; SVE2-NEXT:    // kill: def $d0 killed $d0 def $z0
323 ; SVE2-NEXT:    // kill: def $d1 killed $d1 def $z1
324 ; SVE2-NEXT:    mul z0.h, z0.h, z1.h
325 ; SVE2-NEXT:    // kill: def $d0 killed $d0 killed $z0
326 ; SVE2-NEXT:    ret
327   %res = mul <4 x i16> %op1, %op2
328   ret <4 x i16> %res
331 define <8 x i16> @mul_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
332 ; SVE-LABEL: mul_v8i16:
333 ; SVE:       // %bb.0:
334 ; SVE-NEXT:    ptrue p0.h, vl8
335 ; SVE-NEXT:    // kill: def $q0 killed $q0 def $z0
336 ; SVE-NEXT:    // kill: def $q1 killed $q1 def $z1
337 ; SVE-NEXT:    mul z0.h, p0/m, z0.h, z1.h
338 ; SVE-NEXT:    // kill: def $q0 killed $q0 killed $z0
339 ; SVE-NEXT:    ret
341 ; SVE2-LABEL: mul_v8i16:
342 ; SVE2:       // %bb.0:
343 ; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z0
344 ; SVE2-NEXT:    // kill: def $q1 killed $q1 def $z1
345 ; SVE2-NEXT:    mul z0.h, z0.h, z1.h
346 ; SVE2-NEXT:    // kill: def $q0 killed $q0 killed $z0
347 ; SVE2-NEXT:    ret
348   %res = mul <8 x i16> %op1, %op2
349   ret <8 x i16> %res
352 define void @mul_v16i16(ptr %a, ptr %b) {
353 ; SVE-LABEL: mul_v16i16:
354 ; SVE:       // %bb.0:
355 ; SVE-NEXT:    ptrue p0.h, vl8
356 ; SVE-NEXT:    ldp q0, q3, [x1]
357 ; SVE-NEXT:    ldp q1, q2, [x0]
358 ; SVE-NEXT:    mul z0.h, p0/m, z0.h, z1.h
359 ; SVE-NEXT:    movprfx z1, z2
360 ; SVE-NEXT:    mul z1.h, p0/m, z1.h, z3.h
361 ; SVE-NEXT:    stp q0, q1, [x0]
362 ; SVE-NEXT:    ret
364 ; SVE2-LABEL: mul_v16i16:
365 ; SVE2:       // %bb.0:
366 ; SVE2-NEXT:    ldp q0, q3, [x1]
367 ; SVE2-NEXT:    ldp q1, q2, [x0]
368 ; SVE2-NEXT:    mul z0.h, z1.h, z0.h
369 ; SVE2-NEXT:    mul z1.h, z2.h, z3.h
370 ; SVE2-NEXT:    stp q0, q1, [x0]
371 ; SVE2-NEXT:    ret
372   %op1 = load <16 x i16>, ptr %a
373   %op2 = load <16 x i16>, ptr %b
374   %res = mul <16 x i16> %op1, %op2
375   store <16 x i16> %res, ptr %a
376   ret void
379 define <2 x i32> @mul_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
380 ; SVE-LABEL: mul_v2i32:
381 ; SVE:       // %bb.0:
382 ; SVE-NEXT:    ptrue p0.s, vl2
383 ; SVE-NEXT:    // kill: def $d0 killed $d0 def $z0
384 ; SVE-NEXT:    // kill: def $d1 killed $d1 def $z1
385 ; SVE-NEXT:    mul z0.s, p0/m, z0.s, z1.s
386 ; SVE-NEXT:    // kill: def $d0 killed $d0 killed $z0
387 ; SVE-NEXT:    ret
389 ; SVE2-LABEL: mul_v2i32:
390 ; SVE2:       // %bb.0:
391 ; SVE2-NEXT:    // kill: def $d0 killed $d0 def $z0
392 ; SVE2-NEXT:    // kill: def $d1 killed $d1 def $z1
393 ; SVE2-NEXT:    mul z0.s, z0.s, z1.s
394 ; SVE2-NEXT:    // kill: def $d0 killed $d0 killed $z0
395 ; SVE2-NEXT:    ret
396   %res = mul <2 x i32> %op1, %op2
397   ret <2 x i32> %res
400 define <4 x i32> @mul_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
401 ; SVE-LABEL: mul_v4i32:
402 ; SVE:       // %bb.0:
403 ; SVE-NEXT:    ptrue p0.s, vl4
404 ; SVE-NEXT:    // kill: def $q0 killed $q0 def $z0
405 ; SVE-NEXT:    // kill: def $q1 killed $q1 def $z1
406 ; SVE-NEXT:    mul z0.s, p0/m, z0.s, z1.s
407 ; SVE-NEXT:    // kill: def $q0 killed $q0 killed $z0
408 ; SVE-NEXT:    ret
410 ; SVE2-LABEL: mul_v4i32:
411 ; SVE2:       // %bb.0:
412 ; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z0
413 ; SVE2-NEXT:    // kill: def $q1 killed $q1 def $z1
414 ; SVE2-NEXT:    mul z0.s, z0.s, z1.s
415 ; SVE2-NEXT:    // kill: def $q0 killed $q0 killed $z0
416 ; SVE2-NEXT:    ret
417   %res = mul <4 x i32> %op1, %op2
418   ret <4 x i32> %res
421 define void @mul_v8i32(ptr %a, ptr %b) {
422 ; SVE-LABEL: mul_v8i32:
423 ; SVE:       // %bb.0:
424 ; SVE-NEXT:    ptrue p0.s, vl4
425 ; SVE-NEXT:    ldp q0, q3, [x1]
426 ; SVE-NEXT:    ldp q1, q2, [x0]
427 ; SVE-NEXT:    mul z0.s, p0/m, z0.s, z1.s
428 ; SVE-NEXT:    movprfx z1, z2
429 ; SVE-NEXT:    mul z1.s, p0/m, z1.s, z3.s
430 ; SVE-NEXT:    stp q0, q1, [x0]
431 ; SVE-NEXT:    ret
433 ; SVE2-LABEL: mul_v8i32:
434 ; SVE2:       // %bb.0:
435 ; SVE2-NEXT:    ldp q0, q3, [x1]
436 ; SVE2-NEXT:    ldp q1, q2, [x0]
437 ; SVE2-NEXT:    mul z0.s, z1.s, z0.s
438 ; SVE2-NEXT:    mul z1.s, z2.s, z3.s
439 ; SVE2-NEXT:    stp q0, q1, [x0]
440 ; SVE2-NEXT:    ret
441   %op1 = load <8 x i32>, ptr %a
442   %op2 = load <8 x i32>, ptr %b
443   %res = mul <8 x i32> %op1, %op2
444   store <8 x i32> %res, ptr %a
445   ret void
448 define <1 x i64> @mul_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
449 ; SVE-LABEL: mul_v1i64:
450 ; SVE:       // %bb.0:
451 ; SVE-NEXT:    ptrue p0.d, vl1
452 ; SVE-NEXT:    // kill: def $d0 killed $d0 def $z0
453 ; SVE-NEXT:    // kill: def $d1 killed $d1 def $z1
454 ; SVE-NEXT:    mul z0.d, p0/m, z0.d, z1.d
455 ; SVE-NEXT:    // kill: def $d0 killed $d0 killed $z0
456 ; SVE-NEXT:    ret
458 ; SVE2-LABEL: mul_v1i64:
459 ; SVE2:       // %bb.0:
460 ; SVE2-NEXT:    // kill: def $d0 killed $d0 def $z0
461 ; SVE2-NEXT:    // kill: def $d1 killed $d1 def $z1
462 ; SVE2-NEXT:    mul z0.d, z0.d, z1.d
463 ; SVE2-NEXT:    // kill: def $d0 killed $d0 killed $z0
464 ; SVE2-NEXT:    ret
465   %res = mul <1 x i64> %op1, %op2
466   ret <1 x i64> %res
469 define <2 x i64> @mul_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
470 ; SVE-LABEL: mul_v2i64:
471 ; SVE:       // %bb.0:
472 ; SVE-NEXT:    ptrue p0.d, vl2
473 ; SVE-NEXT:    // kill: def $q0 killed $q0 def $z0
474 ; SVE-NEXT:    // kill: def $q1 killed $q1 def $z1
475 ; SVE-NEXT:    mul z0.d, p0/m, z0.d, z1.d
476 ; SVE-NEXT:    // kill: def $q0 killed $q0 killed $z0
477 ; SVE-NEXT:    ret
479 ; SVE2-LABEL: mul_v2i64:
480 ; SVE2:       // %bb.0:
481 ; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z0
482 ; SVE2-NEXT:    // kill: def $q1 killed $q1 def $z1
483 ; SVE2-NEXT:    mul z0.d, z0.d, z1.d
484 ; SVE2-NEXT:    // kill: def $q0 killed $q0 killed $z0
485 ; SVE2-NEXT:    ret
486   %res = mul <2 x i64> %op1, %op2
487   ret <2 x i64> %res
490 define void @mul_v4i64(ptr %a, ptr %b) {
491 ; SVE-LABEL: mul_v4i64:
492 ; SVE:       // %bb.0:
493 ; SVE-NEXT:    ptrue p0.d, vl2
494 ; SVE-NEXT:    ldp q0, q3, [x1]
495 ; SVE-NEXT:    ldp q1, q2, [x0]
496 ; SVE-NEXT:    mul z0.d, p0/m, z0.d, z1.d
497 ; SVE-NEXT:    movprfx z1, z2
498 ; SVE-NEXT:    mul z1.d, p0/m, z1.d, z3.d
499 ; SVE-NEXT:    stp q0, q1, [x0]
500 ; SVE-NEXT:    ret
502 ; SVE2-LABEL: mul_v4i64:
503 ; SVE2:       // %bb.0:
504 ; SVE2-NEXT:    ldp q0, q3, [x1]
505 ; SVE2-NEXT:    ldp q1, q2, [x0]
506 ; SVE2-NEXT:    mul z0.d, z1.d, z0.d
507 ; SVE2-NEXT:    mul z1.d, z2.d, z3.d
508 ; SVE2-NEXT:    stp q0, q1, [x0]
509 ; SVE2-NEXT:    ret
510   %op1 = load <4 x i64>, ptr %a
511   %op2 = load <4 x i64>, ptr %b
512   %res = mul <4 x i64> %op1, %op2
513   store <4 x i64> %res, ptr %a
514   ret void
518 ; SUB
521 define <4 x i8> @sub_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
522 ; CHECK-LABEL: sub_v4i8:
523 ; CHECK:       // %bb.0:
524 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
525 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
526 ; CHECK-NEXT:    sub z0.h, z0.h, z1.h
527 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
528 ; CHECK-NEXT:    ret
529   %res = sub <4 x i8> %op1, %op2
530   ret <4 x i8> %res
533 define <8 x i8> @sub_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
534 ; CHECK-LABEL: sub_v8i8:
535 ; CHECK:       // %bb.0:
536 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
537 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
538 ; CHECK-NEXT:    sub z0.b, z0.b, z1.b
539 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
540 ; CHECK-NEXT:    ret
541   %res = sub <8 x i8> %op1, %op2
542   ret <8 x i8> %res
545 define <16 x i8> @sub_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
546 ; CHECK-LABEL: sub_v16i8:
547 ; CHECK:       // %bb.0:
548 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
549 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
550 ; CHECK-NEXT:    sub z0.b, z0.b, z1.b
551 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
552 ; CHECK-NEXT:    ret
553   %res = sub <16 x i8> %op1, %op2
554   ret <16 x i8> %res
557 define void @sub_v32i8(ptr %a, ptr %b) {
558 ; CHECK-LABEL: sub_v32i8:
559 ; CHECK:       // %bb.0:
560 ; CHECK-NEXT:    ldp q0, q3, [x1]
561 ; CHECK-NEXT:    ldp q1, q2, [x0]
562 ; CHECK-NEXT:    sub z0.b, z1.b, z0.b
563 ; CHECK-NEXT:    sub z1.b, z2.b, z3.b
564 ; CHECK-NEXT:    stp q0, q1, [x0]
565 ; CHECK-NEXT:    ret
566   %op1 = load <32 x i8>, ptr %a
567   %op2 = load <32 x i8>, ptr %b
568   %res = sub <32 x i8> %op1, %op2
569   store <32 x i8> %res, ptr %a
570   ret void
573 define <2 x i16> @sub_v2i16(<2 x i16> %op1, <2 x i16> %op2) {
574 ; CHECK-LABEL: sub_v2i16:
575 ; CHECK:       // %bb.0:
576 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
577 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
578 ; CHECK-NEXT:    sub z0.s, z0.s, z1.s
579 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
580 ; CHECK-NEXT:    ret
581   %res = sub <2 x i16> %op1, %op2
582   ret <2 x i16> %res
585 define <4 x i16> @sub_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
586 ; CHECK-LABEL: sub_v4i16:
587 ; CHECK:       // %bb.0:
588 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
589 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
590 ; CHECK-NEXT:    sub z0.h, z0.h, z1.h
591 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
592 ; CHECK-NEXT:    ret
593   %res = sub <4 x i16> %op1, %op2
594   ret <4 x i16> %res
597 define <8 x i16> @sub_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
598 ; CHECK-LABEL: sub_v8i16:
599 ; CHECK:       // %bb.0:
600 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
601 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
602 ; CHECK-NEXT:    sub z0.h, z0.h, z1.h
603 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
604 ; CHECK-NEXT:    ret
605   %res = sub <8 x i16> %op1, %op2
606   ret <8 x i16> %res
609 define void @sub_v16i16(ptr %a, ptr %b) {
610 ; CHECK-LABEL: sub_v16i16:
611 ; CHECK:       // %bb.0:
612 ; CHECK-NEXT:    ldp q0, q3, [x1]
613 ; CHECK-NEXT:    ldp q1, q2, [x0]
614 ; CHECK-NEXT:    sub z0.h, z1.h, z0.h
615 ; CHECK-NEXT:    sub z1.h, z2.h, z3.h
616 ; CHECK-NEXT:    stp q0, q1, [x0]
617 ; CHECK-NEXT:    ret
618   %op1 = load <16 x i16>, ptr %a
619   %op2 = load <16 x i16>, ptr %b
620   %res = sub <16 x i16> %op1, %op2
621   store <16 x i16> %res, ptr %a
622   ret void
625 define <2 x i32> @sub_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
626 ; CHECK-LABEL: sub_v2i32:
627 ; CHECK:       // %bb.0:
628 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
629 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
630 ; CHECK-NEXT:    sub z0.s, z0.s, z1.s
631 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
632 ; CHECK-NEXT:    ret
633   %res = sub <2 x i32> %op1, %op2
634   ret <2 x i32> %res
637 define <4 x i32> @sub_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
638 ; CHECK-LABEL: sub_v4i32:
639 ; CHECK:       // %bb.0:
640 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
641 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
642 ; CHECK-NEXT:    sub z0.s, z0.s, z1.s
643 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
644 ; CHECK-NEXT:    ret
645   %res = sub <4 x i32> %op1, %op2
646   ret <4 x i32> %res
649 define void @sub_v8i32(ptr %a, ptr %b) {
650 ; CHECK-LABEL: sub_v8i32:
651 ; CHECK:       // %bb.0:
652 ; CHECK-NEXT:    ldp q0, q3, [x1]
653 ; CHECK-NEXT:    ldp q1, q2, [x0]
654 ; CHECK-NEXT:    sub z0.s, z1.s, z0.s
655 ; CHECK-NEXT:    sub z1.s, z2.s, z3.s
656 ; CHECK-NEXT:    stp q0, q1, [x0]
657 ; CHECK-NEXT:    ret
658   %op1 = load <8 x i32>, ptr %a
659   %op2 = load <8 x i32>, ptr %b
660   %res = sub <8 x i32> %op1, %op2
661   store <8 x i32> %res, ptr %a
662   ret void
665 define <1 x i64> @sub_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
666 ; CHECK-LABEL: sub_v1i64:
667 ; CHECK:       // %bb.0:
668 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
669 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
670 ; CHECK-NEXT:    sub z0.d, z0.d, z1.d
671 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
672 ; CHECK-NEXT:    ret
673   %res = sub <1 x i64> %op1, %op2
674   ret <1 x i64> %res
677 define <2 x i64> @sub_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
678 ; CHECK-LABEL: sub_v2i64:
679 ; CHECK:       // %bb.0:
680 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
681 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
682 ; CHECK-NEXT:    sub z0.d, z0.d, z1.d
683 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
684 ; CHECK-NEXT:    ret
685   %res = sub <2 x i64> %op1, %op2
686   ret <2 x i64> %res
689 define void @sub_v4i64(ptr %a, ptr %b) {
690 ; CHECK-LABEL: sub_v4i64:
691 ; CHECK:       // %bb.0:
692 ; CHECK-NEXT:    ldp q0, q3, [x1]
693 ; CHECK-NEXT:    ldp q1, q2, [x0]
694 ; CHECK-NEXT:    sub z0.d, z1.d, z0.d
695 ; CHECK-NEXT:    sub z1.d, z2.d, z3.d
696 ; CHECK-NEXT:    stp q0, q1, [x0]
697 ; CHECK-NEXT:    ret
698   %op1 = load <4 x i64>, ptr %a
699   %op2 = load <4 x i64>, ptr %b
700   %res = sub <4 x i64> %op1, %op2
701   store <4 x i64> %res, ptr %a
702   ret void
706 ; ABS
709 define <4 x i8> @abs_v4i8(<4 x i8> %op1) {
710 ; CHECK-LABEL: abs_v4i8:
711 ; CHECK:       // %bb.0:
712 ; CHECK-NEXT:    ptrue p0.h, vl4
713 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
714 ; CHECK-NEXT:    sxtb z0.h, p0/m, z0.h
715 ; CHECK-NEXT:    abs z0.h, p0/m, z0.h
716 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
717 ; CHECK-NEXT:    ret
718   %res = call <4 x i8> @llvm.abs.v4i8(<4 x i8> %op1, i1 false)
719   ret <4 x i8> %res
722 define <8 x i8> @abs_v8i8(<8 x i8> %op1) {
723 ; CHECK-LABEL: abs_v8i8:
724 ; CHECK:       // %bb.0:
725 ; CHECK-NEXT:    ptrue p0.b, vl8
726 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
727 ; CHECK-NEXT:    abs z0.b, p0/m, z0.b
728 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
729 ; CHECK-NEXT:    ret
730   %res = call <8 x i8> @llvm.abs.v8i8(<8 x i8> %op1, i1 false)
731   ret <8 x i8> %res
734 define <16 x i8> @abs_v16i8(<16 x i8> %op1) {
735 ; CHECK-LABEL: abs_v16i8:
736 ; CHECK:       // %bb.0:
737 ; CHECK-NEXT:    ptrue p0.b, vl16
738 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
739 ; CHECK-NEXT:    abs z0.b, p0/m, z0.b
740 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
741 ; CHECK-NEXT:    ret
742   %res = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %op1, i1 false)
743   ret <16 x i8> %res
746 define void @abs_v32i8(ptr %a) {
747 ; CHECK-LABEL: abs_v32i8:
748 ; CHECK:       // %bb.0:
749 ; CHECK-NEXT:    ptrue p0.b, vl16
750 ; CHECK-NEXT:    ldp q0, q1, [x0]
751 ; CHECK-NEXT:    abs z0.b, p0/m, z0.b
752 ; CHECK-NEXT:    abs z1.b, p0/m, z1.b
753 ; CHECK-NEXT:    stp q0, q1, [x0]
754 ; CHECK-NEXT:    ret
755   %op1 = load <32 x i8>, ptr %a
756   %res = call <32 x i8> @llvm.abs.v32i8(<32 x i8> %op1, i1 false)
757   store <32 x i8> %res, ptr %a
758   ret void
761 define <2 x i16> @abs_v2i16(<2 x i16> %op1) {
762 ; CHECK-LABEL: abs_v2i16:
763 ; CHECK:       // %bb.0:
764 ; CHECK-NEXT:    ptrue p0.s, vl2
765 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
766 ; CHECK-NEXT:    sxth z0.s, p0/m, z0.s
767 ; CHECK-NEXT:    abs z0.s, p0/m, z0.s
768 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
769 ; CHECK-NEXT:    ret
770   %res = call <2 x i16> @llvm.abs.v2i16(<2 x i16> %op1, i1 false)
771   ret <2 x i16> %res
774 define <4 x i16> @abs_v4i16(<4 x i16> %op1) {
775 ; CHECK-LABEL: abs_v4i16:
776 ; CHECK:       // %bb.0:
777 ; CHECK-NEXT:    ptrue p0.h, vl4
778 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
779 ; CHECK-NEXT:    abs z0.h, p0/m, z0.h
780 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
781 ; CHECK-NEXT:    ret
782   %res = call <4 x i16> @llvm.abs.v4i16(<4 x i16> %op1, i1 false)
783   ret <4 x i16> %res
786 define <8 x i16> @abs_v8i16(<8 x i16> %op1) {
787 ; CHECK-LABEL: abs_v8i16:
788 ; CHECK:       // %bb.0:
789 ; CHECK-NEXT:    ptrue p0.h, vl8
790 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
791 ; CHECK-NEXT:    abs z0.h, p0/m, z0.h
792 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
793 ; CHECK-NEXT:    ret
794   %res = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %op1, i1 false)
795   ret <8 x i16> %res
798 define void @abs_v16i16(ptr %a) {
799 ; CHECK-LABEL: abs_v16i16:
800 ; CHECK:       // %bb.0:
801 ; CHECK-NEXT:    ptrue p0.h, vl8
802 ; CHECK-NEXT:    ldp q0, q1, [x0]
803 ; CHECK-NEXT:    abs z0.h, p0/m, z0.h
804 ; CHECK-NEXT:    abs z1.h, p0/m, z1.h
805 ; CHECK-NEXT:    stp q0, q1, [x0]
806 ; CHECK-NEXT:    ret
807   %op1 = load <16 x i16>, ptr %a
808   %res = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %op1, i1 false)
809   store <16 x i16> %res, ptr %a
810   ret void
813 define <2 x i32> @abs_v2i32(<2 x i32> %op1) {
814 ; CHECK-LABEL: abs_v2i32:
815 ; CHECK:       // %bb.0:
816 ; CHECK-NEXT:    ptrue p0.s, vl2
817 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
818 ; CHECK-NEXT:    abs z0.s, p0/m, z0.s
819 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
820 ; CHECK-NEXT:    ret
821   %res = call <2 x i32> @llvm.abs.v2i32(<2 x i32> %op1, i1 false)
822   ret <2 x i32> %res
825 define <4 x i32> @abs_v4i32(<4 x i32> %op1) {
826 ; CHECK-LABEL: abs_v4i32:
827 ; CHECK:       // %bb.0:
828 ; CHECK-NEXT:    ptrue p0.s, vl4
829 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
830 ; CHECK-NEXT:    abs z0.s, p0/m, z0.s
831 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
832 ; CHECK-NEXT:    ret
833   %res = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %op1, i1 false)
834   ret <4 x i32> %res
837 define void @abs_v8i32(ptr %a) {
838 ; CHECK-LABEL: abs_v8i32:
839 ; CHECK:       // %bb.0:
840 ; CHECK-NEXT:    ptrue p0.s, vl4
841 ; CHECK-NEXT:    ldp q0, q1, [x0]
842 ; CHECK-NEXT:    abs z0.s, p0/m, z0.s
843 ; CHECK-NEXT:    abs z1.s, p0/m, z1.s
844 ; CHECK-NEXT:    stp q0, q1, [x0]
845 ; CHECK-NEXT:    ret
846   %op1 = load <8 x i32>, ptr %a
847   %res = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %op1, i1 false)
848   store <8 x i32> %res, ptr %a
849   ret void
852 define <1 x i64> @abs_v1i64(<1 x i64> %op1) {
853 ; CHECK-LABEL: abs_v1i64:
854 ; CHECK:       // %bb.0:
855 ; CHECK-NEXT:    ptrue p0.d, vl1
856 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
857 ; CHECK-NEXT:    abs z0.d, p0/m, z0.d
858 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
859 ; CHECK-NEXT:    ret
860   %res = call <1 x i64> @llvm.abs.v1i64(<1 x i64> %op1, i1 false)
861   ret <1 x i64> %res
864 define <2 x i64> @abs_v2i64(<2 x i64> %op1) {
865 ; CHECK-LABEL: abs_v2i64:
866 ; CHECK:       // %bb.0:
867 ; CHECK-NEXT:    ptrue p0.d, vl2
868 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
869 ; CHECK-NEXT:    abs z0.d, p0/m, z0.d
870 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
871 ; CHECK-NEXT:    ret
872   %res = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %op1, i1 false)
873   ret <2 x i64> %res
876 define void @abs_v4i64(ptr %a) {
877 ; CHECK-LABEL: abs_v4i64:
878 ; CHECK:       // %bb.0:
879 ; CHECK-NEXT:    ptrue p0.d, vl2
880 ; CHECK-NEXT:    ldp q0, q1, [x0]
881 ; CHECK-NEXT:    abs z0.d, p0/m, z0.d
882 ; CHECK-NEXT:    abs z1.d, p0/m, z1.d
883 ; CHECK-NEXT:    stp q0, q1, [x0]
884 ; CHECK-NEXT:    ret
885   %op1 = load <4 x i64>, ptr %a
886   %res = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %op1, i1 false)
887   store <4 x i64> %res, ptr %a
888   ret void
891 declare <4 x i8> @llvm.abs.v4i8(<4 x i8>, i1)
892 declare <8 x i8> @llvm.abs.v8i8(<8 x i8>, i1)
893 declare <16 x i8> @llvm.abs.v16i8(<16 x i8>, i1)
894 declare <32 x i8> @llvm.abs.v32i8(<32 x i8>, i1)
895 declare <4 x i16> @llvm.abs.v4i16(<4 x i16>, i1)
896 declare <2 x i16> @llvm.abs.v2i16(<2 x i16>, i1)
897 declare <8 x i16> @llvm.abs.v8i16(<8 x i16>, i1)
898 declare <16 x i16> @llvm.abs.v16i16(<16 x i16>, i1)
899 declare <2 x i32> @llvm.abs.v2i32(<2 x i32>, i1)
900 declare <4 x i32> @llvm.abs.v4i32(<4 x i32>, i1)
901 declare <8 x i32> @llvm.abs.v8i32(<8 x i32>, i1)
902 declare <1 x i64> @llvm.abs.v1i64(<1 x i64>, i1)
903 declare <2 x i64> @llvm.abs.v2i64(<2 x i64>, i1)
904 declare <4 x i64> @llvm.abs.v4i64(<4 x i64>, i1)