[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-streaming-mode-fixed-length-bit-counting.ll
bloba00569d884959603bdc6f2901116428d0f5238fd
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
4 target triple = "aarch64-unknown-linux-gnu"
7 ; CLZ
10 define <4 x i8> @ctlz_v4i8(<4 x i8> %op) {
11 ; CHECK-LABEL: ctlz_v4i8:
12 ; CHECK:       // %bb.0:
13 ; CHECK-NEXT:    ptrue p0.h, vl4
14 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
15 ; CHECK-NEXT:    and z0.h, z0.h, #0xff
16 ; CHECK-NEXT:    clz z0.h, p0/m, z0.h
17 ; CHECK-NEXT:    sub z0.h, z0.h, #8 // =0x8
18 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
19 ; CHECK-NEXT:    ret
20   %res = call <4 x i8> @llvm.ctlz.v4i8(<4 x i8> %op)
21   ret <4 x i8> %res
24 define <8 x i8> @ctlz_v8i8(<8 x i8> %op) {
25 ; CHECK-LABEL: ctlz_v8i8:
26 ; CHECK:       // %bb.0:
27 ; CHECK-NEXT:    ptrue p0.b, vl8
28 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
29 ; CHECK-NEXT:    clz z0.b, p0/m, z0.b
30 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
31 ; CHECK-NEXT:    ret
32   %res = call <8 x i8> @llvm.ctlz.v8i8(<8 x i8> %op)
33   ret <8 x i8> %res
36 define <16 x i8> @ctlz_v16i8(<16 x i8> %op) {
37 ; CHECK-LABEL: ctlz_v16i8:
38 ; CHECK:       // %bb.0:
39 ; CHECK-NEXT:    ptrue p0.b, vl16
40 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
41 ; CHECK-NEXT:    clz z0.b, p0/m, z0.b
42 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
43 ; CHECK-NEXT:    ret
44   %res = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %op)
45   ret <16 x i8> %res
48 define void @ctlz_v32i8(ptr %a) {
49 ; CHECK-LABEL: ctlz_v32i8:
50 ; CHECK:       // %bb.0:
51 ; CHECK-NEXT:    ptrue p0.b, vl16
52 ; CHECK-NEXT:    ldp q0, q1, [x0]
53 ; CHECK-NEXT:    clz z0.b, p0/m, z0.b
54 ; CHECK-NEXT:    clz z1.b, p0/m, z1.b
55 ; CHECK-NEXT:    stp q0, q1, [x0]
56 ; CHECK-NEXT:    ret
57   %op = load <32 x i8>, ptr %a
58   %res = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %op)
59   store <32 x i8> %res, ptr %a
60   ret void
63 define <2 x i16> @ctlz_v2i16(<2 x i16> %op) {
64 ; CHECK-LABEL: ctlz_v2i16:
65 ; CHECK:       // %bb.0:
66 ; CHECK-NEXT:    ptrue p0.s, vl2
67 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
68 ; CHECK-NEXT:    and z0.s, z0.s, #0xffff
69 ; CHECK-NEXT:    clz z0.s, p0/m, z0.s
70 ; CHECK-NEXT:    sub z0.s, z0.s, #16 // =0x10
71 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
72 ; CHECK-NEXT:    ret
73   %res = call <2 x i16> @llvm.ctlz.v2i16(<2 x i16> %op)
74   ret <2 x i16> %res
77 define <4 x i16> @ctlz_v4i16(<4 x i16> %op) {
78 ; CHECK-LABEL: ctlz_v4i16:
79 ; CHECK:       // %bb.0:
80 ; CHECK-NEXT:    ptrue p0.h, vl4
81 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
82 ; CHECK-NEXT:    clz z0.h, p0/m, z0.h
83 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
84 ; CHECK-NEXT:    ret
85   %res = call <4 x i16> @llvm.ctlz.v4i16(<4 x i16> %op)
86   ret <4 x i16> %res
89 define <8 x i16> @ctlz_v8i16(<8 x i16> %op) {
90 ; CHECK-LABEL: ctlz_v8i16:
91 ; CHECK:       // %bb.0:
92 ; CHECK-NEXT:    ptrue p0.h, vl8
93 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
94 ; CHECK-NEXT:    clz z0.h, p0/m, z0.h
95 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
96 ; CHECK-NEXT:    ret
97   %res = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %op)
98   ret <8 x i16> %res
101 define void @ctlz_v16i16(ptr %a) {
102 ; CHECK-LABEL: ctlz_v16i16:
103 ; CHECK:       // %bb.0:
104 ; CHECK-NEXT:    ptrue p0.h, vl8
105 ; CHECK-NEXT:    ldp q0, q1, [x0]
106 ; CHECK-NEXT:    clz z0.h, p0/m, z0.h
107 ; CHECK-NEXT:    clz z1.h, p0/m, z1.h
108 ; CHECK-NEXT:    stp q0, q1, [x0]
109 ; CHECK-NEXT:    ret
110   %op = load <16 x i16>, ptr %a
111   %res = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> %op)
112   store <16 x i16> %res, ptr %a
113   ret void
116 define <2 x i32> @ctlz_v2i32(<2 x i32> %op) {
117 ; CHECK-LABEL: ctlz_v2i32:
118 ; CHECK:       // %bb.0:
119 ; CHECK-NEXT:    ptrue p0.s, vl2
120 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
121 ; CHECK-NEXT:    clz z0.s, p0/m, z0.s
122 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
123 ; CHECK-NEXT:    ret
124   %res = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %op)
125   ret <2 x i32> %res
128 define <4 x i32> @ctlz_v4i32(<4 x i32> %op) {
129 ; CHECK-LABEL: ctlz_v4i32:
130 ; CHECK:       // %bb.0:
131 ; CHECK-NEXT:    ptrue p0.s, vl4
132 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
133 ; CHECK-NEXT:    clz z0.s, p0/m, z0.s
134 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
135 ; CHECK-NEXT:    ret
136   %res = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %op)
137   ret <4 x i32> %res
140 define void @ctlz_v8i32(ptr %a) {
141 ; CHECK-LABEL: ctlz_v8i32:
142 ; CHECK:       // %bb.0:
143 ; CHECK-NEXT:    ptrue p0.s, vl4
144 ; CHECK-NEXT:    ldp q0, q1, [x0]
145 ; CHECK-NEXT:    clz z0.s, p0/m, z0.s
146 ; CHECK-NEXT:    clz z1.s, p0/m, z1.s
147 ; CHECK-NEXT:    stp q0, q1, [x0]
148 ; CHECK-NEXT:    ret
149   %op = load <8 x i32>, ptr %a
150   %res = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %op)
151   store <8 x i32> %res, ptr %a
152   ret void
155 define <1 x i64> @ctlz_v1i64(<1 x i64> %op) {
156 ; CHECK-LABEL: ctlz_v1i64:
157 ; CHECK:       // %bb.0:
158 ; CHECK-NEXT:    ptrue p0.d, vl1
159 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
160 ; CHECK-NEXT:    clz z0.d, p0/m, z0.d
161 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
162 ; CHECK-NEXT:    ret
163   %res = call <1 x i64> @llvm.ctlz.v1i64(<1 x i64> %op)
164   ret <1 x i64> %res
167 define <2 x i64> @ctlz_v2i64(<2 x i64> %op) {
168 ; CHECK-LABEL: ctlz_v2i64:
169 ; CHECK:       // %bb.0:
170 ; CHECK-NEXT:    ptrue p0.d, vl2
171 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
172 ; CHECK-NEXT:    clz z0.d, p0/m, z0.d
173 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
174 ; CHECK-NEXT:    ret
175   %res = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %op)
176   ret <2 x i64> %res
179 define void @ctlz_v4i64(ptr %a) {
180 ; CHECK-LABEL: ctlz_v4i64:
181 ; CHECK:       // %bb.0:
182 ; CHECK-NEXT:    ptrue p0.d, vl2
183 ; CHECK-NEXT:    ldp q0, q1, [x0]
184 ; CHECK-NEXT:    clz z0.d, p0/m, z0.d
185 ; CHECK-NEXT:    clz z1.d, p0/m, z1.d
186 ; CHECK-NEXT:    stp q0, q1, [x0]
187 ; CHECK-NEXT:    ret
188   %op = load <4 x i64>, ptr %a
189   %res = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %op)
190   store <4 x i64> %res, ptr %a
191   ret void
195 ; CNT
198 define <4 x i8> @ctpop_v4i8(<4 x i8> %op) {
199 ; CHECK-LABEL: ctpop_v4i8:
200 ; CHECK:       // %bb.0:
201 ; CHECK-NEXT:    ptrue p0.h, vl4
202 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
203 ; CHECK-NEXT:    and z0.h, z0.h, #0xff
204 ; CHECK-NEXT:    cnt z0.h, p0/m, z0.h
205 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
206 ; CHECK-NEXT:    ret
207   %res = call <4 x i8> @llvm.ctpop.v4i8(<4 x i8> %op)
208   ret <4 x i8> %res
211 define <8 x i8> @ctpop_v8i8(<8 x i8> %op) {
212 ; CHECK-LABEL: ctpop_v8i8:
213 ; CHECK:       // %bb.0:
214 ; CHECK-NEXT:    ptrue p0.b, vl8
215 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
216 ; CHECK-NEXT:    cnt z0.b, p0/m, z0.b
217 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
218 ; CHECK-NEXT:    ret
219   %res = call <8 x i8> @llvm.ctpop.v8i8(<8 x i8> %op)
220   ret <8 x i8> %res
223 define <16 x i8> @ctpop_v16i8(<16 x i8> %op) {
224 ; CHECK-LABEL: ctpop_v16i8:
225 ; CHECK:       // %bb.0:
226 ; CHECK-NEXT:    ptrue p0.b, vl16
227 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
228 ; CHECK-NEXT:    cnt z0.b, p0/m, z0.b
229 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
230 ; CHECK-NEXT:    ret
231   %res = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %op)
232   ret <16 x i8> %res
235 define void @ctpop_v32i8(ptr %a) {
236 ; CHECK-LABEL: ctpop_v32i8:
237 ; CHECK:       // %bb.0:
238 ; CHECK-NEXT:    ptrue p0.b, vl16
239 ; CHECK-NEXT:    ldp q0, q1, [x0]
240 ; CHECK-NEXT:    cnt z0.b, p0/m, z0.b
241 ; CHECK-NEXT:    cnt z1.b, p0/m, z1.b
242 ; CHECK-NEXT:    stp q0, q1, [x0]
243 ; CHECK-NEXT:    ret
244   %op = load <32 x i8>, ptr %a
245   %res = call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %op)
246   store <32 x i8> %res, ptr %a
247   ret void
250 define <2 x i16> @ctpop_v2i16(<2 x i16> %op) {
251 ; CHECK-LABEL: ctpop_v2i16:
252 ; CHECK:       // %bb.0:
253 ; CHECK-NEXT:    ptrue p0.s, vl2
254 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
255 ; CHECK-NEXT:    and z0.s, z0.s, #0xffff
256 ; CHECK-NEXT:    cnt z0.s, p0/m, z0.s
257 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
258 ; CHECK-NEXT:    ret
259   %res = call <2 x i16> @llvm.ctpop.v2i16(<2 x i16> %op)
260   ret <2 x i16> %res
263 define <4 x i16> @ctpop_v4i16(<4 x i16> %op) {
264 ; CHECK-LABEL: ctpop_v4i16:
265 ; CHECK:       // %bb.0:
266 ; CHECK-NEXT:    ptrue p0.h, vl4
267 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
268 ; CHECK-NEXT:    cnt z0.h, p0/m, z0.h
269 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
270 ; CHECK-NEXT:    ret
271   %res = call <4 x i16> @llvm.ctpop.v4i16(<4 x i16> %op)
272   ret <4 x i16> %res
275 define <8 x i16> @ctpop_v8i16(<8 x i16> %op) {
276 ; CHECK-LABEL: ctpop_v8i16:
277 ; CHECK:       // %bb.0:
278 ; CHECK-NEXT:    ptrue p0.h, vl8
279 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
280 ; CHECK-NEXT:    cnt z0.h, p0/m, z0.h
281 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
282 ; CHECK-NEXT:    ret
283   %res = call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %op)
284   ret <8 x i16> %res
287 define void @ctpop_v16i16(ptr %a) {
288 ; CHECK-LABEL: ctpop_v16i16:
289 ; CHECK:       // %bb.0:
290 ; CHECK-NEXT:    ptrue p0.h, vl8
291 ; CHECK-NEXT:    ldp q0, q1, [x0]
292 ; CHECK-NEXT:    cnt z0.h, p0/m, z0.h
293 ; CHECK-NEXT:    cnt z1.h, p0/m, z1.h
294 ; CHECK-NEXT:    stp q0, q1, [x0]
295 ; CHECK-NEXT:    ret
296   %op = load <16 x i16>, ptr %a
297   %res = call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %op)
298   store <16 x i16> %res, ptr %a
299   ret void
302 define <2 x i32> @ctpop_v2i32(<2 x i32> %op) {
303 ; CHECK-LABEL: ctpop_v2i32:
304 ; CHECK:       // %bb.0:
305 ; CHECK-NEXT:    ptrue p0.s, vl2
306 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
307 ; CHECK-NEXT:    cnt z0.s, p0/m, z0.s
308 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
309 ; CHECK-NEXT:    ret
310   %res = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %op)
311   ret <2 x i32> %res
314 define <4 x i32> @ctpop_v4i32(<4 x i32> %op) {
315 ; CHECK-LABEL: ctpop_v4i32:
316 ; CHECK:       // %bb.0:
317 ; CHECK-NEXT:    ptrue p0.s, vl4
318 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
319 ; CHECK-NEXT:    cnt z0.s, p0/m, z0.s
320 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
321 ; CHECK-NEXT:    ret
322   %res = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %op)
323   ret <4 x i32> %res
326 define void @ctpop_v8i32(ptr %a) {
327 ; CHECK-LABEL: ctpop_v8i32:
328 ; CHECK:       // %bb.0:
329 ; CHECK-NEXT:    ptrue p0.s, vl4
330 ; CHECK-NEXT:    ldp q0, q1, [x0]
331 ; CHECK-NEXT:    cnt z0.s, p0/m, z0.s
332 ; CHECK-NEXT:    cnt z1.s, p0/m, z1.s
333 ; CHECK-NEXT:    stp q0, q1, [x0]
334 ; CHECK-NEXT:    ret
335   %op = load <8 x i32>, ptr %a
336   %res = call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %op)
337   store <8 x i32> %res, ptr %a
338   ret void
341 define <1 x i64> @ctpop_v1i64(<1 x i64> %op) {
342 ; CHECK-LABEL: ctpop_v1i64:
343 ; CHECK:       // %bb.0:
344 ; CHECK-NEXT:    ptrue p0.d, vl1
345 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
346 ; CHECK-NEXT:    cnt z0.d, p0/m, z0.d
347 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
348 ; CHECK-NEXT:    ret
349   %res = call <1 x i64> @llvm.ctpop.v1i64(<1 x i64> %op)
350   ret <1 x i64> %res
353 define <2 x i64> @ctpop_v2i64(<2 x i64> %op) {
354 ; CHECK-LABEL: ctpop_v2i64:
355 ; CHECK:       // %bb.0:
356 ; CHECK-NEXT:    ptrue p0.d, vl2
357 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
358 ; CHECK-NEXT:    cnt z0.d, p0/m, z0.d
359 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
360 ; CHECK-NEXT:    ret
361   %res = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %op)
362   ret <2 x i64> %res
365 define void @ctpop_v4i64(ptr %a) {
366 ; CHECK-LABEL: ctpop_v4i64:
367 ; CHECK:       // %bb.0:
368 ; CHECK-NEXT:    ptrue p0.d, vl2
369 ; CHECK-NEXT:    ldp q0, q1, [x0]
370 ; CHECK-NEXT:    cnt z0.d, p0/m, z0.d
371 ; CHECK-NEXT:    cnt z1.d, p0/m, z1.d
372 ; CHECK-NEXT:    stp q0, q1, [x0]
373 ; CHECK-NEXT:    ret
374   %op = load <4 x i64>, ptr %a
375   %res = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %op)
376   store <4 x i64> %res, ptr %a
377   ret void
381 ; Count trailing zeros
384 define <4 x i8> @cttz_v4i8(<4 x i8> %op) {
385 ; CHECK-LABEL: cttz_v4i8:
386 ; CHECK:       // %bb.0:
387 ; CHECK-NEXT:    ptrue p0.h, vl4
388 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
389 ; CHECK-NEXT:    orr z0.h, z0.h, #0x100
390 ; CHECK-NEXT:    rbit z0.h, p0/m, z0.h
391 ; CHECK-NEXT:    clz z0.h, p0/m, z0.h
392 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
393 ; CHECK-NEXT:    ret
394   %res = call <4 x i8> @llvm.cttz.v4i8(<4 x i8> %op)
395   ret <4 x i8> %res
398 define <8 x i8> @cttz_v8i8(<8 x i8> %op) {
399 ; CHECK-LABEL: cttz_v8i8:
400 ; CHECK:       // %bb.0:
401 ; CHECK-NEXT:    ptrue p0.b, vl8
402 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
403 ; CHECK-NEXT:    rbit z0.b, p0/m, z0.b
404 ; CHECK-NEXT:    clz z0.b, p0/m, z0.b
405 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
406 ; CHECK-NEXT:    ret
407   %res = call <8 x i8> @llvm.cttz.v8i8(<8 x i8> %op)
408   ret <8 x i8> %res
411 define <16 x i8> @cttz_v16i8(<16 x i8> %op) {
412 ; CHECK-LABEL: cttz_v16i8:
413 ; CHECK:       // %bb.0:
414 ; CHECK-NEXT:    ptrue p0.b, vl16
415 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
416 ; CHECK-NEXT:    rbit z0.b, p0/m, z0.b
417 ; CHECK-NEXT:    clz z0.b, p0/m, z0.b
418 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
419 ; CHECK-NEXT:    ret
420   %res = call <16 x i8> @llvm.cttz.v16i8(<16 x i8> %op)
421   ret <16 x i8> %res
424 define void @cttz_v32i8(ptr %a) {
425 ; CHECK-LABEL: cttz_v32i8:
426 ; CHECK:       // %bb.0:
427 ; CHECK-NEXT:    ptrue p0.b, vl16
428 ; CHECK-NEXT:    ldp q0, q1, [x0]
429 ; CHECK-NEXT:    rbit z0.b, p0/m, z0.b
430 ; CHECK-NEXT:    rbit z1.b, p0/m, z1.b
431 ; CHECK-NEXT:    clz z0.b, p0/m, z0.b
432 ; CHECK-NEXT:    clz z1.b, p0/m, z1.b
433 ; CHECK-NEXT:    stp q0, q1, [x0]
434 ; CHECK-NEXT:    ret
435   %op = load <32 x i8>, ptr %a
436   %res = call <32 x i8> @llvm.cttz.v32i8(<32 x i8> %op)
437   store <32 x i8> %res, ptr %a
438   ret void
441 define <2 x i16> @cttz_v2i16(<2 x i16> %op) {
442 ; CHECK-LABEL: cttz_v2i16:
443 ; CHECK:       // %bb.0:
444 ; CHECK-NEXT:    ptrue p0.s, vl2
445 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
446 ; CHECK-NEXT:    orr z0.s, z0.s, #0x10000
447 ; CHECK-NEXT:    rbit z0.s, p0/m, z0.s
448 ; CHECK-NEXT:    clz z0.s, p0/m, z0.s
449 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
450 ; CHECK-NEXT:    ret
451   %res = call <2 x i16> @llvm.cttz.v2i16(<2 x i16> %op)
452   ret <2 x i16> %res
455 define <4 x i16> @cttz_v4i16(<4 x i16> %op) {
456 ; CHECK-LABEL: cttz_v4i16:
457 ; CHECK:       // %bb.0:
458 ; CHECK-NEXT:    ptrue p0.h, vl4
459 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
460 ; CHECK-NEXT:    rbit z0.h, p0/m, z0.h
461 ; CHECK-NEXT:    clz z0.h, p0/m, z0.h
462 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
463 ; CHECK-NEXT:    ret
464   %res = call <4 x i16> @llvm.cttz.v4i16(<4 x i16> %op)
465   ret <4 x i16> %res
468 define <8 x i16> @cttz_v8i16(<8 x i16> %op) {
469 ; CHECK-LABEL: cttz_v8i16:
470 ; CHECK:       // %bb.0:
471 ; CHECK-NEXT:    ptrue p0.h, vl8
472 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
473 ; CHECK-NEXT:    rbit z0.h, p0/m, z0.h
474 ; CHECK-NEXT:    clz z0.h, p0/m, z0.h
475 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
476 ; CHECK-NEXT:    ret
477   %res = call <8 x i16> @llvm.cttz.v8i16(<8 x i16> %op)
478   ret <8 x i16> %res
481 define void @cttz_v16i16(ptr %a) {
482 ; CHECK-LABEL: cttz_v16i16:
483 ; CHECK:       // %bb.0:
484 ; CHECK-NEXT:    ptrue p0.h, vl8
485 ; CHECK-NEXT:    ldp q0, q1, [x0]
486 ; CHECK-NEXT:    rbit z0.h, p0/m, z0.h
487 ; CHECK-NEXT:    rbit z1.h, p0/m, z1.h
488 ; CHECK-NEXT:    clz z0.h, p0/m, z0.h
489 ; CHECK-NEXT:    clz z1.h, p0/m, z1.h
490 ; CHECK-NEXT:    stp q0, q1, [x0]
491 ; CHECK-NEXT:    ret
492   %op = load <16 x i16>, ptr %a
493   %res = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> %op)
494   store <16 x i16> %res, ptr %a
495   ret void
498 define <2 x i32> @cttz_v2i32(<2 x i32> %op) {
499 ; CHECK-LABEL: cttz_v2i32:
500 ; CHECK:       // %bb.0:
501 ; CHECK-NEXT:    ptrue p0.s, vl2
502 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
503 ; CHECK-NEXT:    rbit z0.s, p0/m, z0.s
504 ; CHECK-NEXT:    clz z0.s, p0/m, z0.s
505 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
506 ; CHECK-NEXT:    ret
507   %res = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %op)
508   ret <2 x i32> %res
511 define <4 x i32> @cttz_v4i32(<4 x i32> %op) {
512 ; CHECK-LABEL: cttz_v4i32:
513 ; CHECK:       // %bb.0:
514 ; CHECK-NEXT:    ptrue p0.s, vl4
515 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
516 ; CHECK-NEXT:    rbit z0.s, p0/m, z0.s
517 ; CHECK-NEXT:    clz z0.s, p0/m, z0.s
518 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
519 ; CHECK-NEXT:    ret
520   %res = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %op)
521   ret <4 x i32> %res
524 define void @cttz_v8i32(ptr %a) {
525 ; CHECK-LABEL: cttz_v8i32:
526 ; CHECK:       // %bb.0:
527 ; CHECK-NEXT:    ptrue p0.s, vl4
528 ; CHECK-NEXT:    ldp q0, q1, [x0]
529 ; CHECK-NEXT:    rbit z0.s, p0/m, z0.s
530 ; CHECK-NEXT:    rbit z1.s, p0/m, z1.s
531 ; CHECK-NEXT:    clz z0.s, p0/m, z0.s
532 ; CHECK-NEXT:    clz z1.s, p0/m, z1.s
533 ; CHECK-NEXT:    stp q0, q1, [x0]
534 ; CHECK-NEXT:    ret
535   %op = load <8 x i32>, ptr %a
536   %res = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> %op)
537   store <8 x i32> %res, ptr %a
538   ret void
541 define <1 x i64> @cttz_v1i64(<1 x i64> %op) {
542 ; CHECK-LABEL: cttz_v1i64:
543 ; CHECK:       // %bb.0:
544 ; CHECK-NEXT:    ptrue p0.d, vl1
545 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
546 ; CHECK-NEXT:    rbit z0.d, p0/m, z0.d
547 ; CHECK-NEXT:    clz z0.d, p0/m, z0.d
548 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
549 ; CHECK-NEXT:    ret
550   %res = call <1 x i64> @llvm.cttz.v1i64(<1 x i64> %op)
551   ret <1 x i64> %res
554 define <2 x i64> @cttz_v2i64(<2 x i64> %op) {
555 ; CHECK-LABEL: cttz_v2i64:
556 ; CHECK:       // %bb.0:
557 ; CHECK-NEXT:    ptrue p0.d, vl2
558 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
559 ; CHECK-NEXT:    rbit z0.d, p0/m, z0.d
560 ; CHECK-NEXT:    clz z0.d, p0/m, z0.d
561 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
562 ; CHECK-NEXT:    ret
563   %res = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %op)
564   ret <2 x i64> %res
567 define void @cttz_v4i64(ptr %a) {
568 ; CHECK-LABEL: cttz_v4i64:
569 ; CHECK:       // %bb.0:
570 ; CHECK-NEXT:    ptrue p0.d, vl2
571 ; CHECK-NEXT:    ldp q0, q1, [x0]
572 ; CHECK-NEXT:    rbit z0.d, p0/m, z0.d
573 ; CHECK-NEXT:    rbit z1.d, p0/m, z1.d
574 ; CHECK-NEXT:    clz z0.d, p0/m, z0.d
575 ; CHECK-NEXT:    clz z1.d, p0/m, z1.d
576 ; CHECK-NEXT:    stp q0, q1, [x0]
577 ; CHECK-NEXT:    ret
578   %op = load <4 x i64>, ptr %a
579   %res = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> %op)
580   store <4 x i64> %res, ptr %a
581   ret void
585 declare <4 x i8> @llvm.ctlz.v4i8(<4 x i8>)
586 declare <8 x i8> @llvm.ctlz.v8i8(<8 x i8>)
587 declare <16 x i8> @llvm.ctlz.v16i8(<16 x i8>)
588 declare <32 x i8> @llvm.ctlz.v32i8(<32 x i8>)
589 declare <2 x i16> @llvm.ctlz.v2i16(<2 x i16>)
590 declare <4 x i16> @llvm.ctlz.v4i16(<4 x i16>)
591 declare <8 x i16> @llvm.ctlz.v8i16(<8 x i16>)
592 declare <16 x i16> @llvm.ctlz.v16i16(<16 x i16>)
593 declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>)
594 declare <4 x i32> @llvm.ctlz.v4i32(<4 x i32>)
595 declare <8 x i32> @llvm.ctlz.v8i32(<8 x i32>)
596 declare <1 x i64> @llvm.ctlz.v1i64(<1 x i64>)
597 declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>)
598 declare <4 x i64> @llvm.ctlz.v4i64(<4 x i64>)
600 declare <4 x i8> @llvm.ctpop.v4i8(<4 x i8>)
601 declare <8 x i8> @llvm.ctpop.v8i8(<8 x i8>)
602 declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)
603 declare <32 x i8> @llvm.ctpop.v32i8(<32 x i8>)
604 declare <2 x i16> @llvm.ctpop.v2i16(<2 x i16>)
605 declare <4 x i16> @llvm.ctpop.v4i16(<4 x i16>)
606 declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>)
607 declare <16 x i16> @llvm.ctpop.v16i16(<16 x i16>)
608 declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>)
609 declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)
610 declare <8 x i32> @llvm.ctpop.v8i32(<8 x i32>)
611 declare <1 x i64> @llvm.ctpop.v1i64(<1 x i64>)
612 declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>)
613 declare <4 x i64> @llvm.ctpop.v4i64(<4 x i64>)
615 declare <4 x i8> @llvm.cttz.v4i8(<4 x i8>)
616 declare <8 x i8> @llvm.cttz.v8i8(<8 x i8>)
617 declare <16 x i8> @llvm.cttz.v16i8(<16 x i8>)
618 declare <32 x i8> @llvm.cttz.v32i8(<32 x i8>)
619 declare <2 x i16> @llvm.cttz.v2i16(<2 x i16>)
620 declare <4 x i16> @llvm.cttz.v4i16(<4 x i16>)
621 declare <8 x i16> @llvm.cttz.v8i16(<8 x i16>)
622 declare <16 x i16> @llvm.cttz.v16i16(<16 x i16>)
623 declare <2 x i32> @llvm.cttz.v2i32(<2 x i32>)
624 declare <4 x i32> @llvm.cttz.v4i32(<4 x i32>)
625 declare <8 x i32> @llvm.cttz.v8i32(<8 x i32>)
626 declare <1 x i64> @llvm.cttz.v1i64(<1 x i64>)
627 declare <2 x i64> @llvm.cttz.v2i64(<2 x i64>)
628 declare <4 x i64> @llvm.cttz.v4i64(<4 x i64>)