1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=ALL,AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop | FileCheck %s --check-prefixes=ALL,XOP
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq | FileCheck %s --check-prefixes=ALL,AVX512VPOPCNTDQ
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq,+avx512vl | FileCheck %s --check-prefixes=ALL,AVX512VPOPCNTDQVL
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg | FileCheck %s --check-prefixes=ALL,BITALG_NOVLX
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg,+avx512vl | FileCheck %s --check-prefixes=ALL,BITALG
10 define <4 x i64> @testv4i64(<4 x i64> %in) nounwind {
11 ; AVX1-LABEL: testv4i64:
13 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
14 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
15 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm3
16 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
17 ; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3
18 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1
19 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
20 ; AVX1-NEXT: vpshufb %xmm1, %xmm4, %xmm1
21 ; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1
22 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
23 ; AVX1-NEXT: vpsadbw %xmm3, %xmm1, %xmm1
24 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm5
25 ; AVX1-NEXT: vpshufb %xmm5, %xmm4, %xmm5
26 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
27 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
28 ; AVX1-NEXT: vpshufb %xmm0, %xmm4, %xmm0
29 ; AVX1-NEXT: vpaddb %xmm5, %xmm0, %xmm0
30 ; AVX1-NEXT: vpsadbw %xmm3, %xmm0, %xmm0
31 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
34 ; AVX2-LABEL: testv4i64:
36 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
37 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
38 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
39 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
40 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
41 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
42 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
43 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
44 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
45 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
46 ; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
49 ; XOP-LABEL: testv4i64:
51 ; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
52 ; XOP-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
53 ; XOP-NEXT: vpand %xmm2, %xmm1, %xmm3
54 ; XOP-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
55 ; XOP-NEXT: vpshufb %xmm3, %xmm4, %xmm3
56 ; XOP-NEXT: vbroadcastss {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
57 ; XOP-NEXT: vpshlb %xmm5, %xmm1, %xmm1
58 ; XOP-NEXT: vpshufb %xmm1, %xmm4, %xmm1
59 ; XOP-NEXT: vpaddb %xmm3, %xmm1, %xmm1
60 ; XOP-NEXT: vpxor %xmm3, %xmm3, %xmm3
61 ; XOP-NEXT: vpsadbw %xmm3, %xmm1, %xmm1
62 ; XOP-NEXT: vpand %xmm2, %xmm0, %xmm2
63 ; XOP-NEXT: vpshufb %xmm2, %xmm4, %xmm2
64 ; XOP-NEXT: vpshlb %xmm5, %xmm0, %xmm0
65 ; XOP-NEXT: vpshufb %xmm0, %xmm4, %xmm0
66 ; XOP-NEXT: vpaddb %xmm2, %xmm0, %xmm0
67 ; XOP-NEXT: vpsadbw %xmm3, %xmm0, %xmm0
68 ; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
71 ; AVX512VPOPCNTDQ-LABEL: testv4i64:
72 ; AVX512VPOPCNTDQ: # %bb.0:
73 ; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
74 ; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm0
75 ; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
76 ; AVX512VPOPCNTDQ-NEXT: retq
78 ; AVX512VPOPCNTDQVL-LABEL: testv4i64:
79 ; AVX512VPOPCNTDQVL: # %bb.0:
80 ; AVX512VPOPCNTDQVL-NEXT: vpopcntq %ymm0, %ymm0
81 ; AVX512VPOPCNTDQVL-NEXT: retq
83 ; BITALG_NOVLX-LABEL: testv4i64:
84 ; BITALG_NOVLX: # %bb.0:
85 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
86 ; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0
87 ; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1
88 ; BITALG_NOVLX-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
89 ; BITALG_NOVLX-NEXT: retq
91 ; BITALG-LABEL: testv4i64:
93 ; BITALG-NEXT: vpopcntb %ymm0, %ymm0
94 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
95 ; BITALG-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
97 %out = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %in)
101 define <8 x i32> @testv8i32(<8 x i32> %in) nounwind {
102 ; AVX1-LABEL: testv8i32:
104 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
105 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
106 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm3
107 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
108 ; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3
109 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1
110 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
111 ; AVX1-NEXT: vpshufb %xmm1, %xmm4, %xmm1
112 ; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1
113 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
114 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm5 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
115 ; AVX1-NEXT: vpsadbw %xmm3, %xmm5, %xmm5
116 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
117 ; AVX1-NEXT: vpsadbw %xmm3, %xmm1, %xmm1
118 ; AVX1-NEXT: vpackuswb %xmm5, %xmm1, %xmm1
119 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm5
120 ; AVX1-NEXT: vpshufb %xmm5, %xmm4, %xmm5
121 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
122 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
123 ; AVX1-NEXT: vpshufb %xmm0, %xmm4, %xmm0
124 ; AVX1-NEXT: vpaddb %xmm5, %xmm0, %xmm0
125 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm3[2],xmm0[3],xmm3[3]
126 ; AVX1-NEXT: vpsadbw %xmm3, %xmm2, %xmm2
127 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
128 ; AVX1-NEXT: vpsadbw %xmm3, %xmm0, %xmm0
129 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
130 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
133 ; AVX2-LABEL: testv8i32:
135 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
136 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
137 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
138 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
139 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
140 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
141 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
142 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
143 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
144 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
145 ; AVX2-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
146 ; AVX2-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
147 ; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
148 ; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
149 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
152 ; XOP-LABEL: testv8i32:
154 ; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
155 ; XOP-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
156 ; XOP-NEXT: vpand %xmm2, %xmm1, %xmm3
157 ; XOP-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
158 ; XOP-NEXT: vpshufb %xmm3, %xmm4, %xmm3
159 ; XOP-NEXT: vbroadcastss {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
160 ; XOP-NEXT: vpshlb %xmm5, %xmm1, %xmm1
161 ; XOP-NEXT: vpshufb %xmm1, %xmm4, %xmm1
162 ; XOP-NEXT: vpaddb %xmm3, %xmm1, %xmm1
163 ; XOP-NEXT: vpxor %xmm3, %xmm3, %xmm3
164 ; XOP-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
165 ; XOP-NEXT: vpsadbw %xmm3, %xmm6, %xmm6
166 ; XOP-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
167 ; XOP-NEXT: vpsadbw %xmm3, %xmm1, %xmm1
168 ; XOP-NEXT: vpackuswb %xmm6, %xmm1, %xmm1
169 ; XOP-NEXT: vpand %xmm2, %xmm0, %xmm2
170 ; XOP-NEXT: vpshufb %xmm2, %xmm4, %xmm2
171 ; XOP-NEXT: vpshlb %xmm5, %xmm0, %xmm0
172 ; XOP-NEXT: vpshufb %xmm0, %xmm4, %xmm0
173 ; XOP-NEXT: vpaddb %xmm2, %xmm0, %xmm0
174 ; XOP-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm3[2],xmm0[3],xmm3[3]
175 ; XOP-NEXT: vpsadbw %xmm3, %xmm2, %xmm2
176 ; XOP-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
177 ; XOP-NEXT: vpsadbw %xmm3, %xmm0, %xmm0
178 ; XOP-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
179 ; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
182 ; AVX512VPOPCNTDQ-LABEL: testv8i32:
183 ; AVX512VPOPCNTDQ: # %bb.0:
184 ; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
185 ; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0
186 ; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
187 ; AVX512VPOPCNTDQ-NEXT: retq
189 ; AVX512VPOPCNTDQVL-LABEL: testv8i32:
190 ; AVX512VPOPCNTDQVL: # %bb.0:
191 ; AVX512VPOPCNTDQVL-NEXT: vpopcntd %ymm0, %ymm0
192 ; AVX512VPOPCNTDQVL-NEXT: retq
194 ; BITALG_NOVLX-LABEL: testv8i32:
195 ; BITALG_NOVLX: # %bb.0:
196 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
197 ; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0
198 ; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1
199 ; BITALG_NOVLX-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
200 ; BITALG_NOVLX-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
201 ; BITALG_NOVLX-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
202 ; BITALG_NOVLX-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
203 ; BITALG_NOVLX-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
204 ; BITALG_NOVLX-NEXT: retq
206 ; BITALG-LABEL: testv8i32:
208 ; BITALG-NEXT: vpopcntb %ymm0, %ymm0
209 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
210 ; BITALG-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
211 ; BITALG-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
212 ; BITALG-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
213 ; BITALG-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
214 ; BITALG-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
216 %out = call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %in)
220 define <16 x i16> @testv16i16(<16 x i16> %in) nounwind {
221 ; AVX1-LABEL: testv16i16:
223 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
224 ; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2
225 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
226 ; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
227 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm4
228 ; AVX1-NEXT: vpand %xmm1, %xmm4, %xmm4
229 ; AVX1-NEXT: vpshufb %xmm4, %xmm3, %xmm4
230 ; AVX1-NEXT: vpaddb %xmm2, %xmm4, %xmm2
231 ; AVX1-NEXT: vpsllw $8, %xmm2, %xmm4
232 ; AVX1-NEXT: vpaddb %xmm2, %xmm4, %xmm2
233 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
234 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
235 ; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm4
236 ; AVX1-NEXT: vpshufb %xmm4, %xmm3, %xmm4
237 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
238 ; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
239 ; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0
240 ; AVX1-NEXT: vpaddb %xmm4, %xmm0, %xmm0
241 ; AVX1-NEXT: vpsllw $8, %xmm0, %xmm1
242 ; AVX1-NEXT: vpaddb %xmm0, %xmm1, %xmm0
243 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0
244 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
247 ; AVX2-LABEL: testv16i16:
249 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
250 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
251 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
252 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
253 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
254 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
255 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
256 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
257 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
258 ; AVX2-NEXT: vpsllw $8, %ymm0, %ymm1
259 ; AVX2-NEXT: vpaddb %ymm0, %ymm1, %ymm0
260 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0
263 ; XOP-LABEL: testv16i16:
265 ; XOP-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
266 ; XOP-NEXT: vpand %xmm1, %xmm0, %xmm2
267 ; XOP-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
268 ; XOP-NEXT: vpshufb %xmm2, %xmm3, %xmm2
269 ; XOP-NEXT: vbroadcastss {{.*#+}} xmm4 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
270 ; XOP-NEXT: vpshlb %xmm4, %xmm0, %xmm5
271 ; XOP-NEXT: vpshufb %xmm5, %xmm3, %xmm5
272 ; XOP-NEXT: vpaddb %xmm2, %xmm5, %xmm2
273 ; XOP-NEXT: vpsllw $8, %xmm2, %xmm5
274 ; XOP-NEXT: vpaddb %xmm2, %xmm5, %xmm2
275 ; XOP-NEXT: vpsrlw $8, %xmm2, %xmm2
276 ; XOP-NEXT: vextractf128 $1, %ymm0, %xmm0
277 ; XOP-NEXT: vpand %xmm1, %xmm0, %xmm1
278 ; XOP-NEXT: vpshufb %xmm1, %xmm3, %xmm1
279 ; XOP-NEXT: vpshlb %xmm4, %xmm0, %xmm0
280 ; XOP-NEXT: vpshufb %xmm0, %xmm3, %xmm0
281 ; XOP-NEXT: vpaddb %xmm1, %xmm0, %xmm0
282 ; XOP-NEXT: vpsllw $8, %xmm0, %xmm1
283 ; XOP-NEXT: vpaddb %xmm0, %xmm1, %xmm0
284 ; XOP-NEXT: vpsrlw $8, %xmm0, %xmm0
285 ; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
288 ; AVX512VPOPCNTDQ-LABEL: testv16i16:
289 ; AVX512VPOPCNTDQ: # %bb.0:
290 ; AVX512VPOPCNTDQ-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
291 ; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0
292 ; AVX512VPOPCNTDQ-NEXT: vpmovdw %zmm0, %ymm0
293 ; AVX512VPOPCNTDQ-NEXT: retq
295 ; AVX512VPOPCNTDQVL-LABEL: testv16i16:
296 ; AVX512VPOPCNTDQVL: # %bb.0:
297 ; AVX512VPOPCNTDQVL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
298 ; AVX512VPOPCNTDQVL-NEXT: vpopcntd %zmm0, %zmm0
299 ; AVX512VPOPCNTDQVL-NEXT: vpmovdw %zmm0, %ymm0
300 ; AVX512VPOPCNTDQVL-NEXT: retq
302 ; BITALG_NOVLX-LABEL: testv16i16:
303 ; BITALG_NOVLX: # %bb.0:
304 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
305 ; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm0
306 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
307 ; BITALG_NOVLX-NEXT: retq
309 ; BITALG-LABEL: testv16i16:
311 ; BITALG-NEXT: vpopcntw %ymm0, %ymm0
313 %out = call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %in)
317 define <32 x i8> @testv32i8(<32 x i8> %in) nounwind {
318 ; AVX1-LABEL: testv32i8:
320 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
321 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
322 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm3
323 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
324 ; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3
325 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1
326 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
327 ; AVX1-NEXT: vpshufb %xmm1, %xmm4, %xmm1
328 ; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1
329 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm3
330 ; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3
331 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
332 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
333 ; AVX1-NEXT: vpshufb %xmm0, %xmm4, %xmm0
334 ; AVX1-NEXT: vpaddb %xmm3, %xmm0, %xmm0
335 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
338 ; AVX2-LABEL: testv32i8:
340 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
341 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
342 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
343 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
344 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
345 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
346 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
347 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
348 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
351 ; XOP-LABEL: testv32i8:
353 ; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
354 ; XOP-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
355 ; XOP-NEXT: vpand %xmm2, %xmm1, %xmm3
356 ; XOP-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
357 ; XOP-NEXT: vpshufb %xmm3, %xmm4, %xmm3
358 ; XOP-NEXT: vbroadcastss {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
359 ; XOP-NEXT: vpshlb %xmm5, %xmm1, %xmm1
360 ; XOP-NEXT: vpshufb %xmm1, %xmm4, %xmm1
361 ; XOP-NEXT: vpaddb %xmm3, %xmm1, %xmm1
362 ; XOP-NEXT: vpand %xmm2, %xmm0, %xmm2
363 ; XOP-NEXT: vpshufb %xmm2, %xmm4, %xmm2
364 ; XOP-NEXT: vpshlb %xmm5, %xmm0, %xmm0
365 ; XOP-NEXT: vpshufb %xmm0, %xmm4, %xmm0
366 ; XOP-NEXT: vpaddb %xmm2, %xmm0, %xmm0
367 ; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
370 ; AVX512VPOPCNTDQ-LABEL: testv32i8:
371 ; AVX512VPOPCNTDQ: # %bb.0:
372 ; AVX512VPOPCNTDQ-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
373 ; AVX512VPOPCNTDQ-NEXT: vpand %ymm1, %ymm0, %ymm2
374 ; AVX512VPOPCNTDQ-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
375 ; AVX512VPOPCNTDQ-NEXT: # ymm3 = mem[0,1,0,1]
376 ; AVX512VPOPCNTDQ-NEXT: vpshufb %ymm2, %ymm3, %ymm2
377 ; AVX512VPOPCNTDQ-NEXT: vpsrlw $4, %ymm0, %ymm0
378 ; AVX512VPOPCNTDQ-NEXT: vpand %ymm1, %ymm0, %ymm0
379 ; AVX512VPOPCNTDQ-NEXT: vpshufb %ymm0, %ymm3, %ymm0
380 ; AVX512VPOPCNTDQ-NEXT: vpaddb %ymm2, %ymm0, %ymm0
381 ; AVX512VPOPCNTDQ-NEXT: retq
383 ; AVX512VPOPCNTDQVL-LABEL: testv32i8:
384 ; AVX512VPOPCNTDQVL: # %bb.0:
385 ; AVX512VPOPCNTDQVL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
386 ; AVX512VPOPCNTDQVL-NEXT: vpand %ymm1, %ymm0, %ymm2
387 ; AVX512VPOPCNTDQVL-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
388 ; AVX512VPOPCNTDQVL-NEXT: # ymm3 = mem[0,1,0,1]
389 ; AVX512VPOPCNTDQVL-NEXT: vpshufb %ymm2, %ymm3, %ymm2
390 ; AVX512VPOPCNTDQVL-NEXT: vpsrlw $4, %ymm0, %ymm0
391 ; AVX512VPOPCNTDQVL-NEXT: vpand %ymm1, %ymm0, %ymm0
392 ; AVX512VPOPCNTDQVL-NEXT: vpshufb %ymm0, %ymm3, %ymm0
393 ; AVX512VPOPCNTDQVL-NEXT: vpaddb %ymm2, %ymm0, %ymm0
394 ; AVX512VPOPCNTDQVL-NEXT: retq
396 ; BITALG_NOVLX-LABEL: testv32i8:
397 ; BITALG_NOVLX: # %bb.0:
398 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
399 ; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0
400 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
401 ; BITALG_NOVLX-NEXT: retq
403 ; BITALG-LABEL: testv32i8:
405 ; BITALG-NEXT: vpopcntb %ymm0, %ymm0
407 %out = call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %in)
411 define <4 x i64> @foldv4i64() nounwind {
412 ; ALL-LABEL: foldv4i64:
414 ; ALL-NEXT: vmovaps {{.*#+}} ymm0 = [1,64,0,8]
416 %out = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> <i64 256, i64 -1, i64 0, i64 255>)
420 define <8 x i32> @foldv8i32() nounwind {
421 ; ALL-LABEL: foldv8i32:
423 ; ALL-NEXT: vmovaps {{.*#+}} ymm0 = [1,32,0,8,16,3,2,3]
425 %out = call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> <i32 256, i32 -1, i32 0, i32 255, i32 -65536, i32 7, i32 24, i32 88>)
429 define <16 x i16> @foldv16i16() nounwind {
430 ; ALL-LABEL: foldv16i16:
432 ; ALL-NEXT: vmovaps {{.*#+}} ymm0 = [1,16,0,8,0,3,2,3,15,7,1,1,1,1,1,1]
434 %out = call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88, i16 -2, i16 254, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32>)
438 define <32 x i8> @foldv32i8() nounwind {
439 ; ALL-LABEL: foldv32i8:
441 ; ALL-NEXT: vmovaps {{.*#+}} ymm0 = [0,8,0,8,0,3,2,3,7,7,1,1,1,1,1,1,1,1,0,0,1,2,3,4,5,6,7,8,2,2,3,7]
443 %out = call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> <i8 256, i8 -1, i8 0, i8 255, i8 -65536, i8 7, i8 24, i8 88, i8 -2, i8 254, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 128, i8 256, i8 -256, i8 -128, i8 -64, i8 -32, i8 -16, i8 -8, i8 -4, i8 -2, i8 -1, i8 3, i8 5, i8 7, i8 127>)
447 define <4 x i64> @eq_1_v4i64(<4 x i64> %0) {
448 ; AVX1-LABEL: eq_1_v4i64:
450 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
451 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
452 ; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm3
453 ; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm4
454 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
455 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
456 ; AVX1-NEXT: vpaddq %xmm4, %xmm1, %xmm5
457 ; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1
458 ; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1
459 ; AVX1-NEXT: vpaddq %xmm4, %xmm0, %xmm4
460 ; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0
461 ; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm0
462 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
463 ; AVX1-NEXT: vandnps %ymm0, %ymm3, %ymm0
466 ; AVX2-LABEL: eq_1_v4i64:
468 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
469 ; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm2
470 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
471 ; AVX2-NEXT: vpaddq %ymm3, %ymm0, %ymm3
472 ; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0
473 ; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
474 ; AVX2-NEXT: vpandn %ymm0, %ymm2, %ymm0
477 ; XOP-LABEL: eq_1_v4i64:
479 ; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
480 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
481 ; XOP-NEXT: vpcomneqq %xmm2, %xmm1, %xmm3
482 ; XOP-NEXT: vpcomneqq %xmm2, %xmm0, %xmm4
483 ; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
484 ; XOP-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
485 ; XOP-NEXT: vpaddq %xmm4, %xmm1, %xmm5
486 ; XOP-NEXT: vpand %xmm5, %xmm1, %xmm1
487 ; XOP-NEXT: vpcomeqq %xmm2, %xmm1, %xmm1
488 ; XOP-NEXT: vpaddq %xmm4, %xmm0, %xmm4
489 ; XOP-NEXT: vpand %xmm4, %xmm0, %xmm0
490 ; XOP-NEXT: vpcomeqq %xmm2, %xmm0, %xmm0
491 ; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
492 ; XOP-NEXT: vandps %ymm0, %ymm3, %ymm0
495 ; AVX512VPOPCNTDQ-LABEL: eq_1_v4i64:
496 ; AVX512VPOPCNTDQ: # %bb.0:
497 ; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
498 ; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm0
499 ; AVX512VPOPCNTDQ-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
500 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
501 ; AVX512VPOPCNTDQ-NEXT: retq
503 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v4i64:
504 ; AVX512VPOPCNTDQVL: # %bb.0:
505 ; AVX512VPOPCNTDQVL-NEXT: vpopcntq %ymm0, %ymm0
506 ; AVX512VPOPCNTDQVL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
507 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
508 ; AVX512VPOPCNTDQVL-NEXT: retq
510 ; BITALG_NOVLX-LABEL: eq_1_v4i64:
511 ; BITALG_NOVLX: # %bb.0:
512 ; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1
513 ; BITALG_NOVLX-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm2
514 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
515 ; BITALG_NOVLX-NEXT: vpaddq %ymm3, %ymm0, %ymm3
516 ; BITALG_NOVLX-NEXT: vpand %ymm3, %ymm0, %ymm0
517 ; BITALG_NOVLX-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
518 ; BITALG_NOVLX-NEXT: vpandn %ymm0, %ymm2, %ymm0
519 ; BITALG_NOVLX-NEXT: retq
521 ; BITALG-LABEL: eq_1_v4i64:
523 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
524 ; BITALG-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm2
525 ; BITALG-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
526 ; BITALG-NEXT: vpaddq %ymm3, %ymm0, %ymm3
527 ; BITALG-NEXT: vpand %ymm3, %ymm0, %ymm0
528 ; BITALG-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
529 ; BITALG-NEXT: vpandn %ymm0, %ymm2, %ymm0
531 %2 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %0)
532 %3 = icmp eq <4 x i64> %2, <i64 1, i64 1, i64 1, i64 1>
533 %4 = sext <4 x i1> %3 to <4 x i64>
537 define <4 x i64> @ne_1_v4i64(<4 x i64> %0) {
538 ; AVX1-LABEL: ne_1_v4i64:
540 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
541 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
542 ; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm3
543 ; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm4
544 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
545 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
546 ; AVX1-NEXT: vpaddq %xmm4, %xmm1, %xmm5
547 ; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1
548 ; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1
549 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
550 ; AVX1-NEXT: vpaddq %xmm4, %xmm0, %xmm5
551 ; AVX1-NEXT: vpand %xmm5, %xmm0, %xmm0
552 ; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm0
553 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
554 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
555 ; AVX1-NEXT: vorps %ymm0, %ymm3, %ymm0
558 ; AVX2-LABEL: ne_1_v4i64:
560 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
561 ; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm2
562 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
563 ; AVX2-NEXT: vpaddq %ymm3, %ymm0, %ymm4
564 ; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0
565 ; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
566 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm0
567 ; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0
570 ; XOP-LABEL: ne_1_v4i64:
572 ; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
573 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
574 ; XOP-NEXT: vpcomeqq %xmm2, %xmm1, %xmm3
575 ; XOP-NEXT: vpcomeqq %xmm2, %xmm0, %xmm4
576 ; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
577 ; XOP-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
578 ; XOP-NEXT: vpaddq %xmm4, %xmm1, %xmm5
579 ; XOP-NEXT: vpand %xmm5, %xmm1, %xmm1
580 ; XOP-NEXT: vpcomneqq %xmm2, %xmm1, %xmm1
581 ; XOP-NEXT: vpaddq %xmm4, %xmm0, %xmm4
582 ; XOP-NEXT: vpand %xmm4, %xmm0, %xmm0
583 ; XOP-NEXT: vpcomneqq %xmm2, %xmm0, %xmm0
584 ; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
585 ; XOP-NEXT: vorps %ymm0, %ymm3, %ymm0
588 ; AVX512VPOPCNTDQ-LABEL: ne_1_v4i64:
589 ; AVX512VPOPCNTDQ: # %bb.0:
590 ; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
591 ; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm0
592 ; AVX512VPOPCNTDQ-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
593 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
594 ; AVX512VPOPCNTDQ-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
595 ; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
596 ; AVX512VPOPCNTDQ-NEXT: retq
598 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v4i64:
599 ; AVX512VPOPCNTDQVL: # %bb.0:
600 ; AVX512VPOPCNTDQVL-NEXT: vpopcntq %ymm0, %ymm0
601 ; AVX512VPOPCNTDQVL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
602 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
603 ; AVX512VPOPCNTDQVL-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm0
604 ; AVX512VPOPCNTDQVL-NEXT: retq
606 ; BITALG_NOVLX-LABEL: ne_1_v4i64:
607 ; BITALG_NOVLX: # %bb.0:
608 ; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1
609 ; BITALG_NOVLX-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm2
610 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
611 ; BITALG_NOVLX-NEXT: vpaddq %ymm3, %ymm0, %ymm3
612 ; BITALG_NOVLX-NEXT: vpand %ymm3, %ymm0, %ymm0
613 ; BITALG_NOVLX-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
614 ; BITALG_NOVLX-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
615 ; BITALG_NOVLX-NEXT: vpor %ymm0, %ymm2, %ymm0
616 ; BITALG_NOVLX-NEXT: retq
618 ; BITALG-LABEL: ne_1_v4i64:
620 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
621 ; BITALG-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm2
622 ; BITALG-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
623 ; BITALG-NEXT: vpaddq %ymm3, %ymm0, %ymm4
624 ; BITALG-NEXT: vpand %ymm4, %ymm0, %ymm0
625 ; BITALG-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
626 ; BITALG-NEXT: vpternlogq $222, %ymm3, %ymm2, %ymm0
628 %2 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %0)
629 %3 = icmp ne <4 x i64> %2, <i64 1, i64 1, i64 1, i64 1>
630 %4 = sext <4 x i1> %3 to <4 x i64>
634 define <8 x i32> @eq_1_v8i32(<8 x i32> %0) {
635 ; AVX1-LABEL: eq_1_v8i32:
637 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
638 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
639 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm3
640 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm4
641 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
642 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
643 ; AVX1-NEXT: vpaddd %xmm4, %xmm1, %xmm5
644 ; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1
645 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1
646 ; AVX1-NEXT: vpaddd %xmm4, %xmm0, %xmm4
647 ; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0
648 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0
649 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
650 ; AVX1-NEXT: vandnps %ymm0, %ymm3, %ymm0
653 ; AVX2-LABEL: eq_1_v8i32:
655 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
656 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm2
657 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
658 ; AVX2-NEXT: vpaddd %ymm3, %ymm0, %ymm3
659 ; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0
660 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
661 ; AVX2-NEXT: vpandn %ymm0, %ymm2, %ymm0
664 ; XOP-LABEL: eq_1_v8i32:
666 ; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
667 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
668 ; XOP-NEXT: vpcomneqd %xmm2, %xmm1, %xmm3
669 ; XOP-NEXT: vpcomneqd %xmm2, %xmm0, %xmm4
670 ; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
671 ; XOP-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
672 ; XOP-NEXT: vpaddd %xmm4, %xmm1, %xmm5
673 ; XOP-NEXT: vpand %xmm5, %xmm1, %xmm1
674 ; XOP-NEXT: vpcomeqd %xmm2, %xmm1, %xmm1
675 ; XOP-NEXT: vpaddd %xmm4, %xmm0, %xmm4
676 ; XOP-NEXT: vpand %xmm4, %xmm0, %xmm0
677 ; XOP-NEXT: vpcomeqd %xmm2, %xmm0, %xmm0
678 ; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
679 ; XOP-NEXT: vandps %ymm0, %ymm3, %ymm0
682 ; AVX512VPOPCNTDQ-LABEL: eq_1_v8i32:
683 ; AVX512VPOPCNTDQ: # %bb.0:
684 ; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
685 ; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0
686 ; AVX512VPOPCNTDQ-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
687 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
688 ; AVX512VPOPCNTDQ-NEXT: retq
690 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v8i32:
691 ; AVX512VPOPCNTDQVL: # %bb.0:
692 ; AVX512VPOPCNTDQVL-NEXT: vpopcntd %ymm0, %ymm0
693 ; AVX512VPOPCNTDQVL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
694 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
695 ; AVX512VPOPCNTDQVL-NEXT: retq
697 ; BITALG_NOVLX-LABEL: eq_1_v8i32:
698 ; BITALG_NOVLX: # %bb.0:
699 ; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1
700 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm2
701 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
702 ; BITALG_NOVLX-NEXT: vpaddd %ymm3, %ymm0, %ymm3
703 ; BITALG_NOVLX-NEXT: vpand %ymm3, %ymm0, %ymm0
704 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
705 ; BITALG_NOVLX-NEXT: vpandn %ymm0, %ymm2, %ymm0
706 ; BITALG_NOVLX-NEXT: retq
708 ; BITALG-LABEL: eq_1_v8i32:
710 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
711 ; BITALG-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm2
712 ; BITALG-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
713 ; BITALG-NEXT: vpaddd %ymm3, %ymm0, %ymm3
714 ; BITALG-NEXT: vpand %ymm3, %ymm0, %ymm0
715 ; BITALG-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
716 ; BITALG-NEXT: vpandn %ymm0, %ymm2, %ymm0
718 %2 = tail call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %0)
719 %3 = icmp eq <8 x i32> %2, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
720 %4 = sext <8 x i1> %3 to <8 x i32>
724 define <8 x i32> @ne_1_v8i32(<8 x i32> %0) {
725 ; AVX1-LABEL: ne_1_v8i32:
727 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
728 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
729 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm3
730 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm4
731 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
732 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
733 ; AVX1-NEXT: vpaddd %xmm4, %xmm1, %xmm5
734 ; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1
735 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1
736 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
737 ; AVX1-NEXT: vpaddd %xmm4, %xmm0, %xmm5
738 ; AVX1-NEXT: vpand %xmm5, %xmm0, %xmm0
739 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0
740 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
741 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
742 ; AVX1-NEXT: vorps %ymm0, %ymm3, %ymm0
745 ; AVX2-LABEL: ne_1_v8i32:
747 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
748 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm2
749 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
750 ; AVX2-NEXT: vpaddd %ymm3, %ymm0, %ymm4
751 ; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0
752 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
753 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm0
754 ; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0
757 ; XOP-LABEL: ne_1_v8i32:
759 ; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
760 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
761 ; XOP-NEXT: vpcomeqd %xmm2, %xmm1, %xmm3
762 ; XOP-NEXT: vpcomeqd %xmm2, %xmm0, %xmm4
763 ; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
764 ; XOP-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
765 ; XOP-NEXT: vpaddd %xmm4, %xmm1, %xmm5
766 ; XOP-NEXT: vpand %xmm5, %xmm1, %xmm1
767 ; XOP-NEXT: vpcomneqd %xmm2, %xmm1, %xmm1
768 ; XOP-NEXT: vpaddd %xmm4, %xmm0, %xmm4
769 ; XOP-NEXT: vpand %xmm4, %xmm0, %xmm0
770 ; XOP-NEXT: vpcomneqd %xmm2, %xmm0, %xmm0
771 ; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
772 ; XOP-NEXT: vorps %ymm0, %ymm3, %ymm0
775 ; AVX512VPOPCNTDQ-LABEL: ne_1_v8i32:
776 ; AVX512VPOPCNTDQ: # %bb.0:
777 ; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
778 ; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0
779 ; AVX512VPOPCNTDQ-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
780 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
781 ; AVX512VPOPCNTDQ-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
782 ; AVX512VPOPCNTDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
783 ; AVX512VPOPCNTDQ-NEXT: retq
785 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v8i32:
786 ; AVX512VPOPCNTDQVL: # %bb.0:
787 ; AVX512VPOPCNTDQVL-NEXT: vpopcntd %ymm0, %ymm0
788 ; AVX512VPOPCNTDQVL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
789 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
790 ; AVX512VPOPCNTDQVL-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm0
791 ; AVX512VPOPCNTDQVL-NEXT: retq
793 ; BITALG_NOVLX-LABEL: ne_1_v8i32:
794 ; BITALG_NOVLX: # %bb.0:
795 ; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1
796 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm2
797 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
798 ; BITALG_NOVLX-NEXT: vpaddd %ymm3, %ymm0, %ymm3
799 ; BITALG_NOVLX-NEXT: vpand %ymm3, %ymm0, %ymm0
800 ; BITALG_NOVLX-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
801 ; BITALG_NOVLX-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
802 ; BITALG_NOVLX-NEXT: vpor %ymm0, %ymm2, %ymm0
803 ; BITALG_NOVLX-NEXT: retq
805 ; BITALG-LABEL: ne_1_v8i32:
807 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
808 ; BITALG-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm2
809 ; BITALG-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
810 ; BITALG-NEXT: vpaddd %ymm3, %ymm0, %ymm4
811 ; BITALG-NEXT: vpand %ymm4, %ymm0, %ymm0
812 ; BITALG-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
813 ; BITALG-NEXT: vpternlogd $222, %ymm3, %ymm2, %ymm0
815 %2 = tail call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %0)
816 %3 = icmp ne <8 x i32> %2, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
817 %4 = sext <8 x i1> %3 to <8 x i32>
821 define <16 x i16> @eq_1_v16i16(<16 x i16> %0) {
822 ; AVX1-LABEL: eq_1_v16i16:
824 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
825 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
826 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm3
827 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm4
828 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
829 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
830 ; AVX1-NEXT: vpaddw %xmm4, %xmm1, %xmm5
831 ; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1
832 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1
833 ; AVX1-NEXT: vpaddw %xmm4, %xmm0, %xmm4
834 ; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0
835 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0
836 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
837 ; AVX1-NEXT: vandnps %ymm0, %ymm3, %ymm0
840 ; AVX2-LABEL: eq_1_v16i16:
842 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
843 ; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm2
844 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
845 ; AVX2-NEXT: vpaddw %ymm3, %ymm0, %ymm3
846 ; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0
847 ; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0
848 ; AVX2-NEXT: vpandn %ymm0, %ymm2, %ymm0
851 ; XOP-LABEL: eq_1_v16i16:
853 ; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
854 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
855 ; XOP-NEXT: vpcomneqw %xmm2, %xmm1, %xmm3
856 ; XOP-NEXT: vpcomneqw %xmm2, %xmm0, %xmm4
857 ; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
858 ; XOP-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
859 ; XOP-NEXT: vpaddw %xmm4, %xmm1, %xmm5
860 ; XOP-NEXT: vpand %xmm5, %xmm1, %xmm1
861 ; XOP-NEXT: vpcomeqw %xmm2, %xmm1, %xmm1
862 ; XOP-NEXT: vpaddw %xmm4, %xmm0, %xmm4
863 ; XOP-NEXT: vpand %xmm4, %xmm0, %xmm0
864 ; XOP-NEXT: vpcomeqw %xmm2, %xmm0, %xmm0
865 ; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
866 ; XOP-NEXT: vandps %ymm0, %ymm3, %ymm0
869 ; AVX512VPOPCNTDQ-LABEL: eq_1_v16i16:
870 ; AVX512VPOPCNTDQ: # %bb.0:
871 ; AVX512VPOPCNTDQ-NEXT: vpxor %xmm1, %xmm1, %xmm1
872 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm2
873 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
874 ; AVX512VPOPCNTDQ-NEXT: vpaddw %ymm3, %ymm0, %ymm3
875 ; AVX512VPOPCNTDQ-NEXT: vpand %ymm3, %ymm0, %ymm0
876 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0
877 ; AVX512VPOPCNTDQ-NEXT: vpandn %ymm0, %ymm2, %ymm0
878 ; AVX512VPOPCNTDQ-NEXT: retq
880 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v16i16:
881 ; AVX512VPOPCNTDQVL: # %bb.0:
882 ; AVX512VPOPCNTDQVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
883 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm2
884 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
885 ; AVX512VPOPCNTDQVL-NEXT: vpaddw %ymm3, %ymm0, %ymm3
886 ; AVX512VPOPCNTDQVL-NEXT: vpand %ymm3, %ymm0, %ymm0
887 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0
888 ; AVX512VPOPCNTDQVL-NEXT: vpandn %ymm0, %ymm2, %ymm0
889 ; AVX512VPOPCNTDQVL-NEXT: retq
891 ; BITALG_NOVLX-LABEL: eq_1_v16i16:
892 ; BITALG_NOVLX: # %bb.0:
893 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
894 ; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm0
895 ; BITALG_NOVLX-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
896 ; BITALG_NOVLX-NEXT: retq
898 ; BITALG-LABEL: eq_1_v16i16:
900 ; BITALG-NEXT: vpopcntw %ymm0, %ymm0
901 ; BITALG-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
903 %2 = tail call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %0)
904 %3 = icmp eq <16 x i16> %2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
905 %4 = sext <16 x i1> %3 to <16 x i16>
909 define <16 x i16> @ne_1_v16i16(<16 x i16> %0) {
910 ; AVX1-LABEL: ne_1_v16i16:
912 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
913 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
914 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm3
915 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm4
916 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
917 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
918 ; AVX1-NEXT: vpaddw %xmm4, %xmm1, %xmm5
919 ; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1
920 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1
921 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
922 ; AVX1-NEXT: vpaddw %xmm4, %xmm0, %xmm5
923 ; AVX1-NEXT: vpand %xmm5, %xmm0, %xmm0
924 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0
925 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
926 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
927 ; AVX1-NEXT: vorps %ymm0, %ymm3, %ymm0
930 ; AVX2-LABEL: ne_1_v16i16:
932 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
933 ; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm2
934 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
935 ; AVX2-NEXT: vpaddw %ymm3, %ymm0, %ymm4
936 ; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0
937 ; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0
938 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm0
939 ; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0
942 ; XOP-LABEL: ne_1_v16i16:
944 ; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
945 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
946 ; XOP-NEXT: vpcomeqw %xmm2, %xmm1, %xmm3
947 ; XOP-NEXT: vpcomeqw %xmm2, %xmm0, %xmm4
948 ; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
949 ; XOP-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
950 ; XOP-NEXT: vpaddw %xmm4, %xmm1, %xmm5
951 ; XOP-NEXT: vpand %xmm5, %xmm1, %xmm1
952 ; XOP-NEXT: vpcomneqw %xmm2, %xmm1, %xmm1
953 ; XOP-NEXT: vpaddw %xmm4, %xmm0, %xmm4
954 ; XOP-NEXT: vpand %xmm4, %xmm0, %xmm0
955 ; XOP-NEXT: vpcomneqw %xmm2, %xmm0, %xmm0
956 ; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
957 ; XOP-NEXT: vorps %ymm0, %ymm3, %ymm0
960 ; AVX512VPOPCNTDQ-LABEL: ne_1_v16i16:
961 ; AVX512VPOPCNTDQ: # %bb.0:
962 ; AVX512VPOPCNTDQ-NEXT: vpxor %xmm1, %xmm1, %xmm1
963 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm2
964 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
965 ; AVX512VPOPCNTDQ-NEXT: vpaddw %ymm3, %ymm0, %ymm3
966 ; AVX512VPOPCNTDQ-NEXT: vpand %ymm3, %ymm0, %ymm0
967 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0
968 ; AVX512VPOPCNTDQ-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
969 ; AVX512VPOPCNTDQ-NEXT: vpor %ymm0, %ymm2, %ymm0
970 ; AVX512VPOPCNTDQ-NEXT: retq
972 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v16i16:
973 ; AVX512VPOPCNTDQVL: # %bb.0:
974 ; AVX512VPOPCNTDQVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
975 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm2
976 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
977 ; AVX512VPOPCNTDQVL-NEXT: vpaddw %ymm3, %ymm0, %ymm4
978 ; AVX512VPOPCNTDQVL-NEXT: vpand %ymm4, %ymm0, %ymm0
979 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0
980 ; AVX512VPOPCNTDQVL-NEXT: vpternlogq $222, %ymm3, %ymm2, %ymm0
981 ; AVX512VPOPCNTDQVL-NEXT: retq
983 ; BITALG_NOVLX-LABEL: ne_1_v16i16:
984 ; BITALG_NOVLX: # %bb.0:
985 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
986 ; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm0
987 ; BITALG_NOVLX-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
988 ; BITALG_NOVLX-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
989 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
990 ; BITALG_NOVLX-NEXT: retq
992 ; BITALG-LABEL: ne_1_v16i16:
994 ; BITALG-NEXT: vpopcntw %ymm0, %ymm0
995 ; BITALG-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
996 ; BITALG-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm0
998 %2 = tail call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %0)
999 %3 = icmp ne <16 x i16> %2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1000 %4 = sext <16 x i1> %3 to <16 x i16>
1004 define <32 x i8> @eq_1_v32i8(<32 x i8> %0) {
1005 ; AVX1-LABEL: eq_1_v32i8:
1007 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1008 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1009 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm3
1010 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm4
1011 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
1012 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
1013 ; AVX1-NEXT: vpaddb %xmm4, %xmm1, %xmm5
1014 ; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1
1015 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1
1016 ; AVX1-NEXT: vpaddb %xmm4, %xmm0, %xmm4
1017 ; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0
1018 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
1019 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1020 ; AVX1-NEXT: vandnps %ymm0, %ymm3, %ymm0
1023 ; AVX2-LABEL: eq_1_v32i8:
1025 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1026 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm2
1027 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1028 ; AVX2-NEXT: vpaddb %ymm3, %ymm0, %ymm3
1029 ; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0
1030 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
1031 ; AVX2-NEXT: vpandn %ymm0, %ymm2, %ymm0
1034 ; XOP-LABEL: eq_1_v32i8:
1036 ; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
1037 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
1038 ; XOP-NEXT: vpcomneqb %xmm2, %xmm1, %xmm3
1039 ; XOP-NEXT: vpcomneqb %xmm2, %xmm0, %xmm4
1040 ; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
1041 ; XOP-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
1042 ; XOP-NEXT: vpaddb %xmm4, %xmm1, %xmm5
1043 ; XOP-NEXT: vpand %xmm5, %xmm1, %xmm1
1044 ; XOP-NEXT: vpcomeqb %xmm2, %xmm1, %xmm1
1045 ; XOP-NEXT: vpaddb %xmm4, %xmm0, %xmm4
1046 ; XOP-NEXT: vpand %xmm4, %xmm0, %xmm0
1047 ; XOP-NEXT: vpcomeqb %xmm2, %xmm0, %xmm0
1048 ; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1049 ; XOP-NEXT: vandps %ymm0, %ymm3, %ymm0
1052 ; AVX512VPOPCNTDQ-LABEL: eq_1_v32i8:
1053 ; AVX512VPOPCNTDQ: # %bb.0:
1054 ; AVX512VPOPCNTDQ-NEXT: vpxor %xmm1, %xmm1, %xmm1
1055 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm2
1056 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1057 ; AVX512VPOPCNTDQ-NEXT: vpaddb %ymm3, %ymm0, %ymm3
1058 ; AVX512VPOPCNTDQ-NEXT: vpand %ymm3, %ymm0, %ymm0
1059 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
1060 ; AVX512VPOPCNTDQ-NEXT: vpandn %ymm0, %ymm2, %ymm0
1061 ; AVX512VPOPCNTDQ-NEXT: retq
1063 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v32i8:
1064 ; AVX512VPOPCNTDQVL: # %bb.0:
1065 ; AVX512VPOPCNTDQVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
1066 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm2
1067 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1068 ; AVX512VPOPCNTDQVL-NEXT: vpaddb %ymm3, %ymm0, %ymm3
1069 ; AVX512VPOPCNTDQVL-NEXT: vpand %ymm3, %ymm0, %ymm0
1070 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
1071 ; AVX512VPOPCNTDQVL-NEXT: vpandn %ymm0, %ymm2, %ymm0
1072 ; AVX512VPOPCNTDQVL-NEXT: retq
1074 ; BITALG_NOVLX-LABEL: eq_1_v32i8:
1075 ; BITALG_NOVLX: # %bb.0:
1076 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1077 ; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0
1078 ; BITALG_NOVLX-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1079 ; BITALG_NOVLX-NEXT: retq
1081 ; BITALG-LABEL: eq_1_v32i8:
1083 ; BITALG-NEXT: vpopcntb %ymm0, %ymm0
1084 ; BITALG-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1086 %2 = tail call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %0)
1087 %3 = icmp eq <32 x i8> %2, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1088 %4 = sext <32 x i1> %3 to <32 x i8>
1092 define <32 x i8> @ne_1_v32i8(<32 x i8> %0) {
1093 ; AVX1-LABEL: ne_1_v32i8:
1095 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1096 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1097 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm3
1098 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm4
1099 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
1100 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
1101 ; AVX1-NEXT: vpaddb %xmm4, %xmm1, %xmm5
1102 ; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1
1103 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1
1104 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
1105 ; AVX1-NEXT: vpaddb %xmm4, %xmm0, %xmm5
1106 ; AVX1-NEXT: vpand %xmm5, %xmm0, %xmm0
1107 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
1108 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
1109 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1110 ; AVX1-NEXT: vorps %ymm0, %ymm3, %ymm0
1113 ; AVX2-LABEL: ne_1_v32i8:
1115 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1116 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm2
1117 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1118 ; AVX2-NEXT: vpaddb %ymm3, %ymm0, %ymm4
1119 ; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0
1120 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
1121 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm0
1122 ; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0
1125 ; XOP-LABEL: ne_1_v32i8:
1127 ; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
1128 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
1129 ; XOP-NEXT: vpcomeqb %xmm2, %xmm1, %xmm3
1130 ; XOP-NEXT: vpcomeqb %xmm2, %xmm0, %xmm4
1131 ; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
1132 ; XOP-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
1133 ; XOP-NEXT: vpaddb %xmm4, %xmm1, %xmm5
1134 ; XOP-NEXT: vpand %xmm5, %xmm1, %xmm1
1135 ; XOP-NEXT: vpcomneqb %xmm2, %xmm1, %xmm1
1136 ; XOP-NEXT: vpaddb %xmm4, %xmm0, %xmm4
1137 ; XOP-NEXT: vpand %xmm4, %xmm0, %xmm0
1138 ; XOP-NEXT: vpcomneqb %xmm2, %xmm0, %xmm0
1139 ; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1140 ; XOP-NEXT: vorps %ymm0, %ymm3, %ymm0
1143 ; AVX512VPOPCNTDQ-LABEL: ne_1_v32i8:
1144 ; AVX512VPOPCNTDQ: # %bb.0:
1145 ; AVX512VPOPCNTDQ-NEXT: vpxor %xmm1, %xmm1, %xmm1
1146 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm2
1147 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1148 ; AVX512VPOPCNTDQ-NEXT: vpaddb %ymm3, %ymm0, %ymm3
1149 ; AVX512VPOPCNTDQ-NEXT: vpand %ymm3, %ymm0, %ymm0
1150 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
1151 ; AVX512VPOPCNTDQ-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
1152 ; AVX512VPOPCNTDQ-NEXT: vpor %ymm0, %ymm2, %ymm0
1153 ; AVX512VPOPCNTDQ-NEXT: retq
1155 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v32i8:
1156 ; AVX512VPOPCNTDQVL: # %bb.0:
1157 ; AVX512VPOPCNTDQVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
1158 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm2
1159 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1160 ; AVX512VPOPCNTDQVL-NEXT: vpaddb %ymm3, %ymm0, %ymm4
1161 ; AVX512VPOPCNTDQVL-NEXT: vpand %ymm4, %ymm0, %ymm0
1162 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
1163 ; AVX512VPOPCNTDQVL-NEXT: vpternlogq $222, %ymm3, %ymm2, %ymm0
1164 ; AVX512VPOPCNTDQVL-NEXT: retq
1166 ; BITALG_NOVLX-LABEL: ne_1_v32i8:
1167 ; BITALG_NOVLX: # %bb.0:
1168 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1169 ; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0
1170 ; BITALG_NOVLX-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1171 ; BITALG_NOVLX-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
1172 ; BITALG_NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
1173 ; BITALG_NOVLX-NEXT: retq
1175 ; BITALG-LABEL: ne_1_v32i8:
1177 ; BITALG-NEXT: vpopcntb %ymm0, %ymm0
1178 ; BITALG-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1179 ; BITALG-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm0
1181 %2 = tail call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %0)
1182 %3 = icmp ne <32 x i8> %2, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1183 %4 = sext <32 x i1> %3 to <32 x i8>
1187 declare <4 x i64> @llvm.ctpop.v4i64(<4 x i64>)
1188 declare <8 x i32> @llvm.ctpop.v8i32(<8 x i32>)
1189 declare <16 x i16> @llvm.ctpop.v16i16(<16 x i16>)
1190 declare <32 x i8> @llvm.ctpop.v32i8(<32 x i8>)