[Reland][Runtimes] Merge 'compile_commands.json' files from runtimes build (#116303)
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-popcnt-256.ll
bloba5ca4affdbc6b1c33354dfae3afb3868abfe4cc8
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:
12 ; AVX1:       # %bb.0:
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
32 ; AVX1-NEXT:    retq
34 ; AVX2-LABEL: testv4i64:
35 ; AVX2:       # %bb.0:
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
47 ; AVX2-NEXT:    retq
49 ; XOP-LABEL: testv4i64:
50 ; XOP:       # %bb.0:
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
69 ; XOP-NEXT:    retq
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:
92 ; BITALG:       # %bb.0:
93 ; BITALG-NEXT:    vpopcntb %ymm0, %ymm0
94 ; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1
95 ; BITALG-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0
96 ; BITALG-NEXT:    retq
97   %out = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %in)
98   ret <4 x i64> %out
101 define <8 x i32> @testv8i32(<8 x i32> %in) nounwind {
102 ; AVX1-LABEL: testv8i32:
103 ; AVX1:       # %bb.0:
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
131 ; AVX1-NEXT:    retq
133 ; AVX2-LABEL: testv8i32:
134 ; AVX2:       # %bb.0:
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
150 ; AVX2-NEXT:    retq
152 ; XOP-LABEL: testv8i32:
153 ; XOP:       # %bb.0:
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
180 ; XOP-NEXT:    retq
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:
207 ; BITALG:       # %bb.0:
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
215 ; BITALG-NEXT:    retq
216   %out = call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %in)
217   ret <8 x i32> %out
220 define <16 x i16> @testv16i16(<16 x i16> %in) nounwind {
221 ; AVX1-LABEL: testv16i16:
222 ; AVX1:       # %bb.0:
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
245 ; AVX1-NEXT:    retq
247 ; AVX2-LABEL: testv16i16:
248 ; AVX2:       # %bb.0:
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
261 ; AVX2-NEXT:    retq
263 ; XOP-LABEL: testv16i16:
264 ; XOP:       # %bb.0:
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
286 ; XOP-NEXT:    retq
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:
310 ; BITALG:       # %bb.0:
311 ; BITALG-NEXT:    vpopcntw %ymm0, %ymm0
312 ; BITALG-NEXT:    retq
313   %out = call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %in)
314   ret <16 x i16> %out
317 define <32 x i8> @testv32i8(<32 x i8> %in) nounwind {
318 ; AVX1-LABEL: testv32i8:
319 ; AVX1:       # %bb.0:
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
336 ; AVX1-NEXT:    retq
338 ; AVX2-LABEL: testv32i8:
339 ; AVX2:       # %bb.0:
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
349 ; AVX2-NEXT:    retq
351 ; XOP-LABEL: testv32i8:
352 ; XOP:       # %bb.0:
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
368 ; XOP-NEXT:    retq
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:
404 ; BITALG:       # %bb.0:
405 ; BITALG-NEXT:    vpopcntb %ymm0, %ymm0
406 ; BITALG-NEXT:    retq
407   %out = call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %in)
408   ret <32 x i8> %out
411 define <4 x i64> @foldv4i64() nounwind {
412 ; ALL-LABEL: foldv4i64:
413 ; ALL:       # %bb.0:
414 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [1,64,0,8]
415 ; ALL-NEXT:    retq
416   %out = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> <i64 256, i64 -1, i64 0, i64 255>)
417   ret <4 x i64> %out
420 define <8 x i32> @foldv8i32() nounwind {
421 ; ALL-LABEL: foldv8i32:
422 ; ALL:       # %bb.0:
423 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [1,32,0,8,16,3,2,3]
424 ; ALL-NEXT:    retq
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>)
426   ret <8 x i32> %out
429 define <16 x i16> @foldv16i16() nounwind {
430 ; ALL-LABEL: foldv16i16:
431 ; ALL:       # %bb.0:
432 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [1,16,0,8,0,3,2,3,15,7,1,1,1,1,1,1]
433 ; ALL-NEXT:    retq
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>)
435   ret <16 x i16> %out
438 define <32 x i8> @foldv32i8() nounwind {
439 ; ALL-LABEL: foldv32i8:
440 ; ALL:       # %bb.0:
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]
442 ; ALL-NEXT:    retq
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>)
444   ret <32 x i8> %out
447 define <4 x i64> @eq_1_v4i64(<4 x i64> %0) {
448 ; AVX1-LABEL: eq_1_v4i64:
449 ; AVX1:       # %bb.0:
450 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
451 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
452 ; AVX1-NEXT:    vpaddq %xmm2, %xmm1, %xmm3
453 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
454 ; AVX1-NEXT:    # xmm4 = mem[0,0]
455 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
456 ; AVX1-NEXT:    vpxor %xmm1, %xmm3, %xmm1
457 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm1
458 ; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm2
459 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
460 ; AVX1-NEXT:    vpxor %xmm0, %xmm2, %xmm0
461 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm0
462 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
463 ; AVX1-NEXT:    retq
465 ; AVX2-LABEL: eq_1_v4i64:
466 ; AVX2:       # %bb.0:
467 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
468 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm1
469 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
470 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
471 ; AVX2-NEXT:    vpxor %ymm0, %ymm1, %ymm0
472 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm0
473 ; AVX2-NEXT:    retq
475 ; XOP-LABEL: eq_1_v4i64:
476 ; XOP:       # %bb.0:
477 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm1
478 ; XOP-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
479 ; XOP-NEXT:    vpaddq %xmm2, %xmm1, %xmm3
480 ; XOP-NEXT:    vpxor %xmm3, %xmm1, %xmm1
481 ; XOP-NEXT:    vpcomgtuq %xmm3, %xmm1, %xmm1
482 ; XOP-NEXT:    vpaddq %xmm2, %xmm0, %xmm2
483 ; XOP-NEXT:    vpxor %xmm2, %xmm0, %xmm0
484 ; XOP-NEXT:    vpcomgtuq %xmm2, %xmm0, %xmm0
485 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
486 ; XOP-NEXT:    retq
488 ; AVX512VPOPCNTDQ-LABEL: eq_1_v4i64:
489 ; AVX512VPOPCNTDQ:       # %bb.0:
490 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
491 ; AVX512VPOPCNTDQ-NEXT:    vpopcntq %zmm0, %zmm0
492 ; AVX512VPOPCNTDQ-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
493 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
494 ; AVX512VPOPCNTDQ-NEXT:    retq
496 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v4i64:
497 ; AVX512VPOPCNTDQVL:       # %bb.0:
498 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntq %ymm0, %ymm0
499 ; AVX512VPOPCNTDQVL-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
500 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
501 ; AVX512VPOPCNTDQVL-NEXT:    retq
503 ; BITALG_NOVLX-LABEL: eq_1_v4i64:
504 ; BITALG_NOVLX:       # %bb.0:
505 ; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
506 ; BITALG_NOVLX-NEXT:    vpaddq %ymm1, %ymm0, %ymm1
507 ; BITALG_NOVLX-NEXT:    vpxor %ymm1, %ymm0, %ymm0
508 ; BITALG_NOVLX-NEXT:    vpminuq %zmm1, %zmm0, %zmm1
509 ; BITALG_NOVLX-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
510 ; BITALG_NOVLX-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
511 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
512 ; BITALG_NOVLX-NEXT:    retq
514 ; BITALG-LABEL: eq_1_v4i64:
515 ; BITALG:       # %bb.0:
516 ; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
517 ; BITALG-NEXT:    vpaddq %ymm1, %ymm0, %ymm1
518 ; BITALG-NEXT:    vpxor %ymm1, %ymm0, %ymm0
519 ; BITALG-NEXT:    vpminuq %ymm1, %ymm0, %ymm1
520 ; BITALG-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
521 ; BITALG-NEXT:    vpternlogq $15, %ymm0, %ymm0, %ymm0
522 ; BITALG-NEXT:    retq
523   %2 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %0)
524   %3 = icmp eq <4 x i64> %2, <i64 1, i64 1, i64 1, i64 1>
525   %4 = sext <4 x i1> %3 to <4 x i64>
526   ret <4 x i64> %4
529 define <4 x i64> @ne_1_v4i64(<4 x i64> %0) {
530 ; AVX1-LABEL: ne_1_v4i64:
531 ; AVX1:       # %bb.0:
532 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
533 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
534 ; AVX1-NEXT:    vpaddq %xmm2, %xmm1, %xmm3
535 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
536 ; AVX1-NEXT:    # xmm4 = mem[0,0]
537 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
538 ; AVX1-NEXT:    vpxor %xmm1, %xmm3, %xmm1
539 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm1
540 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
541 ; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm3
542 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
543 ; AVX1-NEXT:    vpxor %xmm0, %xmm3, %xmm0
544 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm0, %xmm0
545 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
546 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
547 ; AVX1-NEXT:    retq
549 ; AVX2-LABEL: ne_1_v4i64:
550 ; AVX2:       # %bb.0:
551 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
552 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm2
553 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
554 ; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
555 ; AVX2-NEXT:    vpxor %ymm0, %ymm2, %ymm0
556 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm0
557 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
558 ; AVX2-NEXT:    retq
560 ; XOP-LABEL: ne_1_v4i64:
561 ; XOP:       # %bb.0:
562 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm1
563 ; XOP-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
564 ; XOP-NEXT:    vpaddq %xmm2, %xmm1, %xmm3
565 ; XOP-NEXT:    vpxor %xmm3, %xmm1, %xmm1
566 ; XOP-NEXT:    vpcomleuq %xmm3, %xmm1, %xmm1
567 ; XOP-NEXT:    vpaddq %xmm2, %xmm0, %xmm2
568 ; XOP-NEXT:    vpxor %xmm2, %xmm0, %xmm0
569 ; XOP-NEXT:    vpcomleuq %xmm2, %xmm0, %xmm0
570 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
571 ; XOP-NEXT:    retq
573 ; AVX512VPOPCNTDQ-LABEL: ne_1_v4i64:
574 ; AVX512VPOPCNTDQ:       # %bb.0:
575 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
576 ; AVX512VPOPCNTDQ-NEXT:    vpopcntq %zmm0, %zmm0
577 ; AVX512VPOPCNTDQ-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
578 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
579 ; AVX512VPOPCNTDQ-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
580 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
581 ; AVX512VPOPCNTDQ-NEXT:    retq
583 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v4i64:
584 ; AVX512VPOPCNTDQVL:       # %bb.0:
585 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntq %ymm0, %ymm0
586 ; AVX512VPOPCNTDQVL-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
587 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
588 ; AVX512VPOPCNTDQVL-NEXT:    vpternlogq $15, %ymm0, %ymm0, %ymm0
589 ; AVX512VPOPCNTDQVL-NEXT:    retq
591 ; BITALG_NOVLX-LABEL: ne_1_v4i64:
592 ; BITALG_NOVLX:       # %bb.0:
593 ; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
594 ; BITALG_NOVLX-NEXT:    vpaddq %ymm1, %ymm0, %ymm1
595 ; BITALG_NOVLX-NEXT:    vpxor %ymm1, %ymm0, %ymm0
596 ; BITALG_NOVLX-NEXT:    vpminuq %zmm1, %zmm0, %zmm1
597 ; BITALG_NOVLX-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
598 ; BITALG_NOVLX-NEXT:    retq
600 ; BITALG-LABEL: ne_1_v4i64:
601 ; BITALG:       # %bb.0:
602 ; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
603 ; BITALG-NEXT:    vpaddq %ymm1, %ymm0, %ymm1
604 ; BITALG-NEXT:    vpxor %ymm1, %ymm0, %ymm0
605 ; BITALG-NEXT:    vpminuq %ymm1, %ymm0, %ymm1
606 ; BITALG-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
607 ; BITALG-NEXT:    retq
608   %2 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %0)
609   %3 = icmp ne <4 x i64> %2, <i64 1, i64 1, i64 1, i64 1>
610   %4 = sext <4 x i1> %3 to <4 x i64>
611   ret <4 x i64> %4
614 define <8 x i32> @eq_1_v8i32(<8 x i32> %0) {
615 ; AVX1-LABEL: eq_1_v8i32:
616 ; AVX1:       # %bb.0:
617 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
618 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
619 ; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm3
620 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
621 ; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm3
622 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
623 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
624 ; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm3
625 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
626 ; AVX1-NEXT:    vpminud %xmm3, %xmm0, %xmm3
627 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm0, %xmm0
628 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
629 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
630 ; AVX1-NEXT:    retq
632 ; AVX2-LABEL: eq_1_v8i32:
633 ; AVX2:       # %bb.0:
634 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
635 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm2
636 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
637 ; AVX2-NEXT:    vpminud %ymm2, %ymm0, %ymm2
638 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm0, %ymm0
639 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
640 ; AVX2-NEXT:    retq
642 ; XOP-LABEL: eq_1_v8i32:
643 ; XOP:       # %bb.0:
644 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm1
645 ; XOP-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
646 ; XOP-NEXT:    vpaddd %xmm2, %xmm1, %xmm3
647 ; XOP-NEXT:    vpxor %xmm3, %xmm1, %xmm1
648 ; XOP-NEXT:    vpcomgtud %xmm3, %xmm1, %xmm1
649 ; XOP-NEXT:    vpaddd %xmm2, %xmm0, %xmm2
650 ; XOP-NEXT:    vpxor %xmm2, %xmm0, %xmm0
651 ; XOP-NEXT:    vpcomgtud %xmm2, %xmm0, %xmm0
652 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
653 ; XOP-NEXT:    retq
655 ; AVX512VPOPCNTDQ-LABEL: eq_1_v8i32:
656 ; AVX512VPOPCNTDQ:       # %bb.0:
657 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
658 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0
659 ; AVX512VPOPCNTDQ-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
660 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
661 ; AVX512VPOPCNTDQ-NEXT:    retq
663 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v8i32:
664 ; AVX512VPOPCNTDQVL:       # %bb.0:
665 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntd %ymm0, %ymm0
666 ; AVX512VPOPCNTDQVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
667 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
668 ; AVX512VPOPCNTDQVL-NEXT:    retq
670 ; BITALG_NOVLX-LABEL: eq_1_v8i32:
671 ; BITALG_NOVLX:       # %bb.0:
672 ; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
673 ; BITALG_NOVLX-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
674 ; BITALG_NOVLX-NEXT:    vpxor %ymm1, %ymm0, %ymm0
675 ; BITALG_NOVLX-NEXT:    vpminud %ymm1, %ymm0, %ymm1
676 ; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
677 ; BITALG_NOVLX-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
678 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
679 ; BITALG_NOVLX-NEXT:    retq
681 ; BITALG-LABEL: eq_1_v8i32:
682 ; BITALG:       # %bb.0:
683 ; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
684 ; BITALG-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
685 ; BITALG-NEXT:    vpxor %ymm1, %ymm0, %ymm0
686 ; BITALG-NEXT:    vpminud %ymm1, %ymm0, %ymm1
687 ; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
688 ; BITALG-NEXT:    vpternlogq $15, %ymm0, %ymm0, %ymm0
689 ; BITALG-NEXT:    retq
690   %2 = tail call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %0)
691   %3 = icmp eq <8 x i32> %2, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
692   %4 = sext <8 x i1> %3 to <8 x i32>
693   ret <8 x i32> %4
696 define <8 x i32> @ne_1_v8i32(<8 x i32> %0) {
697 ; AVX1-LABEL: ne_1_v8i32:
698 ; AVX1:       # %bb.0:
699 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
700 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
701 ; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm3
702 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
703 ; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm3
704 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
705 ; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm2
706 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
707 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm2
708 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm0
709 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
710 ; AVX1-NEXT:    retq
712 ; AVX2-LABEL: ne_1_v8i32:
713 ; AVX2:       # %bb.0:
714 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
715 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
716 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
717 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm1
718 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
719 ; AVX2-NEXT:    retq
721 ; XOP-LABEL: ne_1_v8i32:
722 ; XOP:       # %bb.0:
723 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm1
724 ; XOP-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
725 ; XOP-NEXT:    vpaddd %xmm2, %xmm1, %xmm3
726 ; XOP-NEXT:    vpxor %xmm3, %xmm1, %xmm1
727 ; XOP-NEXT:    vpcomleud %xmm3, %xmm1, %xmm1
728 ; XOP-NEXT:    vpaddd %xmm2, %xmm0, %xmm2
729 ; XOP-NEXT:    vpxor %xmm2, %xmm0, %xmm0
730 ; XOP-NEXT:    vpcomleud %xmm2, %xmm0, %xmm0
731 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
732 ; XOP-NEXT:    retq
734 ; AVX512VPOPCNTDQ-LABEL: ne_1_v8i32:
735 ; AVX512VPOPCNTDQ:       # %bb.0:
736 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
737 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0
738 ; AVX512VPOPCNTDQ-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
739 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
740 ; AVX512VPOPCNTDQ-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
741 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
742 ; AVX512VPOPCNTDQ-NEXT:    retq
744 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v8i32:
745 ; AVX512VPOPCNTDQVL:       # %bb.0:
746 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntd %ymm0, %ymm0
747 ; AVX512VPOPCNTDQVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
748 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
749 ; AVX512VPOPCNTDQVL-NEXT:    vpternlogq $15, %ymm0, %ymm0, %ymm0
750 ; AVX512VPOPCNTDQVL-NEXT:    retq
752 ; BITALG_NOVLX-LABEL: ne_1_v8i32:
753 ; BITALG_NOVLX:       # %bb.0:
754 ; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
755 ; BITALG_NOVLX-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
756 ; BITALG_NOVLX-NEXT:    vpxor %ymm1, %ymm0, %ymm0
757 ; BITALG_NOVLX-NEXT:    vpminud %ymm1, %ymm0, %ymm1
758 ; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
759 ; BITALG_NOVLX-NEXT:    retq
761 ; BITALG-LABEL: ne_1_v8i32:
762 ; BITALG:       # %bb.0:
763 ; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
764 ; BITALG-NEXT:    vpaddd %ymm1, %ymm0, %ymm1
765 ; BITALG-NEXT:    vpxor %ymm1, %ymm0, %ymm0
766 ; BITALG-NEXT:    vpminud %ymm1, %ymm0, %ymm1
767 ; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
768 ; BITALG-NEXT:    retq
769   %2 = tail call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %0)
770   %3 = icmp ne <8 x i32> %2, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
771   %4 = sext <8 x i1> %3 to <8 x i32>
772   ret <8 x i32> %4
775 define <16 x i16> @eq_1_v16i16(<16 x i16> %0) {
776 ; AVX1-LABEL: eq_1_v16i16:
777 ; AVX1:       # %bb.0:
778 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
779 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
780 ; AVX1-NEXT:    vpaddw %xmm2, %xmm1, %xmm3
781 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
782 ; AVX1-NEXT:    vpminuw %xmm3, %xmm1, %xmm3
783 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm1, %xmm1
784 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
785 ; AVX1-NEXT:    vpaddw %xmm2, %xmm0, %xmm3
786 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
787 ; AVX1-NEXT:    vpminuw %xmm3, %xmm0, %xmm3
788 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm0, %xmm0
789 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
790 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
791 ; AVX1-NEXT:    retq
793 ; AVX2-LABEL: eq_1_v16i16:
794 ; AVX2:       # %bb.0:
795 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
796 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm2
797 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
798 ; AVX2-NEXT:    vpminuw %ymm2, %ymm0, %ymm2
799 ; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
800 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
801 ; AVX2-NEXT:    retq
803 ; XOP-LABEL: eq_1_v16i16:
804 ; XOP:       # %bb.0:
805 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm1
806 ; XOP-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
807 ; XOP-NEXT:    vpaddw %xmm2, %xmm1, %xmm3
808 ; XOP-NEXT:    vpxor %xmm3, %xmm1, %xmm1
809 ; XOP-NEXT:    vpcomgtuw %xmm3, %xmm1, %xmm1
810 ; XOP-NEXT:    vpaddw %xmm2, %xmm0, %xmm2
811 ; XOP-NEXT:    vpxor %xmm2, %xmm0, %xmm0
812 ; XOP-NEXT:    vpcomgtuw %xmm2, %xmm0, %xmm0
813 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
814 ; XOP-NEXT:    retq
816 ; AVX512VPOPCNTDQ-LABEL: eq_1_v16i16:
817 ; AVX512VPOPCNTDQ:       # %bb.0:
818 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
819 ; AVX512VPOPCNTDQ-NEXT:    vpaddw %ymm1, %ymm0, %ymm1
820 ; AVX512VPOPCNTDQ-NEXT:    vpxor %ymm1, %ymm0, %ymm0
821 ; AVX512VPOPCNTDQ-NEXT:    vpminuw %ymm1, %ymm0, %ymm1
822 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
823 ; AVX512VPOPCNTDQ-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
824 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
825 ; AVX512VPOPCNTDQ-NEXT:    retq
827 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v16i16:
828 ; AVX512VPOPCNTDQVL:       # %bb.0:
829 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
830 ; AVX512VPOPCNTDQVL-NEXT:    vpaddw %ymm1, %ymm0, %ymm1
831 ; AVX512VPOPCNTDQVL-NEXT:    vpxor %ymm1, %ymm0, %ymm0
832 ; AVX512VPOPCNTDQVL-NEXT:    vpminuw %ymm1, %ymm0, %ymm1
833 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
834 ; AVX512VPOPCNTDQVL-NEXT:    vpternlogq $15, %ymm0, %ymm0, %ymm0
835 ; AVX512VPOPCNTDQVL-NEXT:    retq
837 ; BITALG_NOVLX-LABEL: eq_1_v16i16:
838 ; BITALG_NOVLX:       # %bb.0:
839 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
840 ; BITALG_NOVLX-NEXT:    vpopcntw %zmm0, %zmm0
841 ; BITALG_NOVLX-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
842 ; BITALG_NOVLX-NEXT:    retq
844 ; BITALG-LABEL: eq_1_v16i16:
845 ; BITALG:       # %bb.0:
846 ; BITALG-NEXT:    vpopcntw %ymm0, %ymm0
847 ; BITALG-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
848 ; BITALG-NEXT:    retq
849   %2 = tail call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %0)
850   %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>
851   %4 = sext <16 x i1> %3 to <16 x i16>
852   ret <16 x i16> %4
855 define <16 x i16> @ne_1_v16i16(<16 x i16> %0) {
856 ; AVX1-LABEL: ne_1_v16i16:
857 ; AVX1:       # %bb.0:
858 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
859 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
860 ; AVX1-NEXT:    vpaddw %xmm2, %xmm1, %xmm3
861 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
862 ; AVX1-NEXT:    vpminuw %xmm3, %xmm1, %xmm3
863 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm1, %xmm1
864 ; AVX1-NEXT:    vpaddw %xmm2, %xmm0, %xmm2
865 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
866 ; AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm2
867 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm0
868 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
869 ; AVX1-NEXT:    retq
871 ; AVX2-LABEL: ne_1_v16i16:
872 ; AVX2:       # %bb.0:
873 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
874 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm1
875 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
876 ; AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm1
877 ; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
878 ; AVX2-NEXT:    retq
880 ; XOP-LABEL: ne_1_v16i16:
881 ; XOP:       # %bb.0:
882 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm1
883 ; XOP-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
884 ; XOP-NEXT:    vpaddw %xmm2, %xmm1, %xmm3
885 ; XOP-NEXT:    vpxor %xmm3, %xmm1, %xmm1
886 ; XOP-NEXT:    vpcomleuw %xmm3, %xmm1, %xmm1
887 ; XOP-NEXT:    vpaddw %xmm2, %xmm0, %xmm2
888 ; XOP-NEXT:    vpxor %xmm2, %xmm0, %xmm0
889 ; XOP-NEXT:    vpcomleuw %xmm2, %xmm0, %xmm0
890 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
891 ; XOP-NEXT:    retq
893 ; AVX512VPOPCNTDQ-LABEL: ne_1_v16i16:
894 ; AVX512VPOPCNTDQ:       # %bb.0:
895 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
896 ; AVX512VPOPCNTDQ-NEXT:    vpaddw %ymm1, %ymm0, %ymm1
897 ; AVX512VPOPCNTDQ-NEXT:    vpxor %ymm1, %ymm0, %ymm0
898 ; AVX512VPOPCNTDQ-NEXT:    vpminuw %ymm1, %ymm0, %ymm1
899 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
900 ; AVX512VPOPCNTDQ-NEXT:    retq
902 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v16i16:
903 ; AVX512VPOPCNTDQVL:       # %bb.0:
904 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
905 ; AVX512VPOPCNTDQVL-NEXT:    vpaddw %ymm1, %ymm0, %ymm1
906 ; AVX512VPOPCNTDQVL-NEXT:    vpxor %ymm1, %ymm0, %ymm0
907 ; AVX512VPOPCNTDQVL-NEXT:    vpminuw %ymm1, %ymm0, %ymm1
908 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
909 ; AVX512VPOPCNTDQVL-NEXT:    retq
911 ; BITALG_NOVLX-LABEL: ne_1_v16i16:
912 ; BITALG_NOVLX:       # %bb.0:
913 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
914 ; BITALG_NOVLX-NEXT:    vpopcntw %zmm0, %zmm0
915 ; BITALG_NOVLX-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
916 ; BITALG_NOVLX-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
917 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
918 ; BITALG_NOVLX-NEXT:    retq
920 ; BITALG-LABEL: ne_1_v16i16:
921 ; BITALG:       # %bb.0:
922 ; BITALG-NEXT:    vpopcntw %ymm0, %ymm0
923 ; BITALG-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
924 ; BITALG-NEXT:    vpternlogq $15, %ymm0, %ymm0, %ymm0
925 ; BITALG-NEXT:    retq
926   %2 = tail call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %0)
927   %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>
928   %4 = sext <16 x i1> %3 to <16 x i16>
929   ret <16 x i16> %4
932 define <32 x i8> @eq_1_v32i8(<32 x i8> %0) {
933 ; AVX1-LABEL: eq_1_v32i8:
934 ; AVX1:       # %bb.0:
935 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
936 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
937 ; AVX1-NEXT:    vpaddb %xmm2, %xmm1, %xmm3
938 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
939 ; AVX1-NEXT:    vpminub %xmm3, %xmm1, %xmm3
940 ; AVX1-NEXT:    vpcmpeqb %xmm3, %xmm1, %xmm1
941 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
942 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm3
943 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
944 ; AVX1-NEXT:    vpminub %xmm3, %xmm0, %xmm3
945 ; AVX1-NEXT:    vpcmpeqb %xmm3, %xmm0, %xmm0
946 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
947 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
948 ; AVX1-NEXT:    retq
950 ; AVX2-LABEL: eq_1_v32i8:
951 ; AVX2:       # %bb.0:
952 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
953 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm2
954 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
955 ; AVX2-NEXT:    vpminub %ymm2, %ymm0, %ymm2
956 ; AVX2-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm0
957 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
958 ; AVX2-NEXT:    retq
960 ; XOP-LABEL: eq_1_v32i8:
961 ; XOP:       # %bb.0:
962 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm1
963 ; XOP-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
964 ; XOP-NEXT:    vpaddb %xmm2, %xmm1, %xmm3
965 ; XOP-NEXT:    vpxor %xmm3, %xmm1, %xmm1
966 ; XOP-NEXT:    vpcomgtub %xmm3, %xmm1, %xmm1
967 ; XOP-NEXT:    vpaddb %xmm2, %xmm0, %xmm2
968 ; XOP-NEXT:    vpxor %xmm2, %xmm0, %xmm0
969 ; XOP-NEXT:    vpcomgtub %xmm2, %xmm0, %xmm0
970 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
971 ; XOP-NEXT:    retq
973 ; AVX512VPOPCNTDQ-LABEL: eq_1_v32i8:
974 ; AVX512VPOPCNTDQ:       # %bb.0:
975 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
976 ; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm1, %ymm0, %ymm1
977 ; AVX512VPOPCNTDQ-NEXT:    vpxor %ymm1, %ymm0, %ymm0
978 ; AVX512VPOPCNTDQ-NEXT:    vpminub %ymm1, %ymm0, %ymm1
979 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
980 ; AVX512VPOPCNTDQ-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
981 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
982 ; AVX512VPOPCNTDQ-NEXT:    retq
984 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v32i8:
985 ; AVX512VPOPCNTDQVL:       # %bb.0:
986 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
987 ; AVX512VPOPCNTDQVL-NEXT:    vpaddb %ymm1, %ymm0, %ymm1
988 ; AVX512VPOPCNTDQVL-NEXT:    vpxor %ymm1, %ymm0, %ymm0
989 ; AVX512VPOPCNTDQVL-NEXT:    vpminub %ymm1, %ymm0, %ymm1
990 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
991 ; AVX512VPOPCNTDQVL-NEXT:    vpternlogq $15, %ymm0, %ymm0, %ymm0
992 ; AVX512VPOPCNTDQVL-NEXT:    retq
994 ; BITALG_NOVLX-LABEL: eq_1_v32i8:
995 ; BITALG_NOVLX:       # %bb.0:
996 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
997 ; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0
998 ; BITALG_NOVLX-NEXT:    vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
999 ; BITALG_NOVLX-NEXT:    retq
1001 ; BITALG-LABEL: eq_1_v32i8:
1002 ; BITALG:       # %bb.0:
1003 ; BITALG-NEXT:    vpopcntb %ymm0, %ymm0
1004 ; BITALG-NEXT:    vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1005 ; BITALG-NEXT:    retq
1006   %2 = tail call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %0)
1007   %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>
1008   %4 = sext <32 x i1> %3 to <32 x i8>
1009   ret <32 x i8> %4
1012 define <32 x i8> @ne_1_v32i8(<32 x i8> %0) {
1013 ; AVX1-LABEL: ne_1_v32i8:
1014 ; AVX1:       # %bb.0:
1015 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1016 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1017 ; AVX1-NEXT:    vpaddb %xmm2, %xmm1, %xmm3
1018 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
1019 ; AVX1-NEXT:    vpminub %xmm3, %xmm1, %xmm3
1020 ; AVX1-NEXT:    vpcmpeqb %xmm3, %xmm1, %xmm1
1021 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm2
1022 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1023 ; AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm2
1024 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
1025 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1026 ; AVX1-NEXT:    retq
1028 ; AVX2-LABEL: ne_1_v32i8:
1029 ; AVX2:       # %bb.0:
1030 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
1031 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm1
1032 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1033 ; AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm1
1034 ; AVX2-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
1035 ; AVX2-NEXT:    retq
1037 ; XOP-LABEL: ne_1_v32i8:
1038 ; XOP:       # %bb.0:
1039 ; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm1
1040 ; XOP-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1041 ; XOP-NEXT:    vpaddb %xmm2, %xmm1, %xmm3
1042 ; XOP-NEXT:    vpxor %xmm3, %xmm1, %xmm1
1043 ; XOP-NEXT:    vpcomleub %xmm3, %xmm1, %xmm1
1044 ; XOP-NEXT:    vpaddb %xmm2, %xmm0, %xmm2
1045 ; XOP-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1046 ; XOP-NEXT:    vpcomleub %xmm2, %xmm0, %xmm0
1047 ; XOP-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1048 ; XOP-NEXT:    retq
1050 ; AVX512VPOPCNTDQ-LABEL: ne_1_v32i8:
1051 ; AVX512VPOPCNTDQ:       # %bb.0:
1052 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
1053 ; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm1, %ymm0, %ymm1
1054 ; AVX512VPOPCNTDQ-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1055 ; AVX512VPOPCNTDQ-NEXT:    vpminub %ymm1, %ymm0, %ymm1
1056 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
1057 ; AVX512VPOPCNTDQ-NEXT:    retq
1059 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v32i8:
1060 ; AVX512VPOPCNTDQVL:       # %bb.0:
1061 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
1062 ; AVX512VPOPCNTDQVL-NEXT:    vpaddb %ymm1, %ymm0, %ymm1
1063 ; AVX512VPOPCNTDQVL-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1064 ; AVX512VPOPCNTDQVL-NEXT:    vpminub %ymm1, %ymm0, %ymm1
1065 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
1066 ; AVX512VPOPCNTDQVL-NEXT:    retq
1068 ; BITALG_NOVLX-LABEL: ne_1_v32i8:
1069 ; BITALG_NOVLX:       # %bb.0:
1070 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1071 ; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0
1072 ; BITALG_NOVLX-NEXT:    vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1073 ; BITALG_NOVLX-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1074 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1075 ; BITALG_NOVLX-NEXT:    retq
1077 ; BITALG-LABEL: ne_1_v32i8:
1078 ; BITALG:       # %bb.0:
1079 ; BITALG-NEXT:    vpopcntb %ymm0, %ymm0
1080 ; BITALG-NEXT:    vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1081 ; BITALG-NEXT:    vpternlogq $15, %ymm0, %ymm0, %ymm0
1082 ; BITALG-NEXT:    retq
1083   %2 = tail call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %0)
1084   %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>
1085   %4 = sext <32 x i1> %3 to <32 x i8>
1086   ret <32 x i8> %4
1089 declare <4 x i64> @llvm.ctpop.v4i64(<4 x i64>)
1090 declare <8 x i32> @llvm.ctpop.v8i32(<8 x i32>)
1091 declare <16 x i16> @llvm.ctpop.v16i16(<16 x i16>)
1092 declare <32 x i8> @llvm.ctpop.v32i8(<32 x i8>)