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