1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX2,LMULMAX2-RV32
3; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX2,LMULMAX2-RV64
4; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX1,LMULMAX1-RV32
5; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX1,LMULMAX1-RV64
6
7define void @ctpop_v16i8(<16 x i8>* %x, <16 x i8>* %y) {
8; CHECK-LABEL: ctpop_v16i8:
9; CHECK:       # %bb.0:
10; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, mu
11; CHECK-NEXT:    vle8.v v25, (a0)
12; CHECK-NEXT:    vsrl.vi v26, v25, 1
13; CHECK-NEXT:    addi a1, zero, 85
14; CHECK-NEXT:    vand.vx v26, v26, a1
15; CHECK-NEXT:    vsub.vv v25, v25, v26
16; CHECK-NEXT:    addi a1, zero, 51
17; CHECK-NEXT:    vand.vx v26, v25, a1
18; CHECK-NEXT:    vsrl.vi v25, v25, 2
19; CHECK-NEXT:    vand.vx v25, v25, a1
20; CHECK-NEXT:    vadd.vv v25, v26, v25
21; CHECK-NEXT:    vsrl.vi v26, v25, 4
22; CHECK-NEXT:    vadd.vv v25, v25, v26
23; CHECK-NEXT:    vand.vi v25, v25, 15
24; CHECK-NEXT:    vse8.v v25, (a0)
25; CHECK-NEXT:    ret
26  %a = load <16 x i8>, <16 x i8>* %x
27  %b = load <16 x i8>, <16 x i8>* %y
28  %c = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %a)
29  store <16 x i8> %c, <16 x i8>* %x
30  ret void
31}
32declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)
33
34define void @ctpop_v8i16(<8 x i16>* %x, <8 x i16>* %y) {
35; LMULMAX2-RV32-LABEL: ctpop_v8i16:
36; LMULMAX2-RV32:       # %bb.0:
37; LMULMAX2-RV32-NEXT:    vsetivli zero, 8, e16, m1, ta, mu
38; LMULMAX2-RV32-NEXT:    vle16.v v25, (a0)
39; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v25, 1
40; LMULMAX2-RV32-NEXT:    lui a1, 5
41; LMULMAX2-RV32-NEXT:    addi a1, a1, 1365
42; LMULMAX2-RV32-NEXT:    vand.vx v26, v26, a1
43; LMULMAX2-RV32-NEXT:    vsub.vv v25, v25, v26
44; LMULMAX2-RV32-NEXT:    lui a1, 3
45; LMULMAX2-RV32-NEXT:    addi a1, a1, 819
46; LMULMAX2-RV32-NEXT:    vand.vx v26, v25, a1
47; LMULMAX2-RV32-NEXT:    vsrl.vi v25, v25, 2
48; LMULMAX2-RV32-NEXT:    vand.vx v25, v25, a1
49; LMULMAX2-RV32-NEXT:    vadd.vv v25, v26, v25
50; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v25, 4
51; LMULMAX2-RV32-NEXT:    vadd.vv v25, v25, v26
52; LMULMAX2-RV32-NEXT:    lui a1, 1
53; LMULMAX2-RV32-NEXT:    addi a1, a1, -241
54; LMULMAX2-RV32-NEXT:    vand.vx v25, v25, a1
55; LMULMAX2-RV32-NEXT:    addi a1, zero, 257
56; LMULMAX2-RV32-NEXT:    vmul.vx v25, v25, a1
57; LMULMAX2-RV32-NEXT:    vsrl.vi v25, v25, 8
58; LMULMAX2-RV32-NEXT:    vse16.v v25, (a0)
59; LMULMAX2-RV32-NEXT:    ret
60;
61; LMULMAX2-RV64-LABEL: ctpop_v8i16:
62; LMULMAX2-RV64:       # %bb.0:
63; LMULMAX2-RV64-NEXT:    vsetivli zero, 8, e16, m1, ta, mu
64; LMULMAX2-RV64-NEXT:    vle16.v v25, (a0)
65; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v25, 1
66; LMULMAX2-RV64-NEXT:    lui a1, 5
67; LMULMAX2-RV64-NEXT:    addiw a1, a1, 1365
68; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
69; LMULMAX2-RV64-NEXT:    vsub.vv v25, v25, v26
70; LMULMAX2-RV64-NEXT:    lui a1, 3
71; LMULMAX2-RV64-NEXT:    addiw a1, a1, 819
72; LMULMAX2-RV64-NEXT:    vand.vx v26, v25, a1
73; LMULMAX2-RV64-NEXT:    vsrl.vi v25, v25, 2
74; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
75; LMULMAX2-RV64-NEXT:    vadd.vv v25, v26, v25
76; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v25, 4
77; LMULMAX2-RV64-NEXT:    vadd.vv v25, v25, v26
78; LMULMAX2-RV64-NEXT:    lui a1, 1
79; LMULMAX2-RV64-NEXT:    addiw a1, a1, -241
80; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
81; LMULMAX2-RV64-NEXT:    addi a1, zero, 257
82; LMULMAX2-RV64-NEXT:    vmul.vx v25, v25, a1
83; LMULMAX2-RV64-NEXT:    vsrl.vi v25, v25, 8
84; LMULMAX2-RV64-NEXT:    vse16.v v25, (a0)
85; LMULMAX2-RV64-NEXT:    ret
86;
87; LMULMAX1-RV32-LABEL: ctpop_v8i16:
88; LMULMAX1-RV32:       # %bb.0:
89; LMULMAX1-RV32-NEXT:    vsetivli zero, 8, e16, m1, ta, mu
90; LMULMAX1-RV32-NEXT:    vle16.v v25, (a0)
91; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v25, 1
92; LMULMAX1-RV32-NEXT:    lui a1, 5
93; LMULMAX1-RV32-NEXT:    addi a1, a1, 1365
94; LMULMAX1-RV32-NEXT:    vand.vx v26, v26, a1
95; LMULMAX1-RV32-NEXT:    vsub.vv v25, v25, v26
96; LMULMAX1-RV32-NEXT:    lui a1, 3
97; LMULMAX1-RV32-NEXT:    addi a1, a1, 819
98; LMULMAX1-RV32-NEXT:    vand.vx v26, v25, a1
99; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 2
100; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a1
101; LMULMAX1-RV32-NEXT:    vadd.vv v25, v26, v25
102; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v25, 4
103; LMULMAX1-RV32-NEXT:    vadd.vv v25, v25, v26
104; LMULMAX1-RV32-NEXT:    lui a1, 1
105; LMULMAX1-RV32-NEXT:    addi a1, a1, -241
106; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a1
107; LMULMAX1-RV32-NEXT:    addi a1, zero, 257
108; LMULMAX1-RV32-NEXT:    vmul.vx v25, v25, a1
109; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 8
110; LMULMAX1-RV32-NEXT:    vse16.v v25, (a0)
111; LMULMAX1-RV32-NEXT:    ret
112;
113; LMULMAX1-RV64-LABEL: ctpop_v8i16:
114; LMULMAX1-RV64:       # %bb.0:
115; LMULMAX1-RV64-NEXT:    vsetivli zero, 8, e16, m1, ta, mu
116; LMULMAX1-RV64-NEXT:    vle16.v v25, (a0)
117; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v25, 1
118; LMULMAX1-RV64-NEXT:    lui a1, 5
119; LMULMAX1-RV64-NEXT:    addiw a1, a1, 1365
120; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a1
121; LMULMAX1-RV64-NEXT:    vsub.vv v25, v25, v26
122; LMULMAX1-RV64-NEXT:    lui a1, 3
123; LMULMAX1-RV64-NEXT:    addiw a1, a1, 819
124; LMULMAX1-RV64-NEXT:    vand.vx v26, v25, a1
125; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 2
126; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
127; LMULMAX1-RV64-NEXT:    vadd.vv v25, v26, v25
128; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v25, 4
129; LMULMAX1-RV64-NEXT:    vadd.vv v25, v25, v26
130; LMULMAX1-RV64-NEXT:    lui a1, 1
131; LMULMAX1-RV64-NEXT:    addiw a1, a1, -241
132; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
133; LMULMAX1-RV64-NEXT:    addi a1, zero, 257
134; LMULMAX1-RV64-NEXT:    vmul.vx v25, v25, a1
135; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 8
136; LMULMAX1-RV64-NEXT:    vse16.v v25, (a0)
137; LMULMAX1-RV64-NEXT:    ret
138  %a = load <8 x i16>, <8 x i16>* %x
139  %b = load <8 x i16>, <8 x i16>* %y
140  %c = call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %a)
141  store <8 x i16> %c, <8 x i16>* %x
142  ret void
143}
144declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>)
145
146define void @ctpop_v4i32(<4 x i32>* %x, <4 x i32>* %y) {
147; LMULMAX2-RV32-LABEL: ctpop_v4i32:
148; LMULMAX2-RV32:       # %bb.0:
149; LMULMAX2-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
150; LMULMAX2-RV32-NEXT:    vle32.v v25, (a0)
151; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v25, 1
152; LMULMAX2-RV32-NEXT:    lui a1, 349525
153; LMULMAX2-RV32-NEXT:    addi a1, a1, 1365
154; LMULMAX2-RV32-NEXT:    vand.vx v26, v26, a1
155; LMULMAX2-RV32-NEXT:    vsub.vv v25, v25, v26
156; LMULMAX2-RV32-NEXT:    lui a1, 209715
157; LMULMAX2-RV32-NEXT:    addi a1, a1, 819
158; LMULMAX2-RV32-NEXT:    vand.vx v26, v25, a1
159; LMULMAX2-RV32-NEXT:    vsrl.vi v25, v25, 2
160; LMULMAX2-RV32-NEXT:    vand.vx v25, v25, a1
161; LMULMAX2-RV32-NEXT:    vadd.vv v25, v26, v25
162; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v25, 4
163; LMULMAX2-RV32-NEXT:    vadd.vv v25, v25, v26
164; LMULMAX2-RV32-NEXT:    lui a1, 61681
165; LMULMAX2-RV32-NEXT:    addi a1, a1, -241
166; LMULMAX2-RV32-NEXT:    vand.vx v25, v25, a1
167; LMULMAX2-RV32-NEXT:    lui a1, 4112
168; LMULMAX2-RV32-NEXT:    addi a1, a1, 257
169; LMULMAX2-RV32-NEXT:    vmul.vx v25, v25, a1
170; LMULMAX2-RV32-NEXT:    vsrl.vi v25, v25, 24
171; LMULMAX2-RV32-NEXT:    vse32.v v25, (a0)
172; LMULMAX2-RV32-NEXT:    ret
173;
174; LMULMAX2-RV64-LABEL: ctpop_v4i32:
175; LMULMAX2-RV64:       # %bb.0:
176; LMULMAX2-RV64-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
177; LMULMAX2-RV64-NEXT:    vle32.v v25, (a0)
178; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v25, 1
179; LMULMAX2-RV64-NEXT:    lui a1, 349525
180; LMULMAX2-RV64-NEXT:    addiw a1, a1, 1365
181; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
182; LMULMAX2-RV64-NEXT:    vsub.vv v25, v25, v26
183; LMULMAX2-RV64-NEXT:    lui a1, 209715
184; LMULMAX2-RV64-NEXT:    addiw a1, a1, 819
185; LMULMAX2-RV64-NEXT:    vand.vx v26, v25, a1
186; LMULMAX2-RV64-NEXT:    vsrl.vi v25, v25, 2
187; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
188; LMULMAX2-RV64-NEXT:    vadd.vv v25, v26, v25
189; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v25, 4
190; LMULMAX2-RV64-NEXT:    vadd.vv v25, v25, v26
191; LMULMAX2-RV64-NEXT:    lui a1, 61681
192; LMULMAX2-RV64-NEXT:    addiw a1, a1, -241
193; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
194; LMULMAX2-RV64-NEXT:    lui a1, 4112
195; LMULMAX2-RV64-NEXT:    addiw a1, a1, 257
196; LMULMAX2-RV64-NEXT:    vmul.vx v25, v25, a1
197; LMULMAX2-RV64-NEXT:    vsrl.vi v25, v25, 24
198; LMULMAX2-RV64-NEXT:    vse32.v v25, (a0)
199; LMULMAX2-RV64-NEXT:    ret
200;
201; LMULMAX1-RV32-LABEL: ctpop_v4i32:
202; LMULMAX1-RV32:       # %bb.0:
203; LMULMAX1-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
204; LMULMAX1-RV32-NEXT:    vle32.v v25, (a0)
205; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v25, 1
206; LMULMAX1-RV32-NEXT:    lui a1, 349525
207; LMULMAX1-RV32-NEXT:    addi a1, a1, 1365
208; LMULMAX1-RV32-NEXT:    vand.vx v26, v26, a1
209; LMULMAX1-RV32-NEXT:    vsub.vv v25, v25, v26
210; LMULMAX1-RV32-NEXT:    lui a1, 209715
211; LMULMAX1-RV32-NEXT:    addi a1, a1, 819
212; LMULMAX1-RV32-NEXT:    vand.vx v26, v25, a1
213; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 2
214; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a1
215; LMULMAX1-RV32-NEXT:    vadd.vv v25, v26, v25
216; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v25, 4
217; LMULMAX1-RV32-NEXT:    vadd.vv v25, v25, v26
218; LMULMAX1-RV32-NEXT:    lui a1, 61681
219; LMULMAX1-RV32-NEXT:    addi a1, a1, -241
220; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a1
221; LMULMAX1-RV32-NEXT:    lui a1, 4112
222; LMULMAX1-RV32-NEXT:    addi a1, a1, 257
223; LMULMAX1-RV32-NEXT:    vmul.vx v25, v25, a1
224; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 24
225; LMULMAX1-RV32-NEXT:    vse32.v v25, (a0)
226; LMULMAX1-RV32-NEXT:    ret
227;
228; LMULMAX1-RV64-LABEL: ctpop_v4i32:
229; LMULMAX1-RV64:       # %bb.0:
230; LMULMAX1-RV64-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
231; LMULMAX1-RV64-NEXT:    vle32.v v25, (a0)
232; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v25, 1
233; LMULMAX1-RV64-NEXT:    lui a1, 349525
234; LMULMAX1-RV64-NEXT:    addiw a1, a1, 1365
235; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a1
236; LMULMAX1-RV64-NEXT:    vsub.vv v25, v25, v26
237; LMULMAX1-RV64-NEXT:    lui a1, 209715
238; LMULMAX1-RV64-NEXT:    addiw a1, a1, 819
239; LMULMAX1-RV64-NEXT:    vand.vx v26, v25, a1
240; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 2
241; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
242; LMULMAX1-RV64-NEXT:    vadd.vv v25, v26, v25
243; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v25, 4
244; LMULMAX1-RV64-NEXT:    vadd.vv v25, v25, v26
245; LMULMAX1-RV64-NEXT:    lui a1, 61681
246; LMULMAX1-RV64-NEXT:    addiw a1, a1, -241
247; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
248; LMULMAX1-RV64-NEXT:    lui a1, 4112
249; LMULMAX1-RV64-NEXT:    addiw a1, a1, 257
250; LMULMAX1-RV64-NEXT:    vmul.vx v25, v25, a1
251; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 24
252; LMULMAX1-RV64-NEXT:    vse32.v v25, (a0)
253; LMULMAX1-RV64-NEXT:    ret
254  %a = load <4 x i32>, <4 x i32>* %x
255  %b = load <4 x i32>, <4 x i32>* %y
256  %c = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %a)
257  store <4 x i32> %c, <4 x i32>* %x
258  ret void
259}
260declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)
261
262define void @ctpop_v2i64(<2 x i64>* %x, <2 x i64>* %y) {
263; LMULMAX2-RV32-LABEL: ctpop_v2i64:
264; LMULMAX2-RV32:       # %bb.0:
265; LMULMAX2-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
266; LMULMAX2-RV32-NEXT:    vle64.v v25, (a0)
267; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v25, 1
268; LMULMAX2-RV32-NEXT:    lui a1, 349525
269; LMULMAX2-RV32-NEXT:    addi a1, a1, 1365
270; LMULMAX2-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
271; LMULMAX2-RV32-NEXT:    vmv.v.x v27, a1
272; LMULMAX2-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
273; LMULMAX2-RV32-NEXT:    vand.vv v26, v26, v27
274; LMULMAX2-RV32-NEXT:    vsub.vv v25, v25, v26
275; LMULMAX2-RV32-NEXT:    lui a1, 209715
276; LMULMAX2-RV32-NEXT:    addi a1, a1, 819
277; LMULMAX2-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
278; LMULMAX2-RV32-NEXT:    vmv.v.x v26, a1
279; LMULMAX2-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
280; LMULMAX2-RV32-NEXT:    vand.vv v27, v25, v26
281; LMULMAX2-RV32-NEXT:    vsrl.vi v25, v25, 2
282; LMULMAX2-RV32-NEXT:    vand.vv v25, v25, v26
283; LMULMAX2-RV32-NEXT:    vadd.vv v25, v27, v25
284; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v25, 4
285; LMULMAX2-RV32-NEXT:    vadd.vv v25, v25, v26
286; LMULMAX2-RV32-NEXT:    lui a1, 61681
287; LMULMAX2-RV32-NEXT:    addi a1, a1, -241
288; LMULMAX2-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
289; LMULMAX2-RV32-NEXT:    vmv.v.x v26, a1
290; LMULMAX2-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
291; LMULMAX2-RV32-NEXT:    vand.vv v25, v25, v26
292; LMULMAX2-RV32-NEXT:    lui a1, 4112
293; LMULMAX2-RV32-NEXT:    addi a1, a1, 257
294; LMULMAX2-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
295; LMULMAX2-RV32-NEXT:    vmv.v.x v26, a1
296; LMULMAX2-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
297; LMULMAX2-RV32-NEXT:    vmul.vv v25, v25, v26
298; LMULMAX2-RV32-NEXT:    addi a1, zero, 56
299; LMULMAX2-RV32-NEXT:    vsrl.vx v25, v25, a1
300; LMULMAX2-RV32-NEXT:    vse64.v v25, (a0)
301; LMULMAX2-RV32-NEXT:    ret
302;
303; LMULMAX2-RV64-LABEL: ctpop_v2i64:
304; LMULMAX2-RV64:       # %bb.0:
305; LMULMAX2-RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
306; LMULMAX2-RV64-NEXT:    vle64.v v25, (a0)
307; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v25, 1
308; LMULMAX2-RV64-NEXT:    lui a1, 21845
309; LMULMAX2-RV64-NEXT:    addiw a1, a1, 1365
310; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
311; LMULMAX2-RV64-NEXT:    addi a1, a1, 1365
312; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
313; LMULMAX2-RV64-NEXT:    addi a1, a1, 1365
314; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
315; LMULMAX2-RV64-NEXT:    addi a1, a1, 1365
316; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
317; LMULMAX2-RV64-NEXT:    vsub.vv v25, v25, v26
318; LMULMAX2-RV64-NEXT:    lui a1, 13107
319; LMULMAX2-RV64-NEXT:    addiw a1, a1, 819
320; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
321; LMULMAX2-RV64-NEXT:    addi a1, a1, 819
322; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
323; LMULMAX2-RV64-NEXT:    addi a1, a1, 819
324; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
325; LMULMAX2-RV64-NEXT:    addi a1, a1, 819
326; LMULMAX2-RV64-NEXT:    vand.vx v26, v25, a1
327; LMULMAX2-RV64-NEXT:    vsrl.vi v25, v25, 2
328; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
329; LMULMAX2-RV64-NEXT:    vadd.vv v25, v26, v25
330; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v25, 4
331; LMULMAX2-RV64-NEXT:    vadd.vv v25, v25, v26
332; LMULMAX2-RV64-NEXT:    lui a1, 3855
333; LMULMAX2-RV64-NEXT:    addiw a1, a1, 241
334; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
335; LMULMAX2-RV64-NEXT:    addi a1, a1, -241
336; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
337; LMULMAX2-RV64-NEXT:    addi a1, a1, 241
338; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
339; LMULMAX2-RV64-NEXT:    addi a1, a1, -241
340; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
341; LMULMAX2-RV64-NEXT:    lui a1, 4112
342; LMULMAX2-RV64-NEXT:    addiw a1, a1, 257
343; LMULMAX2-RV64-NEXT:    slli a1, a1, 16
344; LMULMAX2-RV64-NEXT:    addi a1, a1, 257
345; LMULMAX2-RV64-NEXT:    slli a1, a1, 16
346; LMULMAX2-RV64-NEXT:    addi a1, a1, 257
347; LMULMAX2-RV64-NEXT:    vmul.vx v25, v25, a1
348; LMULMAX2-RV64-NEXT:    addi a1, zero, 56
349; LMULMAX2-RV64-NEXT:    vsrl.vx v25, v25, a1
350; LMULMAX2-RV64-NEXT:    vse64.v v25, (a0)
351; LMULMAX2-RV64-NEXT:    ret
352;
353; LMULMAX1-RV32-LABEL: ctpop_v2i64:
354; LMULMAX1-RV32:       # %bb.0:
355; LMULMAX1-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
356; LMULMAX1-RV32-NEXT:    vle64.v v25, (a0)
357; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v25, 1
358; LMULMAX1-RV32-NEXT:    lui a1, 349525
359; LMULMAX1-RV32-NEXT:    addi a1, a1, 1365
360; LMULMAX1-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
361; LMULMAX1-RV32-NEXT:    vmv.v.x v27, a1
362; LMULMAX1-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
363; LMULMAX1-RV32-NEXT:    vand.vv v26, v26, v27
364; LMULMAX1-RV32-NEXT:    vsub.vv v25, v25, v26
365; LMULMAX1-RV32-NEXT:    lui a1, 209715
366; LMULMAX1-RV32-NEXT:    addi a1, a1, 819
367; LMULMAX1-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
368; LMULMAX1-RV32-NEXT:    vmv.v.x v26, a1
369; LMULMAX1-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
370; LMULMAX1-RV32-NEXT:    vand.vv v27, v25, v26
371; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 2
372; LMULMAX1-RV32-NEXT:    vand.vv v25, v25, v26
373; LMULMAX1-RV32-NEXT:    vadd.vv v25, v27, v25
374; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v25, 4
375; LMULMAX1-RV32-NEXT:    vadd.vv v25, v25, v26
376; LMULMAX1-RV32-NEXT:    lui a1, 61681
377; LMULMAX1-RV32-NEXT:    addi a1, a1, -241
378; LMULMAX1-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
379; LMULMAX1-RV32-NEXT:    vmv.v.x v26, a1
380; LMULMAX1-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
381; LMULMAX1-RV32-NEXT:    vand.vv v25, v25, v26
382; LMULMAX1-RV32-NEXT:    lui a1, 4112
383; LMULMAX1-RV32-NEXT:    addi a1, a1, 257
384; LMULMAX1-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
385; LMULMAX1-RV32-NEXT:    vmv.v.x v26, a1
386; LMULMAX1-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
387; LMULMAX1-RV32-NEXT:    vmul.vv v25, v25, v26
388; LMULMAX1-RV32-NEXT:    addi a1, zero, 56
389; LMULMAX1-RV32-NEXT:    vsrl.vx v25, v25, a1
390; LMULMAX1-RV32-NEXT:    vse64.v v25, (a0)
391; LMULMAX1-RV32-NEXT:    ret
392;
393; LMULMAX1-RV64-LABEL: ctpop_v2i64:
394; LMULMAX1-RV64:       # %bb.0:
395; LMULMAX1-RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
396; LMULMAX1-RV64-NEXT:    vle64.v v25, (a0)
397; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v25, 1
398; LMULMAX1-RV64-NEXT:    lui a1, 21845
399; LMULMAX1-RV64-NEXT:    addiw a1, a1, 1365
400; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
401; LMULMAX1-RV64-NEXT:    addi a1, a1, 1365
402; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
403; LMULMAX1-RV64-NEXT:    addi a1, a1, 1365
404; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
405; LMULMAX1-RV64-NEXT:    addi a1, a1, 1365
406; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a1
407; LMULMAX1-RV64-NEXT:    vsub.vv v25, v25, v26
408; LMULMAX1-RV64-NEXT:    lui a1, 13107
409; LMULMAX1-RV64-NEXT:    addiw a1, a1, 819
410; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
411; LMULMAX1-RV64-NEXT:    addi a1, a1, 819
412; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
413; LMULMAX1-RV64-NEXT:    addi a1, a1, 819
414; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
415; LMULMAX1-RV64-NEXT:    addi a1, a1, 819
416; LMULMAX1-RV64-NEXT:    vand.vx v26, v25, a1
417; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 2
418; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
419; LMULMAX1-RV64-NEXT:    vadd.vv v25, v26, v25
420; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v25, 4
421; LMULMAX1-RV64-NEXT:    vadd.vv v25, v25, v26
422; LMULMAX1-RV64-NEXT:    lui a1, 3855
423; LMULMAX1-RV64-NEXT:    addiw a1, a1, 241
424; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
425; LMULMAX1-RV64-NEXT:    addi a1, a1, -241
426; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
427; LMULMAX1-RV64-NEXT:    addi a1, a1, 241
428; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
429; LMULMAX1-RV64-NEXT:    addi a1, a1, -241
430; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
431; LMULMAX1-RV64-NEXT:    lui a1, 4112
432; LMULMAX1-RV64-NEXT:    addiw a1, a1, 257
433; LMULMAX1-RV64-NEXT:    slli a1, a1, 16
434; LMULMAX1-RV64-NEXT:    addi a1, a1, 257
435; LMULMAX1-RV64-NEXT:    slli a1, a1, 16
436; LMULMAX1-RV64-NEXT:    addi a1, a1, 257
437; LMULMAX1-RV64-NEXT:    vmul.vx v25, v25, a1
438; LMULMAX1-RV64-NEXT:    addi a1, zero, 56
439; LMULMAX1-RV64-NEXT:    vsrl.vx v25, v25, a1
440; LMULMAX1-RV64-NEXT:    vse64.v v25, (a0)
441; LMULMAX1-RV64-NEXT:    ret
442  %a = load <2 x i64>, <2 x i64>* %x
443  %b = load <2 x i64>, <2 x i64>* %y
444  %c = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %a)
445  store <2 x i64> %c, <2 x i64>* %x
446  ret void
447}
448declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>)
449
450define void @ctpop_v32i8(<32 x i8>* %x, <32 x i8>* %y) {
451; LMULMAX2-LABEL: ctpop_v32i8:
452; LMULMAX2:       # %bb.0:
453; LMULMAX2-NEXT:    addi a1, zero, 32
454; LMULMAX2-NEXT:    vsetvli zero, a1, e8, m2, ta, mu
455; LMULMAX2-NEXT:    vle8.v v26, (a0)
456; LMULMAX2-NEXT:    vsrl.vi v28, v26, 1
457; LMULMAX2-NEXT:    addi a1, zero, 85
458; LMULMAX2-NEXT:    vand.vx v28, v28, a1
459; LMULMAX2-NEXT:    vsub.vv v26, v26, v28
460; LMULMAX2-NEXT:    addi a1, zero, 51
461; LMULMAX2-NEXT:    vand.vx v28, v26, a1
462; LMULMAX2-NEXT:    vsrl.vi v26, v26, 2
463; LMULMAX2-NEXT:    vand.vx v26, v26, a1
464; LMULMAX2-NEXT:    vadd.vv v26, v28, v26
465; LMULMAX2-NEXT:    vsrl.vi v28, v26, 4
466; LMULMAX2-NEXT:    vadd.vv v26, v26, v28
467; LMULMAX2-NEXT:    vand.vi v26, v26, 15
468; LMULMAX2-NEXT:    vse8.v v26, (a0)
469; LMULMAX2-NEXT:    ret
470;
471; LMULMAX1-LABEL: ctpop_v32i8:
472; LMULMAX1:       # %bb.0:
473; LMULMAX1-NEXT:    vsetivli zero, 16, e8, m1, ta, mu
474; LMULMAX1-NEXT:    addi a1, a0, 16
475; LMULMAX1-NEXT:    vle8.v v25, (a1)
476; LMULMAX1-NEXT:    vle8.v v26, (a0)
477; LMULMAX1-NEXT:    vsrl.vi v27, v25, 1
478; LMULMAX1-NEXT:    addi a2, zero, 85
479; LMULMAX1-NEXT:    vand.vx v27, v27, a2
480; LMULMAX1-NEXT:    vsub.vv v25, v25, v27
481; LMULMAX1-NEXT:    addi a3, zero, 51
482; LMULMAX1-NEXT:    vand.vx v27, v25, a3
483; LMULMAX1-NEXT:    vsrl.vi v25, v25, 2
484; LMULMAX1-NEXT:    vand.vx v25, v25, a3
485; LMULMAX1-NEXT:    vadd.vv v25, v27, v25
486; LMULMAX1-NEXT:    vsrl.vi v27, v25, 4
487; LMULMAX1-NEXT:    vadd.vv v25, v25, v27
488; LMULMAX1-NEXT:    vand.vi v25, v25, 15
489; LMULMAX1-NEXT:    vsrl.vi v27, v26, 1
490; LMULMAX1-NEXT:    vand.vx v27, v27, a2
491; LMULMAX1-NEXT:    vsub.vv v26, v26, v27
492; LMULMAX1-NEXT:    vand.vx v27, v26, a3
493; LMULMAX1-NEXT:    vsrl.vi v26, v26, 2
494; LMULMAX1-NEXT:    vand.vx v26, v26, a3
495; LMULMAX1-NEXT:    vadd.vv v26, v27, v26
496; LMULMAX1-NEXT:    vsrl.vi v27, v26, 4
497; LMULMAX1-NEXT:    vadd.vv v26, v26, v27
498; LMULMAX1-NEXT:    vand.vi v26, v26, 15
499; LMULMAX1-NEXT:    vse8.v v26, (a0)
500; LMULMAX1-NEXT:    vse8.v v25, (a1)
501; LMULMAX1-NEXT:    ret
502  %a = load <32 x i8>, <32 x i8>* %x
503  %b = load <32 x i8>, <32 x i8>* %y
504  %c = call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %a)
505  store <32 x i8> %c, <32 x i8>* %x
506  ret void
507}
508declare <32 x i8> @llvm.ctpop.v32i8(<32 x i8>)
509
510define void @ctpop_v16i16(<16 x i16>* %x, <16 x i16>* %y) {
511; LMULMAX2-RV32-LABEL: ctpop_v16i16:
512; LMULMAX2-RV32:       # %bb.0:
513; LMULMAX2-RV32-NEXT:    vsetivli zero, 16, e16, m2, ta, mu
514; LMULMAX2-RV32-NEXT:    vle16.v v26, (a0)
515; LMULMAX2-RV32-NEXT:    vsrl.vi v28, v26, 1
516; LMULMAX2-RV32-NEXT:    lui a1, 5
517; LMULMAX2-RV32-NEXT:    addi a1, a1, 1365
518; LMULMAX2-RV32-NEXT:    vand.vx v28, v28, a1
519; LMULMAX2-RV32-NEXT:    vsub.vv v26, v26, v28
520; LMULMAX2-RV32-NEXT:    lui a1, 3
521; LMULMAX2-RV32-NEXT:    addi a1, a1, 819
522; LMULMAX2-RV32-NEXT:    vand.vx v28, v26, a1
523; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v26, 2
524; LMULMAX2-RV32-NEXT:    vand.vx v26, v26, a1
525; LMULMAX2-RV32-NEXT:    vadd.vv v26, v28, v26
526; LMULMAX2-RV32-NEXT:    vsrl.vi v28, v26, 4
527; LMULMAX2-RV32-NEXT:    vadd.vv v26, v26, v28
528; LMULMAX2-RV32-NEXT:    lui a1, 1
529; LMULMAX2-RV32-NEXT:    addi a1, a1, -241
530; LMULMAX2-RV32-NEXT:    vand.vx v26, v26, a1
531; LMULMAX2-RV32-NEXT:    addi a1, zero, 257
532; LMULMAX2-RV32-NEXT:    vmul.vx v26, v26, a1
533; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v26, 8
534; LMULMAX2-RV32-NEXT:    vse16.v v26, (a0)
535; LMULMAX2-RV32-NEXT:    ret
536;
537; LMULMAX2-RV64-LABEL: ctpop_v16i16:
538; LMULMAX2-RV64:       # %bb.0:
539; LMULMAX2-RV64-NEXT:    vsetivli zero, 16, e16, m2, ta, mu
540; LMULMAX2-RV64-NEXT:    vle16.v v26, (a0)
541; LMULMAX2-RV64-NEXT:    vsrl.vi v28, v26, 1
542; LMULMAX2-RV64-NEXT:    lui a1, 5
543; LMULMAX2-RV64-NEXT:    addiw a1, a1, 1365
544; LMULMAX2-RV64-NEXT:    vand.vx v28, v28, a1
545; LMULMAX2-RV64-NEXT:    vsub.vv v26, v26, v28
546; LMULMAX2-RV64-NEXT:    lui a1, 3
547; LMULMAX2-RV64-NEXT:    addiw a1, a1, 819
548; LMULMAX2-RV64-NEXT:    vand.vx v28, v26, a1
549; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v26, 2
550; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
551; LMULMAX2-RV64-NEXT:    vadd.vv v26, v28, v26
552; LMULMAX2-RV64-NEXT:    vsrl.vi v28, v26, 4
553; LMULMAX2-RV64-NEXT:    vadd.vv v26, v26, v28
554; LMULMAX2-RV64-NEXT:    lui a1, 1
555; LMULMAX2-RV64-NEXT:    addiw a1, a1, -241
556; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
557; LMULMAX2-RV64-NEXT:    addi a1, zero, 257
558; LMULMAX2-RV64-NEXT:    vmul.vx v26, v26, a1
559; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v26, 8
560; LMULMAX2-RV64-NEXT:    vse16.v v26, (a0)
561; LMULMAX2-RV64-NEXT:    ret
562;
563; LMULMAX1-RV32-LABEL: ctpop_v16i16:
564; LMULMAX1-RV32:       # %bb.0:
565; LMULMAX1-RV32-NEXT:    vsetivli zero, 8, e16, m1, ta, mu
566; LMULMAX1-RV32-NEXT:    addi a1, a0, 16
567; LMULMAX1-RV32-NEXT:    vle16.v v25, (a1)
568; LMULMAX1-RV32-NEXT:    vle16.v v26, (a0)
569; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v25, 1
570; LMULMAX1-RV32-NEXT:    lui a2, 5
571; LMULMAX1-RV32-NEXT:    addi a2, a2, 1365
572; LMULMAX1-RV32-NEXT:    vand.vx v27, v27, a2
573; LMULMAX1-RV32-NEXT:    vsub.vv v25, v25, v27
574; LMULMAX1-RV32-NEXT:    lui a3, 3
575; LMULMAX1-RV32-NEXT:    addi a3, a3, 819
576; LMULMAX1-RV32-NEXT:    vand.vx v27, v25, a3
577; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 2
578; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a3
579; LMULMAX1-RV32-NEXT:    vadd.vv v25, v27, v25
580; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v25, 4
581; LMULMAX1-RV32-NEXT:    vadd.vv v25, v25, v27
582; LMULMAX1-RV32-NEXT:    lui a4, 1
583; LMULMAX1-RV32-NEXT:    addi a4, a4, -241
584; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a4
585; LMULMAX1-RV32-NEXT:    addi a5, zero, 257
586; LMULMAX1-RV32-NEXT:    vmul.vx v25, v25, a5
587; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 8
588; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v26, 1
589; LMULMAX1-RV32-NEXT:    vand.vx v27, v27, a2
590; LMULMAX1-RV32-NEXT:    vsub.vv v26, v26, v27
591; LMULMAX1-RV32-NEXT:    vand.vx v27, v26, a3
592; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v26, 2
593; LMULMAX1-RV32-NEXT:    vand.vx v26, v26, a3
594; LMULMAX1-RV32-NEXT:    vadd.vv v26, v27, v26
595; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v26, 4
596; LMULMAX1-RV32-NEXT:    vadd.vv v26, v26, v27
597; LMULMAX1-RV32-NEXT:    vand.vx v26, v26, a4
598; LMULMAX1-RV32-NEXT:    vmul.vx v26, v26, a5
599; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v26, 8
600; LMULMAX1-RV32-NEXT:    vse16.v v26, (a0)
601; LMULMAX1-RV32-NEXT:    vse16.v v25, (a1)
602; LMULMAX1-RV32-NEXT:    ret
603;
604; LMULMAX1-RV64-LABEL: ctpop_v16i16:
605; LMULMAX1-RV64:       # %bb.0:
606; LMULMAX1-RV64-NEXT:    vsetivli zero, 8, e16, m1, ta, mu
607; LMULMAX1-RV64-NEXT:    addi a1, a0, 16
608; LMULMAX1-RV64-NEXT:    vle16.v v25, (a1)
609; LMULMAX1-RV64-NEXT:    vle16.v v26, (a0)
610; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v25, 1
611; LMULMAX1-RV64-NEXT:    lui a2, 5
612; LMULMAX1-RV64-NEXT:    addiw a2, a2, 1365
613; LMULMAX1-RV64-NEXT:    vand.vx v27, v27, a2
614; LMULMAX1-RV64-NEXT:    vsub.vv v25, v25, v27
615; LMULMAX1-RV64-NEXT:    lui a3, 3
616; LMULMAX1-RV64-NEXT:    addiw a3, a3, 819
617; LMULMAX1-RV64-NEXT:    vand.vx v27, v25, a3
618; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 2
619; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a3
620; LMULMAX1-RV64-NEXT:    vadd.vv v25, v27, v25
621; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v25, 4
622; LMULMAX1-RV64-NEXT:    vadd.vv v25, v25, v27
623; LMULMAX1-RV64-NEXT:    lui a4, 1
624; LMULMAX1-RV64-NEXT:    addiw a4, a4, -241
625; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a4
626; LMULMAX1-RV64-NEXT:    addi a5, zero, 257
627; LMULMAX1-RV64-NEXT:    vmul.vx v25, v25, a5
628; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 8
629; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v26, 1
630; LMULMAX1-RV64-NEXT:    vand.vx v27, v27, a2
631; LMULMAX1-RV64-NEXT:    vsub.vv v26, v26, v27
632; LMULMAX1-RV64-NEXT:    vand.vx v27, v26, a3
633; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v26, 2
634; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a3
635; LMULMAX1-RV64-NEXT:    vadd.vv v26, v27, v26
636; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v26, 4
637; LMULMAX1-RV64-NEXT:    vadd.vv v26, v26, v27
638; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a4
639; LMULMAX1-RV64-NEXT:    vmul.vx v26, v26, a5
640; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v26, 8
641; LMULMAX1-RV64-NEXT:    vse16.v v26, (a0)
642; LMULMAX1-RV64-NEXT:    vse16.v v25, (a1)
643; LMULMAX1-RV64-NEXT:    ret
644  %a = load <16 x i16>, <16 x i16>* %x
645  %b = load <16 x i16>, <16 x i16>* %y
646  %c = call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %a)
647  store <16 x i16> %c, <16 x i16>* %x
648  ret void
649}
650declare <16 x i16> @llvm.ctpop.v16i16(<16 x i16>)
651
652define void @ctpop_v8i32(<8 x i32>* %x, <8 x i32>* %y) {
653; LMULMAX2-RV32-LABEL: ctpop_v8i32:
654; LMULMAX2-RV32:       # %bb.0:
655; LMULMAX2-RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, mu
656; LMULMAX2-RV32-NEXT:    vle32.v v26, (a0)
657; LMULMAX2-RV32-NEXT:    vsrl.vi v28, v26, 1
658; LMULMAX2-RV32-NEXT:    lui a1, 349525
659; LMULMAX2-RV32-NEXT:    addi a1, a1, 1365
660; LMULMAX2-RV32-NEXT:    vand.vx v28, v28, a1
661; LMULMAX2-RV32-NEXT:    vsub.vv v26, v26, v28
662; LMULMAX2-RV32-NEXT:    lui a1, 209715
663; LMULMAX2-RV32-NEXT:    addi a1, a1, 819
664; LMULMAX2-RV32-NEXT:    vand.vx v28, v26, a1
665; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v26, 2
666; LMULMAX2-RV32-NEXT:    vand.vx v26, v26, a1
667; LMULMAX2-RV32-NEXT:    vadd.vv v26, v28, v26
668; LMULMAX2-RV32-NEXT:    vsrl.vi v28, v26, 4
669; LMULMAX2-RV32-NEXT:    vadd.vv v26, v26, v28
670; LMULMAX2-RV32-NEXT:    lui a1, 61681
671; LMULMAX2-RV32-NEXT:    addi a1, a1, -241
672; LMULMAX2-RV32-NEXT:    vand.vx v26, v26, a1
673; LMULMAX2-RV32-NEXT:    lui a1, 4112
674; LMULMAX2-RV32-NEXT:    addi a1, a1, 257
675; LMULMAX2-RV32-NEXT:    vmul.vx v26, v26, a1
676; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v26, 24
677; LMULMAX2-RV32-NEXT:    vse32.v v26, (a0)
678; LMULMAX2-RV32-NEXT:    ret
679;
680; LMULMAX2-RV64-LABEL: ctpop_v8i32:
681; LMULMAX2-RV64:       # %bb.0:
682; LMULMAX2-RV64-NEXT:    vsetivli zero, 8, e32, m2, ta, mu
683; LMULMAX2-RV64-NEXT:    vle32.v v26, (a0)
684; LMULMAX2-RV64-NEXT:    vsrl.vi v28, v26, 1
685; LMULMAX2-RV64-NEXT:    lui a1, 349525
686; LMULMAX2-RV64-NEXT:    addiw a1, a1, 1365
687; LMULMAX2-RV64-NEXT:    vand.vx v28, v28, a1
688; LMULMAX2-RV64-NEXT:    vsub.vv v26, v26, v28
689; LMULMAX2-RV64-NEXT:    lui a1, 209715
690; LMULMAX2-RV64-NEXT:    addiw a1, a1, 819
691; LMULMAX2-RV64-NEXT:    vand.vx v28, v26, a1
692; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v26, 2
693; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
694; LMULMAX2-RV64-NEXT:    vadd.vv v26, v28, v26
695; LMULMAX2-RV64-NEXT:    vsrl.vi v28, v26, 4
696; LMULMAX2-RV64-NEXT:    vadd.vv v26, v26, v28
697; LMULMAX2-RV64-NEXT:    lui a1, 61681
698; LMULMAX2-RV64-NEXT:    addiw a1, a1, -241
699; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
700; LMULMAX2-RV64-NEXT:    lui a1, 4112
701; LMULMAX2-RV64-NEXT:    addiw a1, a1, 257
702; LMULMAX2-RV64-NEXT:    vmul.vx v26, v26, a1
703; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v26, 24
704; LMULMAX2-RV64-NEXT:    vse32.v v26, (a0)
705; LMULMAX2-RV64-NEXT:    ret
706;
707; LMULMAX1-RV32-LABEL: ctpop_v8i32:
708; LMULMAX1-RV32:       # %bb.0:
709; LMULMAX1-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
710; LMULMAX1-RV32-NEXT:    addi a1, a0, 16
711; LMULMAX1-RV32-NEXT:    vle32.v v25, (a1)
712; LMULMAX1-RV32-NEXT:    vle32.v v26, (a0)
713; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v25, 1
714; LMULMAX1-RV32-NEXT:    lui a2, 349525
715; LMULMAX1-RV32-NEXT:    addi a2, a2, 1365
716; LMULMAX1-RV32-NEXT:    vand.vx v27, v27, a2
717; LMULMAX1-RV32-NEXT:    vsub.vv v25, v25, v27
718; LMULMAX1-RV32-NEXT:    lui a3, 209715
719; LMULMAX1-RV32-NEXT:    addi a3, a3, 819
720; LMULMAX1-RV32-NEXT:    vand.vx v27, v25, a3
721; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 2
722; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a3
723; LMULMAX1-RV32-NEXT:    vadd.vv v25, v27, v25
724; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v25, 4
725; LMULMAX1-RV32-NEXT:    vadd.vv v25, v25, v27
726; LMULMAX1-RV32-NEXT:    lui a4, 61681
727; LMULMAX1-RV32-NEXT:    addi a4, a4, -241
728; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a4
729; LMULMAX1-RV32-NEXT:    lui a5, 4112
730; LMULMAX1-RV32-NEXT:    addi a5, a5, 257
731; LMULMAX1-RV32-NEXT:    vmul.vx v25, v25, a5
732; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 24
733; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v26, 1
734; LMULMAX1-RV32-NEXT:    vand.vx v27, v27, a2
735; LMULMAX1-RV32-NEXT:    vsub.vv v26, v26, v27
736; LMULMAX1-RV32-NEXT:    vand.vx v27, v26, a3
737; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v26, 2
738; LMULMAX1-RV32-NEXT:    vand.vx v26, v26, a3
739; LMULMAX1-RV32-NEXT:    vadd.vv v26, v27, v26
740; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v26, 4
741; LMULMAX1-RV32-NEXT:    vadd.vv v26, v26, v27
742; LMULMAX1-RV32-NEXT:    vand.vx v26, v26, a4
743; LMULMAX1-RV32-NEXT:    vmul.vx v26, v26, a5
744; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v26, 24
745; LMULMAX1-RV32-NEXT:    vse32.v v26, (a0)
746; LMULMAX1-RV32-NEXT:    vse32.v v25, (a1)
747; LMULMAX1-RV32-NEXT:    ret
748;
749; LMULMAX1-RV64-LABEL: ctpop_v8i32:
750; LMULMAX1-RV64:       # %bb.0:
751; LMULMAX1-RV64-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
752; LMULMAX1-RV64-NEXT:    addi a1, a0, 16
753; LMULMAX1-RV64-NEXT:    vle32.v v25, (a1)
754; LMULMAX1-RV64-NEXT:    vle32.v v26, (a0)
755; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v25, 1
756; LMULMAX1-RV64-NEXT:    lui a2, 349525
757; LMULMAX1-RV64-NEXT:    addiw a2, a2, 1365
758; LMULMAX1-RV64-NEXT:    vand.vx v27, v27, a2
759; LMULMAX1-RV64-NEXT:    vsub.vv v25, v25, v27
760; LMULMAX1-RV64-NEXT:    lui a3, 209715
761; LMULMAX1-RV64-NEXT:    addiw a3, a3, 819
762; LMULMAX1-RV64-NEXT:    vand.vx v27, v25, a3
763; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 2
764; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a3
765; LMULMAX1-RV64-NEXT:    vadd.vv v25, v27, v25
766; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v25, 4
767; LMULMAX1-RV64-NEXT:    vadd.vv v25, v25, v27
768; LMULMAX1-RV64-NEXT:    lui a4, 61681
769; LMULMAX1-RV64-NEXT:    addiw a4, a4, -241
770; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a4
771; LMULMAX1-RV64-NEXT:    lui a5, 4112
772; LMULMAX1-RV64-NEXT:    addiw a5, a5, 257
773; LMULMAX1-RV64-NEXT:    vmul.vx v25, v25, a5
774; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 24
775; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v26, 1
776; LMULMAX1-RV64-NEXT:    vand.vx v27, v27, a2
777; LMULMAX1-RV64-NEXT:    vsub.vv v26, v26, v27
778; LMULMAX1-RV64-NEXT:    vand.vx v27, v26, a3
779; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v26, 2
780; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a3
781; LMULMAX1-RV64-NEXT:    vadd.vv v26, v27, v26
782; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v26, 4
783; LMULMAX1-RV64-NEXT:    vadd.vv v26, v26, v27
784; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a4
785; LMULMAX1-RV64-NEXT:    vmul.vx v26, v26, a5
786; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v26, 24
787; LMULMAX1-RV64-NEXT:    vse32.v v26, (a0)
788; LMULMAX1-RV64-NEXT:    vse32.v v25, (a1)
789; LMULMAX1-RV64-NEXT:    ret
790  %a = load <8 x i32>, <8 x i32>* %x
791  %b = load <8 x i32>, <8 x i32>* %y
792  %c = call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %a)
793  store <8 x i32> %c, <8 x i32>* %x
794  ret void
795}
796declare <8 x i32> @llvm.ctpop.v8i32(<8 x i32>)
797
798define void @ctpop_v4i64(<4 x i64>* %x, <4 x i64>* %y) {
799; LMULMAX2-RV32-LABEL: ctpop_v4i64:
800; LMULMAX2-RV32:       # %bb.0:
801; LMULMAX2-RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, mu
802; LMULMAX2-RV32-NEXT:    vle64.v v26, (a0)
803; LMULMAX2-RV32-NEXT:    vsrl.vi v28, v26, 1
804; LMULMAX2-RV32-NEXT:    lui a1, 349525
805; LMULMAX2-RV32-NEXT:    addi a1, a1, 1365
806; LMULMAX2-RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, mu
807; LMULMAX2-RV32-NEXT:    vmv.v.x v30, a1
808; LMULMAX2-RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, mu
809; LMULMAX2-RV32-NEXT:    vand.vv v28, v28, v30
810; LMULMAX2-RV32-NEXT:    vsub.vv v26, v26, v28
811; LMULMAX2-RV32-NEXT:    lui a1, 209715
812; LMULMAX2-RV32-NEXT:    addi a1, a1, 819
813; LMULMAX2-RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, mu
814; LMULMAX2-RV32-NEXT:    vmv.v.x v28, a1
815; LMULMAX2-RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, mu
816; LMULMAX2-RV32-NEXT:    vand.vv v30, v26, v28
817; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v26, 2
818; LMULMAX2-RV32-NEXT:    vand.vv v26, v26, v28
819; LMULMAX2-RV32-NEXT:    vadd.vv v26, v30, v26
820; LMULMAX2-RV32-NEXT:    vsrl.vi v28, v26, 4
821; LMULMAX2-RV32-NEXT:    vadd.vv v26, v26, v28
822; LMULMAX2-RV32-NEXT:    lui a1, 61681
823; LMULMAX2-RV32-NEXT:    addi a1, a1, -241
824; LMULMAX2-RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, mu
825; LMULMAX2-RV32-NEXT:    vmv.v.x v28, a1
826; LMULMAX2-RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, mu
827; LMULMAX2-RV32-NEXT:    vand.vv v26, v26, v28
828; LMULMAX2-RV32-NEXT:    lui a1, 4112
829; LMULMAX2-RV32-NEXT:    addi a1, a1, 257
830; LMULMAX2-RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, mu
831; LMULMAX2-RV32-NEXT:    vmv.v.x v28, a1
832; LMULMAX2-RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, mu
833; LMULMAX2-RV32-NEXT:    vmul.vv v26, v26, v28
834; LMULMAX2-RV32-NEXT:    addi a1, zero, 56
835; LMULMAX2-RV32-NEXT:    vsrl.vx v26, v26, a1
836; LMULMAX2-RV32-NEXT:    vse64.v v26, (a0)
837; LMULMAX2-RV32-NEXT:    ret
838;
839; LMULMAX2-RV64-LABEL: ctpop_v4i64:
840; LMULMAX2-RV64:       # %bb.0:
841; LMULMAX2-RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, mu
842; LMULMAX2-RV64-NEXT:    vle64.v v26, (a0)
843; LMULMAX2-RV64-NEXT:    vsrl.vi v28, v26, 1
844; LMULMAX2-RV64-NEXT:    lui a1, 21845
845; LMULMAX2-RV64-NEXT:    addiw a1, a1, 1365
846; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
847; LMULMAX2-RV64-NEXT:    addi a1, a1, 1365
848; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
849; LMULMAX2-RV64-NEXT:    addi a1, a1, 1365
850; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
851; LMULMAX2-RV64-NEXT:    addi a1, a1, 1365
852; LMULMAX2-RV64-NEXT:    vand.vx v28, v28, a1
853; LMULMAX2-RV64-NEXT:    vsub.vv v26, v26, v28
854; LMULMAX2-RV64-NEXT:    lui a1, 13107
855; LMULMAX2-RV64-NEXT:    addiw a1, a1, 819
856; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
857; LMULMAX2-RV64-NEXT:    addi a1, a1, 819
858; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
859; LMULMAX2-RV64-NEXT:    addi a1, a1, 819
860; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
861; LMULMAX2-RV64-NEXT:    addi a1, a1, 819
862; LMULMAX2-RV64-NEXT:    vand.vx v28, v26, a1
863; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v26, 2
864; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
865; LMULMAX2-RV64-NEXT:    vadd.vv v26, v28, v26
866; LMULMAX2-RV64-NEXT:    vsrl.vi v28, v26, 4
867; LMULMAX2-RV64-NEXT:    vadd.vv v26, v26, v28
868; LMULMAX2-RV64-NEXT:    lui a1, 3855
869; LMULMAX2-RV64-NEXT:    addiw a1, a1, 241
870; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
871; LMULMAX2-RV64-NEXT:    addi a1, a1, -241
872; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
873; LMULMAX2-RV64-NEXT:    addi a1, a1, 241
874; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
875; LMULMAX2-RV64-NEXT:    addi a1, a1, -241
876; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
877; LMULMAX2-RV64-NEXT:    lui a1, 4112
878; LMULMAX2-RV64-NEXT:    addiw a1, a1, 257
879; LMULMAX2-RV64-NEXT:    slli a1, a1, 16
880; LMULMAX2-RV64-NEXT:    addi a1, a1, 257
881; LMULMAX2-RV64-NEXT:    slli a1, a1, 16
882; LMULMAX2-RV64-NEXT:    addi a1, a1, 257
883; LMULMAX2-RV64-NEXT:    vmul.vx v26, v26, a1
884; LMULMAX2-RV64-NEXT:    addi a1, zero, 56
885; LMULMAX2-RV64-NEXT:    vsrl.vx v26, v26, a1
886; LMULMAX2-RV64-NEXT:    vse64.v v26, (a0)
887; LMULMAX2-RV64-NEXT:    ret
888;
889; LMULMAX1-RV32-LABEL: ctpop_v4i64:
890; LMULMAX1-RV32:       # %bb.0:
891; LMULMAX1-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
892; LMULMAX1-RV32-NEXT:    addi a1, a0, 16
893; LMULMAX1-RV32-NEXT:    vle64.v v25, (a1)
894; LMULMAX1-RV32-NEXT:    vle64.v v26, (a0)
895; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v25, 1
896; LMULMAX1-RV32-NEXT:    lui a2, 349525
897; LMULMAX1-RV32-NEXT:    addi a2, a2, 1365
898; LMULMAX1-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
899; LMULMAX1-RV32-NEXT:    vmv.v.x v28, a2
900; LMULMAX1-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
901; LMULMAX1-RV32-NEXT:    vand.vv v27, v27, v28
902; LMULMAX1-RV32-NEXT:    vsub.vv v25, v25, v27
903; LMULMAX1-RV32-NEXT:    lui a2, 209715
904; LMULMAX1-RV32-NEXT:    addi a2, a2, 819
905; LMULMAX1-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
906; LMULMAX1-RV32-NEXT:    vmv.v.x v27, a2
907; LMULMAX1-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
908; LMULMAX1-RV32-NEXT:    vand.vv v29, v25, v27
909; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 2
910; LMULMAX1-RV32-NEXT:    vand.vv v25, v25, v27
911; LMULMAX1-RV32-NEXT:    vadd.vv v25, v29, v25
912; LMULMAX1-RV32-NEXT:    vsrl.vi v29, v25, 4
913; LMULMAX1-RV32-NEXT:    vadd.vv v25, v25, v29
914; LMULMAX1-RV32-NEXT:    lui a2, 61681
915; LMULMAX1-RV32-NEXT:    addi a2, a2, -241
916; LMULMAX1-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
917; LMULMAX1-RV32-NEXT:    vmv.v.x v29, a2
918; LMULMAX1-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
919; LMULMAX1-RV32-NEXT:    vand.vv v25, v25, v29
920; LMULMAX1-RV32-NEXT:    lui a2, 4112
921; LMULMAX1-RV32-NEXT:    addi a2, a2, 257
922; LMULMAX1-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
923; LMULMAX1-RV32-NEXT:    vmv.v.x v30, a2
924; LMULMAX1-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
925; LMULMAX1-RV32-NEXT:    vmul.vv v25, v25, v30
926; LMULMAX1-RV32-NEXT:    addi a2, zero, 56
927; LMULMAX1-RV32-NEXT:    vsrl.vx v25, v25, a2
928; LMULMAX1-RV32-NEXT:    vsrl.vi v31, v26, 1
929; LMULMAX1-RV32-NEXT:    vand.vv v28, v31, v28
930; LMULMAX1-RV32-NEXT:    vsub.vv v26, v26, v28
931; LMULMAX1-RV32-NEXT:    vand.vv v28, v26, v27
932; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v26, 2
933; LMULMAX1-RV32-NEXT:    vand.vv v26, v26, v27
934; LMULMAX1-RV32-NEXT:    vadd.vv v26, v28, v26
935; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v26, 4
936; LMULMAX1-RV32-NEXT:    vadd.vv v26, v26, v27
937; LMULMAX1-RV32-NEXT:    vand.vv v26, v26, v29
938; LMULMAX1-RV32-NEXT:    vmul.vv v26, v26, v30
939; LMULMAX1-RV32-NEXT:    vsrl.vx v26, v26, a2
940; LMULMAX1-RV32-NEXT:    vse64.v v26, (a0)
941; LMULMAX1-RV32-NEXT:    vse64.v v25, (a1)
942; LMULMAX1-RV32-NEXT:    ret
943;
944; LMULMAX1-RV64-LABEL: ctpop_v4i64:
945; LMULMAX1-RV64:       # %bb.0:
946; LMULMAX1-RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
947; LMULMAX1-RV64-NEXT:    addi a6, a0, 16
948; LMULMAX1-RV64-NEXT:    vle64.v v25, (a6)
949; LMULMAX1-RV64-NEXT:    vle64.v v26, (a0)
950; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v25, 1
951; LMULMAX1-RV64-NEXT:    lui a2, 21845
952; LMULMAX1-RV64-NEXT:    addiw a2, a2, 1365
953; LMULMAX1-RV64-NEXT:    slli a2, a2, 12
954; LMULMAX1-RV64-NEXT:    addi a2, a2, 1365
955; LMULMAX1-RV64-NEXT:    slli a2, a2, 12
956; LMULMAX1-RV64-NEXT:    addi a2, a2, 1365
957; LMULMAX1-RV64-NEXT:    slli a2, a2, 12
958; LMULMAX1-RV64-NEXT:    addi a2, a2, 1365
959; LMULMAX1-RV64-NEXT:    vand.vx v27, v27, a2
960; LMULMAX1-RV64-NEXT:    vsub.vv v25, v25, v27
961; LMULMAX1-RV64-NEXT:    lui a3, 13107
962; LMULMAX1-RV64-NEXT:    addiw a3, a3, 819
963; LMULMAX1-RV64-NEXT:    slli a3, a3, 12
964; LMULMAX1-RV64-NEXT:    addi a3, a3, 819
965; LMULMAX1-RV64-NEXT:    slli a3, a3, 12
966; LMULMAX1-RV64-NEXT:    addi a3, a3, 819
967; LMULMAX1-RV64-NEXT:    slli a3, a3, 12
968; LMULMAX1-RV64-NEXT:    addi a3, a3, 819
969; LMULMAX1-RV64-NEXT:    vand.vx v27, v25, a3
970; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 2
971; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a3
972; LMULMAX1-RV64-NEXT:    vadd.vv v25, v27, v25
973; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v25, 4
974; LMULMAX1-RV64-NEXT:    vadd.vv v25, v25, v27
975; LMULMAX1-RV64-NEXT:    lui a4, 3855
976; LMULMAX1-RV64-NEXT:    addiw a4, a4, 241
977; LMULMAX1-RV64-NEXT:    slli a4, a4, 12
978; LMULMAX1-RV64-NEXT:    addi a4, a4, -241
979; LMULMAX1-RV64-NEXT:    slli a4, a4, 12
980; LMULMAX1-RV64-NEXT:    addi a4, a4, 241
981; LMULMAX1-RV64-NEXT:    slli a4, a4, 12
982; LMULMAX1-RV64-NEXT:    addi a4, a4, -241
983; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a4
984; LMULMAX1-RV64-NEXT:    lui a5, 4112
985; LMULMAX1-RV64-NEXT:    addiw a5, a5, 257
986; LMULMAX1-RV64-NEXT:    slli a5, a5, 16
987; LMULMAX1-RV64-NEXT:    addi a5, a5, 257
988; LMULMAX1-RV64-NEXT:    slli a5, a5, 16
989; LMULMAX1-RV64-NEXT:    addi a5, a5, 257
990; LMULMAX1-RV64-NEXT:    vmul.vx v25, v25, a5
991; LMULMAX1-RV64-NEXT:    addi a1, zero, 56
992; LMULMAX1-RV64-NEXT:    vsrl.vx v25, v25, a1
993; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v26, 1
994; LMULMAX1-RV64-NEXT:    vand.vx v27, v27, a2
995; LMULMAX1-RV64-NEXT:    vsub.vv v26, v26, v27
996; LMULMAX1-RV64-NEXT:    vand.vx v27, v26, a3
997; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v26, 2
998; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a3
999; LMULMAX1-RV64-NEXT:    vadd.vv v26, v27, v26
1000; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v26, 4
1001; LMULMAX1-RV64-NEXT:    vadd.vv v26, v26, v27
1002; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a4
1003; LMULMAX1-RV64-NEXT:    vmul.vx v26, v26, a5
1004; LMULMAX1-RV64-NEXT:    vsrl.vx v26, v26, a1
1005; LMULMAX1-RV64-NEXT:    vse64.v v26, (a0)
1006; LMULMAX1-RV64-NEXT:    vse64.v v25, (a6)
1007; LMULMAX1-RV64-NEXT:    ret
1008  %a = load <4 x i64>, <4 x i64>* %x
1009  %b = load <4 x i64>, <4 x i64>* %y
1010  %c = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a)
1011  store <4 x i64> %c, <4 x i64>* %x
1012  ret void
1013}
1014declare <4 x i64> @llvm.ctpop.v4i64(<4 x i64>)
1015