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