1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE42
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512cd,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512cd,+avx512vl,+avx512vpopcntdq | FileCheck %s --check-prefixes=AVX512,AVX512VPOPCNT
11 define <4 x i32> @widen_ctpop_v2i32_v4i32(<2 x i32> %a0, <2 x i32> %a1) {
12 ; SSE42-LABEL: widen_ctpop_v2i32_v4i32:
14 ; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
15 ; SSE42-NEXT: movdqa %xmm0, %xmm3
16 ; SSE42-NEXT: pand %xmm2, %xmm3
17 ; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
18 ; SSE42-NEXT: movdqa %xmm4, %xmm5
19 ; SSE42-NEXT: pshufb %xmm3, %xmm5
20 ; SSE42-NEXT: psrlw $4, %xmm0
21 ; SSE42-NEXT: pand %xmm2, %xmm0
22 ; SSE42-NEXT: movdqa %xmm4, %xmm3
23 ; SSE42-NEXT: pshufb %xmm0, %xmm3
24 ; SSE42-NEXT: paddb %xmm5, %xmm3
25 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero
26 ; SSE42-NEXT: pxor %xmm3, %xmm3
27 ; SSE42-NEXT: psadbw %xmm3, %xmm0
28 ; SSE42-NEXT: movdqa %xmm1, %xmm5
29 ; SSE42-NEXT: pand %xmm2, %xmm5
30 ; SSE42-NEXT: movdqa %xmm4, %xmm6
31 ; SSE42-NEXT: pshufb %xmm5, %xmm6
32 ; SSE42-NEXT: psrlw $4, %xmm1
33 ; SSE42-NEXT: pand %xmm2, %xmm1
34 ; SSE42-NEXT: pshufb %xmm1, %xmm4
35 ; SSE42-NEXT: paddb %xmm6, %xmm4
36 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm4[0],zero,xmm4[1],zero
37 ; SSE42-NEXT: psadbw %xmm3, %xmm1
38 ; SSE42-NEXT: packuswb %xmm1, %xmm0
41 ; AVX2-LABEL: widen_ctpop_v2i32_v4i32:
43 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
44 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm3
45 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
46 ; AVX2-NEXT: vpshufb %xmm3, %xmm4, %xmm3
47 ; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0
48 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
49 ; AVX2-NEXT: vpshufb %xmm0, %xmm4, %xmm0
50 ; AVX2-NEXT: vpaddb %xmm3, %xmm0, %xmm0
51 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
52 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
53 ; AVX2-NEXT: vpsadbw %xmm3, %xmm0, %xmm0
54 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm5
55 ; AVX2-NEXT: vpshufb %xmm5, %xmm4, %xmm5
56 ; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm1
57 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
58 ; AVX2-NEXT: vpshufb %xmm1, %xmm4, %xmm1
59 ; AVX2-NEXT: vpaddb %xmm5, %xmm1, %xmm1
60 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
61 ; AVX2-NEXT: vpsadbw %xmm3, %xmm1, %xmm1
62 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
65 ; AVX512VL-LABEL: widen_ctpop_v2i32_v4i32:
67 ; AVX512VL-NEXT: vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
68 ; AVX512VL-NEXT: vpand %xmm2, %xmm0, %xmm3
69 ; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
70 ; AVX512VL-NEXT: vpshufb %xmm3, %xmm4, %xmm3
71 ; AVX512VL-NEXT: vpsrlw $4, %xmm0, %xmm0
72 ; AVX512VL-NEXT: vpand %xmm2, %xmm0, %xmm0
73 ; AVX512VL-NEXT: vpshufb %xmm0, %xmm4, %xmm0
74 ; AVX512VL-NEXT: vpaddb %xmm3, %xmm0, %xmm0
75 ; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
76 ; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3
77 ; AVX512VL-NEXT: vpsadbw %xmm3, %xmm0, %xmm0
78 ; AVX512VL-NEXT: vpand %xmm2, %xmm1, %xmm5
79 ; AVX512VL-NEXT: vpshufb %xmm5, %xmm4, %xmm5
80 ; AVX512VL-NEXT: vpsrlw $4, %xmm1, %xmm1
81 ; AVX512VL-NEXT: vpand %xmm2, %xmm1, %xmm1
82 ; AVX512VL-NEXT: vpshufb %xmm1, %xmm4, %xmm1
83 ; AVX512VL-NEXT: vpaddb %xmm5, %xmm1, %xmm1
84 ; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
85 ; AVX512VL-NEXT: vpsadbw %xmm3, %xmm1, %xmm1
86 ; AVX512VL-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
89 ; AVX512VPOPCNT-LABEL: widen_ctpop_v2i32_v4i32:
90 ; AVX512VPOPCNT: # %bb.0:
91 ; AVX512VPOPCNT-NEXT: vpopcntd %xmm0, %xmm0
92 ; AVX512VPOPCNT-NEXT: vpopcntd %xmm1, %xmm1
93 ; AVX512VPOPCNT-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
94 ; AVX512VPOPCNT-NEXT: retq
95 %b0 = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a0)
96 %b1 = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a1)
97 %res = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
101 define <8 x i32> @widen_ctpop_v4i32_v8i32(<4 x i32> %a0, <4 x i32> %a1) {
102 ; SSE42-LABEL: widen_ctpop_v4i32_v8i32:
104 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
105 ; SSE42-NEXT: movdqa %xmm0, %xmm4
106 ; SSE42-NEXT: pand %xmm3, %xmm4
107 ; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
108 ; SSE42-NEXT: movdqa %xmm2, %xmm5
109 ; SSE42-NEXT: pshufb %xmm4, %xmm5
110 ; SSE42-NEXT: psrlw $4, %xmm0
111 ; SSE42-NEXT: pand %xmm3, %xmm0
112 ; SSE42-NEXT: movdqa %xmm2, %xmm4
113 ; SSE42-NEXT: pshufb %xmm0, %xmm4
114 ; SSE42-NEXT: paddb %xmm5, %xmm4
115 ; SSE42-NEXT: pxor %xmm5, %xmm5
116 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm4[0],zero,xmm4[1],zero
117 ; SSE42-NEXT: punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm5[2],xmm4[3],xmm5[3]
118 ; SSE42-NEXT: psadbw %xmm5, %xmm4
119 ; SSE42-NEXT: psadbw %xmm5, %xmm0
120 ; SSE42-NEXT: packuswb %xmm4, %xmm0
121 ; SSE42-NEXT: movdqa %xmm1, %xmm4
122 ; SSE42-NEXT: pand %xmm3, %xmm4
123 ; SSE42-NEXT: movdqa %xmm2, %xmm6
124 ; SSE42-NEXT: pshufb %xmm4, %xmm6
125 ; SSE42-NEXT: psrlw $4, %xmm1
126 ; SSE42-NEXT: pand %xmm3, %xmm1
127 ; SSE42-NEXT: pshufb %xmm1, %xmm2
128 ; SSE42-NEXT: paddb %xmm6, %xmm2
129 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero
130 ; SSE42-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm5[2],xmm2[3],xmm5[3]
131 ; SSE42-NEXT: psadbw %xmm5, %xmm2
132 ; SSE42-NEXT: psadbw %xmm5, %xmm1
133 ; SSE42-NEXT: packuswb %xmm2, %xmm1
136 ; AVX2-LABEL: widen_ctpop_v4i32_v8i32:
138 ; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
139 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
140 ; 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]
141 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
142 ; 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]
143 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
144 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
145 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
146 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
147 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
148 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
149 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
150 ; AVX2-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
151 ; AVX2-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
152 ; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
153 ; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
154 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
157 ; AVX512VL-LABEL: widen_ctpop_v4i32_v8i32:
159 ; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
160 ; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
161 ; AVX512VL-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]
162 ; AVX512VL-NEXT: vpand %ymm1, %ymm0, %ymm2
163 ; AVX512VL-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]
164 ; AVX512VL-NEXT: # ymm3 = mem[0,1,0,1]
165 ; AVX512VL-NEXT: vpshufb %ymm2, %ymm3, %ymm2
166 ; AVX512VL-NEXT: vpsrlw $4, %ymm0, %ymm0
167 ; AVX512VL-NEXT: vpand %ymm1, %ymm0, %ymm0
168 ; AVX512VL-NEXT: vpshufb %ymm0, %ymm3, %ymm0
169 ; AVX512VL-NEXT: vpaddb %ymm2, %ymm0, %ymm0
170 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
171 ; AVX512VL-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
172 ; AVX512VL-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
173 ; AVX512VL-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
174 ; AVX512VL-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
175 ; AVX512VL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
176 ; AVX512VL-NEXT: retq
178 ; AVX512VPOPCNT-LABEL: widen_ctpop_v4i32_v8i32:
179 ; AVX512VPOPCNT: # %bb.0:
180 ; AVX512VPOPCNT-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
181 ; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
182 ; AVX512VPOPCNT-NEXT: vpopcntd %ymm0, %ymm0
183 ; AVX512VPOPCNT-NEXT: retq
184 %b0 = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %a0)
185 %b1 = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %a1)
186 %res = shufflevector <4 x i32> %b0, <4 x i32> %b1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
190 define <8 x i32> @widen_ctpop_v2i32_v8i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32> %a2, <2 x i32> %a3) {
191 ; SSE42-LABEL: widen_ctpop_v2i32_v8i32:
193 ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
194 ; SSE42-NEXT: movdqa %xmm0, %xmm6
195 ; SSE42-NEXT: pand %xmm5, %xmm6
196 ; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
197 ; SSE42-NEXT: movdqa %xmm4, %xmm7
198 ; SSE42-NEXT: pshufb %xmm6, %xmm7
199 ; SSE42-NEXT: psrlw $4, %xmm0
200 ; SSE42-NEXT: pand %xmm5, %xmm0
201 ; SSE42-NEXT: movdqa %xmm4, %xmm6
202 ; SSE42-NEXT: pshufb %xmm0, %xmm6
203 ; SSE42-NEXT: paddb %xmm7, %xmm6
204 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm6[0],zero,xmm6[1],zero
205 ; SSE42-NEXT: pxor %xmm6, %xmm6
206 ; SSE42-NEXT: psadbw %xmm6, %xmm0
207 ; SSE42-NEXT: movdqa %xmm1, %xmm7
208 ; SSE42-NEXT: pand %xmm5, %xmm7
209 ; SSE42-NEXT: movdqa %xmm4, %xmm8
210 ; SSE42-NEXT: pshufb %xmm7, %xmm8
211 ; SSE42-NEXT: psrlw $4, %xmm1
212 ; SSE42-NEXT: pand %xmm5, %xmm1
213 ; SSE42-NEXT: movdqa %xmm4, %xmm7
214 ; SSE42-NEXT: pshufb %xmm1, %xmm7
215 ; SSE42-NEXT: paddb %xmm8, %xmm7
216 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm7[0],zero,xmm7[1],zero
217 ; SSE42-NEXT: psadbw %xmm6, %xmm1
218 ; SSE42-NEXT: packuswb %xmm1, %xmm0
219 ; SSE42-NEXT: movdqa %xmm2, %xmm1
220 ; SSE42-NEXT: pand %xmm5, %xmm1
221 ; SSE42-NEXT: movdqa %xmm4, %xmm7
222 ; SSE42-NEXT: pshufb %xmm1, %xmm7
223 ; SSE42-NEXT: psrlw $4, %xmm2
224 ; SSE42-NEXT: pand %xmm5, %xmm2
225 ; SSE42-NEXT: movdqa %xmm4, %xmm1
226 ; SSE42-NEXT: pshufb %xmm2, %xmm1
227 ; SSE42-NEXT: paddb %xmm7, %xmm1
228 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
229 ; SSE42-NEXT: psadbw %xmm6, %xmm1
230 ; SSE42-NEXT: movdqa %xmm3, %xmm2
231 ; SSE42-NEXT: pand %xmm5, %xmm2
232 ; SSE42-NEXT: movdqa %xmm4, %xmm7
233 ; SSE42-NEXT: pshufb %xmm2, %xmm7
234 ; SSE42-NEXT: psrlw $4, %xmm3
235 ; SSE42-NEXT: pand %xmm5, %xmm3
236 ; SSE42-NEXT: pshufb %xmm3, %xmm4
237 ; SSE42-NEXT: paddb %xmm7, %xmm4
238 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm2 = xmm4[0],zero,xmm4[1],zero
239 ; SSE42-NEXT: psadbw %xmm6, %xmm2
240 ; SSE42-NEXT: packuswb %xmm2, %xmm1
243 ; AVX2-LABEL: widen_ctpop_v2i32_v8i32:
245 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
246 ; AVX2-NEXT: vpand %xmm4, %xmm0, %xmm5
247 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm6 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
248 ; AVX2-NEXT: vpshufb %xmm5, %xmm6, %xmm5
249 ; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0
250 ; AVX2-NEXT: vpand %xmm4, %xmm0, %xmm0
251 ; AVX2-NEXT: vpshufb %xmm0, %xmm6, %xmm0
252 ; AVX2-NEXT: vpaddb %xmm5, %xmm0, %xmm0
253 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
254 ; AVX2-NEXT: vpand %xmm4, %xmm1, %xmm5
255 ; AVX2-NEXT: vpshufb %xmm5, %xmm6, %xmm5
256 ; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm1
257 ; AVX2-NEXT: vpand %xmm4, %xmm1, %xmm1
258 ; AVX2-NEXT: vpshufb %xmm1, %xmm6, %xmm1
259 ; AVX2-NEXT: vpaddb %xmm5, %xmm1, %xmm1
260 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
261 ; AVX2-NEXT: vpand %xmm4, %xmm2, %xmm5
262 ; AVX2-NEXT: vpshufb %xmm5, %xmm6, %xmm5
263 ; AVX2-NEXT: vpsrlw $4, %xmm2, %xmm2
264 ; AVX2-NEXT: vpand %xmm4, %xmm2, %xmm2
265 ; AVX2-NEXT: vpshufb %xmm2, %xmm6, %xmm2
266 ; AVX2-NEXT: vpaddb %xmm5, %xmm2, %xmm2
267 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
268 ; AVX2-NEXT: vpand %xmm4, %xmm3, %xmm5
269 ; AVX2-NEXT: vpshufb %xmm5, %xmm6, %xmm5
270 ; AVX2-NEXT: vpsrlw $4, %xmm3, %xmm3
271 ; AVX2-NEXT: vpand %xmm4, %xmm3, %xmm3
272 ; AVX2-NEXT: vpshufb %xmm3, %xmm6, %xmm3
273 ; AVX2-NEXT: vpaddb %xmm5, %xmm3, %xmm3
274 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
275 ; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
276 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
277 ; AVX2-NEXT: vpsadbw %ymm3, %ymm1, %ymm1
278 ; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
279 ; AVX2-NEXT: vpsadbw %ymm3, %ymm0, %ymm0
280 ; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0
283 ; AVX512VL-LABEL: widen_ctpop_v2i32_v8i32:
285 ; AVX512VL-NEXT: vpbroadcastb {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
286 ; AVX512VL-NEXT: vpand %xmm4, %xmm0, %xmm5
287 ; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm6 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
288 ; AVX512VL-NEXT: vpshufb %xmm5, %xmm6, %xmm5
289 ; AVX512VL-NEXT: vpsrlw $4, %xmm0, %xmm0
290 ; AVX512VL-NEXT: vpand %xmm4, %xmm0, %xmm0
291 ; AVX512VL-NEXT: vpshufb %xmm0, %xmm6, %xmm0
292 ; AVX512VL-NEXT: vpaddb %xmm5, %xmm0, %xmm0
293 ; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
294 ; AVX512VL-NEXT: vpand %xmm4, %xmm1, %xmm5
295 ; AVX512VL-NEXT: vpshufb %xmm5, %xmm6, %xmm5
296 ; AVX512VL-NEXT: vpsrlw $4, %xmm1, %xmm1
297 ; AVX512VL-NEXT: vpand %xmm4, %xmm1, %xmm1
298 ; AVX512VL-NEXT: vpshufb %xmm1, %xmm6, %xmm1
299 ; AVX512VL-NEXT: vpaddb %xmm5, %xmm1, %xmm1
300 ; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
301 ; AVX512VL-NEXT: vpand %xmm4, %xmm2, %xmm5
302 ; AVX512VL-NEXT: vpshufb %xmm5, %xmm6, %xmm5
303 ; AVX512VL-NEXT: vpsrlw $4, %xmm2, %xmm2
304 ; AVX512VL-NEXT: vpand %xmm4, %xmm2, %xmm2
305 ; AVX512VL-NEXT: vpshufb %xmm2, %xmm6, %xmm2
306 ; AVX512VL-NEXT: vpaddb %xmm5, %xmm2, %xmm2
307 ; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
308 ; AVX512VL-NEXT: vpand %xmm4, %xmm3, %xmm5
309 ; AVX512VL-NEXT: vpshufb %xmm5, %xmm6, %xmm5
310 ; AVX512VL-NEXT: vpsrlw $4, %xmm3, %xmm3
311 ; AVX512VL-NEXT: vpand %xmm4, %xmm3, %xmm3
312 ; AVX512VL-NEXT: vpshufb %xmm3, %xmm6, %xmm3
313 ; AVX512VL-NEXT: vpaddb %xmm5, %xmm3, %xmm3
314 ; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
315 ; AVX512VL-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
316 ; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3
317 ; AVX512VL-NEXT: vpsadbw %ymm3, %ymm1, %ymm1
318 ; AVX512VL-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
319 ; AVX512VL-NEXT: vpsadbw %ymm3, %ymm0, %ymm0
320 ; AVX512VL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0
321 ; AVX512VL-NEXT: retq
323 ; AVX512VPOPCNT-LABEL: widen_ctpop_v2i32_v8i32:
324 ; AVX512VPOPCNT: # %bb.0:
325 ; AVX512VPOPCNT-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1
326 ; AVX512VPOPCNT-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
327 ; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
328 ; AVX512VPOPCNT-NEXT: vpopcntd %ymm1, %ymm1
329 ; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
330 ; AVX512VPOPCNT-NEXT: vpopcntd %ymm0, %ymm0
331 ; AVX512VPOPCNT-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
332 ; AVX512VPOPCNT-NEXT: retq
333 %b0 = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a0)
334 %b1 = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a1)
335 %b2 = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a2)
336 %b3 = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a3)
337 %res01 = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
338 %res23 = shufflevector <2 x i32> %b2, <2 x i32> %b3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
339 %res = shufflevector <4 x i32> %res01, <4 x i32> %res23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
347 define <4 x i32> @widen_ctlz_v2i32_v4i32(<2 x i32> %a0, <2 x i32> %a1) {
348 ; SSE42-LABEL: widen_ctlz_v2i32_v4i32:
350 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
351 ; SSE42-NEXT: movdqa %xmm3, %xmm6
352 ; SSE42-NEXT: pshufb %xmm0, %xmm6
353 ; SSE42-NEXT: movdqa %xmm0, %xmm5
354 ; SSE42-NEXT: psrlw $4, %xmm5
355 ; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
356 ; SSE42-NEXT: pand %xmm4, %xmm5
357 ; SSE42-NEXT: pxor %xmm2, %xmm2
358 ; SSE42-NEXT: movdqa %xmm3, %xmm7
359 ; SSE42-NEXT: pshufb %xmm5, %xmm7
360 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm5
361 ; SSE42-NEXT: pand %xmm6, %xmm5
362 ; SSE42-NEXT: paddb %xmm7, %xmm5
363 ; SSE42-NEXT: movdqa %xmm0, %xmm6
364 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm6
365 ; SSE42-NEXT: psrlw $8, %xmm6
366 ; SSE42-NEXT: pand %xmm5, %xmm6
367 ; SSE42-NEXT: psrlw $8, %xmm5
368 ; SSE42-NEXT: paddw %xmm6, %xmm5
369 ; SSE42-NEXT: pcmpeqw %xmm2, %xmm0
370 ; SSE42-NEXT: psrld $16, %xmm0
371 ; SSE42-NEXT: pand %xmm5, %xmm0
372 ; SSE42-NEXT: psrld $16, %xmm5
373 ; SSE42-NEXT: paddd %xmm5, %xmm0
374 ; SSE42-NEXT: movdqa %xmm3, %xmm6
375 ; SSE42-NEXT: pshufb %xmm1, %xmm6
376 ; SSE42-NEXT: movdqa %xmm1, %xmm5
377 ; SSE42-NEXT: psrlw $4, %xmm5
378 ; SSE42-NEXT: pand %xmm4, %xmm5
379 ; SSE42-NEXT: pshufb %xmm5, %xmm3
380 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm5
381 ; SSE42-NEXT: pand %xmm6, %xmm5
382 ; SSE42-NEXT: paddb %xmm3, %xmm5
383 ; SSE42-NEXT: movdqa %xmm1, %xmm3
384 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm3
385 ; SSE42-NEXT: psrlw $8, %xmm3
386 ; SSE42-NEXT: pand %xmm5, %xmm3
387 ; SSE42-NEXT: psrlw $8, %xmm5
388 ; SSE42-NEXT: paddw %xmm3, %xmm5
389 ; SSE42-NEXT: pcmpeqw %xmm2, %xmm1
390 ; SSE42-NEXT: psrld $16, %xmm1
391 ; SSE42-NEXT: pand %xmm5, %xmm1
392 ; SSE42-NEXT: psrld $16, %xmm5
393 ; SSE42-NEXT: paddd %xmm1, %xmm5
394 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]
397 ; AVX2-LABEL: widen_ctlz_v2i32_v4i32:
399 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
400 ; AVX2-NEXT: vpshufb %xmm0, %xmm2, %xmm3
401 ; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm4
402 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
403 ; AVX2-NEXT: vpand %xmm5, %xmm4, %xmm4
404 ; AVX2-NEXT: vpxor %xmm6, %xmm6, %xmm6
405 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm4, %xmm7
406 ; AVX2-NEXT: vpand %xmm7, %xmm3, %xmm3
407 ; AVX2-NEXT: vpshufb %xmm4, %xmm2, %xmm4
408 ; AVX2-NEXT: vpaddb %xmm4, %xmm3, %xmm3
409 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm0, %xmm4
410 ; AVX2-NEXT: vpsrlw $8, %xmm4, %xmm4
411 ; AVX2-NEXT: vpand %xmm4, %xmm3, %xmm4
412 ; AVX2-NEXT: vpsrlw $8, %xmm3, %xmm3
413 ; AVX2-NEXT: vpaddw %xmm4, %xmm3, %xmm3
414 ; AVX2-NEXT: vpcmpeqw %xmm6, %xmm0, %xmm0
415 ; AVX2-NEXT: vpsrld $16, %xmm0, %xmm0
416 ; AVX2-NEXT: vpand %xmm0, %xmm3, %xmm0
417 ; AVX2-NEXT: vpsrld $16, %xmm3, %xmm3
418 ; AVX2-NEXT: vpaddd %xmm0, %xmm3, %xmm0
419 ; AVX2-NEXT: vpshufb %xmm1, %xmm2, %xmm3
420 ; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm4
421 ; AVX2-NEXT: vpand %xmm5, %xmm4, %xmm4
422 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm4, %xmm5
423 ; AVX2-NEXT: vpand %xmm5, %xmm3, %xmm3
424 ; AVX2-NEXT: vpshufb %xmm4, %xmm2, %xmm2
425 ; AVX2-NEXT: vpaddb %xmm2, %xmm3, %xmm2
426 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm1, %xmm3
427 ; AVX2-NEXT: vpsrlw $8, %xmm3, %xmm3
428 ; AVX2-NEXT: vpand %xmm3, %xmm2, %xmm3
429 ; AVX2-NEXT: vpsrlw $8, %xmm2, %xmm2
430 ; AVX2-NEXT: vpaddw %xmm3, %xmm2, %xmm2
431 ; AVX2-NEXT: vpcmpeqw %xmm6, %xmm1, %xmm1
432 ; AVX2-NEXT: vpsrld $16, %xmm1, %xmm1
433 ; AVX2-NEXT: vpand %xmm1, %xmm2, %xmm1
434 ; AVX2-NEXT: vpsrld $16, %xmm2, %xmm2
435 ; AVX2-NEXT: vpaddd %xmm1, %xmm2, %xmm1
436 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
439 ; AVX512-LABEL: widen_ctlz_v2i32_v4i32:
441 ; AVX512-NEXT: vplzcntd %xmm0, %xmm0
442 ; AVX512-NEXT: vplzcntd %xmm1, %xmm1
443 ; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
445 %b0 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a0, i1 0)
446 %b1 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a1, i1 0)
447 %res = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
451 define <8 x i32> @widen_ctlz_v4i32_v8i32(<4 x i32> %a0, <4 x i32> %a1) {
452 ; SSE42-LABEL: widen_ctlz_v4i32_v8i32:
454 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
455 ; SSE42-NEXT: movdqa %xmm3, %xmm6
456 ; SSE42-NEXT: pshufb %xmm0, %xmm6
457 ; SSE42-NEXT: movdqa %xmm0, %xmm5
458 ; SSE42-NEXT: psrlw $4, %xmm5
459 ; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
460 ; SSE42-NEXT: pand %xmm4, %xmm5
461 ; SSE42-NEXT: pxor %xmm2, %xmm2
462 ; SSE42-NEXT: movdqa %xmm3, %xmm7
463 ; SSE42-NEXT: pshufb %xmm5, %xmm7
464 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm5
465 ; SSE42-NEXT: pand %xmm6, %xmm5
466 ; SSE42-NEXT: paddb %xmm7, %xmm5
467 ; SSE42-NEXT: movdqa %xmm0, %xmm6
468 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm6
469 ; SSE42-NEXT: psrlw $8, %xmm6
470 ; SSE42-NEXT: pand %xmm5, %xmm6
471 ; SSE42-NEXT: psrlw $8, %xmm5
472 ; SSE42-NEXT: paddw %xmm6, %xmm5
473 ; SSE42-NEXT: pcmpeqw %xmm2, %xmm0
474 ; SSE42-NEXT: psrld $16, %xmm0
475 ; SSE42-NEXT: pand %xmm5, %xmm0
476 ; SSE42-NEXT: psrld $16, %xmm5
477 ; SSE42-NEXT: paddd %xmm5, %xmm0
478 ; SSE42-NEXT: movdqa %xmm3, %xmm5
479 ; SSE42-NEXT: pshufb %xmm1, %xmm5
480 ; SSE42-NEXT: movdqa %xmm1, %xmm6
481 ; SSE42-NEXT: psrlw $4, %xmm6
482 ; SSE42-NEXT: pand %xmm4, %xmm6
483 ; SSE42-NEXT: pshufb %xmm6, %xmm3
484 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm6
485 ; SSE42-NEXT: pand %xmm5, %xmm6
486 ; SSE42-NEXT: paddb %xmm3, %xmm6
487 ; SSE42-NEXT: movdqa %xmm1, %xmm3
488 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm3
489 ; SSE42-NEXT: psrlw $8, %xmm3
490 ; SSE42-NEXT: pand %xmm6, %xmm3
491 ; SSE42-NEXT: psrlw $8, %xmm6
492 ; SSE42-NEXT: paddw %xmm3, %xmm6
493 ; SSE42-NEXT: pcmpeqw %xmm2, %xmm1
494 ; SSE42-NEXT: psrld $16, %xmm1
495 ; SSE42-NEXT: pand %xmm6, %xmm1
496 ; SSE42-NEXT: psrld $16, %xmm6
497 ; SSE42-NEXT: paddd %xmm6, %xmm1
500 ; AVX2-LABEL: widen_ctlz_v4i32_v8i32:
502 ; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
503 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
504 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
505 ; AVX2-NEXT: # ymm1 = mem[0,1,0,1]
506 ; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm2
507 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm3
508 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
509 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
510 ; AVX2-NEXT: vpcmpeqb %ymm4, %ymm3, %ymm5
511 ; AVX2-NEXT: vpand %ymm5, %ymm2, %ymm2
512 ; AVX2-NEXT: vpshufb %ymm3, %ymm1, %ymm1
513 ; AVX2-NEXT: vpaddb %ymm1, %ymm2, %ymm1
514 ; AVX2-NEXT: vpcmpeqb %ymm4, %ymm0, %ymm2
515 ; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2
516 ; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm2
517 ; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm1
518 ; AVX2-NEXT: vpaddw %ymm2, %ymm1, %ymm1
519 ; AVX2-NEXT: vpcmpeqw %ymm4, %ymm0, %ymm0
520 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
521 ; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0
522 ; AVX2-NEXT: vpsrld $16, %ymm1, %ymm1
523 ; AVX2-NEXT: vpaddd %ymm0, %ymm1, %ymm0
526 ; AVX512-LABEL: widen_ctlz_v4i32_v8i32:
528 ; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
529 ; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
530 ; AVX512-NEXT: vplzcntd %ymm0, %ymm0
532 %b0 = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a0, i1 0)
533 %b1 = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a1, i1 0)
534 %res = shufflevector <4 x i32> %b0, <4 x i32> %b1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
538 define <8 x i32> @widen_ctlz_v2i32_v8i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32> %a2, <2 x i32> %a3) {
539 ; SSE42-LABEL: widen_ctlz_v2i32_v8i32:
541 ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
542 ; SSE42-NEXT: movdqa %xmm5, %xmm8
543 ; SSE42-NEXT: pshufb %xmm0, %xmm8
544 ; SSE42-NEXT: movdqa %xmm0, %xmm7
545 ; SSE42-NEXT: psrlw $4, %xmm7
546 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
547 ; SSE42-NEXT: pand %xmm6, %xmm7
548 ; SSE42-NEXT: pxor %xmm4, %xmm4
549 ; SSE42-NEXT: movdqa %xmm5, %xmm9
550 ; SSE42-NEXT: pshufb %xmm7, %xmm9
551 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm7
552 ; SSE42-NEXT: pand %xmm8, %xmm7
553 ; SSE42-NEXT: paddb %xmm9, %xmm7
554 ; SSE42-NEXT: movdqa %xmm0, %xmm8
555 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm8
556 ; SSE42-NEXT: psrlw $8, %xmm8
557 ; SSE42-NEXT: pand %xmm7, %xmm8
558 ; SSE42-NEXT: psrlw $8, %xmm7
559 ; SSE42-NEXT: paddw %xmm8, %xmm7
560 ; SSE42-NEXT: pcmpeqw %xmm4, %xmm0
561 ; SSE42-NEXT: psrld $16, %xmm0
562 ; SSE42-NEXT: pand %xmm7, %xmm0
563 ; SSE42-NEXT: psrld $16, %xmm7
564 ; SSE42-NEXT: paddd %xmm7, %xmm0
565 ; SSE42-NEXT: movdqa %xmm5, %xmm8
566 ; SSE42-NEXT: pshufb %xmm1, %xmm8
567 ; SSE42-NEXT: movdqa %xmm1, %xmm7
568 ; SSE42-NEXT: psrlw $4, %xmm7
569 ; SSE42-NEXT: pand %xmm6, %xmm7
570 ; SSE42-NEXT: movdqa %xmm5, %xmm9
571 ; SSE42-NEXT: pshufb %xmm7, %xmm9
572 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm7
573 ; SSE42-NEXT: pand %xmm8, %xmm7
574 ; SSE42-NEXT: paddb %xmm9, %xmm7
575 ; SSE42-NEXT: movdqa %xmm1, %xmm8
576 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm8
577 ; SSE42-NEXT: psrlw $8, %xmm8
578 ; SSE42-NEXT: pand %xmm7, %xmm8
579 ; SSE42-NEXT: psrlw $8, %xmm7
580 ; SSE42-NEXT: paddw %xmm8, %xmm7
581 ; SSE42-NEXT: pcmpeqw %xmm4, %xmm1
582 ; SSE42-NEXT: psrld $16, %xmm1
583 ; SSE42-NEXT: pand %xmm7, %xmm1
584 ; SSE42-NEXT: psrld $16, %xmm7
585 ; SSE42-NEXT: paddd %xmm1, %xmm7
586 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm7[0]
587 ; SSE42-NEXT: movdqa %xmm5, %xmm7
588 ; SSE42-NEXT: pshufb %xmm2, %xmm7
589 ; SSE42-NEXT: movdqa %xmm2, %xmm1
590 ; SSE42-NEXT: psrlw $4, %xmm1
591 ; SSE42-NEXT: pand %xmm6, %xmm1
592 ; SSE42-NEXT: movdqa %xmm5, %xmm8
593 ; SSE42-NEXT: pshufb %xmm1, %xmm8
594 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm1
595 ; SSE42-NEXT: pand %xmm7, %xmm1
596 ; SSE42-NEXT: paddb %xmm8, %xmm1
597 ; SSE42-NEXT: movdqa %xmm2, %xmm7
598 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm7
599 ; SSE42-NEXT: psrlw $8, %xmm7
600 ; SSE42-NEXT: pand %xmm1, %xmm7
601 ; SSE42-NEXT: psrlw $8, %xmm1
602 ; SSE42-NEXT: paddw %xmm7, %xmm1
603 ; SSE42-NEXT: pcmpeqw %xmm4, %xmm2
604 ; SSE42-NEXT: psrld $16, %xmm2
605 ; SSE42-NEXT: pand %xmm1, %xmm2
606 ; SSE42-NEXT: psrld $16, %xmm1
607 ; SSE42-NEXT: paddd %xmm2, %xmm1
608 ; SSE42-NEXT: movdqa %xmm5, %xmm7
609 ; SSE42-NEXT: pshufb %xmm3, %xmm7
610 ; SSE42-NEXT: movdqa %xmm3, %xmm2
611 ; SSE42-NEXT: psrlw $4, %xmm2
612 ; SSE42-NEXT: pand %xmm6, %xmm2
613 ; SSE42-NEXT: pshufb %xmm2, %xmm5
614 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm2
615 ; SSE42-NEXT: pand %xmm7, %xmm2
616 ; SSE42-NEXT: paddb %xmm5, %xmm2
617 ; SSE42-NEXT: movdqa %xmm3, %xmm5
618 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm5
619 ; SSE42-NEXT: psrlw $8, %xmm5
620 ; SSE42-NEXT: pand %xmm2, %xmm5
621 ; SSE42-NEXT: psrlw $8, %xmm2
622 ; SSE42-NEXT: paddw %xmm5, %xmm2
623 ; SSE42-NEXT: pcmpeqw %xmm4, %xmm3
624 ; SSE42-NEXT: psrld $16, %xmm3
625 ; SSE42-NEXT: pand %xmm2, %xmm3
626 ; SSE42-NEXT: psrld $16, %xmm2
627 ; SSE42-NEXT: paddd %xmm3, %xmm2
628 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
631 ; AVX2-LABEL: widen_ctlz_v2i32_v8i32:
633 ; AVX2-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1
634 ; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
635 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm5 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
636 ; AVX2-NEXT: vpshufb %xmm0, %xmm5, %xmm4
637 ; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm6
638 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm7 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
639 ; AVX2-NEXT: vpand %xmm7, %xmm6, %xmm8
640 ; AVX2-NEXT: vpxor %xmm6, %xmm6, %xmm6
641 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm8, %xmm9
642 ; AVX2-NEXT: vpand %xmm4, %xmm9, %xmm4
643 ; AVX2-NEXT: vpshufb %xmm8, %xmm5, %xmm8
644 ; AVX2-NEXT: vpaddb %xmm4, %xmm8, %xmm4
645 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm0, %xmm8
646 ; AVX2-NEXT: vpsrlw $8, %xmm8, %xmm8
647 ; AVX2-NEXT: vpand %xmm4, %xmm8, %xmm8
648 ; AVX2-NEXT: vpsrlw $8, %xmm4, %xmm4
649 ; AVX2-NEXT: vpaddw %xmm4, %xmm8, %xmm4
650 ; AVX2-NEXT: vpshufb %xmm1, %xmm5, %xmm8
651 ; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm9
652 ; AVX2-NEXT: vpand %xmm7, %xmm9, %xmm9
653 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm9, %xmm10
654 ; AVX2-NEXT: vpand %xmm10, %xmm8, %xmm8
655 ; AVX2-NEXT: vpshufb %xmm9, %xmm5, %xmm9
656 ; AVX2-NEXT: vpaddb %xmm9, %xmm8, %xmm8
657 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm1, %xmm9
658 ; AVX2-NEXT: vpsrlw $8, %xmm9, %xmm9
659 ; AVX2-NEXT: vpand %xmm9, %xmm8, %xmm9
660 ; AVX2-NEXT: vpsrlw $8, %xmm8, %xmm8
661 ; AVX2-NEXT: vpaddw %xmm9, %xmm8, %xmm8
662 ; AVX2-NEXT: vpshufb %xmm2, %xmm5, %xmm9
663 ; AVX2-NEXT: vpsrlw $4, %xmm2, %xmm10
664 ; AVX2-NEXT: vpand %xmm7, %xmm10, %xmm10
665 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm10, %xmm11
666 ; AVX2-NEXT: vpand %xmm11, %xmm9, %xmm9
667 ; AVX2-NEXT: vpshufb %xmm10, %xmm5, %xmm10
668 ; AVX2-NEXT: vpaddb %xmm10, %xmm9, %xmm9
669 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm10
670 ; AVX2-NEXT: vpsrlw $8, %xmm10, %xmm10
671 ; AVX2-NEXT: vpand %xmm10, %xmm9, %xmm10
672 ; AVX2-NEXT: vpsrlw $8, %xmm9, %xmm9
673 ; AVX2-NEXT: vpaddw %xmm10, %xmm9, %xmm9
674 ; AVX2-NEXT: vpshufb %xmm3, %xmm5, %xmm10
675 ; AVX2-NEXT: vpsrlw $4, %xmm3, %xmm11
676 ; AVX2-NEXT: vpand %xmm7, %xmm11, %xmm7
677 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm7, %xmm11
678 ; AVX2-NEXT: vpand %xmm11, %xmm10, %xmm10
679 ; AVX2-NEXT: vpshufb %xmm7, %xmm5, %xmm5
680 ; AVX2-NEXT: vpaddb %xmm5, %xmm10, %xmm5
681 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm3, %xmm6
682 ; AVX2-NEXT: vpsrlw $8, %xmm6, %xmm6
683 ; AVX2-NEXT: vpand %xmm6, %xmm5, %xmm6
684 ; AVX2-NEXT: vpsrlw $8, %xmm5, %xmm5
685 ; AVX2-NEXT: vpaddw %xmm6, %xmm5, %xmm5
686 ; AVX2-NEXT: vinserti128 $1, %xmm5, %ymm8, %ymm5
687 ; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
688 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
689 ; AVX2-NEXT: vpcmpeqw %ymm3, %ymm1, %ymm1
690 ; AVX2-NEXT: vpsrld $16, %ymm1, %ymm1
691 ; AVX2-NEXT: vpand %ymm1, %ymm5, %ymm1
692 ; AVX2-NEXT: vpsrld $16, %ymm5, %ymm5
693 ; AVX2-NEXT: vpaddd %ymm1, %ymm5, %ymm1
694 ; AVX2-NEXT: vinserti128 $1, %xmm9, %ymm4, %ymm4
695 ; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
696 ; AVX2-NEXT: vpcmpeqw %ymm3, %ymm0, %ymm0
697 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
698 ; AVX2-NEXT: vpand %ymm0, %ymm4, %ymm0
699 ; AVX2-NEXT: vpsrld $16, %ymm4, %ymm2
700 ; AVX2-NEXT: vpaddd %ymm0, %ymm2, %ymm0
701 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
704 ; AVX512-LABEL: widen_ctlz_v2i32_v8i32:
706 ; AVX512-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1
707 ; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
708 ; AVX512-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
709 ; AVX512-NEXT: vplzcntd %ymm1, %ymm1
710 ; AVX512-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
711 ; AVX512-NEXT: vplzcntd %ymm0, %ymm0
712 ; AVX512-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
714 %b0 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a0, i1 0)
715 %b1 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a1, i1 0)
716 %b2 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a2, i1 0)
717 %b3 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a3, i1 0)
718 %res01 = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
719 %res23 = shufflevector <2 x i32> %b2, <2 x i32> %b3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
720 %res = shufflevector <4 x i32> %res01, <4 x i32> %res23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
728 define <4 x i32> @widen_ctlz_undef_v2i32_v4i32(<2 x i32> %a0, <2 x i32> %a1) {
729 ; SSE42-LABEL: widen_ctlz_undef_v2i32_v4i32:
731 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
732 ; SSE42-NEXT: movdqa %xmm3, %xmm6
733 ; SSE42-NEXT: pshufb %xmm0, %xmm6
734 ; SSE42-NEXT: movdqa %xmm0, %xmm5
735 ; SSE42-NEXT: psrlw $4, %xmm5
736 ; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
737 ; SSE42-NEXT: pand %xmm4, %xmm5
738 ; SSE42-NEXT: pxor %xmm2, %xmm2
739 ; SSE42-NEXT: movdqa %xmm3, %xmm7
740 ; SSE42-NEXT: pshufb %xmm5, %xmm7
741 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm5
742 ; SSE42-NEXT: pand %xmm6, %xmm5
743 ; SSE42-NEXT: paddb %xmm7, %xmm5
744 ; SSE42-NEXT: movdqa %xmm0, %xmm6
745 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm6
746 ; SSE42-NEXT: psrlw $8, %xmm6
747 ; SSE42-NEXT: pand %xmm5, %xmm6
748 ; SSE42-NEXT: psrlw $8, %xmm5
749 ; SSE42-NEXT: paddw %xmm6, %xmm5
750 ; SSE42-NEXT: pcmpeqw %xmm2, %xmm0
751 ; SSE42-NEXT: psrld $16, %xmm0
752 ; SSE42-NEXT: pand %xmm5, %xmm0
753 ; SSE42-NEXT: psrld $16, %xmm5
754 ; SSE42-NEXT: paddd %xmm5, %xmm0
755 ; SSE42-NEXT: movdqa %xmm3, %xmm6
756 ; SSE42-NEXT: pshufb %xmm1, %xmm6
757 ; SSE42-NEXT: movdqa %xmm1, %xmm5
758 ; SSE42-NEXT: psrlw $4, %xmm5
759 ; SSE42-NEXT: pand %xmm4, %xmm5
760 ; SSE42-NEXT: pshufb %xmm5, %xmm3
761 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm5
762 ; SSE42-NEXT: pand %xmm6, %xmm5
763 ; SSE42-NEXT: paddb %xmm3, %xmm5
764 ; SSE42-NEXT: movdqa %xmm1, %xmm3
765 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm3
766 ; SSE42-NEXT: psrlw $8, %xmm3
767 ; SSE42-NEXT: pand %xmm5, %xmm3
768 ; SSE42-NEXT: psrlw $8, %xmm5
769 ; SSE42-NEXT: paddw %xmm3, %xmm5
770 ; SSE42-NEXT: pcmpeqw %xmm2, %xmm1
771 ; SSE42-NEXT: psrld $16, %xmm1
772 ; SSE42-NEXT: pand %xmm5, %xmm1
773 ; SSE42-NEXT: psrld $16, %xmm5
774 ; SSE42-NEXT: paddd %xmm1, %xmm5
775 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]
778 ; AVX2-LABEL: widen_ctlz_undef_v2i32_v4i32:
780 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
781 ; AVX2-NEXT: vpshufb %xmm0, %xmm2, %xmm3
782 ; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm4
783 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
784 ; AVX2-NEXT: vpand %xmm5, %xmm4, %xmm4
785 ; AVX2-NEXT: vpxor %xmm6, %xmm6, %xmm6
786 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm4, %xmm7
787 ; AVX2-NEXT: vpand %xmm7, %xmm3, %xmm3
788 ; AVX2-NEXT: vpshufb %xmm4, %xmm2, %xmm4
789 ; AVX2-NEXT: vpaddb %xmm4, %xmm3, %xmm3
790 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm0, %xmm4
791 ; AVX2-NEXT: vpsrlw $8, %xmm4, %xmm4
792 ; AVX2-NEXT: vpand %xmm4, %xmm3, %xmm4
793 ; AVX2-NEXT: vpsrlw $8, %xmm3, %xmm3
794 ; AVX2-NEXT: vpaddw %xmm4, %xmm3, %xmm3
795 ; AVX2-NEXT: vpcmpeqw %xmm6, %xmm0, %xmm0
796 ; AVX2-NEXT: vpsrld $16, %xmm0, %xmm0
797 ; AVX2-NEXT: vpand %xmm0, %xmm3, %xmm0
798 ; AVX2-NEXT: vpsrld $16, %xmm3, %xmm3
799 ; AVX2-NEXT: vpaddd %xmm0, %xmm3, %xmm0
800 ; AVX2-NEXT: vpshufb %xmm1, %xmm2, %xmm3
801 ; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm4
802 ; AVX2-NEXT: vpand %xmm5, %xmm4, %xmm4
803 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm4, %xmm5
804 ; AVX2-NEXT: vpand %xmm5, %xmm3, %xmm3
805 ; AVX2-NEXT: vpshufb %xmm4, %xmm2, %xmm2
806 ; AVX2-NEXT: vpaddb %xmm2, %xmm3, %xmm2
807 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm1, %xmm3
808 ; AVX2-NEXT: vpsrlw $8, %xmm3, %xmm3
809 ; AVX2-NEXT: vpand %xmm3, %xmm2, %xmm3
810 ; AVX2-NEXT: vpsrlw $8, %xmm2, %xmm2
811 ; AVX2-NEXT: vpaddw %xmm3, %xmm2, %xmm2
812 ; AVX2-NEXT: vpcmpeqw %xmm6, %xmm1, %xmm1
813 ; AVX2-NEXT: vpsrld $16, %xmm1, %xmm1
814 ; AVX2-NEXT: vpand %xmm1, %xmm2, %xmm1
815 ; AVX2-NEXT: vpsrld $16, %xmm2, %xmm2
816 ; AVX2-NEXT: vpaddd %xmm1, %xmm2, %xmm1
817 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
820 ; AVX512-LABEL: widen_ctlz_undef_v2i32_v4i32:
822 ; AVX512-NEXT: vplzcntd %xmm0, %xmm0
823 ; AVX512-NEXT: vplzcntd %xmm1, %xmm1
824 ; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
826 %b0 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a0, i1 1)
827 %b1 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a1, i1 1)
828 %res = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
832 define <8 x i32> @widen_ctlz_undef_v4i32_v8i32(<4 x i32> %a0, <4 x i32> %a1) {
833 ; SSE42-LABEL: widen_ctlz_undef_v4i32_v8i32:
835 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
836 ; SSE42-NEXT: movdqa %xmm3, %xmm6
837 ; SSE42-NEXT: pshufb %xmm0, %xmm6
838 ; SSE42-NEXT: movdqa %xmm0, %xmm5
839 ; SSE42-NEXT: psrlw $4, %xmm5
840 ; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
841 ; SSE42-NEXT: pand %xmm4, %xmm5
842 ; SSE42-NEXT: pxor %xmm2, %xmm2
843 ; SSE42-NEXT: movdqa %xmm3, %xmm7
844 ; SSE42-NEXT: pshufb %xmm5, %xmm7
845 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm5
846 ; SSE42-NEXT: pand %xmm6, %xmm5
847 ; SSE42-NEXT: paddb %xmm7, %xmm5
848 ; SSE42-NEXT: movdqa %xmm0, %xmm6
849 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm6
850 ; SSE42-NEXT: psrlw $8, %xmm6
851 ; SSE42-NEXT: pand %xmm5, %xmm6
852 ; SSE42-NEXT: psrlw $8, %xmm5
853 ; SSE42-NEXT: paddw %xmm6, %xmm5
854 ; SSE42-NEXT: pcmpeqw %xmm2, %xmm0
855 ; SSE42-NEXT: psrld $16, %xmm0
856 ; SSE42-NEXT: pand %xmm5, %xmm0
857 ; SSE42-NEXT: psrld $16, %xmm5
858 ; SSE42-NEXT: paddd %xmm5, %xmm0
859 ; SSE42-NEXT: movdqa %xmm3, %xmm5
860 ; SSE42-NEXT: pshufb %xmm1, %xmm5
861 ; SSE42-NEXT: movdqa %xmm1, %xmm6
862 ; SSE42-NEXT: psrlw $4, %xmm6
863 ; SSE42-NEXT: pand %xmm4, %xmm6
864 ; SSE42-NEXT: pshufb %xmm6, %xmm3
865 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm6
866 ; SSE42-NEXT: pand %xmm5, %xmm6
867 ; SSE42-NEXT: paddb %xmm3, %xmm6
868 ; SSE42-NEXT: movdqa %xmm1, %xmm3
869 ; SSE42-NEXT: pcmpeqb %xmm2, %xmm3
870 ; SSE42-NEXT: psrlw $8, %xmm3
871 ; SSE42-NEXT: pand %xmm6, %xmm3
872 ; SSE42-NEXT: psrlw $8, %xmm6
873 ; SSE42-NEXT: paddw %xmm3, %xmm6
874 ; SSE42-NEXT: pcmpeqw %xmm2, %xmm1
875 ; SSE42-NEXT: psrld $16, %xmm1
876 ; SSE42-NEXT: pand %xmm6, %xmm1
877 ; SSE42-NEXT: psrld $16, %xmm6
878 ; SSE42-NEXT: paddd %xmm6, %xmm1
881 ; AVX2-LABEL: widen_ctlz_undef_v4i32_v8i32:
883 ; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
884 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
885 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
886 ; AVX2-NEXT: # ymm1 = mem[0,1,0,1]
887 ; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm2
888 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm3
889 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
890 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
891 ; AVX2-NEXT: vpcmpeqb %ymm4, %ymm3, %ymm5
892 ; AVX2-NEXT: vpand %ymm5, %ymm2, %ymm2
893 ; AVX2-NEXT: vpshufb %ymm3, %ymm1, %ymm1
894 ; AVX2-NEXT: vpaddb %ymm1, %ymm2, %ymm1
895 ; AVX2-NEXT: vpcmpeqb %ymm4, %ymm0, %ymm2
896 ; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2
897 ; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm2
898 ; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm1
899 ; AVX2-NEXT: vpaddw %ymm2, %ymm1, %ymm1
900 ; AVX2-NEXT: vpcmpeqw %ymm4, %ymm0, %ymm0
901 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
902 ; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0
903 ; AVX2-NEXT: vpsrld $16, %ymm1, %ymm1
904 ; AVX2-NEXT: vpaddd %ymm0, %ymm1, %ymm0
907 ; AVX512-LABEL: widen_ctlz_undef_v4i32_v8i32:
909 ; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
910 ; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
911 ; AVX512-NEXT: vplzcntd %ymm0, %ymm0
913 %b0 = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a0, i1 1)
914 %b1 = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a1, i1 1)
915 %res = shufflevector <4 x i32> %b0, <4 x i32> %b1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
919 define <8 x i32> @widen_ctlz_undef_v2i32_v8i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32> %a2, <2 x i32> %a3) {
920 ; SSE42-LABEL: widen_ctlz_undef_v2i32_v8i32:
922 ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
923 ; SSE42-NEXT: movdqa %xmm5, %xmm8
924 ; SSE42-NEXT: pshufb %xmm0, %xmm8
925 ; SSE42-NEXT: movdqa %xmm0, %xmm7
926 ; SSE42-NEXT: psrlw $4, %xmm7
927 ; SSE42-NEXT: movdqa {{.*#+}} xmm6 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
928 ; SSE42-NEXT: pand %xmm6, %xmm7
929 ; SSE42-NEXT: pxor %xmm4, %xmm4
930 ; SSE42-NEXT: movdqa %xmm5, %xmm9
931 ; SSE42-NEXT: pshufb %xmm7, %xmm9
932 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm7
933 ; SSE42-NEXT: pand %xmm8, %xmm7
934 ; SSE42-NEXT: paddb %xmm9, %xmm7
935 ; SSE42-NEXT: movdqa %xmm0, %xmm8
936 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm8
937 ; SSE42-NEXT: psrlw $8, %xmm8
938 ; SSE42-NEXT: pand %xmm7, %xmm8
939 ; SSE42-NEXT: psrlw $8, %xmm7
940 ; SSE42-NEXT: paddw %xmm8, %xmm7
941 ; SSE42-NEXT: pcmpeqw %xmm4, %xmm0
942 ; SSE42-NEXT: psrld $16, %xmm0
943 ; SSE42-NEXT: pand %xmm7, %xmm0
944 ; SSE42-NEXT: psrld $16, %xmm7
945 ; SSE42-NEXT: paddd %xmm7, %xmm0
946 ; SSE42-NEXT: movdqa %xmm5, %xmm8
947 ; SSE42-NEXT: pshufb %xmm1, %xmm8
948 ; SSE42-NEXT: movdqa %xmm1, %xmm7
949 ; SSE42-NEXT: psrlw $4, %xmm7
950 ; SSE42-NEXT: pand %xmm6, %xmm7
951 ; SSE42-NEXT: movdqa %xmm5, %xmm9
952 ; SSE42-NEXT: pshufb %xmm7, %xmm9
953 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm7
954 ; SSE42-NEXT: pand %xmm8, %xmm7
955 ; SSE42-NEXT: paddb %xmm9, %xmm7
956 ; SSE42-NEXT: movdqa %xmm1, %xmm8
957 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm8
958 ; SSE42-NEXT: psrlw $8, %xmm8
959 ; SSE42-NEXT: pand %xmm7, %xmm8
960 ; SSE42-NEXT: psrlw $8, %xmm7
961 ; SSE42-NEXT: paddw %xmm8, %xmm7
962 ; SSE42-NEXT: pcmpeqw %xmm4, %xmm1
963 ; SSE42-NEXT: psrld $16, %xmm1
964 ; SSE42-NEXT: pand %xmm7, %xmm1
965 ; SSE42-NEXT: psrld $16, %xmm7
966 ; SSE42-NEXT: paddd %xmm1, %xmm7
967 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm7[0]
968 ; SSE42-NEXT: movdqa %xmm5, %xmm7
969 ; SSE42-NEXT: pshufb %xmm2, %xmm7
970 ; SSE42-NEXT: movdqa %xmm2, %xmm1
971 ; SSE42-NEXT: psrlw $4, %xmm1
972 ; SSE42-NEXT: pand %xmm6, %xmm1
973 ; SSE42-NEXT: movdqa %xmm5, %xmm8
974 ; SSE42-NEXT: pshufb %xmm1, %xmm8
975 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm1
976 ; SSE42-NEXT: pand %xmm7, %xmm1
977 ; SSE42-NEXT: paddb %xmm8, %xmm1
978 ; SSE42-NEXT: movdqa %xmm2, %xmm7
979 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm7
980 ; SSE42-NEXT: psrlw $8, %xmm7
981 ; SSE42-NEXT: pand %xmm1, %xmm7
982 ; SSE42-NEXT: psrlw $8, %xmm1
983 ; SSE42-NEXT: paddw %xmm7, %xmm1
984 ; SSE42-NEXT: pcmpeqw %xmm4, %xmm2
985 ; SSE42-NEXT: psrld $16, %xmm2
986 ; SSE42-NEXT: pand %xmm1, %xmm2
987 ; SSE42-NEXT: psrld $16, %xmm1
988 ; SSE42-NEXT: paddd %xmm2, %xmm1
989 ; SSE42-NEXT: movdqa %xmm5, %xmm7
990 ; SSE42-NEXT: pshufb %xmm3, %xmm7
991 ; SSE42-NEXT: movdqa %xmm3, %xmm2
992 ; SSE42-NEXT: psrlw $4, %xmm2
993 ; SSE42-NEXT: pand %xmm6, %xmm2
994 ; SSE42-NEXT: pshufb %xmm2, %xmm5
995 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm2
996 ; SSE42-NEXT: pand %xmm7, %xmm2
997 ; SSE42-NEXT: paddb %xmm5, %xmm2
998 ; SSE42-NEXT: movdqa %xmm3, %xmm5
999 ; SSE42-NEXT: pcmpeqb %xmm4, %xmm5
1000 ; SSE42-NEXT: psrlw $8, %xmm5
1001 ; SSE42-NEXT: pand %xmm2, %xmm5
1002 ; SSE42-NEXT: psrlw $8, %xmm2
1003 ; SSE42-NEXT: paddw %xmm5, %xmm2
1004 ; SSE42-NEXT: pcmpeqw %xmm4, %xmm3
1005 ; SSE42-NEXT: psrld $16, %xmm3
1006 ; SSE42-NEXT: pand %xmm2, %xmm3
1007 ; SSE42-NEXT: psrld $16, %xmm2
1008 ; SSE42-NEXT: paddd %xmm3, %xmm2
1009 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1012 ; AVX2-LABEL: widen_ctlz_undef_v2i32_v8i32:
1014 ; AVX2-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1
1015 ; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1016 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm5 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1017 ; AVX2-NEXT: vpshufb %xmm0, %xmm5, %xmm4
1018 ; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm6
1019 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm7 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1020 ; AVX2-NEXT: vpand %xmm7, %xmm6, %xmm8
1021 ; AVX2-NEXT: vpxor %xmm6, %xmm6, %xmm6
1022 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm8, %xmm9
1023 ; AVX2-NEXT: vpand %xmm4, %xmm9, %xmm4
1024 ; AVX2-NEXT: vpshufb %xmm8, %xmm5, %xmm8
1025 ; AVX2-NEXT: vpaddb %xmm4, %xmm8, %xmm4
1026 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm0, %xmm8
1027 ; AVX2-NEXT: vpsrlw $8, %xmm8, %xmm8
1028 ; AVX2-NEXT: vpand %xmm4, %xmm8, %xmm8
1029 ; AVX2-NEXT: vpsrlw $8, %xmm4, %xmm4
1030 ; AVX2-NEXT: vpaddw %xmm4, %xmm8, %xmm4
1031 ; AVX2-NEXT: vpshufb %xmm1, %xmm5, %xmm8
1032 ; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm9
1033 ; AVX2-NEXT: vpand %xmm7, %xmm9, %xmm9
1034 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm9, %xmm10
1035 ; AVX2-NEXT: vpand %xmm10, %xmm8, %xmm8
1036 ; AVX2-NEXT: vpshufb %xmm9, %xmm5, %xmm9
1037 ; AVX2-NEXT: vpaddb %xmm9, %xmm8, %xmm8
1038 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm1, %xmm9
1039 ; AVX2-NEXT: vpsrlw $8, %xmm9, %xmm9
1040 ; AVX2-NEXT: vpand %xmm9, %xmm8, %xmm9
1041 ; AVX2-NEXT: vpsrlw $8, %xmm8, %xmm8
1042 ; AVX2-NEXT: vpaddw %xmm9, %xmm8, %xmm8
1043 ; AVX2-NEXT: vpshufb %xmm2, %xmm5, %xmm9
1044 ; AVX2-NEXT: vpsrlw $4, %xmm2, %xmm10
1045 ; AVX2-NEXT: vpand %xmm7, %xmm10, %xmm10
1046 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm10, %xmm11
1047 ; AVX2-NEXT: vpand %xmm11, %xmm9, %xmm9
1048 ; AVX2-NEXT: vpshufb %xmm10, %xmm5, %xmm10
1049 ; AVX2-NEXT: vpaddb %xmm10, %xmm9, %xmm9
1050 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm10
1051 ; AVX2-NEXT: vpsrlw $8, %xmm10, %xmm10
1052 ; AVX2-NEXT: vpand %xmm10, %xmm9, %xmm10
1053 ; AVX2-NEXT: vpsrlw $8, %xmm9, %xmm9
1054 ; AVX2-NEXT: vpaddw %xmm10, %xmm9, %xmm9
1055 ; AVX2-NEXT: vpshufb %xmm3, %xmm5, %xmm10
1056 ; AVX2-NEXT: vpsrlw $4, %xmm3, %xmm11
1057 ; AVX2-NEXT: vpand %xmm7, %xmm11, %xmm7
1058 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm7, %xmm11
1059 ; AVX2-NEXT: vpand %xmm11, %xmm10, %xmm10
1060 ; AVX2-NEXT: vpshufb %xmm7, %xmm5, %xmm5
1061 ; AVX2-NEXT: vpaddb %xmm5, %xmm10, %xmm5
1062 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm3, %xmm6
1063 ; AVX2-NEXT: vpsrlw $8, %xmm6, %xmm6
1064 ; AVX2-NEXT: vpand %xmm6, %xmm5, %xmm6
1065 ; AVX2-NEXT: vpsrlw $8, %xmm5, %xmm5
1066 ; AVX2-NEXT: vpaddw %xmm6, %xmm5, %xmm5
1067 ; AVX2-NEXT: vinserti128 $1, %xmm5, %ymm8, %ymm5
1068 ; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
1069 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
1070 ; AVX2-NEXT: vpcmpeqw %ymm3, %ymm1, %ymm1
1071 ; AVX2-NEXT: vpsrld $16, %ymm1, %ymm1
1072 ; AVX2-NEXT: vpand %ymm1, %ymm5, %ymm1
1073 ; AVX2-NEXT: vpsrld $16, %ymm5, %ymm5
1074 ; AVX2-NEXT: vpaddd %ymm1, %ymm5, %ymm1
1075 ; AVX2-NEXT: vinserti128 $1, %xmm9, %ymm4, %ymm4
1076 ; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
1077 ; AVX2-NEXT: vpcmpeqw %ymm3, %ymm0, %ymm0
1078 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
1079 ; AVX2-NEXT: vpand %ymm0, %ymm4, %ymm0
1080 ; AVX2-NEXT: vpsrld $16, %ymm4, %ymm2
1081 ; AVX2-NEXT: vpaddd %ymm0, %ymm2, %ymm0
1082 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
1085 ; AVX512-LABEL: widen_ctlz_undef_v2i32_v8i32:
1087 ; AVX512-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1
1088 ; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1089 ; AVX512-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
1090 ; AVX512-NEXT: vplzcntd %ymm1, %ymm1
1091 ; AVX512-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
1092 ; AVX512-NEXT: vplzcntd %ymm0, %ymm0
1093 ; AVX512-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
1095 %b0 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a0, i1 1)
1096 %b1 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a1, i1 1)
1097 %b2 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a2, i1 1)
1098 %b3 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a3, i1 1)
1099 %res01 = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1100 %res23 = shufflevector <2 x i32> %b2, <2 x i32> %b3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1101 %res = shufflevector <4 x i32> %res01, <4 x i32> %res23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1109 define <4 x i32> @widen_cttz_v2i32_v4i32(<2 x i32> %a0, <2 x i32> %a1) {
1110 ; SSE42-LABEL: widen_cttz_v2i32_v4i32:
1112 ; SSE42-NEXT: pcmpeqd %xmm2, %xmm2
1113 ; SSE42-NEXT: movdqa %xmm0, %xmm3
1114 ; SSE42-NEXT: paddd %xmm2, %xmm3
1115 ; SSE42-NEXT: pandn %xmm3, %xmm0
1116 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1117 ; SSE42-NEXT: movdqa %xmm0, %xmm4
1118 ; SSE42-NEXT: pand %xmm3, %xmm4
1119 ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1120 ; SSE42-NEXT: movdqa %xmm5, %xmm6
1121 ; SSE42-NEXT: pshufb %xmm4, %xmm6
1122 ; SSE42-NEXT: psrlw $4, %xmm0
1123 ; SSE42-NEXT: pand %xmm3, %xmm0
1124 ; SSE42-NEXT: movdqa %xmm5, %xmm4
1125 ; SSE42-NEXT: pshufb %xmm0, %xmm4
1126 ; SSE42-NEXT: paddb %xmm6, %xmm4
1127 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm4[0],zero,xmm4[1],zero
1128 ; SSE42-NEXT: pxor %xmm4, %xmm4
1129 ; SSE42-NEXT: psadbw %xmm4, %xmm0
1130 ; SSE42-NEXT: paddd %xmm1, %xmm2
1131 ; SSE42-NEXT: pandn %xmm2, %xmm1
1132 ; SSE42-NEXT: movdqa %xmm1, %xmm2
1133 ; SSE42-NEXT: pand %xmm3, %xmm2
1134 ; SSE42-NEXT: movdqa %xmm5, %xmm6
1135 ; SSE42-NEXT: pshufb %xmm2, %xmm6
1136 ; SSE42-NEXT: psrlw $4, %xmm1
1137 ; SSE42-NEXT: pand %xmm3, %xmm1
1138 ; SSE42-NEXT: pshufb %xmm1, %xmm5
1139 ; SSE42-NEXT: paddb %xmm6, %xmm5
1140 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm5[0],zero,xmm5[1],zero
1141 ; SSE42-NEXT: psadbw %xmm4, %xmm1
1142 ; SSE42-NEXT: packuswb %xmm1, %xmm0
1145 ; AVX2-LABEL: widen_cttz_v2i32_v4i32:
1147 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1148 ; AVX2-NEXT: vpaddd %xmm2, %xmm0, %xmm3
1149 ; AVX2-NEXT: vpandn %xmm3, %xmm0, %xmm0
1150 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1151 ; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm4
1152 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1153 ; AVX2-NEXT: vpshufb %xmm4, %xmm5, %xmm4
1154 ; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0
1155 ; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0
1156 ; AVX2-NEXT: vpshufb %xmm0, %xmm5, %xmm0
1157 ; AVX2-NEXT: vpaddb %xmm4, %xmm0, %xmm0
1158 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1159 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
1160 ; AVX2-NEXT: vpsadbw %xmm4, %xmm0, %xmm0
1161 ; AVX2-NEXT: vpaddd %xmm2, %xmm1, %xmm2
1162 ; AVX2-NEXT: vpandn %xmm2, %xmm1, %xmm1
1163 ; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm2
1164 ; AVX2-NEXT: vpshufb %xmm2, %xmm5, %xmm2
1165 ; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm1
1166 ; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1
1167 ; AVX2-NEXT: vpshufb %xmm1, %xmm5, %xmm1
1168 ; AVX2-NEXT: vpaddb %xmm2, %xmm1, %xmm1
1169 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
1170 ; AVX2-NEXT: vpsadbw %xmm4, %xmm1, %xmm1
1171 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
1174 ; AVX512VL-LABEL: widen_cttz_v2i32_v4i32:
1175 ; AVX512VL: # %bb.0:
1176 ; AVX512VL-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1177 ; AVX512VL-NEXT: vpaddd %xmm2, %xmm0, %xmm3
1178 ; AVX512VL-NEXT: vpandn %xmm3, %xmm0, %xmm0
1179 ; AVX512VL-NEXT: vplzcntd %xmm0, %xmm0
1180 ; AVX512VL-NEXT: vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]
1181 ; AVX512VL-NEXT: vpaddd %xmm2, %xmm1, %xmm2
1182 ; AVX512VL-NEXT: vpandn %xmm2, %xmm1, %xmm1
1183 ; AVX512VL-NEXT: vplzcntd %xmm1, %xmm1
1184 ; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1185 ; AVX512VL-NEXT: vpsubd %xmm0, %xmm3, %xmm0
1186 ; AVX512VL-NEXT: retq
1188 ; AVX512VPOPCNT-LABEL: widen_cttz_v2i32_v4i32:
1189 ; AVX512VPOPCNT: # %bb.0:
1190 ; AVX512VPOPCNT-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1191 ; AVX512VPOPCNT-NEXT: vpaddd %xmm2, %xmm0, %xmm3
1192 ; AVX512VPOPCNT-NEXT: vpandn %xmm3, %xmm0, %xmm0
1193 ; AVX512VPOPCNT-NEXT: vpopcntd %xmm0, %xmm0
1194 ; AVX512VPOPCNT-NEXT: vpaddd %xmm2, %xmm1, %xmm2
1195 ; AVX512VPOPCNT-NEXT: vpandn %xmm2, %xmm1, %xmm1
1196 ; AVX512VPOPCNT-NEXT: vpopcntd %xmm1, %xmm1
1197 ; AVX512VPOPCNT-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1198 ; AVX512VPOPCNT-NEXT: retq
1199 %b0 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a0, i1 0)
1200 %b1 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a1, i1 0)
1201 %res = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1205 define <8 x i32> @widen_cttz_v4i32_v8i32(<4 x i32> %a0, <4 x i32> %a1) {
1206 ; SSE42-LABEL: widen_cttz_v4i32_v8i32:
1208 ; SSE42-NEXT: pcmpeqd %xmm4, %xmm4
1209 ; SSE42-NEXT: movdqa %xmm0, %xmm2
1210 ; SSE42-NEXT: paddd %xmm4, %xmm2
1211 ; SSE42-NEXT: pandn %xmm2, %xmm0
1212 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1213 ; SSE42-NEXT: movdqa %xmm0, %xmm5
1214 ; SSE42-NEXT: pand %xmm3, %xmm5
1215 ; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1216 ; SSE42-NEXT: movdqa %xmm2, %xmm6
1217 ; SSE42-NEXT: pshufb %xmm5, %xmm6
1218 ; SSE42-NEXT: psrlw $4, %xmm0
1219 ; SSE42-NEXT: pand %xmm3, %xmm0
1220 ; SSE42-NEXT: movdqa %xmm2, %xmm5
1221 ; SSE42-NEXT: pshufb %xmm0, %xmm5
1222 ; SSE42-NEXT: paddb %xmm6, %xmm5
1223 ; SSE42-NEXT: pxor %xmm6, %xmm6
1224 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm5[0],zero,xmm5[1],zero
1225 ; SSE42-NEXT: punpckhdq {{.*#+}} xmm5 = xmm5[2],xmm6[2],xmm5[3],xmm6[3]
1226 ; SSE42-NEXT: psadbw %xmm6, %xmm5
1227 ; SSE42-NEXT: psadbw %xmm6, %xmm0
1228 ; SSE42-NEXT: packuswb %xmm5, %xmm0
1229 ; SSE42-NEXT: paddd %xmm1, %xmm4
1230 ; SSE42-NEXT: pandn %xmm4, %xmm1
1231 ; SSE42-NEXT: movdqa %xmm1, %xmm4
1232 ; SSE42-NEXT: pand %xmm3, %xmm4
1233 ; SSE42-NEXT: movdqa %xmm2, %xmm5
1234 ; SSE42-NEXT: pshufb %xmm4, %xmm5
1235 ; SSE42-NEXT: psrlw $4, %xmm1
1236 ; SSE42-NEXT: pand %xmm3, %xmm1
1237 ; SSE42-NEXT: pshufb %xmm1, %xmm2
1238 ; SSE42-NEXT: paddb %xmm5, %xmm2
1239 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero
1240 ; SSE42-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm6[2],xmm2[3],xmm6[3]
1241 ; SSE42-NEXT: psadbw %xmm6, %xmm2
1242 ; SSE42-NEXT: psadbw %xmm6, %xmm1
1243 ; SSE42-NEXT: packuswb %xmm2, %xmm1
1246 ; AVX2-LABEL: widen_cttz_v4i32_v8i32:
1248 ; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1249 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1250 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1251 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1
1252 ; AVX2-NEXT: vpandn %ymm1, %ymm0, %ymm0
1253 ; 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]
1254 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
1255 ; 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]
1256 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
1257 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
1258 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
1259 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
1260 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
1261 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
1262 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1263 ; AVX2-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
1264 ; AVX2-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
1265 ; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
1266 ; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
1267 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
1270 ; AVX512VL-LABEL: widen_cttz_v4i32_v8i32:
1271 ; AVX512VL: # %bb.0:
1272 ; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1273 ; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1274 ; AVX512VL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1275 ; AVX512VL-NEXT: vpaddd %ymm1, %ymm0, %ymm1
1276 ; AVX512VL-NEXT: vpandn %ymm1, %ymm0, %ymm0
1277 ; AVX512VL-NEXT: vplzcntd %ymm0, %ymm0
1278 ; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]
1279 ; AVX512VL-NEXT: vpsubd %ymm0, %ymm1, %ymm0
1280 ; AVX512VL-NEXT: retq
1282 ; AVX512VPOPCNT-LABEL: widen_cttz_v4i32_v8i32:
1283 ; AVX512VPOPCNT: # %bb.0:
1284 ; AVX512VPOPCNT-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1285 ; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1286 ; AVX512VPOPCNT-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1287 ; AVX512VPOPCNT-NEXT: vpaddd %ymm1, %ymm0, %ymm1
1288 ; AVX512VPOPCNT-NEXT: vpandn %ymm1, %ymm0, %ymm0
1289 ; AVX512VPOPCNT-NEXT: vpopcntd %ymm0, %ymm0
1290 ; AVX512VPOPCNT-NEXT: retq
1291 %b0 = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %a0, i1 0)
1292 %b1 = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %a1, i1 0)
1293 %res = shufflevector <4 x i32> %b0, <4 x i32> %b1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1297 define <8 x i32> @widen_cttz_v2i32_v8i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32> %a2, <2 x i32> %a3) {
1298 ; SSE42-LABEL: widen_cttz_v2i32_v8i32:
1300 ; SSE42-NEXT: pcmpeqd %xmm6, %xmm6
1301 ; SSE42-NEXT: movdqa %xmm0, %xmm4
1302 ; SSE42-NEXT: paddd %xmm6, %xmm4
1303 ; SSE42-NEXT: pandn %xmm4, %xmm0
1304 ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1305 ; SSE42-NEXT: movdqa %xmm0, %xmm7
1306 ; SSE42-NEXT: pand %xmm5, %xmm7
1307 ; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1308 ; SSE42-NEXT: movdqa %xmm4, %xmm8
1309 ; SSE42-NEXT: pshufb %xmm7, %xmm8
1310 ; SSE42-NEXT: psrlw $4, %xmm0
1311 ; SSE42-NEXT: pand %xmm5, %xmm0
1312 ; SSE42-NEXT: movdqa %xmm4, %xmm7
1313 ; SSE42-NEXT: pshufb %xmm0, %xmm7
1314 ; SSE42-NEXT: paddb %xmm8, %xmm7
1315 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm7[0],zero,xmm7[1],zero
1316 ; SSE42-NEXT: pxor %xmm7, %xmm7
1317 ; SSE42-NEXT: psadbw %xmm7, %xmm0
1318 ; SSE42-NEXT: movdqa %xmm1, %xmm8
1319 ; SSE42-NEXT: paddd %xmm6, %xmm8
1320 ; SSE42-NEXT: pandn %xmm8, %xmm1
1321 ; SSE42-NEXT: movdqa %xmm1, %xmm8
1322 ; SSE42-NEXT: pand %xmm5, %xmm8
1323 ; SSE42-NEXT: movdqa %xmm4, %xmm9
1324 ; SSE42-NEXT: pshufb %xmm8, %xmm9
1325 ; SSE42-NEXT: psrlw $4, %xmm1
1326 ; SSE42-NEXT: pand %xmm5, %xmm1
1327 ; SSE42-NEXT: movdqa %xmm4, %xmm8
1328 ; SSE42-NEXT: pshufb %xmm1, %xmm8
1329 ; SSE42-NEXT: paddb %xmm9, %xmm8
1330 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm8[0],zero,xmm8[1],zero
1331 ; SSE42-NEXT: psadbw %xmm7, %xmm1
1332 ; SSE42-NEXT: packuswb %xmm1, %xmm0
1333 ; SSE42-NEXT: movdqa %xmm2, %xmm1
1334 ; SSE42-NEXT: paddd %xmm6, %xmm1
1335 ; SSE42-NEXT: pandn %xmm1, %xmm2
1336 ; SSE42-NEXT: movdqa %xmm2, %xmm1
1337 ; SSE42-NEXT: pand %xmm5, %xmm1
1338 ; SSE42-NEXT: movdqa %xmm4, %xmm8
1339 ; SSE42-NEXT: pshufb %xmm1, %xmm8
1340 ; SSE42-NEXT: psrlw $4, %xmm2
1341 ; SSE42-NEXT: pand %xmm5, %xmm2
1342 ; SSE42-NEXT: movdqa %xmm4, %xmm1
1343 ; SSE42-NEXT: pshufb %xmm2, %xmm1
1344 ; SSE42-NEXT: paddb %xmm8, %xmm1
1345 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
1346 ; SSE42-NEXT: psadbw %xmm7, %xmm1
1347 ; SSE42-NEXT: paddd %xmm3, %xmm6
1348 ; SSE42-NEXT: pandn %xmm6, %xmm3
1349 ; SSE42-NEXT: movdqa %xmm3, %xmm2
1350 ; SSE42-NEXT: pand %xmm5, %xmm2
1351 ; SSE42-NEXT: movdqa %xmm4, %xmm6
1352 ; SSE42-NEXT: pshufb %xmm2, %xmm6
1353 ; SSE42-NEXT: psrlw $4, %xmm3
1354 ; SSE42-NEXT: pand %xmm5, %xmm3
1355 ; SSE42-NEXT: pshufb %xmm3, %xmm4
1356 ; SSE42-NEXT: paddb %xmm6, %xmm4
1357 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm2 = xmm4[0],zero,xmm4[1],zero
1358 ; SSE42-NEXT: psadbw %xmm7, %xmm2
1359 ; SSE42-NEXT: packuswb %xmm2, %xmm1
1362 ; AVX2-LABEL: widen_cttz_v2i32_v8i32:
1364 ; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
1365 ; AVX2-NEXT: vpaddd %xmm4, %xmm0, %xmm5
1366 ; AVX2-NEXT: vpandn %xmm5, %xmm0, %xmm0
1367 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1368 ; AVX2-NEXT: vpand %xmm5, %xmm0, %xmm6
1369 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm7 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1370 ; AVX2-NEXT: vpshufb %xmm6, %xmm7, %xmm6
1371 ; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0
1372 ; AVX2-NEXT: vpand %xmm5, %xmm0, %xmm0
1373 ; AVX2-NEXT: vpshufb %xmm0, %xmm7, %xmm0
1374 ; AVX2-NEXT: vpaddb %xmm6, %xmm0, %xmm0
1375 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1376 ; AVX2-NEXT: vpaddd %xmm4, %xmm1, %xmm6
1377 ; AVX2-NEXT: vpandn %xmm6, %xmm1, %xmm1
1378 ; AVX2-NEXT: vpand %xmm5, %xmm1, %xmm6
1379 ; AVX2-NEXT: vpshufb %xmm6, %xmm7, %xmm6
1380 ; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm1
1381 ; AVX2-NEXT: vpand %xmm5, %xmm1, %xmm1
1382 ; AVX2-NEXT: vpshufb %xmm1, %xmm7, %xmm1
1383 ; AVX2-NEXT: vpaddb %xmm6, %xmm1, %xmm1
1384 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
1385 ; AVX2-NEXT: vpaddd %xmm4, %xmm2, %xmm6
1386 ; AVX2-NEXT: vpandn %xmm6, %xmm2, %xmm2
1387 ; AVX2-NEXT: vpand %xmm5, %xmm2, %xmm6
1388 ; AVX2-NEXT: vpshufb %xmm6, %xmm7, %xmm6
1389 ; AVX2-NEXT: vpsrlw $4, %xmm2, %xmm2
1390 ; AVX2-NEXT: vpand %xmm5, %xmm2, %xmm2
1391 ; AVX2-NEXT: vpshufb %xmm2, %xmm7, %xmm2
1392 ; AVX2-NEXT: vpaddb %xmm6, %xmm2, %xmm2
1393 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
1394 ; AVX2-NEXT: vpaddd %xmm4, %xmm3, %xmm4
1395 ; AVX2-NEXT: vpandn %xmm4, %xmm3, %xmm3
1396 ; AVX2-NEXT: vpand %xmm5, %xmm3, %xmm4
1397 ; AVX2-NEXT: vpshufb %xmm4, %xmm7, %xmm4
1398 ; AVX2-NEXT: vpsrlw $4, %xmm3, %xmm3
1399 ; AVX2-NEXT: vpand %xmm5, %xmm3, %xmm3
1400 ; AVX2-NEXT: vpshufb %xmm3, %xmm7, %xmm3
1401 ; AVX2-NEXT: vpaddb %xmm4, %xmm3, %xmm3
1402 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
1403 ; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
1404 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
1405 ; AVX2-NEXT: vpsadbw %ymm3, %ymm1, %ymm1
1406 ; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
1407 ; AVX2-NEXT: vpsadbw %ymm3, %ymm0, %ymm0
1408 ; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0
1411 ; AVX512VL-LABEL: widen_cttz_v2i32_v8i32:
1412 ; AVX512VL: # %bb.0:
1413 ; AVX512VL-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1
1414 ; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1415 ; AVX512VL-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
1416 ; AVX512VL-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1417 ; AVX512VL-NEXT: vpaddd %ymm3, %ymm1, %ymm4
1418 ; AVX512VL-NEXT: vpandn %ymm4, %ymm1, %ymm1
1419 ; AVX512VL-NEXT: vplzcntd %ymm1, %ymm1
1420 ; AVX512VL-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
1421 ; AVX512VL-NEXT: vpaddd %ymm3, %ymm0, %ymm2
1422 ; AVX512VL-NEXT: vpandn %ymm2, %ymm0, %ymm0
1423 ; AVX512VL-NEXT: vplzcntd %ymm0, %ymm0
1424 ; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
1425 ; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]
1426 ; AVX512VL-NEXT: vpsubd %ymm0, %ymm1, %ymm0
1427 ; AVX512VL-NEXT: retq
1429 ; AVX512VPOPCNT-LABEL: widen_cttz_v2i32_v8i32:
1430 ; AVX512VPOPCNT: # %bb.0:
1431 ; AVX512VPOPCNT-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1
1432 ; AVX512VPOPCNT-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1433 ; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
1434 ; AVX512VPOPCNT-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1435 ; AVX512VPOPCNT-NEXT: vpaddd %ymm3, %ymm1, %ymm4
1436 ; AVX512VPOPCNT-NEXT: vpandn %ymm4, %ymm1, %ymm1
1437 ; AVX512VPOPCNT-NEXT: vpopcntd %ymm1, %ymm1
1438 ; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
1439 ; AVX512VPOPCNT-NEXT: vpaddd %ymm3, %ymm0, %ymm2
1440 ; AVX512VPOPCNT-NEXT: vpandn %ymm2, %ymm0, %ymm0
1441 ; AVX512VPOPCNT-NEXT: vpopcntd %ymm0, %ymm0
1442 ; AVX512VPOPCNT-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
1443 ; AVX512VPOPCNT-NEXT: retq
1444 %b0 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a0, i1 0)
1445 %b1 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a1, i1 0)
1446 %b2 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a2, i1 0)
1447 %b3 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a3, i1 0)
1448 %res01 = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1449 %res23 = shufflevector <2 x i32> %b2, <2 x i32> %b3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1450 %res = shufflevector <4 x i32> %res01, <4 x i32> %res23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1458 define <4 x i32> @widen_cttz_undef_v2i32_v4i32(<2 x i32> %a0, <2 x i32> %a1) {
1459 ; SSE42-LABEL: widen_cttz_undef_v2i32_v4i32:
1461 ; SSE42-NEXT: pcmpeqd %xmm2, %xmm2
1462 ; SSE42-NEXT: movdqa %xmm0, %xmm3
1463 ; SSE42-NEXT: paddd %xmm2, %xmm3
1464 ; SSE42-NEXT: pandn %xmm3, %xmm0
1465 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1466 ; SSE42-NEXT: movdqa %xmm0, %xmm4
1467 ; SSE42-NEXT: pand %xmm3, %xmm4
1468 ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1469 ; SSE42-NEXT: movdqa %xmm5, %xmm6
1470 ; SSE42-NEXT: pshufb %xmm4, %xmm6
1471 ; SSE42-NEXT: psrlw $4, %xmm0
1472 ; SSE42-NEXT: pand %xmm3, %xmm0
1473 ; SSE42-NEXT: movdqa %xmm5, %xmm4
1474 ; SSE42-NEXT: pshufb %xmm0, %xmm4
1475 ; SSE42-NEXT: paddb %xmm6, %xmm4
1476 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm4[0],zero,xmm4[1],zero
1477 ; SSE42-NEXT: pxor %xmm4, %xmm4
1478 ; SSE42-NEXT: psadbw %xmm4, %xmm0
1479 ; SSE42-NEXT: paddd %xmm1, %xmm2
1480 ; SSE42-NEXT: pandn %xmm2, %xmm1
1481 ; SSE42-NEXT: movdqa %xmm1, %xmm2
1482 ; SSE42-NEXT: pand %xmm3, %xmm2
1483 ; SSE42-NEXT: movdqa %xmm5, %xmm6
1484 ; SSE42-NEXT: pshufb %xmm2, %xmm6
1485 ; SSE42-NEXT: psrlw $4, %xmm1
1486 ; SSE42-NEXT: pand %xmm3, %xmm1
1487 ; SSE42-NEXT: pshufb %xmm1, %xmm5
1488 ; SSE42-NEXT: paddb %xmm6, %xmm5
1489 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm5[0],zero,xmm5[1],zero
1490 ; SSE42-NEXT: psadbw %xmm4, %xmm1
1491 ; SSE42-NEXT: packuswb %xmm1, %xmm0
1494 ; AVX2-LABEL: widen_cttz_undef_v2i32_v4i32:
1496 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1497 ; AVX2-NEXT: vpaddd %xmm2, %xmm0, %xmm3
1498 ; AVX2-NEXT: vpandn %xmm3, %xmm0, %xmm0
1499 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1500 ; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm4
1501 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1502 ; AVX2-NEXT: vpshufb %xmm4, %xmm5, %xmm4
1503 ; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0
1504 ; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0
1505 ; AVX2-NEXT: vpshufb %xmm0, %xmm5, %xmm0
1506 ; AVX2-NEXT: vpaddb %xmm4, %xmm0, %xmm0
1507 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1508 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
1509 ; AVX2-NEXT: vpsadbw %xmm4, %xmm0, %xmm0
1510 ; AVX2-NEXT: vpaddd %xmm2, %xmm1, %xmm2
1511 ; AVX2-NEXT: vpandn %xmm2, %xmm1, %xmm1
1512 ; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm2
1513 ; AVX2-NEXT: vpshufb %xmm2, %xmm5, %xmm2
1514 ; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm1
1515 ; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1
1516 ; AVX2-NEXT: vpshufb %xmm1, %xmm5, %xmm1
1517 ; AVX2-NEXT: vpaddb %xmm2, %xmm1, %xmm1
1518 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
1519 ; AVX2-NEXT: vpsadbw %xmm4, %xmm1, %xmm1
1520 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
1523 ; AVX512VL-LABEL: widen_cttz_undef_v2i32_v4i32:
1524 ; AVX512VL: # %bb.0:
1525 ; AVX512VL-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1526 ; AVX512VL-NEXT: vpaddd %xmm2, %xmm0, %xmm3
1527 ; AVX512VL-NEXT: vpandn %xmm3, %xmm0, %xmm0
1528 ; AVX512VL-NEXT: vplzcntd %xmm0, %xmm0
1529 ; AVX512VL-NEXT: vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]
1530 ; AVX512VL-NEXT: vpaddd %xmm2, %xmm1, %xmm2
1531 ; AVX512VL-NEXT: vpandn %xmm2, %xmm1, %xmm1
1532 ; AVX512VL-NEXT: vplzcntd %xmm1, %xmm1
1533 ; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1534 ; AVX512VL-NEXT: vpsubd %xmm0, %xmm3, %xmm0
1535 ; AVX512VL-NEXT: retq
1537 ; AVX512VPOPCNT-LABEL: widen_cttz_undef_v2i32_v4i32:
1538 ; AVX512VPOPCNT: # %bb.0:
1539 ; AVX512VPOPCNT-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1540 ; AVX512VPOPCNT-NEXT: vpaddd %xmm2, %xmm0, %xmm3
1541 ; AVX512VPOPCNT-NEXT: vpandn %xmm3, %xmm0, %xmm0
1542 ; AVX512VPOPCNT-NEXT: vpopcntd %xmm0, %xmm0
1543 ; AVX512VPOPCNT-NEXT: vpaddd %xmm2, %xmm1, %xmm2
1544 ; AVX512VPOPCNT-NEXT: vpandn %xmm2, %xmm1, %xmm1
1545 ; AVX512VPOPCNT-NEXT: vpopcntd %xmm1, %xmm1
1546 ; AVX512VPOPCNT-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1547 ; AVX512VPOPCNT-NEXT: retq
1548 %b0 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a0, i1 1)
1549 %b1 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a1, i1 1)
1550 %res = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1554 define <8 x i32> @widen_cttz_undef_v4i32_v8i32(<4 x i32> %a0, <4 x i32> %a1) {
1555 ; SSE42-LABEL: widen_cttz_undef_v4i32_v8i32:
1557 ; SSE42-NEXT: pcmpeqd %xmm4, %xmm4
1558 ; SSE42-NEXT: movdqa %xmm0, %xmm2
1559 ; SSE42-NEXT: paddd %xmm4, %xmm2
1560 ; SSE42-NEXT: pandn %xmm2, %xmm0
1561 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1562 ; SSE42-NEXT: movdqa %xmm0, %xmm5
1563 ; SSE42-NEXT: pand %xmm3, %xmm5
1564 ; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1565 ; SSE42-NEXT: movdqa %xmm2, %xmm6
1566 ; SSE42-NEXT: pshufb %xmm5, %xmm6
1567 ; SSE42-NEXT: psrlw $4, %xmm0
1568 ; SSE42-NEXT: pand %xmm3, %xmm0
1569 ; SSE42-NEXT: movdqa %xmm2, %xmm5
1570 ; SSE42-NEXT: pshufb %xmm0, %xmm5
1571 ; SSE42-NEXT: paddb %xmm6, %xmm5
1572 ; SSE42-NEXT: pxor %xmm6, %xmm6
1573 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm5[0],zero,xmm5[1],zero
1574 ; SSE42-NEXT: punpckhdq {{.*#+}} xmm5 = xmm5[2],xmm6[2],xmm5[3],xmm6[3]
1575 ; SSE42-NEXT: psadbw %xmm6, %xmm5
1576 ; SSE42-NEXT: psadbw %xmm6, %xmm0
1577 ; SSE42-NEXT: packuswb %xmm5, %xmm0
1578 ; SSE42-NEXT: paddd %xmm1, %xmm4
1579 ; SSE42-NEXT: pandn %xmm4, %xmm1
1580 ; SSE42-NEXT: movdqa %xmm1, %xmm4
1581 ; SSE42-NEXT: pand %xmm3, %xmm4
1582 ; SSE42-NEXT: movdqa %xmm2, %xmm5
1583 ; SSE42-NEXT: pshufb %xmm4, %xmm5
1584 ; SSE42-NEXT: psrlw $4, %xmm1
1585 ; SSE42-NEXT: pand %xmm3, %xmm1
1586 ; SSE42-NEXT: pshufb %xmm1, %xmm2
1587 ; SSE42-NEXT: paddb %xmm5, %xmm2
1588 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero
1589 ; SSE42-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm6[2],xmm2[3],xmm6[3]
1590 ; SSE42-NEXT: psadbw %xmm6, %xmm2
1591 ; SSE42-NEXT: psadbw %xmm6, %xmm1
1592 ; SSE42-NEXT: packuswb %xmm2, %xmm1
1595 ; AVX2-LABEL: widen_cttz_undef_v4i32_v8i32:
1597 ; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1598 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1599 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1600 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1
1601 ; AVX2-NEXT: vpandn %ymm1, %ymm0, %ymm0
1602 ; 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]
1603 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
1604 ; 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]
1605 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
1606 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
1607 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
1608 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
1609 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
1610 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
1611 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1612 ; AVX2-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
1613 ; AVX2-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
1614 ; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
1615 ; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
1616 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
1619 ; AVX512VL-LABEL: widen_cttz_undef_v4i32_v8i32:
1620 ; AVX512VL: # %bb.0:
1621 ; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1622 ; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1623 ; AVX512VL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1624 ; AVX512VL-NEXT: vpaddd %ymm1, %ymm0, %ymm1
1625 ; AVX512VL-NEXT: vpandn %ymm1, %ymm0, %ymm0
1626 ; AVX512VL-NEXT: vplzcntd %ymm0, %ymm0
1627 ; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]
1628 ; AVX512VL-NEXT: vpsubd %ymm0, %ymm1, %ymm0
1629 ; AVX512VL-NEXT: retq
1631 ; AVX512VPOPCNT-LABEL: widen_cttz_undef_v4i32_v8i32:
1632 ; AVX512VPOPCNT: # %bb.0:
1633 ; AVX512VPOPCNT-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1634 ; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1635 ; AVX512VPOPCNT-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1636 ; AVX512VPOPCNT-NEXT: vpaddd %ymm1, %ymm0, %ymm1
1637 ; AVX512VPOPCNT-NEXT: vpandn %ymm1, %ymm0, %ymm0
1638 ; AVX512VPOPCNT-NEXT: vpopcntd %ymm0, %ymm0
1639 ; AVX512VPOPCNT-NEXT: retq
1640 %b0 = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %a0, i1 1)
1641 %b1 = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %a1, i1 1)
1642 %res = shufflevector <4 x i32> %b0, <4 x i32> %b1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1646 define <8 x i32> @widen_cttz_undef_v2i32_v8i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32> %a2, <2 x i32> %a3) {
1647 ; SSE42-LABEL: widen_cttz_undef_v2i32_v8i32:
1649 ; SSE42-NEXT: pcmpeqd %xmm6, %xmm6
1650 ; SSE42-NEXT: movdqa %xmm0, %xmm4
1651 ; SSE42-NEXT: paddd %xmm6, %xmm4
1652 ; SSE42-NEXT: pandn %xmm4, %xmm0
1653 ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1654 ; SSE42-NEXT: movdqa %xmm0, %xmm7
1655 ; SSE42-NEXT: pand %xmm5, %xmm7
1656 ; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1657 ; SSE42-NEXT: movdqa %xmm4, %xmm8
1658 ; SSE42-NEXT: pshufb %xmm7, %xmm8
1659 ; SSE42-NEXT: psrlw $4, %xmm0
1660 ; SSE42-NEXT: pand %xmm5, %xmm0
1661 ; SSE42-NEXT: movdqa %xmm4, %xmm7
1662 ; SSE42-NEXT: pshufb %xmm0, %xmm7
1663 ; SSE42-NEXT: paddb %xmm8, %xmm7
1664 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm7[0],zero,xmm7[1],zero
1665 ; SSE42-NEXT: pxor %xmm7, %xmm7
1666 ; SSE42-NEXT: psadbw %xmm7, %xmm0
1667 ; SSE42-NEXT: movdqa %xmm1, %xmm8
1668 ; SSE42-NEXT: paddd %xmm6, %xmm8
1669 ; SSE42-NEXT: pandn %xmm8, %xmm1
1670 ; SSE42-NEXT: movdqa %xmm1, %xmm8
1671 ; SSE42-NEXT: pand %xmm5, %xmm8
1672 ; SSE42-NEXT: movdqa %xmm4, %xmm9
1673 ; SSE42-NEXT: pshufb %xmm8, %xmm9
1674 ; SSE42-NEXT: psrlw $4, %xmm1
1675 ; SSE42-NEXT: pand %xmm5, %xmm1
1676 ; SSE42-NEXT: movdqa %xmm4, %xmm8
1677 ; SSE42-NEXT: pshufb %xmm1, %xmm8
1678 ; SSE42-NEXT: paddb %xmm9, %xmm8
1679 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm8[0],zero,xmm8[1],zero
1680 ; SSE42-NEXT: psadbw %xmm7, %xmm1
1681 ; SSE42-NEXT: packuswb %xmm1, %xmm0
1682 ; SSE42-NEXT: movdqa %xmm2, %xmm1
1683 ; SSE42-NEXT: paddd %xmm6, %xmm1
1684 ; SSE42-NEXT: pandn %xmm1, %xmm2
1685 ; SSE42-NEXT: movdqa %xmm2, %xmm1
1686 ; SSE42-NEXT: pand %xmm5, %xmm1
1687 ; SSE42-NEXT: movdqa %xmm4, %xmm8
1688 ; SSE42-NEXT: pshufb %xmm1, %xmm8
1689 ; SSE42-NEXT: psrlw $4, %xmm2
1690 ; SSE42-NEXT: pand %xmm5, %xmm2
1691 ; SSE42-NEXT: movdqa %xmm4, %xmm1
1692 ; SSE42-NEXT: pshufb %xmm2, %xmm1
1693 ; SSE42-NEXT: paddb %xmm8, %xmm1
1694 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
1695 ; SSE42-NEXT: psadbw %xmm7, %xmm1
1696 ; SSE42-NEXT: paddd %xmm3, %xmm6
1697 ; SSE42-NEXT: pandn %xmm6, %xmm3
1698 ; SSE42-NEXT: movdqa %xmm3, %xmm2
1699 ; SSE42-NEXT: pand %xmm5, %xmm2
1700 ; SSE42-NEXT: movdqa %xmm4, %xmm6
1701 ; SSE42-NEXT: pshufb %xmm2, %xmm6
1702 ; SSE42-NEXT: psrlw $4, %xmm3
1703 ; SSE42-NEXT: pand %xmm5, %xmm3
1704 ; SSE42-NEXT: pshufb %xmm3, %xmm4
1705 ; SSE42-NEXT: paddb %xmm6, %xmm4
1706 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm2 = xmm4[0],zero,xmm4[1],zero
1707 ; SSE42-NEXT: psadbw %xmm7, %xmm2
1708 ; SSE42-NEXT: packuswb %xmm2, %xmm1
1711 ; AVX2-LABEL: widen_cttz_undef_v2i32_v8i32:
1713 ; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
1714 ; AVX2-NEXT: vpaddd %xmm4, %xmm0, %xmm5
1715 ; AVX2-NEXT: vpandn %xmm5, %xmm0, %xmm0
1716 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1717 ; AVX2-NEXT: vpand %xmm5, %xmm0, %xmm6
1718 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm7 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1719 ; AVX2-NEXT: vpshufb %xmm6, %xmm7, %xmm6
1720 ; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0
1721 ; AVX2-NEXT: vpand %xmm5, %xmm0, %xmm0
1722 ; AVX2-NEXT: vpshufb %xmm0, %xmm7, %xmm0
1723 ; AVX2-NEXT: vpaddb %xmm6, %xmm0, %xmm0
1724 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1725 ; AVX2-NEXT: vpaddd %xmm4, %xmm1, %xmm6
1726 ; AVX2-NEXT: vpandn %xmm6, %xmm1, %xmm1
1727 ; AVX2-NEXT: vpand %xmm5, %xmm1, %xmm6
1728 ; AVX2-NEXT: vpshufb %xmm6, %xmm7, %xmm6
1729 ; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm1
1730 ; AVX2-NEXT: vpand %xmm5, %xmm1, %xmm1
1731 ; AVX2-NEXT: vpshufb %xmm1, %xmm7, %xmm1
1732 ; AVX2-NEXT: vpaddb %xmm6, %xmm1, %xmm1
1733 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
1734 ; AVX2-NEXT: vpaddd %xmm4, %xmm2, %xmm6
1735 ; AVX2-NEXT: vpandn %xmm6, %xmm2, %xmm2
1736 ; AVX2-NEXT: vpand %xmm5, %xmm2, %xmm6
1737 ; AVX2-NEXT: vpshufb %xmm6, %xmm7, %xmm6
1738 ; AVX2-NEXT: vpsrlw $4, %xmm2, %xmm2
1739 ; AVX2-NEXT: vpand %xmm5, %xmm2, %xmm2
1740 ; AVX2-NEXT: vpshufb %xmm2, %xmm7, %xmm2
1741 ; AVX2-NEXT: vpaddb %xmm6, %xmm2, %xmm2
1742 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
1743 ; AVX2-NEXT: vpaddd %xmm4, %xmm3, %xmm4
1744 ; AVX2-NEXT: vpandn %xmm4, %xmm3, %xmm3
1745 ; AVX2-NEXT: vpand %xmm5, %xmm3, %xmm4
1746 ; AVX2-NEXT: vpshufb %xmm4, %xmm7, %xmm4
1747 ; AVX2-NEXT: vpsrlw $4, %xmm3, %xmm3
1748 ; AVX2-NEXT: vpand %xmm5, %xmm3, %xmm3
1749 ; AVX2-NEXT: vpshufb %xmm3, %xmm7, %xmm3
1750 ; AVX2-NEXT: vpaddb %xmm4, %xmm3, %xmm3
1751 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
1752 ; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
1753 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
1754 ; AVX2-NEXT: vpsadbw %ymm3, %ymm1, %ymm1
1755 ; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
1756 ; AVX2-NEXT: vpsadbw %ymm3, %ymm0, %ymm0
1757 ; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0
1760 ; AVX512VL-LABEL: widen_cttz_undef_v2i32_v8i32:
1761 ; AVX512VL: # %bb.0:
1762 ; AVX512VL-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1
1763 ; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1764 ; AVX512VL-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
1765 ; AVX512VL-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1766 ; AVX512VL-NEXT: vpaddd %ymm3, %ymm1, %ymm4
1767 ; AVX512VL-NEXT: vpandn %ymm4, %ymm1, %ymm1
1768 ; AVX512VL-NEXT: vplzcntd %ymm1, %ymm1
1769 ; AVX512VL-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
1770 ; AVX512VL-NEXT: vpaddd %ymm3, %ymm0, %ymm2
1771 ; AVX512VL-NEXT: vpandn %ymm2, %ymm0, %ymm0
1772 ; AVX512VL-NEXT: vplzcntd %ymm0, %ymm0
1773 ; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
1774 ; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32]
1775 ; AVX512VL-NEXT: vpsubd %ymm0, %ymm1, %ymm0
1776 ; AVX512VL-NEXT: retq
1778 ; AVX512VPOPCNT-LABEL: widen_cttz_undef_v2i32_v8i32:
1779 ; AVX512VPOPCNT: # %bb.0:
1780 ; AVX512VPOPCNT-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1
1781 ; AVX512VPOPCNT-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1782 ; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
1783 ; AVX512VPOPCNT-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1784 ; AVX512VPOPCNT-NEXT: vpaddd %ymm3, %ymm1, %ymm4
1785 ; AVX512VPOPCNT-NEXT: vpandn %ymm4, %ymm1, %ymm1
1786 ; AVX512VPOPCNT-NEXT: vpopcntd %ymm1, %ymm1
1787 ; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
1788 ; AVX512VPOPCNT-NEXT: vpaddd %ymm3, %ymm0, %ymm2
1789 ; AVX512VPOPCNT-NEXT: vpandn %ymm2, %ymm0, %ymm0
1790 ; AVX512VPOPCNT-NEXT: vpopcntd %ymm0, %ymm0
1791 ; AVX512VPOPCNT-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
1792 ; AVX512VPOPCNT-NEXT: retq
1793 %b0 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a0, i1 1)
1794 %b1 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a1, i1 1)
1795 %b2 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a2, i1 1)
1796 %b3 = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a3, i1 1)
1797 %res01 = shufflevector <2 x i32> %b0, <2 x i32> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1798 %res23 = shufflevector <2 x i32> %b2, <2 x i32> %b3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1799 %res = shufflevector <4 x i32> %res01, <4 x i32> %res23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1803 declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>)
1804 declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)
1806 declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1)
1807 declare <4 x i32> @llvm.ctlz.v4i32(<4 x i32>, i1)
1809 declare <2 x i32> @llvm.cttz.v2i32(<2 x i32>, i1)
1810 declare <4 x i32> @llvm.cttz.v4i32(<4 x i32>, i1)