xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-bit-counting.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s
3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s
4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
5
6target triple = "aarch64-unknown-linux-gnu"
7
8;
9; CLZ
10;
11
12define <4 x i8> @ctlz_v4i8(<4 x i8> %op) {
13; CHECK-LABEL: ctlz_v4i8:
14; CHECK:       // %bb.0:
15; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
16; CHECK-NEXT:    ptrue p0.h, vl4
17; CHECK-NEXT:    and z0.h, z0.h, #0xff
18; CHECK-NEXT:    clz z0.h, p0/m, z0.h
19; CHECK-NEXT:    sub z0.h, z0.h, #8 // =0x8
20; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
21; CHECK-NEXT:    ret
22;
23; NONEON-NOSVE-LABEL: ctlz_v4i8:
24; NONEON-NOSVE:       // %bb.0:
25; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
26; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
27; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
28; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
29; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #2]
30; NONEON-NOSVE-NEXT:    ldrb w11, [sp]
31; NONEON-NOSVE-NEXT:    clz w8, w8
32; NONEON-NOSVE-NEXT:    clz w9, w9
33; NONEON-NOSVE-NEXT:    clz w10, w10
34; NONEON-NOSVE-NEXT:    sub w8, w8, #24
35; NONEON-NOSVE-NEXT:    sub w9, w9, #24
36; NONEON-NOSVE-NEXT:    sub w10, w10, #24
37; NONEON-NOSVE-NEXT:    strh w8, [sp, #14]
38; NONEON-NOSVE-NEXT:    clz w8, w11
39; NONEON-NOSVE-NEXT:    sub w8, w8, #24
40; NONEON-NOSVE-NEXT:    strh w9, [sp, #12]
41; NONEON-NOSVE-NEXT:    strh w10, [sp, #10]
42; NONEON-NOSVE-NEXT:    strh w8, [sp, #8]
43; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
44; NONEON-NOSVE-NEXT:    add sp, sp, #16
45; NONEON-NOSVE-NEXT:    ret
46  %res = call <4 x i8> @llvm.ctlz.v4i8(<4 x i8> %op)
47  ret <4 x i8> %res
48}
49
50define <8 x i8> @ctlz_v8i8(<8 x i8> %op) {
51; CHECK-LABEL: ctlz_v8i8:
52; CHECK:       // %bb.0:
53; CHECK-NEXT:    ptrue p0.b, vl8
54; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
55; CHECK-NEXT:    clz z0.b, p0/m, z0.b
56; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
57; CHECK-NEXT:    ret
58;
59; NONEON-NOSVE-LABEL: ctlz_v8i8:
60; NONEON-NOSVE:       // %bb.0:
61; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
62; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
63; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
64; NONEON-NOSVE-NEXT:    clz w8, w8
65; NONEON-NOSVE-NEXT:    sub w8, w8, #24
66; NONEON-NOSVE-NEXT:    strb w8, [sp, #15]
67; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
68; NONEON-NOSVE-NEXT:    clz w8, w8
69; NONEON-NOSVE-NEXT:    sub w8, w8, #24
70; NONEON-NOSVE-NEXT:    strb w8, [sp, #14]
71; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
72; NONEON-NOSVE-NEXT:    clz w8, w8
73; NONEON-NOSVE-NEXT:    sub w8, w8, #24
74; NONEON-NOSVE-NEXT:    strb w8, [sp, #13]
75; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
76; NONEON-NOSVE-NEXT:    clz w8, w8
77; NONEON-NOSVE-NEXT:    sub w8, w8, #24
78; NONEON-NOSVE-NEXT:    strb w8, [sp, #12]
79; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
80; NONEON-NOSVE-NEXT:    clz w8, w8
81; NONEON-NOSVE-NEXT:    sub w8, w8, #24
82; NONEON-NOSVE-NEXT:    strb w8, [sp, #11]
83; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
84; NONEON-NOSVE-NEXT:    clz w8, w8
85; NONEON-NOSVE-NEXT:    sub w8, w8, #24
86; NONEON-NOSVE-NEXT:    strb w8, [sp, #10]
87; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
88; NONEON-NOSVE-NEXT:    clz w8, w8
89; NONEON-NOSVE-NEXT:    sub w8, w8, #24
90; NONEON-NOSVE-NEXT:    strb w8, [sp, #9]
91; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
92; NONEON-NOSVE-NEXT:    clz w8, w8
93; NONEON-NOSVE-NEXT:    sub w8, w8, #24
94; NONEON-NOSVE-NEXT:    strb w8, [sp, #8]
95; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
96; NONEON-NOSVE-NEXT:    add sp, sp, #16
97; NONEON-NOSVE-NEXT:    ret
98  %res = call <8 x i8> @llvm.ctlz.v8i8(<8 x i8> %op)
99  ret <8 x i8> %res
100}
101
102define <16 x i8> @ctlz_v16i8(<16 x i8> %op) {
103; CHECK-LABEL: ctlz_v16i8:
104; CHECK:       // %bb.0:
105; CHECK-NEXT:    ptrue p0.b, vl16
106; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
107; CHECK-NEXT:    clz z0.b, p0/m, z0.b
108; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
109; CHECK-NEXT:    ret
110;
111; NONEON-NOSVE-LABEL: ctlz_v16i8:
112; NONEON-NOSVE:       // %bb.0:
113; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
114; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
115; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
116; NONEON-NOSVE-NEXT:    clz w8, w8
117; NONEON-NOSVE-NEXT:    sub w8, w8, #24
118; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]
119; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
120; NONEON-NOSVE-NEXT:    clz w8, w8
121; NONEON-NOSVE-NEXT:    sub w8, w8, #24
122; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]
123; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
124; NONEON-NOSVE-NEXT:    clz w8, w8
125; NONEON-NOSVE-NEXT:    sub w8, w8, #24
126; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]
127; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
128; NONEON-NOSVE-NEXT:    clz w8, w8
129; NONEON-NOSVE-NEXT:    sub w8, w8, #24
130; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]
131; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
132; NONEON-NOSVE-NEXT:    clz w8, w8
133; NONEON-NOSVE-NEXT:    sub w8, w8, #24
134; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]
135; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
136; NONEON-NOSVE-NEXT:    clz w8, w8
137; NONEON-NOSVE-NEXT:    sub w8, w8, #24
138; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]
139; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
140; NONEON-NOSVE-NEXT:    clz w8, w8
141; NONEON-NOSVE-NEXT:    sub w8, w8, #24
142; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]
143; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
144; NONEON-NOSVE-NEXT:    clz w8, w8
145; NONEON-NOSVE-NEXT:    sub w8, w8, #24
146; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]
147; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
148; NONEON-NOSVE-NEXT:    clz w8, w8
149; NONEON-NOSVE-NEXT:    sub w8, w8, #24
150; NONEON-NOSVE-NEXT:    strb w8, [sp, #23]
151; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
152; NONEON-NOSVE-NEXT:    clz w8, w8
153; NONEON-NOSVE-NEXT:    sub w8, w8, #24
154; NONEON-NOSVE-NEXT:    strb w8, [sp, #22]
155; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
156; NONEON-NOSVE-NEXT:    clz w8, w8
157; NONEON-NOSVE-NEXT:    sub w8, w8, #24
158; NONEON-NOSVE-NEXT:    strb w8, [sp, #21]
159; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
160; NONEON-NOSVE-NEXT:    clz w8, w8
161; NONEON-NOSVE-NEXT:    sub w8, w8, #24
162; NONEON-NOSVE-NEXT:    strb w8, [sp, #20]
163; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
164; NONEON-NOSVE-NEXT:    clz w8, w8
165; NONEON-NOSVE-NEXT:    sub w8, w8, #24
166; NONEON-NOSVE-NEXT:    strb w8, [sp, #19]
167; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
168; NONEON-NOSVE-NEXT:    clz w8, w8
169; NONEON-NOSVE-NEXT:    sub w8, w8, #24
170; NONEON-NOSVE-NEXT:    strb w8, [sp, #18]
171; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
172; NONEON-NOSVE-NEXT:    clz w8, w8
173; NONEON-NOSVE-NEXT:    sub w8, w8, #24
174; NONEON-NOSVE-NEXT:    strb w8, [sp, #17]
175; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
176; NONEON-NOSVE-NEXT:    clz w8, w8
177; NONEON-NOSVE-NEXT:    sub w8, w8, #24
178; NONEON-NOSVE-NEXT:    strb w8, [sp, #16]
179; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
180; NONEON-NOSVE-NEXT:    add sp, sp, #32
181; NONEON-NOSVE-NEXT:    ret
182  %res = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %op)
183  ret <16 x i8> %res
184}
185
186define void @ctlz_v32i8(ptr %a) {
187; CHECK-LABEL: ctlz_v32i8:
188; CHECK:       // %bb.0:
189; CHECK-NEXT:    ldp q0, q1, [x0]
190; CHECK-NEXT:    ptrue p0.b, vl16
191; CHECK-NEXT:    clz z0.b, p0/m, z0.b
192; CHECK-NEXT:    clz z1.b, p0/m, z1.b
193; CHECK-NEXT:    stp q0, q1, [x0]
194; CHECK-NEXT:    ret
195;
196; NONEON-NOSVE-LABEL: ctlz_v32i8:
197; NONEON-NOSVE:       // %bb.0:
198; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
199; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
200; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
201; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
202; NONEON-NOSVE-NEXT:    clz w8, w8
203; NONEON-NOSVE-NEXT:    sub w8, w8, #24
204; NONEON-NOSVE-NEXT:    strb w8, [sp, #63]
205; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
206; NONEON-NOSVE-NEXT:    clz w8, w8
207; NONEON-NOSVE-NEXT:    sub w8, w8, #24
208; NONEON-NOSVE-NEXT:    strb w8, [sp, #62]
209; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
210; NONEON-NOSVE-NEXT:    clz w8, w8
211; NONEON-NOSVE-NEXT:    sub w8, w8, #24
212; NONEON-NOSVE-NEXT:    strb w8, [sp, #61]
213; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
214; NONEON-NOSVE-NEXT:    clz w8, w8
215; NONEON-NOSVE-NEXT:    sub w8, w8, #24
216; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
217; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
218; NONEON-NOSVE-NEXT:    clz w8, w8
219; NONEON-NOSVE-NEXT:    sub w8, w8, #24
220; NONEON-NOSVE-NEXT:    strb w8, [sp, #59]
221; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
222; NONEON-NOSVE-NEXT:    clz w8, w8
223; NONEON-NOSVE-NEXT:    sub w8, w8, #24
224; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
225; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
226; NONEON-NOSVE-NEXT:    clz w8, w8
227; NONEON-NOSVE-NEXT:    sub w8, w8, #24
228; NONEON-NOSVE-NEXT:    strb w8, [sp, #57]
229; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
230; NONEON-NOSVE-NEXT:    clz w8, w8
231; NONEON-NOSVE-NEXT:    sub w8, w8, #24
232; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
233; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
234; NONEON-NOSVE-NEXT:    clz w8, w8
235; NONEON-NOSVE-NEXT:    sub w8, w8, #24
236; NONEON-NOSVE-NEXT:    strb w8, [sp, #55]
237; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
238; NONEON-NOSVE-NEXT:    clz w8, w8
239; NONEON-NOSVE-NEXT:    sub w8, w8, #24
240; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
241; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
242; NONEON-NOSVE-NEXT:    clz w8, w8
243; NONEON-NOSVE-NEXT:    sub w8, w8, #24
244; NONEON-NOSVE-NEXT:    strb w8, [sp, #53]
245; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
246; NONEON-NOSVE-NEXT:    clz w8, w8
247; NONEON-NOSVE-NEXT:    sub w8, w8, #24
248; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
249; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
250; NONEON-NOSVE-NEXT:    clz w8, w8
251; NONEON-NOSVE-NEXT:    sub w8, w8, #24
252; NONEON-NOSVE-NEXT:    strb w8, [sp, #51]
253; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
254; NONEON-NOSVE-NEXT:    clz w8, w8
255; NONEON-NOSVE-NEXT:    sub w8, w8, #24
256; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
257; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
258; NONEON-NOSVE-NEXT:    clz w8, w8
259; NONEON-NOSVE-NEXT:    sub w8, w8, #24
260; NONEON-NOSVE-NEXT:    strb w8, [sp, #49]
261; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
262; NONEON-NOSVE-NEXT:    clz w8, w8
263; NONEON-NOSVE-NEXT:    sub w8, w8, #24
264; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
265; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
266; NONEON-NOSVE-NEXT:    clz w8, w8
267; NONEON-NOSVE-NEXT:    sub w8, w8, #24
268; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
269; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
270; NONEON-NOSVE-NEXT:    clz w8, w8
271; NONEON-NOSVE-NEXT:    sub w8, w8, #24
272; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
273; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
274; NONEON-NOSVE-NEXT:    clz w8, w8
275; NONEON-NOSVE-NEXT:    sub w8, w8, #24
276; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
277; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
278; NONEON-NOSVE-NEXT:    clz w8, w8
279; NONEON-NOSVE-NEXT:    sub w8, w8, #24
280; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
281; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
282; NONEON-NOSVE-NEXT:    clz w8, w8
283; NONEON-NOSVE-NEXT:    sub w8, w8, #24
284; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
285; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
286; NONEON-NOSVE-NEXT:    clz w8, w8
287; NONEON-NOSVE-NEXT:    sub w8, w8, #24
288; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
289; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
290; NONEON-NOSVE-NEXT:    clz w8, w8
291; NONEON-NOSVE-NEXT:    sub w8, w8, #24
292; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
293; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
294; NONEON-NOSVE-NEXT:    clz w8, w8
295; NONEON-NOSVE-NEXT:    sub w8, w8, #24
296; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
297; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
298; NONEON-NOSVE-NEXT:    clz w8, w8
299; NONEON-NOSVE-NEXT:    sub w8, w8, #24
300; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
301; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
302; NONEON-NOSVE-NEXT:    clz w8, w8
303; NONEON-NOSVE-NEXT:    sub w8, w8, #24
304; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
305; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
306; NONEON-NOSVE-NEXT:    clz w8, w8
307; NONEON-NOSVE-NEXT:    sub w8, w8, #24
308; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
309; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
310; NONEON-NOSVE-NEXT:    clz w8, w8
311; NONEON-NOSVE-NEXT:    sub w8, w8, #24
312; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
313; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
314; NONEON-NOSVE-NEXT:    clz w8, w8
315; NONEON-NOSVE-NEXT:    sub w8, w8, #24
316; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
317; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
318; NONEON-NOSVE-NEXT:    clz w8, w8
319; NONEON-NOSVE-NEXT:    sub w8, w8, #24
320; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
321; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
322; NONEON-NOSVE-NEXT:    clz w8, w8
323; NONEON-NOSVE-NEXT:    sub w8, w8, #24
324; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
325; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
326; NONEON-NOSVE-NEXT:    clz w8, w8
327; NONEON-NOSVE-NEXT:    sub w8, w8, #24
328; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
329; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
330; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
331; NONEON-NOSVE-NEXT:    add sp, sp, #64
332; NONEON-NOSVE-NEXT:    ret
333  %op = load <32 x i8>, ptr %a
334  %res = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %op)
335  store <32 x i8> %res, ptr %a
336  ret void
337}
338
339define <2 x i16> @ctlz_v2i16(<2 x i16> %op) {
340; CHECK-LABEL: ctlz_v2i16:
341; CHECK:       // %bb.0:
342; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
343; CHECK-NEXT:    ptrue p0.s, vl2
344; CHECK-NEXT:    and z0.s, z0.s, #0xffff
345; CHECK-NEXT:    clz z0.s, p0/m, z0.s
346; CHECK-NEXT:    sub z0.s, z0.s, #16 // =0x10
347; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
348; CHECK-NEXT:    ret
349;
350; NONEON-NOSVE-LABEL: ctlz_v2i16:
351; NONEON-NOSVE:       // %bb.0:
352; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
353; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
354; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
355; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
356; NONEON-NOSVE-NEXT:    clz w8, w8
357; NONEON-NOSVE-NEXT:    clz w9, w9
358; NONEON-NOSVE-NEXT:    sub w8, w8, #16
359; NONEON-NOSVE-NEXT:    sub w9, w9, #16
360; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #8]
361; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
362; NONEON-NOSVE-NEXT:    add sp, sp, #16
363; NONEON-NOSVE-NEXT:    ret
364  %res = call <2 x i16> @llvm.ctlz.v2i16(<2 x i16> %op)
365  ret <2 x i16> %res
366}
367
368define <4 x i16> @ctlz_v4i16(<4 x i16> %op) {
369; CHECK-LABEL: ctlz_v4i16:
370; CHECK:       // %bb.0:
371; CHECK-NEXT:    ptrue p0.h, vl4
372; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
373; CHECK-NEXT:    clz z0.h, p0/m, z0.h
374; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
375; CHECK-NEXT:    ret
376;
377; NONEON-NOSVE-LABEL: ctlz_v4i16:
378; NONEON-NOSVE:       // %bb.0:
379; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
380; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
381; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
382; NONEON-NOSVE-NEXT:    clz w8, w8
383; NONEON-NOSVE-NEXT:    sub w8, w8, #16
384; NONEON-NOSVE-NEXT:    strh w8, [sp, #14]
385; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
386; NONEON-NOSVE-NEXT:    clz w8, w8
387; NONEON-NOSVE-NEXT:    sub w8, w8, #16
388; NONEON-NOSVE-NEXT:    strh w8, [sp, #12]
389; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
390; NONEON-NOSVE-NEXT:    clz w8, w8
391; NONEON-NOSVE-NEXT:    sub w8, w8, #16
392; NONEON-NOSVE-NEXT:    strh w8, [sp, #10]
393; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
394; NONEON-NOSVE-NEXT:    clz w8, w8
395; NONEON-NOSVE-NEXT:    sub w8, w8, #16
396; NONEON-NOSVE-NEXT:    strh w8, [sp, #8]
397; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
398; NONEON-NOSVE-NEXT:    add sp, sp, #16
399; NONEON-NOSVE-NEXT:    ret
400  %res = call <4 x i16> @llvm.ctlz.v4i16(<4 x i16> %op)
401  ret <4 x i16> %res
402}
403
404define <8 x i16> @ctlz_v8i16(<8 x i16> %op) {
405; CHECK-LABEL: ctlz_v8i16:
406; CHECK:       // %bb.0:
407; CHECK-NEXT:    ptrue p0.h, vl8
408; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
409; CHECK-NEXT:    clz z0.h, p0/m, z0.h
410; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
411; CHECK-NEXT:    ret
412;
413; NONEON-NOSVE-LABEL: ctlz_v8i16:
414; NONEON-NOSVE:       // %bb.0:
415; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
416; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
417; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
418; NONEON-NOSVE-NEXT:    clz w8, w8
419; NONEON-NOSVE-NEXT:    sub w8, w8, #16
420; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
421; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
422; NONEON-NOSVE-NEXT:    clz w8, w8
423; NONEON-NOSVE-NEXT:    sub w8, w8, #16
424; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
425; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
426; NONEON-NOSVE-NEXT:    clz w8, w8
427; NONEON-NOSVE-NEXT:    sub w8, w8, #16
428; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
429; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
430; NONEON-NOSVE-NEXT:    clz w8, w8
431; NONEON-NOSVE-NEXT:    sub w8, w8, #16
432; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
433; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
434; NONEON-NOSVE-NEXT:    clz w8, w8
435; NONEON-NOSVE-NEXT:    sub w8, w8, #16
436; NONEON-NOSVE-NEXT:    strh w8, [sp, #22]
437; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
438; NONEON-NOSVE-NEXT:    clz w8, w8
439; NONEON-NOSVE-NEXT:    sub w8, w8, #16
440; NONEON-NOSVE-NEXT:    strh w8, [sp, #20]
441; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
442; NONEON-NOSVE-NEXT:    clz w8, w8
443; NONEON-NOSVE-NEXT:    sub w8, w8, #16
444; NONEON-NOSVE-NEXT:    strh w8, [sp, #18]
445; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
446; NONEON-NOSVE-NEXT:    clz w8, w8
447; NONEON-NOSVE-NEXT:    sub w8, w8, #16
448; NONEON-NOSVE-NEXT:    strh w8, [sp, #16]
449; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
450; NONEON-NOSVE-NEXT:    add sp, sp, #32
451; NONEON-NOSVE-NEXT:    ret
452  %res = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %op)
453  ret <8 x i16> %res
454}
455
456define void @ctlz_v16i16(ptr %a) {
457; CHECK-LABEL: ctlz_v16i16:
458; CHECK:       // %bb.0:
459; CHECK-NEXT:    ldp q0, q1, [x0]
460; CHECK-NEXT:    ptrue p0.h, vl8
461; CHECK-NEXT:    clz z0.h, p0/m, z0.h
462; CHECK-NEXT:    clz z1.h, p0/m, z1.h
463; CHECK-NEXT:    stp q0, q1, [x0]
464; CHECK-NEXT:    ret
465;
466; NONEON-NOSVE-LABEL: ctlz_v16i16:
467; NONEON-NOSVE:       // %bb.0:
468; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
469; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
470; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
471; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
472; NONEON-NOSVE-NEXT:    clz w8, w8
473; NONEON-NOSVE-NEXT:    sub w8, w8, #16
474; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
475; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
476; NONEON-NOSVE-NEXT:    clz w8, w8
477; NONEON-NOSVE-NEXT:    sub w8, w8, #16
478; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
479; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
480; NONEON-NOSVE-NEXT:    clz w8, w8
481; NONEON-NOSVE-NEXT:    sub w8, w8, #16
482; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
483; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
484; NONEON-NOSVE-NEXT:    clz w8, w8
485; NONEON-NOSVE-NEXT:    sub w8, w8, #16
486; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
487; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
488; NONEON-NOSVE-NEXT:    clz w8, w8
489; NONEON-NOSVE-NEXT:    sub w8, w8, #16
490; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
491; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
492; NONEON-NOSVE-NEXT:    clz w8, w8
493; NONEON-NOSVE-NEXT:    sub w8, w8, #16
494; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
495; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
496; NONEON-NOSVE-NEXT:    clz w8, w8
497; NONEON-NOSVE-NEXT:    sub w8, w8, #16
498; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
499; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
500; NONEON-NOSVE-NEXT:    clz w8, w8
501; NONEON-NOSVE-NEXT:    sub w8, w8, #16
502; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
503; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
504; NONEON-NOSVE-NEXT:    clz w8, w8
505; NONEON-NOSVE-NEXT:    sub w8, w8, #16
506; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
507; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
508; NONEON-NOSVE-NEXT:    clz w8, w8
509; NONEON-NOSVE-NEXT:    sub w8, w8, #16
510; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
511; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
512; NONEON-NOSVE-NEXT:    clz w8, w8
513; NONEON-NOSVE-NEXT:    sub w8, w8, #16
514; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
515; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
516; NONEON-NOSVE-NEXT:    clz w8, w8
517; NONEON-NOSVE-NEXT:    sub w8, w8, #16
518; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
519; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
520; NONEON-NOSVE-NEXT:    clz w8, w8
521; NONEON-NOSVE-NEXT:    sub w8, w8, #16
522; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
523; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
524; NONEON-NOSVE-NEXT:    clz w8, w8
525; NONEON-NOSVE-NEXT:    sub w8, w8, #16
526; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
527; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
528; NONEON-NOSVE-NEXT:    clz w8, w8
529; NONEON-NOSVE-NEXT:    sub w8, w8, #16
530; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
531; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
532; NONEON-NOSVE-NEXT:    clz w8, w8
533; NONEON-NOSVE-NEXT:    sub w8, w8, #16
534; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
535; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
536; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
537; NONEON-NOSVE-NEXT:    add sp, sp, #64
538; NONEON-NOSVE-NEXT:    ret
539  %op = load <16 x i16>, ptr %a
540  %res = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> %op)
541  store <16 x i16> %res, ptr %a
542  ret void
543}
544
545define <2 x i32> @ctlz_v2i32(<2 x i32> %op) {
546; CHECK-LABEL: ctlz_v2i32:
547; CHECK:       // %bb.0:
548; CHECK-NEXT:    ptrue p0.s, vl2
549; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
550; CHECK-NEXT:    clz z0.s, p0/m, z0.s
551; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
552; CHECK-NEXT:    ret
553;
554; NONEON-NOSVE-LABEL: ctlz_v2i32:
555; NONEON-NOSVE:       // %bb.0:
556; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
557; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
558; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
559; NONEON-NOSVE-NEXT:    clz w9, w8
560; NONEON-NOSVE-NEXT:    ldr w8, [sp]
561; NONEON-NOSVE-NEXT:    clz w8, w8
562; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8]
563; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
564; NONEON-NOSVE-NEXT:    add sp, sp, #16
565; NONEON-NOSVE-NEXT:    ret
566  %res = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %op)
567  ret <2 x i32> %res
568}
569
570define <4 x i32> @ctlz_v4i32(<4 x i32> %op) {
571; CHECK-LABEL: ctlz_v4i32:
572; CHECK:       // %bb.0:
573; CHECK-NEXT:    ptrue p0.s, vl4
574; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
575; CHECK-NEXT:    clz z0.s, p0/m, z0.s
576; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
577; CHECK-NEXT:    ret
578;
579; NONEON-NOSVE-LABEL: ctlz_v4i32:
580; NONEON-NOSVE:       // %bb.0:
581; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
582; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
583; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
584; NONEON-NOSVE-NEXT:    clz w9, w8
585; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
586; NONEON-NOSVE-NEXT:    clz w8, w8
587; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24]
588; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
589; NONEON-NOSVE-NEXT:    clz w9, w8
590; NONEON-NOSVE-NEXT:    ldr w8, [sp]
591; NONEON-NOSVE-NEXT:    clz w8, w8
592; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #16]
593; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
594; NONEON-NOSVE-NEXT:    add sp, sp, #32
595; NONEON-NOSVE-NEXT:    ret
596  %res = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %op)
597  ret <4 x i32> %res
598}
599
600define void @ctlz_v8i32(ptr %a) {
601; CHECK-LABEL: ctlz_v8i32:
602; CHECK:       // %bb.0:
603; CHECK-NEXT:    ldp q0, q1, [x0]
604; CHECK-NEXT:    ptrue p0.s, vl4
605; CHECK-NEXT:    clz z0.s, p0/m, z0.s
606; CHECK-NEXT:    clz z1.s, p0/m, z1.s
607; CHECK-NEXT:    stp q0, q1, [x0]
608; CHECK-NEXT:    ret
609;
610; NONEON-NOSVE-LABEL: ctlz_v8i32:
611; NONEON-NOSVE:       // %bb.0:
612; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
613; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
614; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
615; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
616; NONEON-NOSVE-NEXT:    clz w9, w8
617; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
618; NONEON-NOSVE-NEXT:    clz w8, w8
619; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
620; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
621; NONEON-NOSVE-NEXT:    clz w9, w8
622; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
623; NONEON-NOSVE-NEXT:    clz w8, w8
624; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
625; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
626; NONEON-NOSVE-NEXT:    clz w9, w8
627; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
628; NONEON-NOSVE-NEXT:    clz w8, w8
629; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
630; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
631; NONEON-NOSVE-NEXT:    clz w9, w8
632; NONEON-NOSVE-NEXT:    ldr w8, [sp]
633; NONEON-NOSVE-NEXT:    clz w8, w8
634; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
635; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
636; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
637; NONEON-NOSVE-NEXT:    add sp, sp, #64
638; NONEON-NOSVE-NEXT:    ret
639  %op = load <8 x i32>, ptr %a
640  %res = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %op)
641  store <8 x i32> %res, ptr %a
642  ret void
643}
644
645define <1 x i64> @ctlz_v1i64(<1 x i64> %op) {
646; CHECK-LABEL: ctlz_v1i64:
647; CHECK:       // %bb.0:
648; CHECK-NEXT:    ptrue p0.d, vl1
649; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
650; CHECK-NEXT:    clz z0.d, p0/m, z0.d
651; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
652; CHECK-NEXT:    ret
653;
654; NONEON-NOSVE-LABEL: ctlz_v1i64:
655; NONEON-NOSVE:       // %bb.0:
656; NONEON-NOSVE-NEXT:    sub sp, sp, #16
657; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
658; NONEON-NOSVE-NEXT:    fmov x8, d0
659; NONEON-NOSVE-NEXT:    clz x8, x8
660; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
661; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
662; NONEON-NOSVE-NEXT:    add sp, sp, #16
663; NONEON-NOSVE-NEXT:    ret
664  %res = call <1 x i64> @llvm.ctlz.v1i64(<1 x i64> %op)
665  ret <1 x i64> %res
666}
667
668define <2 x i64> @ctlz_v2i64(<2 x i64> %op) {
669; CHECK-LABEL: ctlz_v2i64:
670; CHECK:       // %bb.0:
671; CHECK-NEXT:    ptrue p0.d, vl2
672; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
673; CHECK-NEXT:    clz z0.d, p0/m, z0.d
674; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
675; CHECK-NEXT:    ret
676;
677; NONEON-NOSVE-LABEL: ctlz_v2i64:
678; NONEON-NOSVE:       // %bb.0:
679; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
680; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
681; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
682; NONEON-NOSVE-NEXT:    clz x9, x8
683; NONEON-NOSVE-NEXT:    ldr x8, [sp]
684; NONEON-NOSVE-NEXT:    clz x8, x8
685; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #16]
686; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
687; NONEON-NOSVE-NEXT:    add sp, sp, #32
688; NONEON-NOSVE-NEXT:    ret
689  %res = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %op)
690  ret <2 x i64> %res
691}
692
693define void @ctlz_v4i64(ptr %a) {
694; CHECK-LABEL: ctlz_v4i64:
695; CHECK:       // %bb.0:
696; CHECK-NEXT:    ldp q0, q1, [x0]
697; CHECK-NEXT:    ptrue p0.d, vl2
698; CHECK-NEXT:    clz z0.d, p0/m, z0.d
699; CHECK-NEXT:    clz z1.d, p0/m, z1.d
700; CHECK-NEXT:    stp q0, q1, [x0]
701; CHECK-NEXT:    ret
702;
703; NONEON-NOSVE-LABEL: ctlz_v4i64:
704; NONEON-NOSVE:       // %bb.0:
705; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
706; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
707; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
708; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
709; NONEON-NOSVE-NEXT:    clz x9, x8
710; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
711; NONEON-NOSVE-NEXT:    clz x8, x8
712; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]
713; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
714; NONEON-NOSVE-NEXT:    clz x9, x8
715; NONEON-NOSVE-NEXT:    ldr x8, [sp]
716; NONEON-NOSVE-NEXT:    clz x8, x8
717; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]
718; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
719; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
720; NONEON-NOSVE-NEXT:    add sp, sp, #64
721; NONEON-NOSVE-NEXT:    ret
722  %op = load <4 x i64>, ptr %a
723  %res = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %op)
724  store <4 x i64> %res, ptr %a
725  ret void
726}
727
728;
729; CNT
730;
731
732define <4 x i8> @ctpop_v4i8(<4 x i8> %op) {
733; CHECK-LABEL: ctpop_v4i8:
734; CHECK:       // %bb.0:
735; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
736; CHECK-NEXT:    ptrue p0.h, vl4
737; CHECK-NEXT:    and z0.h, z0.h, #0xff
738; CHECK-NEXT:    cnt z0.h, p0/m, z0.h
739; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
740; CHECK-NEXT:    ret
741;
742; NONEON-NOSVE-LABEL: ctpop_v4i8:
743; NONEON-NOSVE:       // %bb.0:
744; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
745; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
746; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
747; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #4]
748; NONEON-NOSVE-NEXT:    mov w8, #16843009 // =0x1010101
749; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #2]
750; NONEON-NOSVE-NEXT:    ldrb w12, [sp]
751; NONEON-NOSVE-NEXT:    lsr w13, w9, #1
752; NONEON-NOSVE-NEXT:    lsr w14, w11, #1
753; NONEON-NOSVE-NEXT:    lsr w15, w10, #1
754; NONEON-NOSVE-NEXT:    lsr w16, w12, #1
755; NONEON-NOSVE-NEXT:    and w13, w13, #0x55555555
756; NONEON-NOSVE-NEXT:    sub w9, w9, w13
757; NONEON-NOSVE-NEXT:    and w13, w14, #0x55555555
758; NONEON-NOSVE-NEXT:    and w14, w15, #0x55555555
759; NONEON-NOSVE-NEXT:    sub w11, w11, w13
760; NONEON-NOSVE-NEXT:    lsr w13, w9, #2
761; NONEON-NOSVE-NEXT:    and w15, w16, #0x55555555
762; NONEON-NOSVE-NEXT:    sub w10, w10, w14
763; NONEON-NOSVE-NEXT:    sub w12, w12, w15
764; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
765; NONEON-NOSVE-NEXT:    and w13, w13, #0x33333333
766; NONEON-NOSVE-NEXT:    lsr w14, w11, #2
767; NONEON-NOSVE-NEXT:    lsr w15, w10, #2
768; NONEON-NOSVE-NEXT:    add w9, w9, w13
769; NONEON-NOSVE-NEXT:    lsr w13, w12, #2
770; NONEON-NOSVE-NEXT:    and w11, w11, #0x33333333
771; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
772; NONEON-NOSVE-NEXT:    and w14, w14, #0x33333333
773; NONEON-NOSVE-NEXT:    and w15, w15, #0x33333333
774; NONEON-NOSVE-NEXT:    and w12, w12, #0x33333333
775; NONEON-NOSVE-NEXT:    and w13, w13, #0x33333333
776; NONEON-NOSVE-NEXT:    add w11, w11, w14
777; NONEON-NOSVE-NEXT:    add w10, w10, w15
778; NONEON-NOSVE-NEXT:    add w12, w12, w13
779; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
780; NONEON-NOSVE-NEXT:    add w11, w11, w11, lsr #4
781; NONEON-NOSVE-NEXT:    add w10, w10, w10, lsr #4
782; NONEON-NOSVE-NEXT:    add w12, w12, w12, lsr #4
783; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
784; NONEON-NOSVE-NEXT:    and w11, w11, #0xf0f0f0f
785; NONEON-NOSVE-NEXT:    and w10, w10, #0xf0f0f0f
786; NONEON-NOSVE-NEXT:    and w12, w12, #0xf0f0f0f
787; NONEON-NOSVE-NEXT:    mul w9, w9, w8
788; NONEON-NOSVE-NEXT:    mul w11, w11, w8
789; NONEON-NOSVE-NEXT:    mul w10, w10, w8
790; NONEON-NOSVE-NEXT:    mul w8, w12, w8
791; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
792; NONEON-NOSVE-NEXT:    lsr w11, w11, #24
793; NONEON-NOSVE-NEXT:    lsr w10, w10, #24
794; NONEON-NOSVE-NEXT:    strh w9, [sp, #14]
795; NONEON-NOSVE-NEXT:    lsr w8, w8, #24
796; NONEON-NOSVE-NEXT:    strh w11, [sp, #12]
797; NONEON-NOSVE-NEXT:    strh w10, [sp, #10]
798; NONEON-NOSVE-NEXT:    strh w8, [sp, #8]
799; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
800; NONEON-NOSVE-NEXT:    add sp, sp, #16
801; NONEON-NOSVE-NEXT:    ret
802  %res = call <4 x i8> @llvm.ctpop.v4i8(<4 x i8> %op)
803  ret <4 x i8> %res
804}
805
806define <8 x i8> @ctpop_v8i8(<8 x i8> %op) {
807; CHECK-LABEL: ctpop_v8i8:
808; CHECK:       // %bb.0:
809; CHECK-NEXT:    ptrue p0.b, vl8
810; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
811; CHECK-NEXT:    cnt z0.b, p0/m, z0.b
812; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
813; CHECK-NEXT:    ret
814;
815; NONEON-NOSVE-LABEL: ctpop_v8i8:
816; NONEON-NOSVE:       // %bb.0:
817; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
818; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
819; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
820; NONEON-NOSVE-NEXT:    mov w8, #16843009 // =0x1010101
821; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
822; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
823; NONEON-NOSVE-NEXT:    sub w9, w9, w10
824; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
825; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
826; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
827; NONEON-NOSVE-NEXT:    add w9, w9, w10
828; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
829; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
830; NONEON-NOSVE-NEXT:    mul w9, w9, w8
831; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
832; NONEON-NOSVE-NEXT:    strb w9, [sp, #15]
833; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
834; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
835; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
836; NONEON-NOSVE-NEXT:    sub w9, w9, w10
837; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
838; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
839; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
840; NONEON-NOSVE-NEXT:    add w9, w9, w10
841; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
842; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
843; NONEON-NOSVE-NEXT:    mul w9, w9, w8
844; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
845; NONEON-NOSVE-NEXT:    strb w9, [sp, #14]
846; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
847; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
848; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
849; NONEON-NOSVE-NEXT:    sub w9, w9, w10
850; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
851; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
852; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
853; NONEON-NOSVE-NEXT:    add w9, w9, w10
854; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
855; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
856; NONEON-NOSVE-NEXT:    mul w9, w9, w8
857; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
858; NONEON-NOSVE-NEXT:    strb w9, [sp, #13]
859; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
860; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
861; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
862; NONEON-NOSVE-NEXT:    sub w9, w9, w10
863; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
864; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
865; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
866; NONEON-NOSVE-NEXT:    add w9, w9, w10
867; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
868; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
869; NONEON-NOSVE-NEXT:    mul w9, w9, w8
870; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
871; NONEON-NOSVE-NEXT:    strb w9, [sp, #12]
872; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
873; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
874; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
875; NONEON-NOSVE-NEXT:    sub w9, w9, w10
876; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
877; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
878; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
879; NONEON-NOSVE-NEXT:    add w9, w9, w10
880; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
881; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
882; NONEON-NOSVE-NEXT:    mul w9, w9, w8
883; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
884; NONEON-NOSVE-NEXT:    strb w9, [sp, #11]
885; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
886; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
887; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
888; NONEON-NOSVE-NEXT:    sub w9, w9, w10
889; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
890; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
891; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
892; NONEON-NOSVE-NEXT:    add w9, w9, w10
893; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
894; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
895; NONEON-NOSVE-NEXT:    mul w9, w9, w8
896; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
897; NONEON-NOSVE-NEXT:    strb w9, [sp, #10]
898; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
899; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
900; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
901; NONEON-NOSVE-NEXT:    sub w9, w9, w10
902; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
903; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
904; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
905; NONEON-NOSVE-NEXT:    add w9, w9, w10
906; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
907; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
908; NONEON-NOSVE-NEXT:    mul w9, w9, w8
909; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
910; NONEON-NOSVE-NEXT:    strb w9, [sp, #9]
911; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
912; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
913; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
914; NONEON-NOSVE-NEXT:    sub w9, w9, w10
915; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
916; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
917; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
918; NONEON-NOSVE-NEXT:    add w9, w9, w10
919; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
920; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
921; NONEON-NOSVE-NEXT:    mul w8, w9, w8
922; NONEON-NOSVE-NEXT:    lsr w8, w8, #24
923; NONEON-NOSVE-NEXT:    strb w8, [sp, #8]
924; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
925; NONEON-NOSVE-NEXT:    add sp, sp, #16
926; NONEON-NOSVE-NEXT:    ret
927  %res = call <8 x i8> @llvm.ctpop.v8i8(<8 x i8> %op)
928  ret <8 x i8> %res
929}
930
931define <16 x i8> @ctpop_v16i8(<16 x i8> %op) {
932; CHECK-LABEL: ctpop_v16i8:
933; CHECK:       // %bb.0:
934; CHECK-NEXT:    ptrue p0.b, vl16
935; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
936; CHECK-NEXT:    cnt z0.b, p0/m, z0.b
937; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
938; CHECK-NEXT:    ret
939;
940; NONEON-NOSVE-LABEL: ctpop_v16i8:
941; NONEON-NOSVE:       // %bb.0:
942; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
943; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
944; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
945; NONEON-NOSVE-NEXT:    mov w8, #16843009 // =0x1010101
946; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
947; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
948; NONEON-NOSVE-NEXT:    sub w9, w9, w10
949; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
950; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
951; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
952; NONEON-NOSVE-NEXT:    add w9, w9, w10
953; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
954; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
955; NONEON-NOSVE-NEXT:    mul w9, w9, w8
956; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
957; NONEON-NOSVE-NEXT:    strb w9, [sp, #31]
958; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
959; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
960; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
961; NONEON-NOSVE-NEXT:    sub w9, w9, w10
962; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
963; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
964; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
965; NONEON-NOSVE-NEXT:    add w9, w9, w10
966; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
967; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
968; NONEON-NOSVE-NEXT:    mul w9, w9, w8
969; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
970; NONEON-NOSVE-NEXT:    strb w9, [sp, #30]
971; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
972; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
973; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
974; NONEON-NOSVE-NEXT:    sub w9, w9, w10
975; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
976; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
977; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
978; NONEON-NOSVE-NEXT:    add w9, w9, w10
979; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
980; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
981; NONEON-NOSVE-NEXT:    mul w9, w9, w8
982; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
983; NONEON-NOSVE-NEXT:    strb w9, [sp, #29]
984; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
985; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
986; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
987; NONEON-NOSVE-NEXT:    sub w9, w9, w10
988; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
989; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
990; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
991; NONEON-NOSVE-NEXT:    add w9, w9, w10
992; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
993; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
994; NONEON-NOSVE-NEXT:    mul w9, w9, w8
995; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
996; NONEON-NOSVE-NEXT:    strb w9, [sp, #28]
997; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
998; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
999; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1000; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1001; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1002; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1003; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1004; NONEON-NOSVE-NEXT:    add w9, w9, w10
1005; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1006; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1007; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1008; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1009; NONEON-NOSVE-NEXT:    strb w9, [sp, #27]
1010; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
1011; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1012; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1013; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1014; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1015; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1016; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1017; NONEON-NOSVE-NEXT:    add w9, w9, w10
1018; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1019; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1020; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1021; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1022; NONEON-NOSVE-NEXT:    strb w9, [sp, #26]
1023; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
1024; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1025; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1026; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1027; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1028; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1029; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1030; NONEON-NOSVE-NEXT:    add w9, w9, w10
1031; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1032; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1033; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1034; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1035; NONEON-NOSVE-NEXT:    strb w9, [sp, #25]
1036; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
1037; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1038; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1039; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1040; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1041; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1042; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1043; NONEON-NOSVE-NEXT:    add w9, w9, w10
1044; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1045; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1046; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1047; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1048; NONEON-NOSVE-NEXT:    strb w9, [sp, #24]
1049; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
1050; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1051; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1052; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1053; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1054; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1055; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1056; NONEON-NOSVE-NEXT:    add w9, w9, w10
1057; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1058; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1059; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1060; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1061; NONEON-NOSVE-NEXT:    strb w9, [sp, #23]
1062; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
1063; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1064; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1065; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1066; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1067; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1068; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1069; NONEON-NOSVE-NEXT:    add w9, w9, w10
1070; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1071; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1072; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1073; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1074; NONEON-NOSVE-NEXT:    strb w9, [sp, #22]
1075; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
1076; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1077; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1078; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1079; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1080; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1081; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1082; NONEON-NOSVE-NEXT:    add w9, w9, w10
1083; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1084; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1085; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1086; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1087; NONEON-NOSVE-NEXT:    strb w9, [sp, #21]
1088; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
1089; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1090; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1091; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1092; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1093; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1094; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1095; NONEON-NOSVE-NEXT:    add w9, w9, w10
1096; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1097; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1098; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1099; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1100; NONEON-NOSVE-NEXT:    strb w9, [sp, #20]
1101; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
1102; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1103; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1104; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1105; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1106; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1107; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1108; NONEON-NOSVE-NEXT:    add w9, w9, w10
1109; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1110; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1111; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1112; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1113; NONEON-NOSVE-NEXT:    strb w9, [sp, #19]
1114; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
1115; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1116; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1117; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1118; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1119; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1120; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1121; NONEON-NOSVE-NEXT:    add w9, w9, w10
1122; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1123; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1124; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1125; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1126; NONEON-NOSVE-NEXT:    strb w9, [sp, #18]
1127; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
1128; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1129; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1130; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1131; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1132; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1133; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1134; NONEON-NOSVE-NEXT:    add w9, w9, w10
1135; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1136; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1137; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1138; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1139; NONEON-NOSVE-NEXT:    strb w9, [sp, #17]
1140; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
1141; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1142; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1143; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1144; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1145; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1146; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1147; NONEON-NOSVE-NEXT:    add w9, w9, w10
1148; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1149; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1150; NONEON-NOSVE-NEXT:    mul w8, w9, w8
1151; NONEON-NOSVE-NEXT:    lsr w8, w8, #24
1152; NONEON-NOSVE-NEXT:    strb w8, [sp, #16]
1153; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
1154; NONEON-NOSVE-NEXT:    add sp, sp, #32
1155; NONEON-NOSVE-NEXT:    ret
1156  %res = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %op)
1157  ret <16 x i8> %res
1158}
1159
1160define void @ctpop_v32i8(ptr %a) {
1161; CHECK-LABEL: ctpop_v32i8:
1162; CHECK:       // %bb.0:
1163; CHECK-NEXT:    ldp q0, q1, [x0]
1164; CHECK-NEXT:    ptrue p0.b, vl16
1165; CHECK-NEXT:    cnt z0.b, p0/m, z0.b
1166; CHECK-NEXT:    cnt z1.b, p0/m, z1.b
1167; CHECK-NEXT:    stp q0, q1, [x0]
1168; CHECK-NEXT:    ret
1169;
1170; NONEON-NOSVE-LABEL: ctpop_v32i8:
1171; NONEON-NOSVE:       // %bb.0:
1172; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1173; NONEON-NOSVE-NEXT:    mov w8, #16843009 // =0x1010101
1174; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1175; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1176; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #31]
1177; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1178; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1179; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1180; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1181; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1182; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1183; NONEON-NOSVE-NEXT:    add w9, w9, w10
1184; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1185; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1186; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1187; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1188; NONEON-NOSVE-NEXT:    strb w9, [sp, #63]
1189; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #30]
1190; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1191; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1192; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1193; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1194; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1195; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1196; NONEON-NOSVE-NEXT:    add w9, w9, w10
1197; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1198; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1199; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1200; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1201; NONEON-NOSVE-NEXT:    strb w9, [sp, #62]
1202; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #29]
1203; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1204; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1205; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1206; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1207; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1208; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1209; NONEON-NOSVE-NEXT:    add w9, w9, w10
1210; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1211; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1212; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1213; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1214; NONEON-NOSVE-NEXT:    strb w9, [sp, #61]
1215; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #28]
1216; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1217; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1218; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1219; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1220; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1221; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1222; NONEON-NOSVE-NEXT:    add w9, w9, w10
1223; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1224; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1225; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1226; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1227; NONEON-NOSVE-NEXT:    strb w9, [sp, #60]
1228; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #27]
1229; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1230; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1231; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1232; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1233; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1234; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1235; NONEON-NOSVE-NEXT:    add w9, w9, w10
1236; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1237; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1238; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1239; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1240; NONEON-NOSVE-NEXT:    strb w9, [sp, #59]
1241; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #26]
1242; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1243; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1244; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1245; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1246; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1247; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1248; NONEON-NOSVE-NEXT:    add w9, w9, w10
1249; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1250; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1251; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1252; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1253; NONEON-NOSVE-NEXT:    strb w9, [sp, #58]
1254; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #25]
1255; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1256; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1257; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1258; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1259; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1260; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1261; NONEON-NOSVE-NEXT:    add w9, w9, w10
1262; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1263; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1264; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1265; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1266; NONEON-NOSVE-NEXT:    strb w9, [sp, #57]
1267; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #24]
1268; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1269; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1270; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1271; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1272; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1273; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1274; NONEON-NOSVE-NEXT:    add w9, w9, w10
1275; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1276; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1277; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1278; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1279; NONEON-NOSVE-NEXT:    strb w9, [sp, #56]
1280; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #23]
1281; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1282; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1283; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1284; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1285; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1286; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1287; NONEON-NOSVE-NEXT:    add w9, w9, w10
1288; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1289; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1290; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1291; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1292; NONEON-NOSVE-NEXT:    strb w9, [sp, #55]
1293; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #22]
1294; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1295; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1296; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1297; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1298; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1299; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1300; NONEON-NOSVE-NEXT:    add w9, w9, w10
1301; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1302; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1303; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1304; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1305; NONEON-NOSVE-NEXT:    strb w9, [sp, #54]
1306; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #21]
1307; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1308; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1309; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1310; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1311; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1312; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1313; NONEON-NOSVE-NEXT:    add w9, w9, w10
1314; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1315; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1316; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1317; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1318; NONEON-NOSVE-NEXT:    strb w9, [sp, #53]
1319; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #20]
1320; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1321; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1322; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1323; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1324; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1325; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1326; NONEON-NOSVE-NEXT:    add w9, w9, w10
1327; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1328; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1329; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1330; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1331; NONEON-NOSVE-NEXT:    strb w9, [sp, #52]
1332; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #19]
1333; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1334; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1335; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1336; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1337; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1338; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1339; NONEON-NOSVE-NEXT:    add w9, w9, w10
1340; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1341; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1342; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1343; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1344; NONEON-NOSVE-NEXT:    strb w9, [sp, #51]
1345; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #18]
1346; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1347; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1348; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1349; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1350; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1351; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1352; NONEON-NOSVE-NEXT:    add w9, w9, w10
1353; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1354; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1355; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1356; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1357; NONEON-NOSVE-NEXT:    strb w9, [sp, #50]
1358; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #17]
1359; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1360; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1361; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1362; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1363; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1364; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1365; NONEON-NOSVE-NEXT:    add w9, w9, w10
1366; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1367; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1368; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1369; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1370; NONEON-NOSVE-NEXT:    strb w9, [sp, #49]
1371; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #16]
1372; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1373; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1374; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1375; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1376; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1377; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1378; NONEON-NOSVE-NEXT:    add w9, w9, w10
1379; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1380; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1381; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1382; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1383; NONEON-NOSVE-NEXT:    strb w9, [sp, #48]
1384; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
1385; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1386; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1387; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1388; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1389; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1390; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1391; NONEON-NOSVE-NEXT:    add w9, w9, w10
1392; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1393; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1394; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1395; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1396; NONEON-NOSVE-NEXT:    strb w9, [sp, #47]
1397; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
1398; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1399; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1400; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1401; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1402; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1403; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1404; NONEON-NOSVE-NEXT:    add w9, w9, w10
1405; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1406; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1407; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1408; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1409; NONEON-NOSVE-NEXT:    strb w9, [sp, #46]
1410; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
1411; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1412; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1413; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1414; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1415; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1416; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1417; NONEON-NOSVE-NEXT:    add w9, w9, w10
1418; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1419; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1420; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1421; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1422; NONEON-NOSVE-NEXT:    strb w9, [sp, #45]
1423; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
1424; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1425; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1426; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1427; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1428; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1429; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1430; NONEON-NOSVE-NEXT:    add w9, w9, w10
1431; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1432; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1433; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1434; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1435; NONEON-NOSVE-NEXT:    strb w9, [sp, #44]
1436; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
1437; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1438; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1439; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1440; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1441; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1442; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1443; NONEON-NOSVE-NEXT:    add w9, w9, w10
1444; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1445; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1446; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1447; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1448; NONEON-NOSVE-NEXT:    strb w9, [sp, #43]
1449; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
1450; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1451; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1452; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1453; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1454; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1455; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1456; NONEON-NOSVE-NEXT:    add w9, w9, w10
1457; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1458; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1459; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1460; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1461; NONEON-NOSVE-NEXT:    strb w9, [sp, #42]
1462; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
1463; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1464; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1465; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1466; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1467; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1468; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1469; NONEON-NOSVE-NEXT:    add w9, w9, w10
1470; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1471; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1472; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1473; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1474; NONEON-NOSVE-NEXT:    strb w9, [sp, #41]
1475; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
1476; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1477; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1478; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1479; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1480; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1481; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1482; NONEON-NOSVE-NEXT:    add w9, w9, w10
1483; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1484; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1485; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1486; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1487; NONEON-NOSVE-NEXT:    strb w9, [sp, #40]
1488; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
1489; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1490; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1491; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1492; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1493; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1494; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1495; NONEON-NOSVE-NEXT:    add w9, w9, w10
1496; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1497; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1498; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1499; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1500; NONEON-NOSVE-NEXT:    strb w9, [sp, #39]
1501; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
1502; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1503; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1504; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1505; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1506; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1507; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1508; NONEON-NOSVE-NEXT:    add w9, w9, w10
1509; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1510; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1511; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1512; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1513; NONEON-NOSVE-NEXT:    strb w9, [sp, #38]
1514; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
1515; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1516; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1517; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1518; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1519; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1520; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1521; NONEON-NOSVE-NEXT:    add w9, w9, w10
1522; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1523; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1524; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1525; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1526; NONEON-NOSVE-NEXT:    strb w9, [sp, #37]
1527; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
1528; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1529; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1530; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1531; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1532; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1533; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1534; NONEON-NOSVE-NEXT:    add w9, w9, w10
1535; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1536; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1537; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1538; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1539; NONEON-NOSVE-NEXT:    strb w9, [sp, #36]
1540; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
1541; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1542; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1543; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1544; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1545; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1546; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1547; NONEON-NOSVE-NEXT:    add w9, w9, w10
1548; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1549; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1550; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1551; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1552; NONEON-NOSVE-NEXT:    strb w9, [sp, #35]
1553; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
1554; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1555; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1556; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1557; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1558; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1559; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1560; NONEON-NOSVE-NEXT:    add w9, w9, w10
1561; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1562; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1563; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1564; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1565; NONEON-NOSVE-NEXT:    strb w9, [sp, #34]
1566; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
1567; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1568; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1569; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1570; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1571; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1572; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1573; NONEON-NOSVE-NEXT:    add w9, w9, w10
1574; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1575; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1576; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1577; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1578; NONEON-NOSVE-NEXT:    strb w9, [sp, #33]
1579; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
1580; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1581; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1582; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1583; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1584; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1585; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1586; NONEON-NOSVE-NEXT:    add w9, w9, w10
1587; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1588; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1589; NONEON-NOSVE-NEXT:    mul w8, w9, w8
1590; NONEON-NOSVE-NEXT:    lsr w8, w8, #24
1591; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
1592; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1593; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1594; NONEON-NOSVE-NEXT:    add sp, sp, #64
1595; NONEON-NOSVE-NEXT:    ret
1596  %op = load <32 x i8>, ptr %a
1597  %res = call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %op)
1598  store <32 x i8> %res, ptr %a
1599  ret void
1600}
1601
1602define <2 x i16> @ctpop_v2i16(<2 x i16> %op) {
1603; CHECK-LABEL: ctpop_v2i16:
1604; CHECK:       // %bb.0:
1605; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1606; CHECK-NEXT:    ptrue p0.s, vl2
1607; CHECK-NEXT:    and z0.s, z0.s, #0xffff
1608; CHECK-NEXT:    cnt z0.s, p0/m, z0.s
1609; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1610; CHECK-NEXT:    ret
1611;
1612; NONEON-NOSVE-LABEL: ctpop_v2i16:
1613; NONEON-NOSVE:       // %bb.0:
1614; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
1615; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
1616; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
1617; NONEON-NOSVE-NEXT:    ldrh w10, [sp]
1618; NONEON-NOSVE-NEXT:    mov w8, #16843009 // =0x1010101
1619; NONEON-NOSVE-NEXT:    lsr w11, w9, #1
1620; NONEON-NOSVE-NEXT:    lsr w12, w10, #1
1621; NONEON-NOSVE-NEXT:    and w11, w11, #0x55555555
1622; NONEON-NOSVE-NEXT:    and w12, w12, #0x55555555
1623; NONEON-NOSVE-NEXT:    sub w9, w9, w11
1624; NONEON-NOSVE-NEXT:    sub w10, w10, w12
1625; NONEON-NOSVE-NEXT:    lsr w11, w9, #2
1626; NONEON-NOSVE-NEXT:    lsr w12, w10, #2
1627; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1628; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1629; NONEON-NOSVE-NEXT:    and w11, w11, #0x33333333
1630; NONEON-NOSVE-NEXT:    add w9, w9, w11
1631; NONEON-NOSVE-NEXT:    and w11, w12, #0x33333333
1632; NONEON-NOSVE-NEXT:    add w10, w10, w11
1633; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1634; NONEON-NOSVE-NEXT:    add w10, w10, w10, lsr #4
1635; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1636; NONEON-NOSVE-NEXT:    and w10, w10, #0xf0f0f0f
1637; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1638; NONEON-NOSVE-NEXT:    mul w8, w10, w8
1639; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1640; NONEON-NOSVE-NEXT:    lsr w8, w8, #24
1641; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8]
1642; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
1643; NONEON-NOSVE-NEXT:    add sp, sp, #16
1644; NONEON-NOSVE-NEXT:    ret
1645  %res = call <2 x i16> @llvm.ctpop.v2i16(<2 x i16> %op)
1646  ret <2 x i16> %res
1647}
1648
1649define <4 x i16> @ctpop_v4i16(<4 x i16> %op) {
1650; CHECK-LABEL: ctpop_v4i16:
1651; CHECK:       // %bb.0:
1652; CHECK-NEXT:    ptrue p0.h, vl4
1653; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1654; CHECK-NEXT:    cnt z0.h, p0/m, z0.h
1655; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1656; CHECK-NEXT:    ret
1657;
1658; NONEON-NOSVE-LABEL: ctpop_v4i16:
1659; NONEON-NOSVE:       // %bb.0:
1660; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
1661; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
1662; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
1663; NONEON-NOSVE-NEXT:    mov w8, #16843009 // =0x1010101
1664; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1665; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1666; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1667; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1668; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1669; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1670; NONEON-NOSVE-NEXT:    add w9, w9, w10
1671; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1672; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1673; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1674; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1675; NONEON-NOSVE-NEXT:    strh w9, [sp, #14]
1676; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
1677; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1678; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1679; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1680; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1681; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1682; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1683; NONEON-NOSVE-NEXT:    add w9, w9, w10
1684; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1685; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1686; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1687; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1688; NONEON-NOSVE-NEXT:    strh w9, [sp, #12]
1689; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
1690; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1691; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1692; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1693; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1694; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1695; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1696; NONEON-NOSVE-NEXT:    add w9, w9, w10
1697; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1698; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1699; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1700; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1701; NONEON-NOSVE-NEXT:    strh w9, [sp, #10]
1702; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
1703; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1704; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1705; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1706; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1707; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1708; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1709; NONEON-NOSVE-NEXT:    add w9, w9, w10
1710; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1711; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1712; NONEON-NOSVE-NEXT:    mul w8, w9, w8
1713; NONEON-NOSVE-NEXT:    lsr w8, w8, #24
1714; NONEON-NOSVE-NEXT:    strh w8, [sp, #8]
1715; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
1716; NONEON-NOSVE-NEXT:    add sp, sp, #16
1717; NONEON-NOSVE-NEXT:    ret
1718  %res = call <4 x i16> @llvm.ctpop.v4i16(<4 x i16> %op)
1719  ret <4 x i16> %res
1720}
1721
1722define <8 x i16> @ctpop_v8i16(<8 x i16> %op) {
1723; CHECK-LABEL: ctpop_v8i16:
1724; CHECK:       // %bb.0:
1725; CHECK-NEXT:    ptrue p0.h, vl8
1726; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1727; CHECK-NEXT:    cnt z0.h, p0/m, z0.h
1728; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1729; CHECK-NEXT:    ret
1730;
1731; NONEON-NOSVE-LABEL: ctpop_v8i16:
1732; NONEON-NOSVE:       // %bb.0:
1733; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
1734; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1735; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1736; NONEON-NOSVE-NEXT:    mov w8, #16843009 // =0x1010101
1737; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1738; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1739; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1740; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1741; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1742; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1743; NONEON-NOSVE-NEXT:    add w9, w9, w10
1744; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1745; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1746; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1747; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1748; NONEON-NOSVE-NEXT:    strh w9, [sp, #30]
1749; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1750; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1751; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1752; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1753; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1754; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1755; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1756; NONEON-NOSVE-NEXT:    add w9, w9, w10
1757; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1758; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1759; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1760; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1761; NONEON-NOSVE-NEXT:    strh w9, [sp, #28]
1762; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1763; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1764; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1765; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1766; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1767; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1768; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1769; NONEON-NOSVE-NEXT:    add w9, w9, w10
1770; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1771; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1772; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1773; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1774; NONEON-NOSVE-NEXT:    strh w9, [sp, #26]
1775; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1776; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1777; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1778; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1779; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1780; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1781; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1782; NONEON-NOSVE-NEXT:    add w9, w9, w10
1783; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1784; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1785; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1786; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1787; NONEON-NOSVE-NEXT:    strh w9, [sp, #24]
1788; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
1789; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1790; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1791; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1792; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1793; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1794; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1795; NONEON-NOSVE-NEXT:    add w9, w9, w10
1796; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1797; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1798; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1799; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1800; NONEON-NOSVE-NEXT:    strh w9, [sp, #22]
1801; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
1802; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1803; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1804; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1805; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1806; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1807; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1808; NONEON-NOSVE-NEXT:    add w9, w9, w10
1809; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1810; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1811; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1812; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1813; NONEON-NOSVE-NEXT:    strh w9, [sp, #20]
1814; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
1815; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1816; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1817; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1818; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1819; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1820; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1821; NONEON-NOSVE-NEXT:    add w9, w9, w10
1822; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1823; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1824; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1825; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1826; NONEON-NOSVE-NEXT:    strh w9, [sp, #18]
1827; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
1828; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1829; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1830; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1831; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1832; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1833; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1834; NONEON-NOSVE-NEXT:    add w9, w9, w10
1835; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1836; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1837; NONEON-NOSVE-NEXT:    mul w8, w9, w8
1838; NONEON-NOSVE-NEXT:    lsr w8, w8, #24
1839; NONEON-NOSVE-NEXT:    strh w8, [sp, #16]
1840; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
1841; NONEON-NOSVE-NEXT:    add sp, sp, #32
1842; NONEON-NOSVE-NEXT:    ret
1843  %res = call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %op)
1844  ret <8 x i16> %res
1845}
1846
1847define void @ctpop_v16i16(ptr %a) {
1848; CHECK-LABEL: ctpop_v16i16:
1849; CHECK:       // %bb.0:
1850; CHECK-NEXT:    ldp q0, q1, [x0]
1851; CHECK-NEXT:    ptrue p0.h, vl8
1852; CHECK-NEXT:    cnt z0.h, p0/m, z0.h
1853; CHECK-NEXT:    cnt z1.h, p0/m, z1.h
1854; CHECK-NEXT:    stp q0, q1, [x0]
1855; CHECK-NEXT:    ret
1856;
1857; NONEON-NOSVE-LABEL: ctpop_v16i16:
1858; NONEON-NOSVE:       // %bb.0:
1859; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1860; NONEON-NOSVE-NEXT:    mov w8, #16843009 // =0x1010101
1861; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1862; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1863; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #30]
1864; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1865; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1866; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1867; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1868; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1869; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1870; NONEON-NOSVE-NEXT:    add w9, w9, w10
1871; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1872; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1873; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1874; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1875; NONEON-NOSVE-NEXT:    strh w9, [sp, #62]
1876; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #28]
1877; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1878; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1879; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1880; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1881; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1882; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1883; NONEON-NOSVE-NEXT:    add w9, w9, w10
1884; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1885; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1886; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1887; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1888; NONEON-NOSVE-NEXT:    strh w9, [sp, #60]
1889; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #26]
1890; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1891; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1892; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1893; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1894; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1895; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1896; NONEON-NOSVE-NEXT:    add w9, w9, w10
1897; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1898; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1899; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1900; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1901; NONEON-NOSVE-NEXT:    strh w9, [sp, #58]
1902; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #24]
1903; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1904; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1905; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1906; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1907; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1908; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1909; NONEON-NOSVE-NEXT:    add w9, w9, w10
1910; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1911; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1912; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1913; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1914; NONEON-NOSVE-NEXT:    strh w9, [sp, #56]
1915; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #22]
1916; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1917; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1918; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1919; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1920; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1921; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1922; NONEON-NOSVE-NEXT:    add w9, w9, w10
1923; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1924; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1925; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1926; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1927; NONEON-NOSVE-NEXT:    strh w9, [sp, #54]
1928; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #20]
1929; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1930; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1931; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1932; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1933; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1934; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1935; NONEON-NOSVE-NEXT:    add w9, w9, w10
1936; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1937; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1938; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1939; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1940; NONEON-NOSVE-NEXT:    strh w9, [sp, #52]
1941; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #18]
1942; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1943; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1944; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1945; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1946; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1947; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1948; NONEON-NOSVE-NEXT:    add w9, w9, w10
1949; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1950; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1951; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1952; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1953; NONEON-NOSVE-NEXT:    strh w9, [sp, #50]
1954; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #16]
1955; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1956; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1957; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1958; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1959; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1960; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1961; NONEON-NOSVE-NEXT:    add w9, w9, w10
1962; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1963; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1964; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1965; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1966; NONEON-NOSVE-NEXT:    strh w9, [sp, #48]
1967; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1968; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1969; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1970; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1971; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1972; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1973; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1974; NONEON-NOSVE-NEXT:    add w9, w9, w10
1975; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1976; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1977; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1978; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1979; NONEON-NOSVE-NEXT:    strh w9, [sp, #46]
1980; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1981; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1982; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1983; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1984; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1985; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1986; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
1987; NONEON-NOSVE-NEXT:    add w9, w9, w10
1988; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
1989; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
1990; NONEON-NOSVE-NEXT:    mul w9, w9, w8
1991; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
1992; NONEON-NOSVE-NEXT:    strh w9, [sp, #44]
1993; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1994; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
1995; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
1996; NONEON-NOSVE-NEXT:    sub w9, w9, w10
1997; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
1998; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
1999; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2000; NONEON-NOSVE-NEXT:    add w9, w9, w10
2001; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2002; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2003; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2004; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
2005; NONEON-NOSVE-NEXT:    strh w9, [sp, #42]
2006; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
2007; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2008; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2009; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2010; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2011; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2012; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2013; NONEON-NOSVE-NEXT:    add w9, w9, w10
2014; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2015; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2016; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2017; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
2018; NONEON-NOSVE-NEXT:    strh w9, [sp, #40]
2019; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
2020; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2021; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2022; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2023; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2024; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2025; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2026; NONEON-NOSVE-NEXT:    add w9, w9, w10
2027; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2028; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2029; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2030; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
2031; NONEON-NOSVE-NEXT:    strh w9, [sp, #38]
2032; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
2033; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2034; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2035; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2036; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2037; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2038; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2039; NONEON-NOSVE-NEXT:    add w9, w9, w10
2040; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2041; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2042; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2043; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
2044; NONEON-NOSVE-NEXT:    strh w9, [sp, #36]
2045; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
2046; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2047; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2048; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2049; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2050; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2051; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2052; NONEON-NOSVE-NEXT:    add w9, w9, w10
2053; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2054; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2055; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2056; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
2057; NONEON-NOSVE-NEXT:    strh w9, [sp, #34]
2058; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
2059; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2060; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2061; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2062; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2063; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2064; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2065; NONEON-NOSVE-NEXT:    add w9, w9, w10
2066; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2067; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2068; NONEON-NOSVE-NEXT:    mul w8, w9, w8
2069; NONEON-NOSVE-NEXT:    lsr w8, w8, #24
2070; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
2071; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2072; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2073; NONEON-NOSVE-NEXT:    add sp, sp, #64
2074; NONEON-NOSVE-NEXT:    ret
2075  %op = load <16 x i16>, ptr %a
2076  %res = call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %op)
2077  store <16 x i16> %res, ptr %a
2078  ret void
2079}
2080
2081define <2 x i32> @ctpop_v2i32(<2 x i32> %op) {
2082; CHECK-LABEL: ctpop_v2i32:
2083; CHECK:       // %bb.0:
2084; CHECK-NEXT:    ptrue p0.s, vl2
2085; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
2086; CHECK-NEXT:    cnt z0.s, p0/m, z0.s
2087; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2088; CHECK-NEXT:    ret
2089;
2090; NONEON-NOSVE-LABEL: ctpop_v2i32:
2091; NONEON-NOSVE:       // %bb.0:
2092; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
2093; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
2094; NONEON-NOSVE-NEXT:    ldr w9, [sp, #4]
2095; NONEON-NOSVE-NEXT:    mov w8, #16843009 // =0x1010101
2096; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2097; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2098; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2099; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2100; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2101; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2102; NONEON-NOSVE-NEXT:    add w9, w9, w10
2103; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2104; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2105; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2106; NONEON-NOSVE-NEXT:    lsr w11, w9, #24
2107; NONEON-NOSVE-NEXT:    ldr w9, [sp]
2108; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2109; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2110; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2111; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2112; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2113; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2114; NONEON-NOSVE-NEXT:    add w9, w9, w10
2115; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2116; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2117; NONEON-NOSVE-NEXT:    mul w8, w9, w8
2118; NONEON-NOSVE-NEXT:    lsr w8, w8, #24
2119; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #8]
2120; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
2121; NONEON-NOSVE-NEXT:    add sp, sp, #16
2122; NONEON-NOSVE-NEXT:    ret
2123  %res = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %op)
2124  ret <2 x i32> %res
2125}
2126
2127define <4 x i32> @ctpop_v4i32(<4 x i32> %op) {
2128; CHECK-LABEL: ctpop_v4i32:
2129; CHECK:       // %bb.0:
2130; CHECK-NEXT:    ptrue p0.s, vl4
2131; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2132; CHECK-NEXT:    cnt z0.s, p0/m, z0.s
2133; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
2134; CHECK-NEXT:    ret
2135;
2136; NONEON-NOSVE-LABEL: ctpop_v4i32:
2137; NONEON-NOSVE:       // %bb.0:
2138; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
2139; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
2140; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12]
2141; NONEON-NOSVE-NEXT:    mov w8, #16843009 // =0x1010101
2142; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2143; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2144; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2145; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2146; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2147; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2148; NONEON-NOSVE-NEXT:    add w9, w9, w10
2149; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2150; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2151; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2152; NONEON-NOSVE-NEXT:    lsr w11, w9, #24
2153; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8]
2154; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2155; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2156; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2157; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2158; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2159; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2160; NONEON-NOSVE-NEXT:    add w9, w9, w10
2161; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2162; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2163; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2164; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
2165; NONEON-NOSVE-NEXT:    stp w9, w11, [sp, #24]
2166; NONEON-NOSVE-NEXT:    ldr w9, [sp, #4]
2167; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2168; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2169; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2170; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2171; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2172; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2173; NONEON-NOSVE-NEXT:    add w9, w9, w10
2174; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2175; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2176; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2177; NONEON-NOSVE-NEXT:    lsr w11, w9, #24
2178; NONEON-NOSVE-NEXT:    ldr w9, [sp]
2179; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2180; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2181; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2182; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2183; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2184; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2185; NONEON-NOSVE-NEXT:    add w9, w9, w10
2186; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2187; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2188; NONEON-NOSVE-NEXT:    mul w8, w9, w8
2189; NONEON-NOSVE-NEXT:    lsr w8, w8, #24
2190; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #16]
2191; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
2192; NONEON-NOSVE-NEXT:    add sp, sp, #32
2193; NONEON-NOSVE-NEXT:    ret
2194  %res = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %op)
2195  ret <4 x i32> %res
2196}
2197
2198define void @ctpop_v8i32(ptr %a) {
2199; CHECK-LABEL: ctpop_v8i32:
2200; CHECK:       // %bb.0:
2201; CHECK-NEXT:    ldp q0, q1, [x0]
2202; CHECK-NEXT:    ptrue p0.s, vl4
2203; CHECK-NEXT:    cnt z0.s, p0/m, z0.s
2204; CHECK-NEXT:    cnt z1.s, p0/m, z1.s
2205; CHECK-NEXT:    stp q0, q1, [x0]
2206; CHECK-NEXT:    ret
2207;
2208; NONEON-NOSVE-LABEL: ctpop_v8i32:
2209; NONEON-NOSVE:       // %bb.0:
2210; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2211; NONEON-NOSVE-NEXT:    mov w8, #16843009 // =0x1010101
2212; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2213; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2214; NONEON-NOSVE-NEXT:    ldr w9, [sp, #28]
2215; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2216; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2217; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2218; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2219; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2220; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2221; NONEON-NOSVE-NEXT:    add w9, w9, w10
2222; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2223; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2224; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2225; NONEON-NOSVE-NEXT:    lsr w11, w9, #24
2226; NONEON-NOSVE-NEXT:    ldr w9, [sp, #24]
2227; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2228; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2229; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2230; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2231; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2232; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2233; NONEON-NOSVE-NEXT:    add w9, w9, w10
2234; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2235; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2236; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2237; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
2238; NONEON-NOSVE-NEXT:    stp w9, w11, [sp, #56]
2239; NONEON-NOSVE-NEXT:    ldr w9, [sp, #20]
2240; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2241; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2242; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2243; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2244; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2245; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2246; NONEON-NOSVE-NEXT:    add w9, w9, w10
2247; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2248; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2249; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2250; NONEON-NOSVE-NEXT:    lsr w11, w9, #24
2251; NONEON-NOSVE-NEXT:    ldr w9, [sp, #16]
2252; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2253; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2254; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2255; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2256; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2257; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2258; NONEON-NOSVE-NEXT:    add w9, w9, w10
2259; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2260; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2261; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2262; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
2263; NONEON-NOSVE-NEXT:    stp w9, w11, [sp, #48]
2264; NONEON-NOSVE-NEXT:    ldr w9, [sp, #12]
2265; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2266; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2267; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2268; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2269; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2270; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2271; NONEON-NOSVE-NEXT:    add w9, w9, w10
2272; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2273; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2274; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2275; NONEON-NOSVE-NEXT:    lsr w11, w9, #24
2276; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8]
2277; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2278; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2279; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2280; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2281; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2282; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2283; NONEON-NOSVE-NEXT:    add w9, w9, w10
2284; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2285; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2286; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2287; NONEON-NOSVE-NEXT:    lsr w9, w9, #24
2288; NONEON-NOSVE-NEXT:    stp w9, w11, [sp, #40]
2289; NONEON-NOSVE-NEXT:    ldr w9, [sp, #4]
2290; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2291; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2292; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2293; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2294; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2295; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2296; NONEON-NOSVE-NEXT:    add w9, w9, w10
2297; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2298; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2299; NONEON-NOSVE-NEXT:    mul w9, w9, w8
2300; NONEON-NOSVE-NEXT:    lsr w11, w9, #24
2301; NONEON-NOSVE-NEXT:    ldr w9, [sp]
2302; NONEON-NOSVE-NEXT:    lsr w10, w9, #1
2303; NONEON-NOSVE-NEXT:    and w10, w10, #0x55555555
2304; NONEON-NOSVE-NEXT:    sub w9, w9, w10
2305; NONEON-NOSVE-NEXT:    lsr w10, w9, #2
2306; NONEON-NOSVE-NEXT:    and w9, w9, #0x33333333
2307; NONEON-NOSVE-NEXT:    and w10, w10, #0x33333333
2308; NONEON-NOSVE-NEXT:    add w9, w9, w10
2309; NONEON-NOSVE-NEXT:    add w9, w9, w9, lsr #4
2310; NONEON-NOSVE-NEXT:    and w9, w9, #0xf0f0f0f
2311; NONEON-NOSVE-NEXT:    mul w8, w9, w8
2312; NONEON-NOSVE-NEXT:    lsr w8, w8, #24
2313; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #32]
2314; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2315; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2316; NONEON-NOSVE-NEXT:    add sp, sp, #64
2317; NONEON-NOSVE-NEXT:    ret
2318  %op = load <8 x i32>, ptr %a
2319  %res = call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %op)
2320  store <8 x i32> %res, ptr %a
2321  ret void
2322}
2323
2324define <1 x i64> @ctpop_v1i64(<1 x i64> %op) {
2325; CHECK-LABEL: ctpop_v1i64:
2326; CHECK:       // %bb.0:
2327; CHECK-NEXT:    ptrue p0.d, vl1
2328; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
2329; CHECK-NEXT:    cnt z0.d, p0/m, z0.d
2330; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2331; CHECK-NEXT:    ret
2332;
2333; NONEON-NOSVE-LABEL: ctpop_v1i64:
2334; NONEON-NOSVE:       // %bb.0:
2335; NONEON-NOSVE-NEXT:    sub sp, sp, #16
2336; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
2337; NONEON-NOSVE-NEXT:    fmov x9, d0
2338; NONEON-NOSVE-NEXT:    mov x8, #72340172838076673 // =0x101010101010101
2339; NONEON-NOSVE-NEXT:    lsr x10, x9, #1
2340; NONEON-NOSVE-NEXT:    and x10, x10, #0x5555555555555555
2341; NONEON-NOSVE-NEXT:    sub x9, x9, x10
2342; NONEON-NOSVE-NEXT:    lsr x10, x9, #2
2343; NONEON-NOSVE-NEXT:    and x9, x9, #0x3333333333333333
2344; NONEON-NOSVE-NEXT:    and x10, x10, #0x3333333333333333
2345; NONEON-NOSVE-NEXT:    add x9, x9, x10
2346; NONEON-NOSVE-NEXT:    add x9, x9, x9, lsr #4
2347; NONEON-NOSVE-NEXT:    and x9, x9, #0xf0f0f0f0f0f0f0f
2348; NONEON-NOSVE-NEXT:    mul x8, x9, x8
2349; NONEON-NOSVE-NEXT:    lsr x8, x8, #56
2350; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
2351; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
2352; NONEON-NOSVE-NEXT:    add sp, sp, #16
2353; NONEON-NOSVE-NEXT:    ret
2354  %res = call <1 x i64> @llvm.ctpop.v1i64(<1 x i64> %op)
2355  ret <1 x i64> %res
2356}
2357
2358define <2 x i64> @ctpop_v2i64(<2 x i64> %op) {
2359; CHECK-LABEL: ctpop_v2i64:
2360; CHECK:       // %bb.0:
2361; CHECK-NEXT:    ptrue p0.d, vl2
2362; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2363; CHECK-NEXT:    cnt z0.d, p0/m, z0.d
2364; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
2365; CHECK-NEXT:    ret
2366;
2367; NONEON-NOSVE-LABEL: ctpop_v2i64:
2368; NONEON-NOSVE:       // %bb.0:
2369; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
2370; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
2371; NONEON-NOSVE-NEXT:    ldr x9, [sp, #8]
2372; NONEON-NOSVE-NEXT:    mov x8, #72340172838076673 // =0x101010101010101
2373; NONEON-NOSVE-NEXT:    lsr x10, x9, #1
2374; NONEON-NOSVE-NEXT:    and x10, x10, #0x5555555555555555
2375; NONEON-NOSVE-NEXT:    sub x9, x9, x10
2376; NONEON-NOSVE-NEXT:    lsr x10, x9, #2
2377; NONEON-NOSVE-NEXT:    and x9, x9, #0x3333333333333333
2378; NONEON-NOSVE-NEXT:    and x10, x10, #0x3333333333333333
2379; NONEON-NOSVE-NEXT:    add x9, x9, x10
2380; NONEON-NOSVE-NEXT:    add x9, x9, x9, lsr #4
2381; NONEON-NOSVE-NEXT:    and x9, x9, #0xf0f0f0f0f0f0f0f
2382; NONEON-NOSVE-NEXT:    mul x9, x9, x8
2383; NONEON-NOSVE-NEXT:    lsr x11, x9, #56
2384; NONEON-NOSVE-NEXT:    ldr x9, [sp]
2385; NONEON-NOSVE-NEXT:    lsr x10, x9, #1
2386; NONEON-NOSVE-NEXT:    and x10, x10, #0x5555555555555555
2387; NONEON-NOSVE-NEXT:    sub x9, x9, x10
2388; NONEON-NOSVE-NEXT:    lsr x10, x9, #2
2389; NONEON-NOSVE-NEXT:    and x9, x9, #0x3333333333333333
2390; NONEON-NOSVE-NEXT:    and x10, x10, #0x3333333333333333
2391; NONEON-NOSVE-NEXT:    add x9, x9, x10
2392; NONEON-NOSVE-NEXT:    add x9, x9, x9, lsr #4
2393; NONEON-NOSVE-NEXT:    and x9, x9, #0xf0f0f0f0f0f0f0f
2394; NONEON-NOSVE-NEXT:    mul x8, x9, x8
2395; NONEON-NOSVE-NEXT:    lsr x8, x8, #56
2396; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #16]
2397; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
2398; NONEON-NOSVE-NEXT:    add sp, sp, #32
2399; NONEON-NOSVE-NEXT:    ret
2400  %res = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %op)
2401  ret <2 x i64> %res
2402}
2403
2404define void @ctpop_v4i64(ptr %a) {
2405; CHECK-LABEL: ctpop_v4i64:
2406; CHECK:       // %bb.0:
2407; CHECK-NEXT:    ldp q0, q1, [x0]
2408; CHECK-NEXT:    ptrue p0.d, vl2
2409; CHECK-NEXT:    cnt z0.d, p0/m, z0.d
2410; CHECK-NEXT:    cnt z1.d, p0/m, z1.d
2411; CHECK-NEXT:    stp q0, q1, [x0]
2412; CHECK-NEXT:    ret
2413;
2414; NONEON-NOSVE-LABEL: ctpop_v4i64:
2415; NONEON-NOSVE:       // %bb.0:
2416; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2417; NONEON-NOSVE-NEXT:    mov x8, #72340172838076673 // =0x101010101010101
2418; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2419; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2420; NONEON-NOSVE-NEXT:    ldr x9, [sp, #24]
2421; NONEON-NOSVE-NEXT:    lsr x10, x9, #1
2422; NONEON-NOSVE-NEXT:    and x10, x10, #0x5555555555555555
2423; NONEON-NOSVE-NEXT:    sub x9, x9, x10
2424; NONEON-NOSVE-NEXT:    lsr x10, x9, #2
2425; NONEON-NOSVE-NEXT:    and x9, x9, #0x3333333333333333
2426; NONEON-NOSVE-NEXT:    and x10, x10, #0x3333333333333333
2427; NONEON-NOSVE-NEXT:    add x9, x9, x10
2428; NONEON-NOSVE-NEXT:    add x9, x9, x9, lsr #4
2429; NONEON-NOSVE-NEXT:    and x9, x9, #0xf0f0f0f0f0f0f0f
2430; NONEON-NOSVE-NEXT:    mul x9, x9, x8
2431; NONEON-NOSVE-NEXT:    lsr x11, x9, #56
2432; NONEON-NOSVE-NEXT:    ldr x9, [sp, #16]
2433; NONEON-NOSVE-NEXT:    lsr x10, x9, #1
2434; NONEON-NOSVE-NEXT:    and x10, x10, #0x5555555555555555
2435; NONEON-NOSVE-NEXT:    sub x9, x9, x10
2436; NONEON-NOSVE-NEXT:    lsr x10, x9, #2
2437; NONEON-NOSVE-NEXT:    and x9, x9, #0x3333333333333333
2438; NONEON-NOSVE-NEXT:    and x10, x10, #0x3333333333333333
2439; NONEON-NOSVE-NEXT:    add x9, x9, x10
2440; NONEON-NOSVE-NEXT:    add x9, x9, x9, lsr #4
2441; NONEON-NOSVE-NEXT:    and x9, x9, #0xf0f0f0f0f0f0f0f
2442; NONEON-NOSVE-NEXT:    mul x9, x9, x8
2443; NONEON-NOSVE-NEXT:    lsr x9, x9, #56
2444; NONEON-NOSVE-NEXT:    stp x9, x11, [sp, #48]
2445; NONEON-NOSVE-NEXT:    ldr x9, [sp, #8]
2446; NONEON-NOSVE-NEXT:    lsr x10, x9, #1
2447; NONEON-NOSVE-NEXT:    and x10, x10, #0x5555555555555555
2448; NONEON-NOSVE-NEXT:    sub x9, x9, x10
2449; NONEON-NOSVE-NEXT:    lsr x10, x9, #2
2450; NONEON-NOSVE-NEXT:    and x9, x9, #0x3333333333333333
2451; NONEON-NOSVE-NEXT:    and x10, x10, #0x3333333333333333
2452; NONEON-NOSVE-NEXT:    add x9, x9, x10
2453; NONEON-NOSVE-NEXT:    add x9, x9, x9, lsr #4
2454; NONEON-NOSVE-NEXT:    and x9, x9, #0xf0f0f0f0f0f0f0f
2455; NONEON-NOSVE-NEXT:    mul x9, x9, x8
2456; NONEON-NOSVE-NEXT:    lsr x11, x9, #56
2457; NONEON-NOSVE-NEXT:    ldr x9, [sp]
2458; NONEON-NOSVE-NEXT:    lsr x10, x9, #1
2459; NONEON-NOSVE-NEXT:    and x10, x10, #0x5555555555555555
2460; NONEON-NOSVE-NEXT:    sub x9, x9, x10
2461; NONEON-NOSVE-NEXT:    lsr x10, x9, #2
2462; NONEON-NOSVE-NEXT:    and x9, x9, #0x3333333333333333
2463; NONEON-NOSVE-NEXT:    and x10, x10, #0x3333333333333333
2464; NONEON-NOSVE-NEXT:    add x9, x9, x10
2465; NONEON-NOSVE-NEXT:    add x9, x9, x9, lsr #4
2466; NONEON-NOSVE-NEXT:    and x9, x9, #0xf0f0f0f0f0f0f0f
2467; NONEON-NOSVE-NEXT:    mul x8, x9, x8
2468; NONEON-NOSVE-NEXT:    lsr x8, x8, #56
2469; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #32]
2470; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2471; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2472; NONEON-NOSVE-NEXT:    add sp, sp, #64
2473; NONEON-NOSVE-NEXT:    ret
2474  %op = load <4 x i64>, ptr %a
2475  %res = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %op)
2476  store <4 x i64> %res, ptr %a
2477  ret void
2478}
2479
2480;
2481; Count trailing zeros
2482;
2483
2484define <4 x i8> @cttz_v4i8(<4 x i8> %op) {
2485; CHECK-LABEL: cttz_v4i8:
2486; CHECK:       // %bb.0:
2487; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
2488; CHECK-NEXT:    ptrue p0.h, vl4
2489; CHECK-NEXT:    orr z0.h, z0.h, #0x100
2490; CHECK-NEXT:    rbit z0.h, p0/m, z0.h
2491; CHECK-NEXT:    clz z0.h, p0/m, z0.h
2492; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2493; CHECK-NEXT:    ret
2494;
2495; NONEON-NOSVE-LABEL: cttz_v4i8:
2496; NONEON-NOSVE:       // %bb.0:
2497; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
2498; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
2499; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
2500; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2501; NONEON-NOSVE-NEXT:    rbit w8, w8
2502; NONEON-NOSVE-NEXT:    clz w8, w8
2503; NONEON-NOSVE-NEXT:    strh w8, [sp, #14]
2504; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
2505; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2506; NONEON-NOSVE-NEXT:    rbit w8, w8
2507; NONEON-NOSVE-NEXT:    clz w8, w8
2508; NONEON-NOSVE-NEXT:    strh w8, [sp, #12]
2509; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
2510; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2511; NONEON-NOSVE-NEXT:    rbit w8, w8
2512; NONEON-NOSVE-NEXT:    clz w8, w8
2513; NONEON-NOSVE-NEXT:    strh w8, [sp, #10]
2514; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
2515; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2516; NONEON-NOSVE-NEXT:    rbit w8, w8
2517; NONEON-NOSVE-NEXT:    clz w8, w8
2518; NONEON-NOSVE-NEXT:    strh w8, [sp, #8]
2519; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
2520; NONEON-NOSVE-NEXT:    add sp, sp, #16
2521; NONEON-NOSVE-NEXT:    ret
2522  %res = call <4 x i8> @llvm.cttz.v4i8(<4 x i8> %op)
2523  ret <4 x i8> %res
2524}
2525
2526define <8 x i8> @cttz_v8i8(<8 x i8> %op) {
2527; CHECK-LABEL: cttz_v8i8:
2528; CHECK:       // %bb.0:
2529; CHECK-NEXT:    ptrue p0.b, vl8
2530; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
2531; CHECK-NEXT:    rbit z0.b, p0/m, z0.b
2532; CHECK-NEXT:    clz z0.b, p0/m, z0.b
2533; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2534; CHECK-NEXT:    ret
2535;
2536; NONEON-NOSVE-LABEL: cttz_v8i8:
2537; NONEON-NOSVE:       // %bb.0:
2538; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
2539; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
2540; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
2541; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2542; NONEON-NOSVE-NEXT:    rbit w8, w8
2543; NONEON-NOSVE-NEXT:    clz w8, w8
2544; NONEON-NOSVE-NEXT:    strb w8, [sp, #15]
2545; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
2546; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2547; NONEON-NOSVE-NEXT:    rbit w8, w8
2548; NONEON-NOSVE-NEXT:    clz w8, w8
2549; NONEON-NOSVE-NEXT:    strb w8, [sp, #14]
2550; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
2551; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2552; NONEON-NOSVE-NEXT:    rbit w8, w8
2553; NONEON-NOSVE-NEXT:    clz w8, w8
2554; NONEON-NOSVE-NEXT:    strb w8, [sp, #13]
2555; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
2556; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2557; NONEON-NOSVE-NEXT:    rbit w8, w8
2558; NONEON-NOSVE-NEXT:    clz w8, w8
2559; NONEON-NOSVE-NEXT:    strb w8, [sp, #12]
2560; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
2561; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2562; NONEON-NOSVE-NEXT:    rbit w8, w8
2563; NONEON-NOSVE-NEXT:    clz w8, w8
2564; NONEON-NOSVE-NEXT:    strb w8, [sp, #11]
2565; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
2566; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2567; NONEON-NOSVE-NEXT:    rbit w8, w8
2568; NONEON-NOSVE-NEXT:    clz w8, w8
2569; NONEON-NOSVE-NEXT:    strb w8, [sp, #10]
2570; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
2571; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2572; NONEON-NOSVE-NEXT:    rbit w8, w8
2573; NONEON-NOSVE-NEXT:    clz w8, w8
2574; NONEON-NOSVE-NEXT:    strb w8, [sp, #9]
2575; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
2576; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2577; NONEON-NOSVE-NEXT:    rbit w8, w8
2578; NONEON-NOSVE-NEXT:    clz w8, w8
2579; NONEON-NOSVE-NEXT:    strb w8, [sp, #8]
2580; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
2581; NONEON-NOSVE-NEXT:    add sp, sp, #16
2582; NONEON-NOSVE-NEXT:    ret
2583  %res = call <8 x i8> @llvm.cttz.v8i8(<8 x i8> %op)
2584  ret <8 x i8> %res
2585}
2586
2587define <16 x i8> @cttz_v16i8(<16 x i8> %op) {
2588; CHECK-LABEL: cttz_v16i8:
2589; CHECK:       // %bb.0:
2590; CHECK-NEXT:    ptrue p0.b, vl16
2591; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2592; CHECK-NEXT:    rbit z0.b, p0/m, z0.b
2593; CHECK-NEXT:    clz z0.b, p0/m, z0.b
2594; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
2595; CHECK-NEXT:    ret
2596;
2597; NONEON-NOSVE-LABEL: cttz_v16i8:
2598; NONEON-NOSVE:       // %bb.0:
2599; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
2600; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
2601; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
2602; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2603; NONEON-NOSVE-NEXT:    rbit w8, w8
2604; NONEON-NOSVE-NEXT:    clz w8, w8
2605; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]
2606; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
2607; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2608; NONEON-NOSVE-NEXT:    rbit w8, w8
2609; NONEON-NOSVE-NEXT:    clz w8, w8
2610; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]
2611; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
2612; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2613; NONEON-NOSVE-NEXT:    rbit w8, w8
2614; NONEON-NOSVE-NEXT:    clz w8, w8
2615; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]
2616; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
2617; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2618; NONEON-NOSVE-NEXT:    rbit w8, w8
2619; NONEON-NOSVE-NEXT:    clz w8, w8
2620; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]
2621; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
2622; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2623; NONEON-NOSVE-NEXT:    rbit w8, w8
2624; NONEON-NOSVE-NEXT:    clz w8, w8
2625; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]
2626; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
2627; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2628; NONEON-NOSVE-NEXT:    rbit w8, w8
2629; NONEON-NOSVE-NEXT:    clz w8, w8
2630; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]
2631; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
2632; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2633; NONEON-NOSVE-NEXT:    rbit w8, w8
2634; NONEON-NOSVE-NEXT:    clz w8, w8
2635; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]
2636; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
2637; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2638; NONEON-NOSVE-NEXT:    rbit w8, w8
2639; NONEON-NOSVE-NEXT:    clz w8, w8
2640; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]
2641; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
2642; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2643; NONEON-NOSVE-NEXT:    rbit w8, w8
2644; NONEON-NOSVE-NEXT:    clz w8, w8
2645; NONEON-NOSVE-NEXT:    strb w8, [sp, #23]
2646; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
2647; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2648; NONEON-NOSVE-NEXT:    rbit w8, w8
2649; NONEON-NOSVE-NEXT:    clz w8, w8
2650; NONEON-NOSVE-NEXT:    strb w8, [sp, #22]
2651; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
2652; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2653; NONEON-NOSVE-NEXT:    rbit w8, w8
2654; NONEON-NOSVE-NEXT:    clz w8, w8
2655; NONEON-NOSVE-NEXT:    strb w8, [sp, #21]
2656; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
2657; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2658; NONEON-NOSVE-NEXT:    rbit w8, w8
2659; NONEON-NOSVE-NEXT:    clz w8, w8
2660; NONEON-NOSVE-NEXT:    strb w8, [sp, #20]
2661; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
2662; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2663; NONEON-NOSVE-NEXT:    rbit w8, w8
2664; NONEON-NOSVE-NEXT:    clz w8, w8
2665; NONEON-NOSVE-NEXT:    strb w8, [sp, #19]
2666; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
2667; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2668; NONEON-NOSVE-NEXT:    rbit w8, w8
2669; NONEON-NOSVE-NEXT:    clz w8, w8
2670; NONEON-NOSVE-NEXT:    strb w8, [sp, #18]
2671; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
2672; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2673; NONEON-NOSVE-NEXT:    rbit w8, w8
2674; NONEON-NOSVE-NEXT:    clz w8, w8
2675; NONEON-NOSVE-NEXT:    strb w8, [sp, #17]
2676; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
2677; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2678; NONEON-NOSVE-NEXT:    rbit w8, w8
2679; NONEON-NOSVE-NEXT:    clz w8, w8
2680; NONEON-NOSVE-NEXT:    strb w8, [sp, #16]
2681; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
2682; NONEON-NOSVE-NEXT:    add sp, sp, #32
2683; NONEON-NOSVE-NEXT:    ret
2684  %res = call <16 x i8> @llvm.cttz.v16i8(<16 x i8> %op)
2685  ret <16 x i8> %res
2686}
2687
2688define void @cttz_v32i8(ptr %a) {
2689; CHECK-LABEL: cttz_v32i8:
2690; CHECK:       // %bb.0:
2691; CHECK-NEXT:    ldp q0, q1, [x0]
2692; CHECK-NEXT:    ptrue p0.b, vl16
2693; CHECK-NEXT:    rbit z0.b, p0/m, z0.b
2694; CHECK-NEXT:    rbit z1.b, p0/m, z1.b
2695; CHECK-NEXT:    clz z0.b, p0/m, z0.b
2696; CHECK-NEXT:    clz z1.b, p0/m, z1.b
2697; CHECK-NEXT:    stp q0, q1, [x0]
2698; CHECK-NEXT:    ret
2699;
2700; NONEON-NOSVE-LABEL: cttz_v32i8:
2701; NONEON-NOSVE:       // %bb.0:
2702; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2703; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2704; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2705; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
2706; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2707; NONEON-NOSVE-NEXT:    rbit w8, w8
2708; NONEON-NOSVE-NEXT:    clz w8, w8
2709; NONEON-NOSVE-NEXT:    strb w8, [sp, #63]
2710; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
2711; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2712; NONEON-NOSVE-NEXT:    rbit w8, w8
2713; NONEON-NOSVE-NEXT:    clz w8, w8
2714; NONEON-NOSVE-NEXT:    strb w8, [sp, #62]
2715; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
2716; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2717; NONEON-NOSVE-NEXT:    rbit w8, w8
2718; NONEON-NOSVE-NEXT:    clz w8, w8
2719; NONEON-NOSVE-NEXT:    strb w8, [sp, #61]
2720; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
2721; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2722; NONEON-NOSVE-NEXT:    rbit w8, w8
2723; NONEON-NOSVE-NEXT:    clz w8, w8
2724; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
2725; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
2726; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2727; NONEON-NOSVE-NEXT:    rbit w8, w8
2728; NONEON-NOSVE-NEXT:    clz w8, w8
2729; NONEON-NOSVE-NEXT:    strb w8, [sp, #59]
2730; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
2731; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2732; NONEON-NOSVE-NEXT:    rbit w8, w8
2733; NONEON-NOSVE-NEXT:    clz w8, w8
2734; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
2735; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
2736; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2737; NONEON-NOSVE-NEXT:    rbit w8, w8
2738; NONEON-NOSVE-NEXT:    clz w8, w8
2739; NONEON-NOSVE-NEXT:    strb w8, [sp, #57]
2740; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
2741; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2742; NONEON-NOSVE-NEXT:    rbit w8, w8
2743; NONEON-NOSVE-NEXT:    clz w8, w8
2744; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
2745; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
2746; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2747; NONEON-NOSVE-NEXT:    rbit w8, w8
2748; NONEON-NOSVE-NEXT:    clz w8, w8
2749; NONEON-NOSVE-NEXT:    strb w8, [sp, #55]
2750; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
2751; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2752; NONEON-NOSVE-NEXT:    rbit w8, w8
2753; NONEON-NOSVE-NEXT:    clz w8, w8
2754; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
2755; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
2756; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2757; NONEON-NOSVE-NEXT:    rbit w8, w8
2758; NONEON-NOSVE-NEXT:    clz w8, w8
2759; NONEON-NOSVE-NEXT:    strb w8, [sp, #53]
2760; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
2761; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2762; NONEON-NOSVE-NEXT:    rbit w8, w8
2763; NONEON-NOSVE-NEXT:    clz w8, w8
2764; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
2765; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
2766; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2767; NONEON-NOSVE-NEXT:    rbit w8, w8
2768; NONEON-NOSVE-NEXT:    clz w8, w8
2769; NONEON-NOSVE-NEXT:    strb w8, [sp, #51]
2770; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
2771; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2772; NONEON-NOSVE-NEXT:    rbit w8, w8
2773; NONEON-NOSVE-NEXT:    clz w8, w8
2774; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
2775; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
2776; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2777; NONEON-NOSVE-NEXT:    rbit w8, w8
2778; NONEON-NOSVE-NEXT:    clz w8, w8
2779; NONEON-NOSVE-NEXT:    strb w8, [sp, #49]
2780; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
2781; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2782; NONEON-NOSVE-NEXT:    rbit w8, w8
2783; NONEON-NOSVE-NEXT:    clz w8, w8
2784; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
2785; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
2786; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2787; NONEON-NOSVE-NEXT:    rbit w8, w8
2788; NONEON-NOSVE-NEXT:    clz w8, w8
2789; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
2790; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
2791; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2792; NONEON-NOSVE-NEXT:    rbit w8, w8
2793; NONEON-NOSVE-NEXT:    clz w8, w8
2794; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
2795; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
2796; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2797; NONEON-NOSVE-NEXT:    rbit w8, w8
2798; NONEON-NOSVE-NEXT:    clz w8, w8
2799; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
2800; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
2801; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2802; NONEON-NOSVE-NEXT:    rbit w8, w8
2803; NONEON-NOSVE-NEXT:    clz w8, w8
2804; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
2805; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
2806; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2807; NONEON-NOSVE-NEXT:    rbit w8, w8
2808; NONEON-NOSVE-NEXT:    clz w8, w8
2809; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
2810; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
2811; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2812; NONEON-NOSVE-NEXT:    rbit w8, w8
2813; NONEON-NOSVE-NEXT:    clz w8, w8
2814; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
2815; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
2816; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2817; NONEON-NOSVE-NEXT:    rbit w8, w8
2818; NONEON-NOSVE-NEXT:    clz w8, w8
2819; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
2820; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
2821; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2822; NONEON-NOSVE-NEXT:    rbit w8, w8
2823; NONEON-NOSVE-NEXT:    clz w8, w8
2824; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
2825; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
2826; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2827; NONEON-NOSVE-NEXT:    rbit w8, w8
2828; NONEON-NOSVE-NEXT:    clz w8, w8
2829; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
2830; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
2831; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2832; NONEON-NOSVE-NEXT:    rbit w8, w8
2833; NONEON-NOSVE-NEXT:    clz w8, w8
2834; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
2835; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
2836; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2837; NONEON-NOSVE-NEXT:    rbit w8, w8
2838; NONEON-NOSVE-NEXT:    clz w8, w8
2839; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
2840; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #4]
2841; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2842; NONEON-NOSVE-NEXT:    rbit w8, w8
2843; NONEON-NOSVE-NEXT:    clz w8, w8
2844; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
2845; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
2846; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2847; NONEON-NOSVE-NEXT:    rbit w8, w8
2848; NONEON-NOSVE-NEXT:    clz w8, w8
2849; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
2850; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
2851; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2852; NONEON-NOSVE-NEXT:    rbit w8, w8
2853; NONEON-NOSVE-NEXT:    clz w8, w8
2854; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
2855; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
2856; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2857; NONEON-NOSVE-NEXT:    rbit w8, w8
2858; NONEON-NOSVE-NEXT:    clz w8, w8
2859; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
2860; NONEON-NOSVE-NEXT:    ldrb w8, [sp]
2861; NONEON-NOSVE-NEXT:    orr w8, w8, #0x100
2862; NONEON-NOSVE-NEXT:    rbit w8, w8
2863; NONEON-NOSVE-NEXT:    clz w8, w8
2864; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
2865; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2866; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2867; NONEON-NOSVE-NEXT:    add sp, sp, #64
2868; NONEON-NOSVE-NEXT:    ret
2869  %op = load <32 x i8>, ptr %a
2870  %res = call <32 x i8> @llvm.cttz.v32i8(<32 x i8> %op)
2871  store <32 x i8> %res, ptr %a
2872  ret void
2873}
2874
2875define <2 x i16> @cttz_v2i16(<2 x i16> %op) {
2876; CHECK-LABEL: cttz_v2i16:
2877; CHECK:       // %bb.0:
2878; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
2879; CHECK-NEXT:    ptrue p0.s, vl2
2880; CHECK-NEXT:    orr z0.s, z0.s, #0x10000
2881; CHECK-NEXT:    rbit z0.s, p0/m, z0.s
2882; CHECK-NEXT:    clz z0.s, p0/m, z0.s
2883; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2884; CHECK-NEXT:    ret
2885;
2886; NONEON-NOSVE-LABEL: cttz_v2i16:
2887; NONEON-NOSVE:       // %bb.0:
2888; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
2889; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
2890; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
2891; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
2892; NONEON-NOSVE-NEXT:    rbit w8, w8
2893; NONEON-NOSVE-NEXT:    clz w9, w8
2894; NONEON-NOSVE-NEXT:    ldr w8, [sp]
2895; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
2896; NONEON-NOSVE-NEXT:    rbit w8, w8
2897; NONEON-NOSVE-NEXT:    clz w8, w8
2898; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8]
2899; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
2900; NONEON-NOSVE-NEXT:    add sp, sp, #16
2901; NONEON-NOSVE-NEXT:    ret
2902  %res = call <2 x i16> @llvm.cttz.v2i16(<2 x i16> %op)
2903  ret <2 x i16> %res
2904}
2905
2906define <4 x i16> @cttz_v4i16(<4 x i16> %op) {
2907; CHECK-LABEL: cttz_v4i16:
2908; CHECK:       // %bb.0:
2909; CHECK-NEXT:    ptrue p0.h, vl4
2910; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
2911; CHECK-NEXT:    rbit z0.h, p0/m, z0.h
2912; CHECK-NEXT:    clz z0.h, p0/m, z0.h
2913; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2914; CHECK-NEXT:    ret
2915;
2916; NONEON-NOSVE-LABEL: cttz_v4i16:
2917; NONEON-NOSVE:       // %bb.0:
2918; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
2919; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
2920; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
2921; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
2922; NONEON-NOSVE-NEXT:    rbit w8, w8
2923; NONEON-NOSVE-NEXT:    clz w8, w8
2924; NONEON-NOSVE-NEXT:    strh w8, [sp, #14]
2925; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
2926; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
2927; NONEON-NOSVE-NEXT:    rbit w8, w8
2928; NONEON-NOSVE-NEXT:    clz w8, w8
2929; NONEON-NOSVE-NEXT:    strh w8, [sp, #12]
2930; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
2931; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
2932; NONEON-NOSVE-NEXT:    rbit w8, w8
2933; NONEON-NOSVE-NEXT:    clz w8, w8
2934; NONEON-NOSVE-NEXT:    strh w8, [sp, #10]
2935; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
2936; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
2937; NONEON-NOSVE-NEXT:    rbit w8, w8
2938; NONEON-NOSVE-NEXT:    clz w8, w8
2939; NONEON-NOSVE-NEXT:    strh w8, [sp, #8]
2940; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
2941; NONEON-NOSVE-NEXT:    add sp, sp, #16
2942; NONEON-NOSVE-NEXT:    ret
2943  %res = call <4 x i16> @llvm.cttz.v4i16(<4 x i16> %op)
2944  ret <4 x i16> %res
2945}
2946
2947define <8 x i16> @cttz_v8i16(<8 x i16> %op) {
2948; CHECK-LABEL: cttz_v8i16:
2949; CHECK:       // %bb.0:
2950; CHECK-NEXT:    ptrue p0.h, vl8
2951; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2952; CHECK-NEXT:    rbit z0.h, p0/m, z0.h
2953; CHECK-NEXT:    clz z0.h, p0/m, z0.h
2954; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
2955; CHECK-NEXT:    ret
2956;
2957; NONEON-NOSVE-LABEL: cttz_v8i16:
2958; NONEON-NOSVE:       // %bb.0:
2959; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
2960; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
2961; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
2962; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
2963; NONEON-NOSVE-NEXT:    rbit w8, w8
2964; NONEON-NOSVE-NEXT:    clz w8, w8
2965; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
2966; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
2967; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
2968; NONEON-NOSVE-NEXT:    rbit w8, w8
2969; NONEON-NOSVE-NEXT:    clz w8, w8
2970; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
2971; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
2972; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
2973; NONEON-NOSVE-NEXT:    rbit w8, w8
2974; NONEON-NOSVE-NEXT:    clz w8, w8
2975; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
2976; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
2977; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
2978; NONEON-NOSVE-NEXT:    rbit w8, w8
2979; NONEON-NOSVE-NEXT:    clz w8, w8
2980; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
2981; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
2982; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
2983; NONEON-NOSVE-NEXT:    rbit w8, w8
2984; NONEON-NOSVE-NEXT:    clz w8, w8
2985; NONEON-NOSVE-NEXT:    strh w8, [sp, #22]
2986; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
2987; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
2988; NONEON-NOSVE-NEXT:    rbit w8, w8
2989; NONEON-NOSVE-NEXT:    clz w8, w8
2990; NONEON-NOSVE-NEXT:    strh w8, [sp, #20]
2991; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
2992; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
2993; NONEON-NOSVE-NEXT:    rbit w8, w8
2994; NONEON-NOSVE-NEXT:    clz w8, w8
2995; NONEON-NOSVE-NEXT:    strh w8, [sp, #18]
2996; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
2997; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
2998; NONEON-NOSVE-NEXT:    rbit w8, w8
2999; NONEON-NOSVE-NEXT:    clz w8, w8
3000; NONEON-NOSVE-NEXT:    strh w8, [sp, #16]
3001; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
3002; NONEON-NOSVE-NEXT:    add sp, sp, #32
3003; NONEON-NOSVE-NEXT:    ret
3004  %res = call <8 x i16> @llvm.cttz.v8i16(<8 x i16> %op)
3005  ret <8 x i16> %res
3006}
3007
3008define void @cttz_v16i16(ptr %a) {
3009; CHECK-LABEL: cttz_v16i16:
3010; CHECK:       // %bb.0:
3011; CHECK-NEXT:    ldp q0, q1, [x0]
3012; CHECK-NEXT:    ptrue p0.h, vl8
3013; CHECK-NEXT:    rbit z0.h, p0/m, z0.h
3014; CHECK-NEXT:    rbit z1.h, p0/m, z1.h
3015; CHECK-NEXT:    clz z0.h, p0/m, z0.h
3016; CHECK-NEXT:    clz z1.h, p0/m, z1.h
3017; CHECK-NEXT:    stp q0, q1, [x0]
3018; CHECK-NEXT:    ret
3019;
3020; NONEON-NOSVE-LABEL: cttz_v16i16:
3021; NONEON-NOSVE:       // %bb.0:
3022; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3023; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3024; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3025; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
3026; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3027; NONEON-NOSVE-NEXT:    rbit w8, w8
3028; NONEON-NOSVE-NEXT:    clz w8, w8
3029; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
3030; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
3031; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3032; NONEON-NOSVE-NEXT:    rbit w8, w8
3033; NONEON-NOSVE-NEXT:    clz w8, w8
3034; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
3035; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
3036; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3037; NONEON-NOSVE-NEXT:    rbit w8, w8
3038; NONEON-NOSVE-NEXT:    clz w8, w8
3039; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
3040; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
3041; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3042; NONEON-NOSVE-NEXT:    rbit w8, w8
3043; NONEON-NOSVE-NEXT:    clz w8, w8
3044; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
3045; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
3046; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3047; NONEON-NOSVE-NEXT:    rbit w8, w8
3048; NONEON-NOSVE-NEXT:    clz w8, w8
3049; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
3050; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
3051; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3052; NONEON-NOSVE-NEXT:    rbit w8, w8
3053; NONEON-NOSVE-NEXT:    clz w8, w8
3054; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
3055; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
3056; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3057; NONEON-NOSVE-NEXT:    rbit w8, w8
3058; NONEON-NOSVE-NEXT:    clz w8, w8
3059; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
3060; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
3061; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3062; NONEON-NOSVE-NEXT:    rbit w8, w8
3063; NONEON-NOSVE-NEXT:    clz w8, w8
3064; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
3065; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
3066; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3067; NONEON-NOSVE-NEXT:    rbit w8, w8
3068; NONEON-NOSVE-NEXT:    clz w8, w8
3069; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
3070; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
3071; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3072; NONEON-NOSVE-NEXT:    rbit w8, w8
3073; NONEON-NOSVE-NEXT:    clz w8, w8
3074; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
3075; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
3076; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3077; NONEON-NOSVE-NEXT:    rbit w8, w8
3078; NONEON-NOSVE-NEXT:    clz w8, w8
3079; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
3080; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
3081; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3082; NONEON-NOSVE-NEXT:    rbit w8, w8
3083; NONEON-NOSVE-NEXT:    clz w8, w8
3084; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
3085; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
3086; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3087; NONEON-NOSVE-NEXT:    rbit w8, w8
3088; NONEON-NOSVE-NEXT:    clz w8, w8
3089; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
3090; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
3091; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3092; NONEON-NOSVE-NEXT:    rbit w8, w8
3093; NONEON-NOSVE-NEXT:    clz w8, w8
3094; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
3095; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
3096; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3097; NONEON-NOSVE-NEXT:    rbit w8, w8
3098; NONEON-NOSVE-NEXT:    clz w8, w8
3099; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
3100; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
3101; NONEON-NOSVE-NEXT:    orr w8, w8, #0x10000
3102; NONEON-NOSVE-NEXT:    rbit w8, w8
3103; NONEON-NOSVE-NEXT:    clz w8, w8
3104; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
3105; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3106; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3107; NONEON-NOSVE-NEXT:    add sp, sp, #64
3108; NONEON-NOSVE-NEXT:    ret
3109  %op = load <16 x i16>, ptr %a
3110  %res = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> %op)
3111  store <16 x i16> %res, ptr %a
3112  ret void
3113}
3114
3115define <2 x i32> @cttz_v2i32(<2 x i32> %op) {
3116; CHECK-LABEL: cttz_v2i32:
3117; CHECK:       // %bb.0:
3118; CHECK-NEXT:    ptrue p0.s, vl2
3119; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
3120; CHECK-NEXT:    rbit z0.s, p0/m, z0.s
3121; CHECK-NEXT:    clz z0.s, p0/m, z0.s
3122; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
3123; CHECK-NEXT:    ret
3124;
3125; NONEON-NOSVE-LABEL: cttz_v2i32:
3126; NONEON-NOSVE:       // %bb.0:
3127; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
3128; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
3129; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
3130; NONEON-NOSVE-NEXT:    rbit w8, w8
3131; NONEON-NOSVE-NEXT:    clz w9, w8
3132; NONEON-NOSVE-NEXT:    ldr w8, [sp]
3133; NONEON-NOSVE-NEXT:    rbit w8, w8
3134; NONEON-NOSVE-NEXT:    clz w8, w8
3135; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8]
3136; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
3137; NONEON-NOSVE-NEXT:    add sp, sp, #16
3138; NONEON-NOSVE-NEXT:    ret
3139  %res = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %op)
3140  ret <2 x i32> %res
3141}
3142
3143define <4 x i32> @cttz_v4i32(<4 x i32> %op) {
3144; CHECK-LABEL: cttz_v4i32:
3145; CHECK:       // %bb.0:
3146; CHECK-NEXT:    ptrue p0.s, vl4
3147; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
3148; CHECK-NEXT:    rbit z0.s, p0/m, z0.s
3149; CHECK-NEXT:    clz z0.s, p0/m, z0.s
3150; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
3151; CHECK-NEXT:    ret
3152;
3153; NONEON-NOSVE-LABEL: cttz_v4i32:
3154; NONEON-NOSVE:       // %bb.0:
3155; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
3156; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
3157; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
3158; NONEON-NOSVE-NEXT:    rbit w8, w8
3159; NONEON-NOSVE-NEXT:    clz w9, w8
3160; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
3161; NONEON-NOSVE-NEXT:    rbit w8, w8
3162; NONEON-NOSVE-NEXT:    clz w8, w8
3163; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24]
3164; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
3165; NONEON-NOSVE-NEXT:    rbit w8, w8
3166; NONEON-NOSVE-NEXT:    clz w9, w8
3167; NONEON-NOSVE-NEXT:    ldr w8, [sp]
3168; NONEON-NOSVE-NEXT:    rbit w8, w8
3169; NONEON-NOSVE-NEXT:    clz w8, w8
3170; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #16]
3171; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
3172; NONEON-NOSVE-NEXT:    add sp, sp, #32
3173; NONEON-NOSVE-NEXT:    ret
3174  %res = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %op)
3175  ret <4 x i32> %res
3176}
3177
3178define void @cttz_v8i32(ptr %a) {
3179; CHECK-LABEL: cttz_v8i32:
3180; CHECK:       // %bb.0:
3181; CHECK-NEXT:    ldp q0, q1, [x0]
3182; CHECK-NEXT:    ptrue p0.s, vl4
3183; CHECK-NEXT:    rbit z0.s, p0/m, z0.s
3184; CHECK-NEXT:    rbit z1.s, p0/m, z1.s
3185; CHECK-NEXT:    clz z0.s, p0/m, z0.s
3186; CHECK-NEXT:    clz z1.s, p0/m, z1.s
3187; CHECK-NEXT:    stp q0, q1, [x0]
3188; CHECK-NEXT:    ret
3189;
3190; NONEON-NOSVE-LABEL: cttz_v8i32:
3191; NONEON-NOSVE:       // %bb.0:
3192; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3193; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3194; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3195; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
3196; NONEON-NOSVE-NEXT:    rbit w8, w8
3197; NONEON-NOSVE-NEXT:    clz w9, w8
3198; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
3199; NONEON-NOSVE-NEXT:    rbit w8, w8
3200; NONEON-NOSVE-NEXT:    clz w8, w8
3201; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
3202; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
3203; NONEON-NOSVE-NEXT:    rbit w8, w8
3204; NONEON-NOSVE-NEXT:    clz w9, w8
3205; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
3206; NONEON-NOSVE-NEXT:    rbit w8, w8
3207; NONEON-NOSVE-NEXT:    clz w8, w8
3208; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
3209; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
3210; NONEON-NOSVE-NEXT:    rbit w8, w8
3211; NONEON-NOSVE-NEXT:    clz w9, w8
3212; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
3213; NONEON-NOSVE-NEXT:    rbit w8, w8
3214; NONEON-NOSVE-NEXT:    clz w8, w8
3215; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
3216; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
3217; NONEON-NOSVE-NEXT:    rbit w8, w8
3218; NONEON-NOSVE-NEXT:    clz w9, w8
3219; NONEON-NOSVE-NEXT:    ldr w8, [sp]
3220; NONEON-NOSVE-NEXT:    rbit w8, w8
3221; NONEON-NOSVE-NEXT:    clz w8, w8
3222; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
3223; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3224; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3225; NONEON-NOSVE-NEXT:    add sp, sp, #64
3226; NONEON-NOSVE-NEXT:    ret
3227  %op = load <8 x i32>, ptr %a
3228  %res = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> %op)
3229  store <8 x i32> %res, ptr %a
3230  ret void
3231}
3232
3233define <1 x i64> @cttz_v1i64(<1 x i64> %op) {
3234; CHECK-LABEL: cttz_v1i64:
3235; CHECK:       // %bb.0:
3236; CHECK-NEXT:    ptrue p0.d, vl1
3237; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
3238; CHECK-NEXT:    rbit z0.d, p0/m, z0.d
3239; CHECK-NEXT:    clz z0.d, p0/m, z0.d
3240; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
3241; CHECK-NEXT:    ret
3242;
3243; NONEON-NOSVE-LABEL: cttz_v1i64:
3244; NONEON-NOSVE:       // %bb.0:
3245; NONEON-NOSVE-NEXT:    sub sp, sp, #16
3246; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
3247; NONEON-NOSVE-NEXT:    fmov x8, d0
3248; NONEON-NOSVE-NEXT:    rbit x8, x8
3249; NONEON-NOSVE-NEXT:    clz x8, x8
3250; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
3251; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
3252; NONEON-NOSVE-NEXT:    add sp, sp, #16
3253; NONEON-NOSVE-NEXT:    ret
3254  %res = call <1 x i64> @llvm.cttz.v1i64(<1 x i64> %op)
3255  ret <1 x i64> %res
3256}
3257
3258define <2 x i64> @cttz_v2i64(<2 x i64> %op) {
3259; CHECK-LABEL: cttz_v2i64:
3260; CHECK:       // %bb.0:
3261; CHECK-NEXT:    ptrue p0.d, vl2
3262; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
3263; CHECK-NEXT:    rbit z0.d, p0/m, z0.d
3264; CHECK-NEXT:    clz z0.d, p0/m, z0.d
3265; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
3266; CHECK-NEXT:    ret
3267;
3268; NONEON-NOSVE-LABEL: cttz_v2i64:
3269; NONEON-NOSVE:       // %bb.0:
3270; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
3271; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
3272; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
3273; NONEON-NOSVE-NEXT:    rbit x8, x8
3274; NONEON-NOSVE-NEXT:    clz x9, x8
3275; NONEON-NOSVE-NEXT:    ldr x8, [sp]
3276; NONEON-NOSVE-NEXT:    rbit x8, x8
3277; NONEON-NOSVE-NEXT:    clz x8, x8
3278; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #16]
3279; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
3280; NONEON-NOSVE-NEXT:    add sp, sp, #32
3281; NONEON-NOSVE-NEXT:    ret
3282  %res = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %op)
3283  ret <2 x i64> %res
3284}
3285
3286define void @cttz_v4i64(ptr %a) {
3287; CHECK-LABEL: cttz_v4i64:
3288; CHECK:       // %bb.0:
3289; CHECK-NEXT:    ldp q0, q1, [x0]
3290; CHECK-NEXT:    ptrue p0.d, vl2
3291; CHECK-NEXT:    rbit z0.d, p0/m, z0.d
3292; CHECK-NEXT:    rbit z1.d, p0/m, z1.d
3293; CHECK-NEXT:    clz z0.d, p0/m, z0.d
3294; CHECK-NEXT:    clz z1.d, p0/m, z1.d
3295; CHECK-NEXT:    stp q0, q1, [x0]
3296; CHECK-NEXT:    ret
3297;
3298; NONEON-NOSVE-LABEL: cttz_v4i64:
3299; NONEON-NOSVE:       // %bb.0:
3300; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3301; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
3302; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3303; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
3304; NONEON-NOSVE-NEXT:    rbit x8, x8
3305; NONEON-NOSVE-NEXT:    clz x9, x8
3306; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
3307; NONEON-NOSVE-NEXT:    rbit x8, x8
3308; NONEON-NOSVE-NEXT:    clz x8, x8
3309; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]
3310; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
3311; NONEON-NOSVE-NEXT:    rbit x8, x8
3312; NONEON-NOSVE-NEXT:    clz x9, x8
3313; NONEON-NOSVE-NEXT:    ldr x8, [sp]
3314; NONEON-NOSVE-NEXT:    rbit x8, x8
3315; NONEON-NOSVE-NEXT:    clz x8, x8
3316; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]
3317; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3318; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3319; NONEON-NOSVE-NEXT:    add sp, sp, #64
3320; NONEON-NOSVE-NEXT:    ret
3321  %op = load <4 x i64>, ptr %a
3322  %res = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> %op)
3323  store <4 x i64> %res, ptr %a
3324  ret void
3325}
3326
3327
3328declare <4 x i8> @llvm.ctlz.v4i8(<4 x i8>)
3329declare <8 x i8> @llvm.ctlz.v8i8(<8 x i8>)
3330declare <16 x i8> @llvm.ctlz.v16i8(<16 x i8>)
3331declare <32 x i8> @llvm.ctlz.v32i8(<32 x i8>)
3332declare <2 x i16> @llvm.ctlz.v2i16(<2 x i16>)
3333declare <4 x i16> @llvm.ctlz.v4i16(<4 x i16>)
3334declare <8 x i16> @llvm.ctlz.v8i16(<8 x i16>)
3335declare <16 x i16> @llvm.ctlz.v16i16(<16 x i16>)
3336declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>)
3337declare <4 x i32> @llvm.ctlz.v4i32(<4 x i32>)
3338declare <8 x i32> @llvm.ctlz.v8i32(<8 x i32>)
3339declare <1 x i64> @llvm.ctlz.v1i64(<1 x i64>)
3340declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>)
3341declare <4 x i64> @llvm.ctlz.v4i64(<4 x i64>)
3342
3343declare <4 x i8> @llvm.ctpop.v4i8(<4 x i8>)
3344declare <8 x i8> @llvm.ctpop.v8i8(<8 x i8>)
3345declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)
3346declare <32 x i8> @llvm.ctpop.v32i8(<32 x i8>)
3347declare <2 x i16> @llvm.ctpop.v2i16(<2 x i16>)
3348declare <4 x i16> @llvm.ctpop.v4i16(<4 x i16>)
3349declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>)
3350declare <16 x i16> @llvm.ctpop.v16i16(<16 x i16>)
3351declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>)
3352declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)
3353declare <8 x i32> @llvm.ctpop.v8i32(<8 x i32>)
3354declare <1 x i64> @llvm.ctpop.v1i64(<1 x i64>)
3355declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>)
3356declare <4 x i64> @llvm.ctpop.v4i64(<4 x i64>)
3357
3358declare <4 x i8> @llvm.cttz.v4i8(<4 x i8>)
3359declare <8 x i8> @llvm.cttz.v8i8(<8 x i8>)
3360declare <16 x i8> @llvm.cttz.v16i8(<16 x i8>)
3361declare <32 x i8> @llvm.cttz.v32i8(<32 x i8>)
3362declare <2 x i16> @llvm.cttz.v2i16(<2 x i16>)
3363declare <4 x i16> @llvm.cttz.v4i16(<4 x i16>)
3364declare <8 x i16> @llvm.cttz.v8i16(<8 x i16>)
3365declare <16 x i16> @llvm.cttz.v16i16(<16 x i16>)
3366declare <2 x i32> @llvm.cttz.v2i32(<2 x i32>)
3367declare <4 x i32> @llvm.cttz.v4i32(<4 x i32>)
3368declare <8 x i32> @llvm.cttz.v8i32(<8 x i32>)
3369declare <1 x i64> @llvm.cttz.v1i64(<1 x i64>)
3370declare <2 x i64> @llvm.cttz.v2i64(<2 x i64>)
3371declare <4 x i64> @llvm.cttz.v4i64(<4 x i64>)
3372