[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-lzcnt-128.ll
blob5d02bb8b05f18134d042926476c6afa07d38ab7d
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-prefixes=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse3 | FileCheck %s --check-prefixes=SSE,SSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE3
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=NOBW,AVX,AVX1OR2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=NOBW,AVX,AVX1OR2
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl | FileCheck %s --check-prefixes=NOBW,AVX,AVX512VL
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512bw,+avx512dq | FileCheck %s --check-prefixes=AVX512VLBWDQ
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512cd,+avx512vl | FileCheck %s --check-prefixes=NOBW,AVX512,AVX512VLCD
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512cd | FileCheck %s --check-prefixes=NOBW,AVX512,AVX512CD
13 ; Just one 32-bit run to make sure we do reasonable things for i64 lzcnt.
14 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X86-SSE
16 define <2 x i64> @testv2i64(<2 x i64> %in) nounwind {
17 ; SSE2-LABEL: testv2i64:
18 ; SSE2:       # %bb.0:
19 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
20 ; SSE2-NEXT:    psrlq $1, %xmm1
21 ; SSE2-NEXT:    por %xmm1, %xmm0
22 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
23 ; SSE2-NEXT:    psrlq $2, %xmm1
24 ; SSE2-NEXT:    por %xmm1, %xmm0
25 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
26 ; SSE2-NEXT:    psrlq $4, %xmm1
27 ; SSE2-NEXT:    por %xmm1, %xmm0
28 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
29 ; SSE2-NEXT:    psrlq $8, %xmm1
30 ; SSE2-NEXT:    por %xmm1, %xmm0
31 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
32 ; SSE2-NEXT:    psrlq $16, %xmm1
33 ; SSE2-NEXT:    por %xmm1, %xmm0
34 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
35 ; SSE2-NEXT:    psrlq $32, %xmm1
36 ; SSE2-NEXT:    por %xmm1, %xmm0
37 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
38 ; SSE2-NEXT:    pxor %xmm1, %xmm0
39 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
40 ; SSE2-NEXT:    psrlw $1, %xmm1
41 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
42 ; SSE2-NEXT:    psubb %xmm1, %xmm0
43 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
44 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
45 ; SSE2-NEXT:    pand %xmm1, %xmm2
46 ; SSE2-NEXT:    psrlw $2, %xmm0
47 ; SSE2-NEXT:    pand %xmm1, %xmm0
48 ; SSE2-NEXT:    paddb %xmm2, %xmm0
49 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
50 ; SSE2-NEXT:    psrlw $4, %xmm1
51 ; SSE2-NEXT:    paddb %xmm1, %xmm0
52 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
53 ; SSE2-NEXT:    pxor %xmm1, %xmm1
54 ; SSE2-NEXT:    psadbw %xmm1, %xmm0
55 ; SSE2-NEXT:    retq
57 ; SSE3-LABEL: testv2i64:
58 ; SSE3:       # %bb.0:
59 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
60 ; SSE3-NEXT:    psrlq $1, %xmm1
61 ; SSE3-NEXT:    por %xmm1, %xmm0
62 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
63 ; SSE3-NEXT:    psrlq $2, %xmm1
64 ; SSE3-NEXT:    por %xmm1, %xmm0
65 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
66 ; SSE3-NEXT:    psrlq $4, %xmm1
67 ; SSE3-NEXT:    por %xmm1, %xmm0
68 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
69 ; SSE3-NEXT:    psrlq $8, %xmm1
70 ; SSE3-NEXT:    por %xmm1, %xmm0
71 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
72 ; SSE3-NEXT:    psrlq $16, %xmm1
73 ; SSE3-NEXT:    por %xmm1, %xmm0
74 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
75 ; SSE3-NEXT:    psrlq $32, %xmm1
76 ; SSE3-NEXT:    por %xmm1, %xmm0
77 ; SSE3-NEXT:    pcmpeqd %xmm1, %xmm1
78 ; SSE3-NEXT:    pxor %xmm1, %xmm0
79 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
80 ; SSE3-NEXT:    psrlw $1, %xmm1
81 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
82 ; SSE3-NEXT:    psubb %xmm1, %xmm0
83 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
84 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
85 ; SSE3-NEXT:    pand %xmm1, %xmm2
86 ; SSE3-NEXT:    psrlw $2, %xmm0
87 ; SSE3-NEXT:    pand %xmm1, %xmm0
88 ; SSE3-NEXT:    paddb %xmm2, %xmm0
89 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
90 ; SSE3-NEXT:    psrlw $4, %xmm1
91 ; SSE3-NEXT:    paddb %xmm1, %xmm0
92 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
93 ; SSE3-NEXT:    pxor %xmm1, %xmm1
94 ; SSE3-NEXT:    psadbw %xmm1, %xmm0
95 ; SSE3-NEXT:    retq
97 ; SSSE3-LABEL: testv2i64:
98 ; SSSE3:       # %bb.0:
99 ; SSSE3-NEXT:    movq {{.*#+}} xmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
100 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
101 ; SSSE3-NEXT:    pshufb %xmm0, %xmm3
102 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
103 ; SSSE3-NEXT:    psrlw $4, %xmm1
104 ; SSSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
105 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
106 ; SSSE3-NEXT:    pshufb %xmm1, %xmm2
107 ; SSSE3-NEXT:    pcmpeqb %xmm4, %xmm1
108 ; SSSE3-NEXT:    pand %xmm3, %xmm1
109 ; SSSE3-NEXT:    paddb %xmm2, %xmm1
110 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
111 ; SSSE3-NEXT:    pcmpeqb %xmm4, %xmm2
112 ; SSSE3-NEXT:    psrlw $8, %xmm2
113 ; SSSE3-NEXT:    pand %xmm1, %xmm2
114 ; SSSE3-NEXT:    psrlw $8, %xmm1
115 ; SSSE3-NEXT:    paddw %xmm2, %xmm1
116 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
117 ; SSSE3-NEXT:    pcmpeqw %xmm4, %xmm2
118 ; SSSE3-NEXT:    psrld $16, %xmm2
119 ; SSSE3-NEXT:    pand %xmm1, %xmm2
120 ; SSSE3-NEXT:    psrld $16, %xmm1
121 ; SSSE3-NEXT:    paddd %xmm2, %xmm1
122 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm0
123 ; SSSE3-NEXT:    psrlq $32, %xmm0
124 ; SSSE3-NEXT:    pand %xmm1, %xmm0
125 ; SSSE3-NEXT:    psrlq $32, %xmm1
126 ; SSSE3-NEXT:    paddq %xmm1, %xmm0
127 ; SSSE3-NEXT:    retq
129 ; SSE41-LABEL: testv2i64:
130 ; SSE41:       # %bb.0:
131 ; SSE41-NEXT:    movq {{.*#+}} xmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
132 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
133 ; SSE41-NEXT:    pshufb %xmm0, %xmm3
134 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
135 ; SSE41-NEXT:    psrlw $4, %xmm1
136 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
137 ; SSE41-NEXT:    pxor %xmm4, %xmm4
138 ; SSE41-NEXT:    pshufb %xmm1, %xmm2
139 ; SSE41-NEXT:    pcmpeqb %xmm4, %xmm1
140 ; SSE41-NEXT:    pand %xmm3, %xmm1
141 ; SSE41-NEXT:    paddb %xmm2, %xmm1
142 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
143 ; SSE41-NEXT:    pcmpeqb %xmm4, %xmm2
144 ; SSE41-NEXT:    psrlw $8, %xmm2
145 ; SSE41-NEXT:    pand %xmm1, %xmm2
146 ; SSE41-NEXT:    psrlw $8, %xmm1
147 ; SSE41-NEXT:    paddw %xmm2, %xmm1
148 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
149 ; SSE41-NEXT:    pcmpeqw %xmm4, %xmm2
150 ; SSE41-NEXT:    psrld $16, %xmm2
151 ; SSE41-NEXT:    pand %xmm1, %xmm2
152 ; SSE41-NEXT:    psrld $16, %xmm1
153 ; SSE41-NEXT:    paddd %xmm2, %xmm1
154 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
155 ; SSE41-NEXT:    psrlq $32, %xmm0
156 ; SSE41-NEXT:    pand %xmm1, %xmm0
157 ; SSE41-NEXT:    psrlq $32, %xmm1
158 ; SSE41-NEXT:    paddq %xmm1, %xmm0
159 ; SSE41-NEXT:    retq
161 ; AVX1OR2-LABEL: testv2i64:
162 ; AVX1OR2:       # %bb.0:
163 ; AVX1OR2-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
164 ; AVX1OR2-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
165 ; AVX1OR2-NEXT:    vpsrlw $4, %xmm0, %xmm3
166 ; AVX1OR2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
167 ; AVX1OR2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
168 ; AVX1OR2-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
169 ; AVX1OR2-NEXT:    vpand %xmm5, %xmm2, %xmm2
170 ; AVX1OR2-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
171 ; AVX1OR2-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
172 ; AVX1OR2-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm2
173 ; AVX1OR2-NEXT:    vpsrlw $8, %xmm2, %xmm2
174 ; AVX1OR2-NEXT:    vpand %xmm2, %xmm1, %xmm2
175 ; AVX1OR2-NEXT:    vpsrlw $8, %xmm1, %xmm1
176 ; AVX1OR2-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
177 ; AVX1OR2-NEXT:    vpcmpeqw %xmm4, %xmm0, %xmm2
178 ; AVX1OR2-NEXT:    vpsrld $16, %xmm2, %xmm2
179 ; AVX1OR2-NEXT:    vpand %xmm2, %xmm1, %xmm2
180 ; AVX1OR2-NEXT:    vpsrld $16, %xmm1, %xmm1
181 ; AVX1OR2-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
182 ; AVX1OR2-NEXT:    vpcmpeqd %xmm4, %xmm0, %xmm0
183 ; AVX1OR2-NEXT:    vpsrlq $32, %xmm0, %xmm0
184 ; AVX1OR2-NEXT:    vpand %xmm0, %xmm1, %xmm0
185 ; AVX1OR2-NEXT:    vpsrlq $32, %xmm1, %xmm1
186 ; AVX1OR2-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
187 ; AVX1OR2-NEXT:    retq
189 ; AVX512VL-LABEL: testv2i64:
190 ; AVX512VL:       # %bb.0:
191 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
192 ; AVX512VL-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
193 ; AVX512VL-NEXT:    vpsrlw $4, %xmm0, %xmm3
194 ; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm3, %xmm3
195 ; AVX512VL-NEXT:    vpxor %xmm4, %xmm4, %xmm4
196 ; AVX512VL-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
197 ; AVX512VL-NEXT:    vpand %xmm5, %xmm2, %xmm2
198 ; AVX512VL-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
199 ; AVX512VL-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
200 ; AVX512VL-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm2
201 ; AVX512VL-NEXT:    vpsrlw $8, %xmm2, %xmm2
202 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm2
203 ; AVX512VL-NEXT:    vpsrlw $8, %xmm1, %xmm1
204 ; AVX512VL-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
205 ; AVX512VL-NEXT:    vpcmpeqw %xmm4, %xmm0, %xmm2
206 ; AVX512VL-NEXT:    vpsrld $16, %xmm2, %xmm2
207 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm2
208 ; AVX512VL-NEXT:    vpsrld $16, %xmm1, %xmm1
209 ; AVX512VL-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
210 ; AVX512VL-NEXT:    vpcmpeqd %xmm4, %xmm0, %xmm0
211 ; AVX512VL-NEXT:    vpsrlq $32, %xmm0, %xmm0
212 ; AVX512VL-NEXT:    vpand %xmm0, %xmm1, %xmm0
213 ; AVX512VL-NEXT:    vpsrlq $32, %xmm1, %xmm1
214 ; AVX512VL-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
215 ; AVX512VL-NEXT:    retq
217 ; AVX512VLBWDQ-LABEL: testv2i64:
218 ; AVX512VLBWDQ:       # %bb.0:
219 ; AVX512VLBWDQ-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
220 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
221 ; AVX512VLBWDQ-NEXT:    vpsrlw $4, %xmm0, %xmm3
222 ; AVX512VLBWDQ-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm3, %xmm3
223 ; AVX512VLBWDQ-NEXT:    vpxor %xmm4, %xmm4, %xmm4
224 ; AVX512VLBWDQ-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
225 ; AVX512VLBWDQ-NEXT:    vpand %xmm5, %xmm2, %xmm2
226 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
227 ; AVX512VLBWDQ-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
228 ; AVX512VLBWDQ-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm2
229 ; AVX512VLBWDQ-NEXT:    vpsrlw $8, %xmm2, %xmm2
230 ; AVX512VLBWDQ-NEXT:    vpand %xmm2, %xmm1, %xmm2
231 ; AVX512VLBWDQ-NEXT:    vpsrlw $8, %xmm1, %xmm1
232 ; AVX512VLBWDQ-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
233 ; AVX512VLBWDQ-NEXT:    vpcmpeqw %xmm4, %xmm0, %xmm2
234 ; AVX512VLBWDQ-NEXT:    vpsrld $16, %xmm2, %xmm2
235 ; AVX512VLBWDQ-NEXT:    vpand %xmm2, %xmm1, %xmm2
236 ; AVX512VLBWDQ-NEXT:    vpsrld $16, %xmm1, %xmm1
237 ; AVX512VLBWDQ-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
238 ; AVX512VLBWDQ-NEXT:    vpcmpeqd %xmm4, %xmm0, %xmm0
239 ; AVX512VLBWDQ-NEXT:    vpsrlq $32, %xmm0, %xmm0
240 ; AVX512VLBWDQ-NEXT:    vpand %xmm0, %xmm1, %xmm0
241 ; AVX512VLBWDQ-NEXT:    vpsrlq $32, %xmm1, %xmm1
242 ; AVX512VLBWDQ-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
243 ; AVX512VLBWDQ-NEXT:    retq
245 ; AVX512VLCD-LABEL: testv2i64:
246 ; AVX512VLCD:       # %bb.0:
247 ; AVX512VLCD-NEXT:    vplzcntq %xmm0, %xmm0
248 ; AVX512VLCD-NEXT:    retq
250 ; AVX512CD-LABEL: testv2i64:
251 ; AVX512CD:       # %bb.0:
252 ; AVX512CD-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
253 ; AVX512CD-NEXT:    vplzcntq %zmm0, %zmm0
254 ; AVX512CD-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
255 ; AVX512CD-NEXT:    vzeroupper
256 ; AVX512CD-NEXT:    retq
258 ; X86-SSE-LABEL: testv2i64:
259 ; X86-SSE:       # %bb.0:
260 ; X86-SSE-NEXT:    movq {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
261 ; X86-SSE-NEXT:    movdqa %xmm3, %xmm4
262 ; X86-SSE-NEXT:    pshufb %xmm0, %xmm4
263 ; X86-SSE-NEXT:    movdqa %xmm0, %xmm1
264 ; X86-SSE-NEXT:    psrlw $4, %xmm1
265 ; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
266 ; X86-SSE-NEXT:    pxor %xmm2, %xmm2
267 ; X86-SSE-NEXT:    pshufb %xmm1, %xmm3
268 ; X86-SSE-NEXT:    pcmpeqb %xmm2, %xmm1
269 ; X86-SSE-NEXT:    pand %xmm4, %xmm1
270 ; X86-SSE-NEXT:    paddb %xmm3, %xmm1
271 ; X86-SSE-NEXT:    movdqa %xmm0, %xmm3
272 ; X86-SSE-NEXT:    pcmpeqb %xmm2, %xmm3
273 ; X86-SSE-NEXT:    psrlw $8, %xmm3
274 ; X86-SSE-NEXT:    pand %xmm1, %xmm3
275 ; X86-SSE-NEXT:    psrlw $8, %xmm1
276 ; X86-SSE-NEXT:    paddw %xmm3, %xmm1
277 ; X86-SSE-NEXT:    movdqa %xmm0, %xmm3
278 ; X86-SSE-NEXT:    pcmpeqw %xmm2, %xmm3
279 ; X86-SSE-NEXT:    psrld $16, %xmm3
280 ; X86-SSE-NEXT:    pand %xmm1, %xmm3
281 ; X86-SSE-NEXT:    psrld $16, %xmm1
282 ; X86-SSE-NEXT:    paddd %xmm3, %xmm1
283 ; X86-SSE-NEXT:    pcmpeqd %xmm2, %xmm0
284 ; X86-SSE-NEXT:    psrlq $32, %xmm0
285 ; X86-SSE-NEXT:    pand %xmm1, %xmm0
286 ; X86-SSE-NEXT:    psrlq $32, %xmm1
287 ; X86-SSE-NEXT:    paddq %xmm1, %xmm0
288 ; X86-SSE-NEXT:    retl
290   %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %in, i1 0)
291   ret <2 x i64> %out
294 define <2 x i64> @testv2i64u(<2 x i64> %in) nounwind {
295 ; SSE2-LABEL: testv2i64u:
296 ; SSE2:       # %bb.0:
297 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
298 ; SSE2-NEXT:    psrlq $1, %xmm1
299 ; SSE2-NEXT:    por %xmm1, %xmm0
300 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
301 ; SSE2-NEXT:    psrlq $2, %xmm1
302 ; SSE2-NEXT:    por %xmm1, %xmm0
303 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
304 ; SSE2-NEXT:    psrlq $4, %xmm1
305 ; SSE2-NEXT:    por %xmm1, %xmm0
306 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
307 ; SSE2-NEXT:    psrlq $8, %xmm1
308 ; SSE2-NEXT:    por %xmm1, %xmm0
309 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
310 ; SSE2-NEXT:    psrlq $16, %xmm1
311 ; SSE2-NEXT:    por %xmm1, %xmm0
312 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
313 ; SSE2-NEXT:    psrlq $32, %xmm1
314 ; SSE2-NEXT:    por %xmm1, %xmm0
315 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
316 ; SSE2-NEXT:    pxor %xmm1, %xmm0
317 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
318 ; SSE2-NEXT:    psrlw $1, %xmm1
319 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
320 ; SSE2-NEXT:    psubb %xmm1, %xmm0
321 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
322 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
323 ; SSE2-NEXT:    pand %xmm1, %xmm2
324 ; SSE2-NEXT:    psrlw $2, %xmm0
325 ; SSE2-NEXT:    pand %xmm1, %xmm0
326 ; SSE2-NEXT:    paddb %xmm2, %xmm0
327 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
328 ; SSE2-NEXT:    psrlw $4, %xmm1
329 ; SSE2-NEXT:    paddb %xmm1, %xmm0
330 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
331 ; SSE2-NEXT:    pxor %xmm1, %xmm1
332 ; SSE2-NEXT:    psadbw %xmm1, %xmm0
333 ; SSE2-NEXT:    retq
335 ; SSE3-LABEL: testv2i64u:
336 ; SSE3:       # %bb.0:
337 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
338 ; SSE3-NEXT:    psrlq $1, %xmm1
339 ; SSE3-NEXT:    por %xmm1, %xmm0
340 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
341 ; SSE3-NEXT:    psrlq $2, %xmm1
342 ; SSE3-NEXT:    por %xmm1, %xmm0
343 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
344 ; SSE3-NEXT:    psrlq $4, %xmm1
345 ; SSE3-NEXT:    por %xmm1, %xmm0
346 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
347 ; SSE3-NEXT:    psrlq $8, %xmm1
348 ; SSE3-NEXT:    por %xmm1, %xmm0
349 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
350 ; SSE3-NEXT:    psrlq $16, %xmm1
351 ; SSE3-NEXT:    por %xmm1, %xmm0
352 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
353 ; SSE3-NEXT:    psrlq $32, %xmm1
354 ; SSE3-NEXT:    por %xmm1, %xmm0
355 ; SSE3-NEXT:    pcmpeqd %xmm1, %xmm1
356 ; SSE3-NEXT:    pxor %xmm1, %xmm0
357 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
358 ; SSE3-NEXT:    psrlw $1, %xmm1
359 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
360 ; SSE3-NEXT:    psubb %xmm1, %xmm0
361 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
362 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
363 ; SSE3-NEXT:    pand %xmm1, %xmm2
364 ; SSE3-NEXT:    psrlw $2, %xmm0
365 ; SSE3-NEXT:    pand %xmm1, %xmm0
366 ; SSE3-NEXT:    paddb %xmm2, %xmm0
367 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
368 ; SSE3-NEXT:    psrlw $4, %xmm1
369 ; SSE3-NEXT:    paddb %xmm1, %xmm0
370 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
371 ; SSE3-NEXT:    pxor %xmm1, %xmm1
372 ; SSE3-NEXT:    psadbw %xmm1, %xmm0
373 ; SSE3-NEXT:    retq
375 ; SSSE3-LABEL: testv2i64u:
376 ; SSSE3:       # %bb.0:
377 ; SSSE3-NEXT:    movq {{.*#+}} xmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
378 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
379 ; SSSE3-NEXT:    pshufb %xmm0, %xmm3
380 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
381 ; SSSE3-NEXT:    psrlw $4, %xmm1
382 ; SSSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
383 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
384 ; SSSE3-NEXT:    pshufb %xmm1, %xmm2
385 ; SSSE3-NEXT:    pcmpeqb %xmm4, %xmm1
386 ; SSSE3-NEXT:    pand %xmm3, %xmm1
387 ; SSSE3-NEXT:    paddb %xmm2, %xmm1
388 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
389 ; SSSE3-NEXT:    pcmpeqb %xmm4, %xmm2
390 ; SSSE3-NEXT:    psrlw $8, %xmm2
391 ; SSSE3-NEXT:    pand %xmm1, %xmm2
392 ; SSSE3-NEXT:    psrlw $8, %xmm1
393 ; SSSE3-NEXT:    paddw %xmm2, %xmm1
394 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
395 ; SSSE3-NEXT:    pcmpeqw %xmm4, %xmm2
396 ; SSSE3-NEXT:    psrld $16, %xmm2
397 ; SSSE3-NEXT:    pand %xmm1, %xmm2
398 ; SSSE3-NEXT:    psrld $16, %xmm1
399 ; SSSE3-NEXT:    paddd %xmm2, %xmm1
400 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm0
401 ; SSSE3-NEXT:    psrlq $32, %xmm0
402 ; SSSE3-NEXT:    pand %xmm1, %xmm0
403 ; SSSE3-NEXT:    psrlq $32, %xmm1
404 ; SSSE3-NEXT:    paddq %xmm1, %xmm0
405 ; SSSE3-NEXT:    retq
407 ; SSE41-LABEL: testv2i64u:
408 ; SSE41:       # %bb.0:
409 ; SSE41-NEXT:    movq {{.*#+}} xmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
410 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
411 ; SSE41-NEXT:    pshufb %xmm0, %xmm3
412 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
413 ; SSE41-NEXT:    psrlw $4, %xmm1
414 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
415 ; SSE41-NEXT:    pxor %xmm4, %xmm4
416 ; SSE41-NEXT:    pshufb %xmm1, %xmm2
417 ; SSE41-NEXT:    pcmpeqb %xmm4, %xmm1
418 ; SSE41-NEXT:    pand %xmm3, %xmm1
419 ; SSE41-NEXT:    paddb %xmm2, %xmm1
420 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
421 ; SSE41-NEXT:    pcmpeqb %xmm4, %xmm2
422 ; SSE41-NEXT:    psrlw $8, %xmm2
423 ; SSE41-NEXT:    pand %xmm1, %xmm2
424 ; SSE41-NEXT:    psrlw $8, %xmm1
425 ; SSE41-NEXT:    paddw %xmm2, %xmm1
426 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
427 ; SSE41-NEXT:    pcmpeqw %xmm4, %xmm2
428 ; SSE41-NEXT:    psrld $16, %xmm2
429 ; SSE41-NEXT:    pand %xmm1, %xmm2
430 ; SSE41-NEXT:    psrld $16, %xmm1
431 ; SSE41-NEXT:    paddd %xmm2, %xmm1
432 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
433 ; SSE41-NEXT:    psrlq $32, %xmm0
434 ; SSE41-NEXT:    pand %xmm1, %xmm0
435 ; SSE41-NEXT:    psrlq $32, %xmm1
436 ; SSE41-NEXT:    paddq %xmm1, %xmm0
437 ; SSE41-NEXT:    retq
439 ; AVX1OR2-LABEL: testv2i64u:
440 ; AVX1OR2:       # %bb.0:
441 ; AVX1OR2-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
442 ; AVX1OR2-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
443 ; AVX1OR2-NEXT:    vpsrlw $4, %xmm0, %xmm3
444 ; AVX1OR2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
445 ; AVX1OR2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
446 ; AVX1OR2-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
447 ; AVX1OR2-NEXT:    vpand %xmm5, %xmm2, %xmm2
448 ; AVX1OR2-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
449 ; AVX1OR2-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
450 ; AVX1OR2-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm2
451 ; AVX1OR2-NEXT:    vpsrlw $8, %xmm2, %xmm2
452 ; AVX1OR2-NEXT:    vpand %xmm2, %xmm1, %xmm2
453 ; AVX1OR2-NEXT:    vpsrlw $8, %xmm1, %xmm1
454 ; AVX1OR2-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
455 ; AVX1OR2-NEXT:    vpcmpeqw %xmm4, %xmm0, %xmm2
456 ; AVX1OR2-NEXT:    vpsrld $16, %xmm2, %xmm2
457 ; AVX1OR2-NEXT:    vpand %xmm2, %xmm1, %xmm2
458 ; AVX1OR2-NEXT:    vpsrld $16, %xmm1, %xmm1
459 ; AVX1OR2-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
460 ; AVX1OR2-NEXT:    vpcmpeqd %xmm4, %xmm0, %xmm0
461 ; AVX1OR2-NEXT:    vpsrlq $32, %xmm0, %xmm0
462 ; AVX1OR2-NEXT:    vpand %xmm0, %xmm1, %xmm0
463 ; AVX1OR2-NEXT:    vpsrlq $32, %xmm1, %xmm1
464 ; AVX1OR2-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
465 ; AVX1OR2-NEXT:    retq
467 ; AVX512VL-LABEL: testv2i64u:
468 ; AVX512VL:       # %bb.0:
469 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
470 ; AVX512VL-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
471 ; AVX512VL-NEXT:    vpsrlw $4, %xmm0, %xmm3
472 ; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm3, %xmm3
473 ; AVX512VL-NEXT:    vpxor %xmm4, %xmm4, %xmm4
474 ; AVX512VL-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
475 ; AVX512VL-NEXT:    vpand %xmm5, %xmm2, %xmm2
476 ; AVX512VL-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
477 ; AVX512VL-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
478 ; AVX512VL-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm2
479 ; AVX512VL-NEXT:    vpsrlw $8, %xmm2, %xmm2
480 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm2
481 ; AVX512VL-NEXT:    vpsrlw $8, %xmm1, %xmm1
482 ; AVX512VL-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
483 ; AVX512VL-NEXT:    vpcmpeqw %xmm4, %xmm0, %xmm2
484 ; AVX512VL-NEXT:    vpsrld $16, %xmm2, %xmm2
485 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm2
486 ; AVX512VL-NEXT:    vpsrld $16, %xmm1, %xmm1
487 ; AVX512VL-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
488 ; AVX512VL-NEXT:    vpcmpeqd %xmm4, %xmm0, %xmm0
489 ; AVX512VL-NEXT:    vpsrlq $32, %xmm0, %xmm0
490 ; AVX512VL-NEXT:    vpand %xmm0, %xmm1, %xmm0
491 ; AVX512VL-NEXT:    vpsrlq $32, %xmm1, %xmm1
492 ; AVX512VL-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
493 ; AVX512VL-NEXT:    retq
495 ; AVX512VLBWDQ-LABEL: testv2i64u:
496 ; AVX512VLBWDQ:       # %bb.0:
497 ; AVX512VLBWDQ-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
498 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
499 ; AVX512VLBWDQ-NEXT:    vpsrlw $4, %xmm0, %xmm3
500 ; AVX512VLBWDQ-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm3, %xmm3
501 ; AVX512VLBWDQ-NEXT:    vpxor %xmm4, %xmm4, %xmm4
502 ; AVX512VLBWDQ-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
503 ; AVX512VLBWDQ-NEXT:    vpand %xmm5, %xmm2, %xmm2
504 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
505 ; AVX512VLBWDQ-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
506 ; AVX512VLBWDQ-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm2
507 ; AVX512VLBWDQ-NEXT:    vpsrlw $8, %xmm2, %xmm2
508 ; AVX512VLBWDQ-NEXT:    vpand %xmm2, %xmm1, %xmm2
509 ; AVX512VLBWDQ-NEXT:    vpsrlw $8, %xmm1, %xmm1
510 ; AVX512VLBWDQ-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
511 ; AVX512VLBWDQ-NEXT:    vpcmpeqw %xmm4, %xmm0, %xmm2
512 ; AVX512VLBWDQ-NEXT:    vpsrld $16, %xmm2, %xmm2
513 ; AVX512VLBWDQ-NEXT:    vpand %xmm2, %xmm1, %xmm2
514 ; AVX512VLBWDQ-NEXT:    vpsrld $16, %xmm1, %xmm1
515 ; AVX512VLBWDQ-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
516 ; AVX512VLBWDQ-NEXT:    vpcmpeqd %xmm4, %xmm0, %xmm0
517 ; AVX512VLBWDQ-NEXT:    vpsrlq $32, %xmm0, %xmm0
518 ; AVX512VLBWDQ-NEXT:    vpand %xmm0, %xmm1, %xmm0
519 ; AVX512VLBWDQ-NEXT:    vpsrlq $32, %xmm1, %xmm1
520 ; AVX512VLBWDQ-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
521 ; AVX512VLBWDQ-NEXT:    retq
523 ; AVX512VLCD-LABEL: testv2i64u:
524 ; AVX512VLCD:       # %bb.0:
525 ; AVX512VLCD-NEXT:    vplzcntq %xmm0, %xmm0
526 ; AVX512VLCD-NEXT:    retq
528 ; AVX512CD-LABEL: testv2i64u:
529 ; AVX512CD:       # %bb.0:
530 ; AVX512CD-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
531 ; AVX512CD-NEXT:    vplzcntq %zmm0, %zmm0
532 ; AVX512CD-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
533 ; AVX512CD-NEXT:    vzeroupper
534 ; AVX512CD-NEXT:    retq
536 ; X86-SSE-LABEL: testv2i64u:
537 ; X86-SSE:       # %bb.0:
538 ; X86-SSE-NEXT:    movq {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
539 ; X86-SSE-NEXT:    movdqa %xmm3, %xmm4
540 ; X86-SSE-NEXT:    pshufb %xmm0, %xmm4
541 ; X86-SSE-NEXT:    movdqa %xmm0, %xmm1
542 ; X86-SSE-NEXT:    psrlw $4, %xmm1
543 ; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
544 ; X86-SSE-NEXT:    pxor %xmm2, %xmm2
545 ; X86-SSE-NEXT:    pshufb %xmm1, %xmm3
546 ; X86-SSE-NEXT:    pcmpeqb %xmm2, %xmm1
547 ; X86-SSE-NEXT:    pand %xmm4, %xmm1
548 ; X86-SSE-NEXT:    paddb %xmm3, %xmm1
549 ; X86-SSE-NEXT:    movdqa %xmm0, %xmm3
550 ; X86-SSE-NEXT:    pcmpeqb %xmm2, %xmm3
551 ; X86-SSE-NEXT:    psrlw $8, %xmm3
552 ; X86-SSE-NEXT:    pand %xmm1, %xmm3
553 ; X86-SSE-NEXT:    psrlw $8, %xmm1
554 ; X86-SSE-NEXT:    paddw %xmm3, %xmm1
555 ; X86-SSE-NEXT:    movdqa %xmm0, %xmm3
556 ; X86-SSE-NEXT:    pcmpeqw %xmm2, %xmm3
557 ; X86-SSE-NEXT:    psrld $16, %xmm3
558 ; X86-SSE-NEXT:    pand %xmm1, %xmm3
559 ; X86-SSE-NEXT:    psrld $16, %xmm1
560 ; X86-SSE-NEXT:    paddd %xmm3, %xmm1
561 ; X86-SSE-NEXT:    pcmpeqd %xmm2, %xmm0
562 ; X86-SSE-NEXT:    psrlq $32, %xmm0
563 ; X86-SSE-NEXT:    pand %xmm1, %xmm0
564 ; X86-SSE-NEXT:    psrlq $32, %xmm1
565 ; X86-SSE-NEXT:    paddq %xmm1, %xmm0
566 ; X86-SSE-NEXT:    retl
568   %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %in, i1 -1)
569   ret <2 x i64> %out
572 define <4 x i32> @testv4i32(<4 x i32> %in) nounwind {
573 ; SSE2-LABEL: testv4i32:
574 ; SSE2:       # %bb.0:
575 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
576 ; SSE2-NEXT:    psrld $1, %xmm1
577 ; SSE2-NEXT:    por %xmm1, %xmm0
578 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
579 ; SSE2-NEXT:    psrld $2, %xmm1
580 ; SSE2-NEXT:    por %xmm1, %xmm0
581 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
582 ; SSE2-NEXT:    psrld $4, %xmm1
583 ; SSE2-NEXT:    por %xmm1, %xmm0
584 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
585 ; SSE2-NEXT:    psrld $8, %xmm1
586 ; SSE2-NEXT:    por %xmm1, %xmm0
587 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
588 ; SSE2-NEXT:    psrld $16, %xmm1
589 ; SSE2-NEXT:    por %xmm1, %xmm0
590 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
591 ; SSE2-NEXT:    pxor %xmm1, %xmm0
592 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
593 ; SSE2-NEXT:    psrlw $1, %xmm1
594 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
595 ; SSE2-NEXT:    psubb %xmm1, %xmm0
596 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
597 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
598 ; SSE2-NEXT:    pand %xmm1, %xmm2
599 ; SSE2-NEXT:    psrlw $2, %xmm0
600 ; SSE2-NEXT:    pand %xmm1, %xmm0
601 ; SSE2-NEXT:    paddb %xmm2, %xmm0
602 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
603 ; SSE2-NEXT:    psrlw $4, %xmm1
604 ; SSE2-NEXT:    paddb %xmm1, %xmm0
605 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
606 ; SSE2-NEXT:    pxor %xmm1, %xmm1
607 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
608 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
609 ; SSE2-NEXT:    psadbw %xmm1, %xmm2
610 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
611 ; SSE2-NEXT:    psadbw %xmm1, %xmm0
612 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
613 ; SSE2-NEXT:    retq
615 ; SSE3-LABEL: testv4i32:
616 ; SSE3:       # %bb.0:
617 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
618 ; SSE3-NEXT:    psrld $1, %xmm1
619 ; SSE3-NEXT:    por %xmm1, %xmm0
620 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
621 ; SSE3-NEXT:    psrld $2, %xmm1
622 ; SSE3-NEXT:    por %xmm1, %xmm0
623 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
624 ; SSE3-NEXT:    psrld $4, %xmm1
625 ; SSE3-NEXT:    por %xmm1, %xmm0
626 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
627 ; SSE3-NEXT:    psrld $8, %xmm1
628 ; SSE3-NEXT:    por %xmm1, %xmm0
629 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
630 ; SSE3-NEXT:    psrld $16, %xmm1
631 ; SSE3-NEXT:    por %xmm1, %xmm0
632 ; SSE3-NEXT:    pcmpeqd %xmm1, %xmm1
633 ; SSE3-NEXT:    pxor %xmm1, %xmm0
634 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
635 ; SSE3-NEXT:    psrlw $1, %xmm1
636 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
637 ; SSE3-NEXT:    psubb %xmm1, %xmm0
638 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
639 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
640 ; SSE3-NEXT:    pand %xmm1, %xmm2
641 ; SSE3-NEXT:    psrlw $2, %xmm0
642 ; SSE3-NEXT:    pand %xmm1, %xmm0
643 ; SSE3-NEXT:    paddb %xmm2, %xmm0
644 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
645 ; SSE3-NEXT:    psrlw $4, %xmm1
646 ; SSE3-NEXT:    paddb %xmm1, %xmm0
647 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
648 ; SSE3-NEXT:    pxor %xmm1, %xmm1
649 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
650 ; SSE3-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
651 ; SSE3-NEXT:    psadbw %xmm1, %xmm2
652 ; SSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
653 ; SSE3-NEXT:    psadbw %xmm1, %xmm0
654 ; SSE3-NEXT:    packuswb %xmm2, %xmm0
655 ; SSE3-NEXT:    retq
657 ; SSSE3-LABEL: testv4i32:
658 ; SSSE3:       # %bb.0:
659 ; SSSE3-NEXT:    movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
660 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
661 ; SSSE3-NEXT:    pshufb %xmm0, %xmm2
662 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
663 ; SSSE3-NEXT:    psrlw $4, %xmm3
664 ; SSSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
665 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
666 ; SSSE3-NEXT:    pshufb %xmm3, %xmm1
667 ; SSSE3-NEXT:    pcmpeqb %xmm4, %xmm3
668 ; SSSE3-NEXT:    pand %xmm2, %xmm3
669 ; SSSE3-NEXT:    paddb %xmm1, %xmm3
670 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
671 ; SSSE3-NEXT:    pcmpeqb %xmm4, %xmm1
672 ; SSSE3-NEXT:    psrlw $8, %xmm1
673 ; SSSE3-NEXT:    pand %xmm3, %xmm1
674 ; SSSE3-NEXT:    psrlw $8, %xmm3
675 ; SSSE3-NEXT:    paddw %xmm1, %xmm3
676 ; SSSE3-NEXT:    pcmpeqw %xmm4, %xmm0
677 ; SSSE3-NEXT:    psrld $16, %xmm0
678 ; SSSE3-NEXT:    pand %xmm3, %xmm0
679 ; SSSE3-NEXT:    psrld $16, %xmm3
680 ; SSSE3-NEXT:    paddd %xmm3, %xmm0
681 ; SSSE3-NEXT:    retq
683 ; SSE41-LABEL: testv4i32:
684 ; SSE41:       # %bb.0:
685 ; SSE41-NEXT:    movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
686 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
687 ; SSE41-NEXT:    pshufb %xmm0, %xmm2
688 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
689 ; SSE41-NEXT:    psrlw $4, %xmm3
690 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
691 ; SSE41-NEXT:    pxor %xmm4, %xmm4
692 ; SSE41-NEXT:    pshufb %xmm3, %xmm1
693 ; SSE41-NEXT:    pcmpeqb %xmm4, %xmm3
694 ; SSE41-NEXT:    pand %xmm2, %xmm3
695 ; SSE41-NEXT:    paddb %xmm1, %xmm3
696 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
697 ; SSE41-NEXT:    pcmpeqb %xmm4, %xmm1
698 ; SSE41-NEXT:    psrlw $8, %xmm1
699 ; SSE41-NEXT:    pand %xmm3, %xmm1
700 ; SSE41-NEXT:    psrlw $8, %xmm3
701 ; SSE41-NEXT:    paddw %xmm1, %xmm3
702 ; SSE41-NEXT:    pcmpeqw %xmm4, %xmm0
703 ; SSE41-NEXT:    psrld $16, %xmm0
704 ; SSE41-NEXT:    pand %xmm3, %xmm0
705 ; SSE41-NEXT:    psrld $16, %xmm3
706 ; SSE41-NEXT:    paddd %xmm3, %xmm0
707 ; SSE41-NEXT:    retq
709 ; AVX1OR2-LABEL: testv4i32:
710 ; AVX1OR2:       # %bb.0:
711 ; AVX1OR2-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
712 ; AVX1OR2-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
713 ; AVX1OR2-NEXT:    vpsrlw $4, %xmm0, %xmm3
714 ; AVX1OR2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
715 ; AVX1OR2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
716 ; AVX1OR2-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
717 ; AVX1OR2-NEXT:    vpand %xmm5, %xmm2, %xmm2
718 ; AVX1OR2-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
719 ; AVX1OR2-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
720 ; AVX1OR2-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm2
721 ; AVX1OR2-NEXT:    vpsrlw $8, %xmm2, %xmm2
722 ; AVX1OR2-NEXT:    vpand %xmm2, %xmm1, %xmm2
723 ; AVX1OR2-NEXT:    vpsrlw $8, %xmm1, %xmm1
724 ; AVX1OR2-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
725 ; AVX1OR2-NEXT:    vpcmpeqw %xmm4, %xmm0, %xmm0
726 ; AVX1OR2-NEXT:    vpsrld $16, %xmm0, %xmm0
727 ; AVX1OR2-NEXT:    vpand %xmm0, %xmm1, %xmm0
728 ; AVX1OR2-NEXT:    vpsrld $16, %xmm1, %xmm1
729 ; AVX1OR2-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
730 ; AVX1OR2-NEXT:    retq
732 ; AVX512VL-LABEL: testv4i32:
733 ; AVX512VL:       # %bb.0:
734 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
735 ; AVX512VL-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
736 ; AVX512VL-NEXT:    vpsrlw $4, %xmm0, %xmm3
737 ; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm3, %xmm3
738 ; AVX512VL-NEXT:    vpxor %xmm4, %xmm4, %xmm4
739 ; AVX512VL-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
740 ; AVX512VL-NEXT:    vpand %xmm5, %xmm2, %xmm2
741 ; AVX512VL-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
742 ; AVX512VL-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
743 ; AVX512VL-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm2
744 ; AVX512VL-NEXT:    vpsrlw $8, %xmm2, %xmm2
745 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm2
746 ; AVX512VL-NEXT:    vpsrlw $8, %xmm1, %xmm1
747 ; AVX512VL-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
748 ; AVX512VL-NEXT:    vpcmpeqw %xmm4, %xmm0, %xmm0
749 ; AVX512VL-NEXT:    vpsrld $16, %xmm0, %xmm0
750 ; AVX512VL-NEXT:    vpand %xmm0, %xmm1, %xmm0
751 ; AVX512VL-NEXT:    vpsrld $16, %xmm1, %xmm1
752 ; AVX512VL-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
753 ; AVX512VL-NEXT:    retq
755 ; AVX512VLBWDQ-LABEL: testv4i32:
756 ; AVX512VLBWDQ:       # %bb.0:
757 ; AVX512VLBWDQ-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
758 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
759 ; AVX512VLBWDQ-NEXT:    vpsrlw $4, %xmm0, %xmm3
760 ; AVX512VLBWDQ-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm3, %xmm3
761 ; AVX512VLBWDQ-NEXT:    vpxor %xmm4, %xmm4, %xmm4
762 ; AVX512VLBWDQ-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
763 ; AVX512VLBWDQ-NEXT:    vpand %xmm5, %xmm2, %xmm2
764 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
765 ; AVX512VLBWDQ-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
766 ; AVX512VLBWDQ-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm2
767 ; AVX512VLBWDQ-NEXT:    vpsrlw $8, %xmm2, %xmm2
768 ; AVX512VLBWDQ-NEXT:    vpand %xmm2, %xmm1, %xmm2
769 ; AVX512VLBWDQ-NEXT:    vpsrlw $8, %xmm1, %xmm1
770 ; AVX512VLBWDQ-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
771 ; AVX512VLBWDQ-NEXT:    vpcmpeqw %xmm4, %xmm0, %xmm0
772 ; AVX512VLBWDQ-NEXT:    vpsrld $16, %xmm0, %xmm0
773 ; AVX512VLBWDQ-NEXT:    vpand %xmm0, %xmm1, %xmm0
774 ; AVX512VLBWDQ-NEXT:    vpsrld $16, %xmm1, %xmm1
775 ; AVX512VLBWDQ-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
776 ; AVX512VLBWDQ-NEXT:    retq
778 ; AVX512VLCD-LABEL: testv4i32:
779 ; AVX512VLCD:       # %bb.0:
780 ; AVX512VLCD-NEXT:    vplzcntd %xmm0, %xmm0
781 ; AVX512VLCD-NEXT:    retq
783 ; AVX512CD-LABEL: testv4i32:
784 ; AVX512CD:       # %bb.0:
785 ; AVX512CD-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
786 ; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0
787 ; AVX512CD-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
788 ; AVX512CD-NEXT:    vzeroupper
789 ; AVX512CD-NEXT:    retq
791 ; X86-SSE-LABEL: testv4i32:
792 ; X86-SSE:       # %bb.0:
793 ; X86-SSE-NEXT:    movq {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
794 ; X86-SSE-NEXT:    movdqa %xmm3, %xmm4
795 ; X86-SSE-NEXT:    pshufb %xmm0, %xmm4
796 ; X86-SSE-NEXT:    movdqa %xmm0, %xmm1
797 ; X86-SSE-NEXT:    psrlw $4, %xmm1
798 ; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
799 ; X86-SSE-NEXT:    pxor %xmm2, %xmm2
800 ; X86-SSE-NEXT:    pshufb %xmm1, %xmm3
801 ; X86-SSE-NEXT:    pcmpeqb %xmm2, %xmm1
802 ; X86-SSE-NEXT:    pand %xmm4, %xmm1
803 ; X86-SSE-NEXT:    paddb %xmm3, %xmm1
804 ; X86-SSE-NEXT:    movdqa %xmm0, %xmm3
805 ; X86-SSE-NEXT:    pcmpeqb %xmm2, %xmm3
806 ; X86-SSE-NEXT:    psrlw $8, %xmm3
807 ; X86-SSE-NEXT:    pand %xmm1, %xmm3
808 ; X86-SSE-NEXT:    psrlw $8, %xmm1
809 ; X86-SSE-NEXT:    paddw %xmm3, %xmm1
810 ; X86-SSE-NEXT:    pcmpeqw %xmm2, %xmm0
811 ; X86-SSE-NEXT:    psrld $16, %xmm0
812 ; X86-SSE-NEXT:    pand %xmm1, %xmm0
813 ; X86-SSE-NEXT:    psrld $16, %xmm1
814 ; X86-SSE-NEXT:    paddd %xmm1, %xmm0
815 ; X86-SSE-NEXT:    retl
817   %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %in, i1 0)
818   ret <4 x i32> %out
821 define <4 x i32> @testv4i32u(<4 x i32> %in) nounwind {
822 ; SSE2-LABEL: testv4i32u:
823 ; SSE2:       # %bb.0:
824 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
825 ; SSE2-NEXT:    psrld $1, %xmm1
826 ; SSE2-NEXT:    por %xmm1, %xmm0
827 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
828 ; SSE2-NEXT:    psrld $2, %xmm1
829 ; SSE2-NEXT:    por %xmm1, %xmm0
830 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
831 ; SSE2-NEXT:    psrld $4, %xmm1
832 ; SSE2-NEXT:    por %xmm1, %xmm0
833 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
834 ; SSE2-NEXT:    psrld $8, %xmm1
835 ; SSE2-NEXT:    por %xmm1, %xmm0
836 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
837 ; SSE2-NEXT:    psrld $16, %xmm1
838 ; SSE2-NEXT:    por %xmm1, %xmm0
839 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
840 ; SSE2-NEXT:    pxor %xmm1, %xmm0
841 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
842 ; SSE2-NEXT:    psrlw $1, %xmm1
843 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
844 ; SSE2-NEXT:    psubb %xmm1, %xmm0
845 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
846 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
847 ; SSE2-NEXT:    pand %xmm1, %xmm2
848 ; SSE2-NEXT:    psrlw $2, %xmm0
849 ; SSE2-NEXT:    pand %xmm1, %xmm0
850 ; SSE2-NEXT:    paddb %xmm2, %xmm0
851 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
852 ; SSE2-NEXT:    psrlw $4, %xmm1
853 ; SSE2-NEXT:    paddb %xmm1, %xmm0
854 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
855 ; SSE2-NEXT:    pxor %xmm1, %xmm1
856 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
857 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
858 ; SSE2-NEXT:    psadbw %xmm1, %xmm2
859 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
860 ; SSE2-NEXT:    psadbw %xmm1, %xmm0
861 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
862 ; SSE2-NEXT:    retq
864 ; SSE3-LABEL: testv4i32u:
865 ; SSE3:       # %bb.0:
866 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
867 ; SSE3-NEXT:    psrld $1, %xmm1
868 ; SSE3-NEXT:    por %xmm1, %xmm0
869 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
870 ; SSE3-NEXT:    psrld $2, %xmm1
871 ; SSE3-NEXT:    por %xmm1, %xmm0
872 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
873 ; SSE3-NEXT:    psrld $4, %xmm1
874 ; SSE3-NEXT:    por %xmm1, %xmm0
875 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
876 ; SSE3-NEXT:    psrld $8, %xmm1
877 ; SSE3-NEXT:    por %xmm1, %xmm0
878 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
879 ; SSE3-NEXT:    psrld $16, %xmm1
880 ; SSE3-NEXT:    por %xmm1, %xmm0
881 ; SSE3-NEXT:    pcmpeqd %xmm1, %xmm1
882 ; SSE3-NEXT:    pxor %xmm1, %xmm0
883 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
884 ; SSE3-NEXT:    psrlw $1, %xmm1
885 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
886 ; SSE3-NEXT:    psubb %xmm1, %xmm0
887 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
888 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
889 ; SSE3-NEXT:    pand %xmm1, %xmm2
890 ; SSE3-NEXT:    psrlw $2, %xmm0
891 ; SSE3-NEXT:    pand %xmm1, %xmm0
892 ; SSE3-NEXT:    paddb %xmm2, %xmm0
893 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
894 ; SSE3-NEXT:    psrlw $4, %xmm1
895 ; SSE3-NEXT:    paddb %xmm1, %xmm0
896 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
897 ; SSE3-NEXT:    pxor %xmm1, %xmm1
898 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
899 ; SSE3-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
900 ; SSE3-NEXT:    psadbw %xmm1, %xmm2
901 ; SSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
902 ; SSE3-NEXT:    psadbw %xmm1, %xmm0
903 ; SSE3-NEXT:    packuswb %xmm2, %xmm0
904 ; SSE3-NEXT:    retq
906 ; SSSE3-LABEL: testv4i32u:
907 ; SSSE3:       # %bb.0:
908 ; SSSE3-NEXT:    movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
909 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
910 ; SSSE3-NEXT:    pshufb %xmm0, %xmm2
911 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
912 ; SSSE3-NEXT:    psrlw $4, %xmm3
913 ; SSSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
914 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
915 ; SSSE3-NEXT:    pshufb %xmm3, %xmm1
916 ; SSSE3-NEXT:    pcmpeqb %xmm4, %xmm3
917 ; SSSE3-NEXT:    pand %xmm2, %xmm3
918 ; SSSE3-NEXT:    paddb %xmm1, %xmm3
919 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
920 ; SSSE3-NEXT:    pcmpeqb %xmm4, %xmm1
921 ; SSSE3-NEXT:    psrlw $8, %xmm1
922 ; SSSE3-NEXT:    pand %xmm3, %xmm1
923 ; SSSE3-NEXT:    psrlw $8, %xmm3
924 ; SSSE3-NEXT:    paddw %xmm1, %xmm3
925 ; SSSE3-NEXT:    pcmpeqw %xmm4, %xmm0
926 ; SSSE3-NEXT:    psrld $16, %xmm0
927 ; SSSE3-NEXT:    pand %xmm3, %xmm0
928 ; SSSE3-NEXT:    psrld $16, %xmm3
929 ; SSSE3-NEXT:    paddd %xmm3, %xmm0
930 ; SSSE3-NEXT:    retq
932 ; SSE41-LABEL: testv4i32u:
933 ; SSE41:       # %bb.0:
934 ; SSE41-NEXT:    movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
935 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
936 ; SSE41-NEXT:    pshufb %xmm0, %xmm2
937 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
938 ; SSE41-NEXT:    psrlw $4, %xmm3
939 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
940 ; SSE41-NEXT:    pxor %xmm4, %xmm4
941 ; SSE41-NEXT:    pshufb %xmm3, %xmm1
942 ; SSE41-NEXT:    pcmpeqb %xmm4, %xmm3
943 ; SSE41-NEXT:    pand %xmm2, %xmm3
944 ; SSE41-NEXT:    paddb %xmm1, %xmm3
945 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
946 ; SSE41-NEXT:    pcmpeqb %xmm4, %xmm1
947 ; SSE41-NEXT:    psrlw $8, %xmm1
948 ; SSE41-NEXT:    pand %xmm3, %xmm1
949 ; SSE41-NEXT:    psrlw $8, %xmm3
950 ; SSE41-NEXT:    paddw %xmm1, %xmm3
951 ; SSE41-NEXT:    pcmpeqw %xmm4, %xmm0
952 ; SSE41-NEXT:    psrld $16, %xmm0
953 ; SSE41-NEXT:    pand %xmm3, %xmm0
954 ; SSE41-NEXT:    psrld $16, %xmm3
955 ; SSE41-NEXT:    paddd %xmm3, %xmm0
956 ; SSE41-NEXT:    retq
958 ; AVX1OR2-LABEL: testv4i32u:
959 ; AVX1OR2:       # %bb.0:
960 ; AVX1OR2-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
961 ; AVX1OR2-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
962 ; AVX1OR2-NEXT:    vpsrlw $4, %xmm0, %xmm3
963 ; AVX1OR2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
964 ; AVX1OR2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
965 ; AVX1OR2-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
966 ; AVX1OR2-NEXT:    vpand %xmm5, %xmm2, %xmm2
967 ; AVX1OR2-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
968 ; AVX1OR2-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
969 ; AVX1OR2-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm2
970 ; AVX1OR2-NEXT:    vpsrlw $8, %xmm2, %xmm2
971 ; AVX1OR2-NEXT:    vpand %xmm2, %xmm1, %xmm2
972 ; AVX1OR2-NEXT:    vpsrlw $8, %xmm1, %xmm1
973 ; AVX1OR2-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
974 ; AVX1OR2-NEXT:    vpcmpeqw %xmm4, %xmm0, %xmm0
975 ; AVX1OR2-NEXT:    vpsrld $16, %xmm0, %xmm0
976 ; AVX1OR2-NEXT:    vpand %xmm0, %xmm1, %xmm0
977 ; AVX1OR2-NEXT:    vpsrld $16, %xmm1, %xmm1
978 ; AVX1OR2-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
979 ; AVX1OR2-NEXT:    retq
981 ; AVX512VL-LABEL: testv4i32u:
982 ; AVX512VL:       # %bb.0:
983 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
984 ; AVX512VL-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
985 ; AVX512VL-NEXT:    vpsrlw $4, %xmm0, %xmm3
986 ; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm3, %xmm3
987 ; AVX512VL-NEXT:    vpxor %xmm4, %xmm4, %xmm4
988 ; AVX512VL-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
989 ; AVX512VL-NEXT:    vpand %xmm5, %xmm2, %xmm2
990 ; AVX512VL-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
991 ; AVX512VL-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
992 ; AVX512VL-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm2
993 ; AVX512VL-NEXT:    vpsrlw $8, %xmm2, %xmm2
994 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm2
995 ; AVX512VL-NEXT:    vpsrlw $8, %xmm1, %xmm1
996 ; AVX512VL-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
997 ; AVX512VL-NEXT:    vpcmpeqw %xmm4, %xmm0, %xmm0
998 ; AVX512VL-NEXT:    vpsrld $16, %xmm0, %xmm0
999 ; AVX512VL-NEXT:    vpand %xmm0, %xmm1, %xmm0
1000 ; AVX512VL-NEXT:    vpsrld $16, %xmm1, %xmm1
1001 ; AVX512VL-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
1002 ; AVX512VL-NEXT:    retq
1004 ; AVX512VLBWDQ-LABEL: testv4i32u:
1005 ; AVX512VLBWDQ:       # %bb.0:
1006 ; AVX512VLBWDQ-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1007 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
1008 ; AVX512VLBWDQ-NEXT:    vpsrlw $4, %xmm0, %xmm3
1009 ; AVX512VLBWDQ-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm3, %xmm3
1010 ; AVX512VLBWDQ-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1011 ; AVX512VLBWDQ-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
1012 ; AVX512VLBWDQ-NEXT:    vpand %xmm5, %xmm2, %xmm2
1013 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1014 ; AVX512VLBWDQ-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
1015 ; AVX512VLBWDQ-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm2
1016 ; AVX512VLBWDQ-NEXT:    vpsrlw $8, %xmm2, %xmm2
1017 ; AVX512VLBWDQ-NEXT:    vpand %xmm2, %xmm1, %xmm2
1018 ; AVX512VLBWDQ-NEXT:    vpsrlw $8, %xmm1, %xmm1
1019 ; AVX512VLBWDQ-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
1020 ; AVX512VLBWDQ-NEXT:    vpcmpeqw %xmm4, %xmm0, %xmm0
1021 ; AVX512VLBWDQ-NEXT:    vpsrld $16, %xmm0, %xmm0
1022 ; AVX512VLBWDQ-NEXT:    vpand %xmm0, %xmm1, %xmm0
1023 ; AVX512VLBWDQ-NEXT:    vpsrld $16, %xmm1, %xmm1
1024 ; AVX512VLBWDQ-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
1025 ; AVX512VLBWDQ-NEXT:    retq
1027 ; AVX512VLCD-LABEL: testv4i32u:
1028 ; AVX512VLCD:       # %bb.0:
1029 ; AVX512VLCD-NEXT:    vplzcntd %xmm0, %xmm0
1030 ; AVX512VLCD-NEXT:    retq
1032 ; AVX512CD-LABEL: testv4i32u:
1033 ; AVX512CD:       # %bb.0:
1034 ; AVX512CD-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1035 ; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0
1036 ; AVX512CD-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1037 ; AVX512CD-NEXT:    vzeroupper
1038 ; AVX512CD-NEXT:    retq
1040 ; X86-SSE-LABEL: testv4i32u:
1041 ; X86-SSE:       # %bb.0:
1042 ; X86-SSE-NEXT:    movq {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1043 ; X86-SSE-NEXT:    movdqa %xmm3, %xmm4
1044 ; X86-SSE-NEXT:    pshufb %xmm0, %xmm4
1045 ; X86-SSE-NEXT:    movdqa %xmm0, %xmm1
1046 ; X86-SSE-NEXT:    psrlw $4, %xmm1
1047 ; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1048 ; X86-SSE-NEXT:    pxor %xmm2, %xmm2
1049 ; X86-SSE-NEXT:    pshufb %xmm1, %xmm3
1050 ; X86-SSE-NEXT:    pcmpeqb %xmm2, %xmm1
1051 ; X86-SSE-NEXT:    pand %xmm4, %xmm1
1052 ; X86-SSE-NEXT:    paddb %xmm3, %xmm1
1053 ; X86-SSE-NEXT:    movdqa %xmm0, %xmm3
1054 ; X86-SSE-NEXT:    pcmpeqb %xmm2, %xmm3
1055 ; X86-SSE-NEXT:    psrlw $8, %xmm3
1056 ; X86-SSE-NEXT:    pand %xmm1, %xmm3
1057 ; X86-SSE-NEXT:    psrlw $8, %xmm1
1058 ; X86-SSE-NEXT:    paddw %xmm3, %xmm1
1059 ; X86-SSE-NEXT:    pcmpeqw %xmm2, %xmm0
1060 ; X86-SSE-NEXT:    psrld $16, %xmm0
1061 ; X86-SSE-NEXT:    pand %xmm1, %xmm0
1062 ; X86-SSE-NEXT:    psrld $16, %xmm1
1063 ; X86-SSE-NEXT:    paddd %xmm1, %xmm0
1064 ; X86-SSE-NEXT:    retl
1066   %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %in, i1 -1)
1067   ret <4 x i32> %out
1070 define <8 x i16> @testv8i16(<8 x i16> %in) nounwind {
1071 ; SSE2-LABEL: testv8i16:
1072 ; SSE2:       # %bb.0:
1073 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1074 ; SSE2-NEXT:    psrlw $1, %xmm1
1075 ; SSE2-NEXT:    por %xmm1, %xmm0
1076 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1077 ; SSE2-NEXT:    psrlw $2, %xmm1
1078 ; SSE2-NEXT:    por %xmm1, %xmm0
1079 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1080 ; SSE2-NEXT:    psrlw $4, %xmm1
1081 ; SSE2-NEXT:    por %xmm1, %xmm0
1082 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1083 ; SSE2-NEXT:    psrlw $8, %xmm1
1084 ; SSE2-NEXT:    por %xmm1, %xmm0
1085 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
1086 ; SSE2-NEXT:    pxor %xmm1, %xmm0
1087 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1088 ; SSE2-NEXT:    psrlw $1, %xmm1
1089 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1090 ; SSE2-NEXT:    psubb %xmm1, %xmm0
1091 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1092 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1093 ; SSE2-NEXT:    pand %xmm1, %xmm2
1094 ; SSE2-NEXT:    psrlw $2, %xmm0
1095 ; SSE2-NEXT:    pand %xmm1, %xmm0
1096 ; SSE2-NEXT:    paddb %xmm2, %xmm0
1097 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1098 ; SSE2-NEXT:    psrlw $4, %xmm1
1099 ; SSE2-NEXT:    paddb %xmm1, %xmm0
1100 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1101 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1102 ; SSE2-NEXT:    psllw $8, %xmm1
1103 ; SSE2-NEXT:    paddb %xmm1, %xmm0
1104 ; SSE2-NEXT:    psrlw $8, %xmm0
1105 ; SSE2-NEXT:    retq
1107 ; SSE3-LABEL: testv8i16:
1108 ; SSE3:       # %bb.0:
1109 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1110 ; SSE3-NEXT:    psrlw $1, %xmm1
1111 ; SSE3-NEXT:    por %xmm1, %xmm0
1112 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1113 ; SSE3-NEXT:    psrlw $2, %xmm1
1114 ; SSE3-NEXT:    por %xmm1, %xmm0
1115 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1116 ; SSE3-NEXT:    psrlw $4, %xmm1
1117 ; SSE3-NEXT:    por %xmm1, %xmm0
1118 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1119 ; SSE3-NEXT:    psrlw $8, %xmm1
1120 ; SSE3-NEXT:    por %xmm1, %xmm0
1121 ; SSE3-NEXT:    pcmpeqd %xmm1, %xmm1
1122 ; SSE3-NEXT:    pxor %xmm1, %xmm0
1123 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1124 ; SSE3-NEXT:    psrlw $1, %xmm1
1125 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1126 ; SSE3-NEXT:    psubb %xmm1, %xmm0
1127 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1128 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
1129 ; SSE3-NEXT:    pand %xmm1, %xmm2
1130 ; SSE3-NEXT:    psrlw $2, %xmm0
1131 ; SSE3-NEXT:    pand %xmm1, %xmm0
1132 ; SSE3-NEXT:    paddb %xmm2, %xmm0
1133 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1134 ; SSE3-NEXT:    psrlw $4, %xmm1
1135 ; SSE3-NEXT:    paddb %xmm1, %xmm0
1136 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1137 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1138 ; SSE3-NEXT:    psllw $8, %xmm1
1139 ; SSE3-NEXT:    paddb %xmm1, %xmm0
1140 ; SSE3-NEXT:    psrlw $8, %xmm0
1141 ; SSE3-NEXT:    retq
1143 ; SSSE3-LABEL: testv8i16:
1144 ; SSSE3:       # %bb.0:
1145 ; SSSE3-NEXT:    movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1146 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1147 ; SSSE3-NEXT:    pshufb %xmm0, %xmm2
1148 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1149 ; SSSE3-NEXT:    psrlw $4, %xmm3
1150 ; SSSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1151 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
1152 ; SSSE3-NEXT:    pshufb %xmm3, %xmm1
1153 ; SSSE3-NEXT:    pcmpeqb %xmm4, %xmm3
1154 ; SSSE3-NEXT:    pand %xmm2, %xmm3
1155 ; SSSE3-NEXT:    paddb %xmm1, %xmm3
1156 ; SSSE3-NEXT:    pcmpeqb %xmm4, %xmm0
1157 ; SSSE3-NEXT:    psrlw $8, %xmm0
1158 ; SSSE3-NEXT:    pand %xmm3, %xmm0
1159 ; SSSE3-NEXT:    psrlw $8, %xmm3
1160 ; SSSE3-NEXT:    paddw %xmm3, %xmm0
1161 ; SSSE3-NEXT:    retq
1163 ; SSE41-LABEL: testv8i16:
1164 ; SSE41:       # %bb.0:
1165 ; SSE41-NEXT:    movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1166 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
1167 ; SSE41-NEXT:    pshufb %xmm0, %xmm2
1168 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
1169 ; SSE41-NEXT:    psrlw $4, %xmm3
1170 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1171 ; SSE41-NEXT:    pxor %xmm4, %xmm4
1172 ; SSE41-NEXT:    pshufb %xmm3, %xmm1
1173 ; SSE41-NEXT:    pcmpeqb %xmm4, %xmm3
1174 ; SSE41-NEXT:    pand %xmm2, %xmm3
1175 ; SSE41-NEXT:    paddb %xmm1, %xmm3
1176 ; SSE41-NEXT:    pcmpeqb %xmm4, %xmm0
1177 ; SSE41-NEXT:    psrlw $8, %xmm0
1178 ; SSE41-NEXT:    pand %xmm3, %xmm0
1179 ; SSE41-NEXT:    psrlw $8, %xmm3
1180 ; SSE41-NEXT:    paddw %xmm3, %xmm0
1181 ; SSE41-NEXT:    retq
1183 ; AVX1OR2-LABEL: testv8i16:
1184 ; AVX1OR2:       # %bb.0:
1185 ; AVX1OR2-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1186 ; AVX1OR2-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
1187 ; AVX1OR2-NEXT:    vpsrlw $4, %xmm0, %xmm3
1188 ; AVX1OR2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
1189 ; AVX1OR2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1190 ; AVX1OR2-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
1191 ; AVX1OR2-NEXT:    vpand %xmm5, %xmm2, %xmm2
1192 ; AVX1OR2-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1193 ; AVX1OR2-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
1194 ; AVX1OR2-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm0
1195 ; AVX1OR2-NEXT:    vpsrlw $8, %xmm0, %xmm0
1196 ; AVX1OR2-NEXT:    vpand %xmm0, %xmm1, %xmm0
1197 ; AVX1OR2-NEXT:    vpsrlw $8, %xmm1, %xmm1
1198 ; AVX1OR2-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
1199 ; AVX1OR2-NEXT:    retq
1201 ; AVX512VL-LABEL: testv8i16:
1202 ; AVX512VL:       # %bb.0:
1203 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1204 ; AVX512VL-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
1205 ; AVX512VL-NEXT:    vpsrlw $4, %xmm0, %xmm3
1206 ; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm3, %xmm3
1207 ; AVX512VL-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1208 ; AVX512VL-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
1209 ; AVX512VL-NEXT:    vpand %xmm5, %xmm2, %xmm2
1210 ; AVX512VL-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1211 ; AVX512VL-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
1212 ; AVX512VL-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm0
1213 ; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm0
1214 ; AVX512VL-NEXT:    vpand %xmm0, %xmm1, %xmm0
1215 ; AVX512VL-NEXT:    vpsrlw $8, %xmm1, %xmm1
1216 ; AVX512VL-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
1217 ; AVX512VL-NEXT:    retq
1219 ; AVX512VLBWDQ-LABEL: testv8i16:
1220 ; AVX512VLBWDQ:       # %bb.0:
1221 ; AVX512VLBWDQ-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1222 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
1223 ; AVX512VLBWDQ-NEXT:    vpsrlw $4, %xmm0, %xmm3
1224 ; AVX512VLBWDQ-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm3, %xmm3
1225 ; AVX512VLBWDQ-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1226 ; AVX512VLBWDQ-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
1227 ; AVX512VLBWDQ-NEXT:    vpand %xmm5, %xmm2, %xmm2
1228 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1229 ; AVX512VLBWDQ-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
1230 ; AVX512VLBWDQ-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm0
1231 ; AVX512VLBWDQ-NEXT:    vpsrlw $8, %xmm0, %xmm0
1232 ; AVX512VLBWDQ-NEXT:    vpand %xmm0, %xmm1, %xmm0
1233 ; AVX512VLBWDQ-NEXT:    vpsrlw $8, %xmm1, %xmm1
1234 ; AVX512VLBWDQ-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
1235 ; AVX512VLBWDQ-NEXT:    retq
1237 ; AVX512VLCD-LABEL: testv8i16:
1238 ; AVX512VLCD:       # %bb.0:
1239 ; AVX512VLCD-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1240 ; AVX512VLCD-NEXT:    vplzcntd %ymm0, %ymm0
1241 ; AVX512VLCD-NEXT:    vpmovdw %ymm0, %xmm0
1242 ; AVX512VLCD-NEXT:    vpsubw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1243 ; AVX512VLCD-NEXT:    vzeroupper
1244 ; AVX512VLCD-NEXT:    retq
1246 ; AVX512CD-LABEL: testv8i16:
1247 ; AVX512CD:       # %bb.0:
1248 ; AVX512CD-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1249 ; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0
1250 ; AVX512CD-NEXT:    vpmovdw %zmm0, %ymm0
1251 ; AVX512CD-NEXT:    vpsubw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1252 ; AVX512CD-NEXT:    vzeroupper
1253 ; AVX512CD-NEXT:    retq
1255 ; X86-SSE-LABEL: testv8i16:
1256 ; X86-SSE:       # %bb.0:
1257 ; X86-SSE-NEXT:    movq {{.*#+}} xmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1258 ; X86-SSE-NEXT:    movdqa %xmm2, %xmm3
1259 ; X86-SSE-NEXT:    pshufb %xmm0, %xmm3
1260 ; X86-SSE-NEXT:    movdqa %xmm0, %xmm1
1261 ; X86-SSE-NEXT:    psrlw $4, %xmm1
1262 ; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1263 ; X86-SSE-NEXT:    pxor %xmm4, %xmm4
1264 ; X86-SSE-NEXT:    pshufb %xmm1, %xmm2
1265 ; X86-SSE-NEXT:    pcmpeqb %xmm4, %xmm1
1266 ; X86-SSE-NEXT:    pand %xmm3, %xmm1
1267 ; X86-SSE-NEXT:    paddb %xmm2, %xmm1
1268 ; X86-SSE-NEXT:    pcmpeqb %xmm4, %xmm0
1269 ; X86-SSE-NEXT:    psrlw $8, %xmm0
1270 ; X86-SSE-NEXT:    pand %xmm1, %xmm0
1271 ; X86-SSE-NEXT:    psrlw $8, %xmm1
1272 ; X86-SSE-NEXT:    paddw %xmm1, %xmm0
1273 ; X86-SSE-NEXT:    retl
1274   %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %in, i1 0)
1275   ret <8 x i16> %out
1278 define <8 x i16> @testv8i16u(<8 x i16> %in) nounwind {
1279 ; SSE2-LABEL: testv8i16u:
1280 ; SSE2:       # %bb.0:
1281 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1282 ; SSE2-NEXT:    psrlw $1, %xmm1
1283 ; SSE2-NEXT:    por %xmm1, %xmm0
1284 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1285 ; SSE2-NEXT:    psrlw $2, %xmm1
1286 ; SSE2-NEXT:    por %xmm1, %xmm0
1287 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1288 ; SSE2-NEXT:    psrlw $4, %xmm1
1289 ; SSE2-NEXT:    por %xmm1, %xmm0
1290 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1291 ; SSE2-NEXT:    psrlw $8, %xmm1
1292 ; SSE2-NEXT:    por %xmm1, %xmm0
1293 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
1294 ; SSE2-NEXT:    pxor %xmm1, %xmm0
1295 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1296 ; SSE2-NEXT:    psrlw $1, %xmm1
1297 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1298 ; SSE2-NEXT:    psubb %xmm1, %xmm0
1299 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1300 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1301 ; SSE2-NEXT:    pand %xmm1, %xmm2
1302 ; SSE2-NEXT:    psrlw $2, %xmm0
1303 ; SSE2-NEXT:    pand %xmm1, %xmm0
1304 ; SSE2-NEXT:    paddb %xmm2, %xmm0
1305 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1306 ; SSE2-NEXT:    psrlw $4, %xmm1
1307 ; SSE2-NEXT:    paddb %xmm1, %xmm0
1308 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1309 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1310 ; SSE2-NEXT:    psllw $8, %xmm1
1311 ; SSE2-NEXT:    paddb %xmm1, %xmm0
1312 ; SSE2-NEXT:    psrlw $8, %xmm0
1313 ; SSE2-NEXT:    retq
1315 ; SSE3-LABEL: testv8i16u:
1316 ; SSE3:       # %bb.0:
1317 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1318 ; SSE3-NEXT:    psrlw $1, %xmm1
1319 ; SSE3-NEXT:    por %xmm1, %xmm0
1320 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1321 ; SSE3-NEXT:    psrlw $2, %xmm1
1322 ; SSE3-NEXT:    por %xmm1, %xmm0
1323 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1324 ; SSE3-NEXT:    psrlw $4, %xmm1
1325 ; SSE3-NEXT:    por %xmm1, %xmm0
1326 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1327 ; SSE3-NEXT:    psrlw $8, %xmm1
1328 ; SSE3-NEXT:    por %xmm1, %xmm0
1329 ; SSE3-NEXT:    pcmpeqd %xmm1, %xmm1
1330 ; SSE3-NEXT:    pxor %xmm1, %xmm0
1331 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1332 ; SSE3-NEXT:    psrlw $1, %xmm1
1333 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1334 ; SSE3-NEXT:    psubb %xmm1, %xmm0
1335 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1336 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
1337 ; SSE3-NEXT:    pand %xmm1, %xmm2
1338 ; SSE3-NEXT:    psrlw $2, %xmm0
1339 ; SSE3-NEXT:    pand %xmm1, %xmm0
1340 ; SSE3-NEXT:    paddb %xmm2, %xmm0
1341 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1342 ; SSE3-NEXT:    psrlw $4, %xmm1
1343 ; SSE3-NEXT:    paddb %xmm1, %xmm0
1344 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1345 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1346 ; SSE3-NEXT:    psllw $8, %xmm1
1347 ; SSE3-NEXT:    paddb %xmm1, %xmm0
1348 ; SSE3-NEXT:    psrlw $8, %xmm0
1349 ; SSE3-NEXT:    retq
1351 ; SSSE3-LABEL: testv8i16u:
1352 ; SSSE3:       # %bb.0:
1353 ; SSSE3-NEXT:    movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1354 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1355 ; SSSE3-NEXT:    pshufb %xmm0, %xmm2
1356 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1357 ; SSSE3-NEXT:    psrlw $4, %xmm3
1358 ; SSSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1359 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
1360 ; SSSE3-NEXT:    pshufb %xmm3, %xmm1
1361 ; SSSE3-NEXT:    pcmpeqb %xmm4, %xmm3
1362 ; SSSE3-NEXT:    pand %xmm2, %xmm3
1363 ; SSSE3-NEXT:    paddb %xmm1, %xmm3
1364 ; SSSE3-NEXT:    pcmpeqb %xmm4, %xmm0
1365 ; SSSE3-NEXT:    psrlw $8, %xmm0
1366 ; SSSE3-NEXT:    pand %xmm3, %xmm0
1367 ; SSSE3-NEXT:    psrlw $8, %xmm3
1368 ; SSSE3-NEXT:    paddw %xmm3, %xmm0
1369 ; SSSE3-NEXT:    retq
1371 ; SSE41-LABEL: testv8i16u:
1372 ; SSE41:       # %bb.0:
1373 ; SSE41-NEXT:    movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1374 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
1375 ; SSE41-NEXT:    pshufb %xmm0, %xmm2
1376 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
1377 ; SSE41-NEXT:    psrlw $4, %xmm3
1378 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1379 ; SSE41-NEXT:    pxor %xmm4, %xmm4
1380 ; SSE41-NEXT:    pshufb %xmm3, %xmm1
1381 ; SSE41-NEXT:    pcmpeqb %xmm4, %xmm3
1382 ; SSE41-NEXT:    pand %xmm2, %xmm3
1383 ; SSE41-NEXT:    paddb %xmm1, %xmm3
1384 ; SSE41-NEXT:    pcmpeqb %xmm4, %xmm0
1385 ; SSE41-NEXT:    psrlw $8, %xmm0
1386 ; SSE41-NEXT:    pand %xmm3, %xmm0
1387 ; SSE41-NEXT:    psrlw $8, %xmm3
1388 ; SSE41-NEXT:    paddw %xmm3, %xmm0
1389 ; SSE41-NEXT:    retq
1391 ; AVX1OR2-LABEL: testv8i16u:
1392 ; AVX1OR2:       # %bb.0:
1393 ; AVX1OR2-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1394 ; AVX1OR2-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
1395 ; AVX1OR2-NEXT:    vpsrlw $4, %xmm0, %xmm3
1396 ; AVX1OR2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
1397 ; AVX1OR2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1398 ; AVX1OR2-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
1399 ; AVX1OR2-NEXT:    vpand %xmm5, %xmm2, %xmm2
1400 ; AVX1OR2-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1401 ; AVX1OR2-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
1402 ; AVX1OR2-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm0
1403 ; AVX1OR2-NEXT:    vpsrlw $8, %xmm0, %xmm0
1404 ; AVX1OR2-NEXT:    vpand %xmm0, %xmm1, %xmm0
1405 ; AVX1OR2-NEXT:    vpsrlw $8, %xmm1, %xmm1
1406 ; AVX1OR2-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
1407 ; AVX1OR2-NEXT:    retq
1409 ; AVX512VL-LABEL: testv8i16u:
1410 ; AVX512VL:       # %bb.0:
1411 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1412 ; AVX512VL-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
1413 ; AVX512VL-NEXT:    vpsrlw $4, %xmm0, %xmm3
1414 ; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm3, %xmm3
1415 ; AVX512VL-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1416 ; AVX512VL-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
1417 ; AVX512VL-NEXT:    vpand %xmm5, %xmm2, %xmm2
1418 ; AVX512VL-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1419 ; AVX512VL-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
1420 ; AVX512VL-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm0
1421 ; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm0
1422 ; AVX512VL-NEXT:    vpand %xmm0, %xmm1, %xmm0
1423 ; AVX512VL-NEXT:    vpsrlw $8, %xmm1, %xmm1
1424 ; AVX512VL-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
1425 ; AVX512VL-NEXT:    retq
1427 ; AVX512VLBWDQ-LABEL: testv8i16u:
1428 ; AVX512VLBWDQ:       # %bb.0:
1429 ; AVX512VLBWDQ-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1430 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
1431 ; AVX512VLBWDQ-NEXT:    vpsrlw $4, %xmm0, %xmm3
1432 ; AVX512VLBWDQ-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm3, %xmm3
1433 ; AVX512VLBWDQ-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1434 ; AVX512VLBWDQ-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm5
1435 ; AVX512VLBWDQ-NEXT:    vpand %xmm5, %xmm2, %xmm2
1436 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1437 ; AVX512VLBWDQ-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
1438 ; AVX512VLBWDQ-NEXT:    vpcmpeqb %xmm4, %xmm0, %xmm0
1439 ; AVX512VLBWDQ-NEXT:    vpsrlw $8, %xmm0, %xmm0
1440 ; AVX512VLBWDQ-NEXT:    vpand %xmm0, %xmm1, %xmm0
1441 ; AVX512VLBWDQ-NEXT:    vpsrlw $8, %xmm1, %xmm1
1442 ; AVX512VLBWDQ-NEXT:    vpaddw %xmm0, %xmm1, %xmm0
1443 ; AVX512VLBWDQ-NEXT:    retq
1445 ; AVX512VLCD-LABEL: testv8i16u:
1446 ; AVX512VLCD:       # %bb.0:
1447 ; AVX512VLCD-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1448 ; AVX512VLCD-NEXT:    vplzcntd %ymm0, %ymm0
1449 ; AVX512VLCD-NEXT:    vpmovdw %ymm0, %xmm0
1450 ; AVX512VLCD-NEXT:    vpsubw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1451 ; AVX512VLCD-NEXT:    vzeroupper
1452 ; AVX512VLCD-NEXT:    retq
1454 ; AVX512CD-LABEL: testv8i16u:
1455 ; AVX512CD:       # %bb.0:
1456 ; AVX512CD-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1457 ; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0
1458 ; AVX512CD-NEXT:    vpmovdw %zmm0, %ymm0
1459 ; AVX512CD-NEXT:    vpsubw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1460 ; AVX512CD-NEXT:    vzeroupper
1461 ; AVX512CD-NEXT:    retq
1463 ; X86-SSE-LABEL: testv8i16u:
1464 ; X86-SSE:       # %bb.0:
1465 ; X86-SSE-NEXT:    movq {{.*#+}} xmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1466 ; X86-SSE-NEXT:    movdqa %xmm2, %xmm3
1467 ; X86-SSE-NEXT:    pshufb %xmm0, %xmm3
1468 ; X86-SSE-NEXT:    movdqa %xmm0, %xmm1
1469 ; X86-SSE-NEXT:    psrlw $4, %xmm1
1470 ; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1471 ; X86-SSE-NEXT:    pxor %xmm4, %xmm4
1472 ; X86-SSE-NEXT:    pshufb %xmm1, %xmm2
1473 ; X86-SSE-NEXT:    pcmpeqb %xmm4, %xmm1
1474 ; X86-SSE-NEXT:    pand %xmm3, %xmm1
1475 ; X86-SSE-NEXT:    paddb %xmm2, %xmm1
1476 ; X86-SSE-NEXT:    pcmpeqb %xmm4, %xmm0
1477 ; X86-SSE-NEXT:    psrlw $8, %xmm0
1478 ; X86-SSE-NEXT:    pand %xmm1, %xmm0
1479 ; X86-SSE-NEXT:    psrlw $8, %xmm1
1480 ; X86-SSE-NEXT:    paddw %xmm1, %xmm0
1481 ; X86-SSE-NEXT:    retl
1482   %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %in, i1 -1)
1483   ret <8 x i16> %out
1486 define <16 x i8> @testv16i8(<16 x i8> %in) nounwind {
1487 ; SSE2-LABEL: testv16i8:
1488 ; SSE2:       # %bb.0:
1489 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1490 ; SSE2-NEXT:    psrlw $1, %xmm1
1491 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1492 ; SSE2-NEXT:    por %xmm1, %xmm0
1493 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1494 ; SSE2-NEXT:    psrlw $2, %xmm1
1495 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1496 ; SSE2-NEXT:    por %xmm1, %xmm0
1497 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1498 ; SSE2-NEXT:    psrlw $4, %xmm1
1499 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1500 ; SSE2-NEXT:    pand %xmm2, %xmm1
1501 ; SSE2-NEXT:    por %xmm1, %xmm0
1502 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
1503 ; SSE2-NEXT:    pxor %xmm1, %xmm0
1504 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1505 ; SSE2-NEXT:    psrlw $1, %xmm1
1506 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1507 ; SSE2-NEXT:    psubb %xmm1, %xmm0
1508 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1509 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1510 ; SSE2-NEXT:    pand %xmm1, %xmm3
1511 ; SSE2-NEXT:    psrlw $2, %xmm0
1512 ; SSE2-NEXT:    pand %xmm1, %xmm0
1513 ; SSE2-NEXT:    paddb %xmm3, %xmm0
1514 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1515 ; SSE2-NEXT:    psrlw $4, %xmm1
1516 ; SSE2-NEXT:    paddb %xmm1, %xmm0
1517 ; SSE2-NEXT:    pand %xmm2, %xmm0
1518 ; SSE2-NEXT:    retq
1520 ; SSE3-LABEL: testv16i8:
1521 ; SSE3:       # %bb.0:
1522 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1523 ; SSE3-NEXT:    psrlw $1, %xmm1
1524 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1525 ; SSE3-NEXT:    por %xmm1, %xmm0
1526 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1527 ; SSE3-NEXT:    psrlw $2, %xmm1
1528 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1529 ; SSE3-NEXT:    por %xmm1, %xmm0
1530 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1531 ; SSE3-NEXT:    psrlw $4, %xmm1
1532 ; SSE3-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1533 ; SSE3-NEXT:    pand %xmm2, %xmm1
1534 ; SSE3-NEXT:    por %xmm1, %xmm0
1535 ; SSE3-NEXT:    pcmpeqd %xmm1, %xmm1
1536 ; SSE3-NEXT:    pxor %xmm1, %xmm0
1537 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1538 ; SSE3-NEXT:    psrlw $1, %xmm1
1539 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1540 ; SSE3-NEXT:    psubb %xmm1, %xmm0
1541 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1542 ; SSE3-NEXT:    movdqa %xmm0, %xmm3
1543 ; SSE3-NEXT:    pand %xmm1, %xmm3
1544 ; SSE3-NEXT:    psrlw $2, %xmm0
1545 ; SSE3-NEXT:    pand %xmm1, %xmm0
1546 ; SSE3-NEXT:    paddb %xmm3, %xmm0
1547 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1548 ; SSE3-NEXT:    psrlw $4, %xmm1
1549 ; SSE3-NEXT:    paddb %xmm1, %xmm0
1550 ; SSE3-NEXT:    pand %xmm2, %xmm0
1551 ; SSE3-NEXT:    retq
1553 ; SSSE3-LABEL: testv16i8:
1554 ; SSSE3:       # %bb.0:
1555 ; SSSE3-NEXT:    movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1556 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1557 ; SSSE3-NEXT:    pshufb %xmm0, %xmm2
1558 ; SSSE3-NEXT:    psrlw $4, %xmm0
1559 ; SSSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1560 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
1561 ; SSSE3-NEXT:    pcmpeqb %xmm0, %xmm3
1562 ; SSSE3-NEXT:    pand %xmm2, %xmm3
1563 ; SSSE3-NEXT:    pshufb %xmm0, %xmm1
1564 ; SSSE3-NEXT:    paddb %xmm3, %xmm1
1565 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1566 ; SSSE3-NEXT:    retq
1568 ; SSE41-LABEL: testv16i8:
1569 ; SSE41:       # %bb.0:
1570 ; SSE41-NEXT:    movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1571 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
1572 ; SSE41-NEXT:    pshufb %xmm0, %xmm2
1573 ; SSE41-NEXT:    psrlw $4, %xmm0
1574 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1575 ; SSE41-NEXT:    pxor %xmm3, %xmm3
1576 ; SSE41-NEXT:    pcmpeqb %xmm0, %xmm3
1577 ; SSE41-NEXT:    pand %xmm2, %xmm3
1578 ; SSE41-NEXT:    pshufb %xmm0, %xmm1
1579 ; SSE41-NEXT:    paddb %xmm3, %xmm1
1580 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1581 ; SSE41-NEXT:    retq
1583 ; AVX1OR2-LABEL: testv16i8:
1584 ; AVX1OR2:       # %bb.0:
1585 ; AVX1OR2-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1586 ; AVX1OR2-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
1587 ; AVX1OR2-NEXT:    vpsrlw $4, %xmm0, %xmm0
1588 ; AVX1OR2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1589 ; AVX1OR2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1590 ; AVX1OR2-NEXT:    vpcmpeqb %xmm3, %xmm0, %xmm3
1591 ; AVX1OR2-NEXT:    vpand %xmm3, %xmm2, %xmm2
1592 ; AVX1OR2-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
1593 ; AVX1OR2-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
1594 ; AVX1OR2-NEXT:    retq
1596 ; AVX512VL-LABEL: testv16i8:
1597 ; AVX512VL:       # %bb.0:
1598 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1599 ; AVX512VL-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
1600 ; AVX512VL-NEXT:    vpsrlw $4, %xmm0, %xmm0
1601 ; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
1602 ; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1603 ; AVX512VL-NEXT:    vpcmpeqb %xmm3, %xmm0, %xmm3
1604 ; AVX512VL-NEXT:    vpand %xmm3, %xmm2, %xmm2
1605 ; AVX512VL-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
1606 ; AVX512VL-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
1607 ; AVX512VL-NEXT:    retq
1609 ; AVX512VLBWDQ-LABEL: testv16i8:
1610 ; AVX512VLBWDQ:       # %bb.0:
1611 ; AVX512VLBWDQ-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1612 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
1613 ; AVX512VLBWDQ-NEXT:    vpsrlw $4, %xmm0, %xmm0
1614 ; AVX512VLBWDQ-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
1615 ; AVX512VLBWDQ-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1616 ; AVX512VLBWDQ-NEXT:    vpcmpeqb %xmm3, %xmm0, %xmm3
1617 ; AVX512VLBWDQ-NEXT:    vpand %xmm3, %xmm2, %xmm2
1618 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
1619 ; AVX512VLBWDQ-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
1620 ; AVX512VLBWDQ-NEXT:    retq
1622 ; AVX512-LABEL: testv16i8:
1623 ; AVX512:       # %bb.0:
1624 ; AVX512-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
1625 ; AVX512-NEXT:    vplzcntd %zmm0, %zmm0
1626 ; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
1627 ; AVX512-NEXT:    vpsubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1628 ; AVX512-NEXT:    vzeroupper
1629 ; AVX512-NEXT:    retq
1631 ; X86-SSE-LABEL: testv16i8:
1632 ; X86-SSE:       # %bb.0:
1633 ; X86-SSE-NEXT:    movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1634 ; X86-SSE-NEXT:    movdqa %xmm1, %xmm2
1635 ; X86-SSE-NEXT:    pshufb %xmm0, %xmm2
1636 ; X86-SSE-NEXT:    psrlw $4, %xmm0
1637 ; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1638 ; X86-SSE-NEXT:    pxor %xmm3, %xmm3
1639 ; X86-SSE-NEXT:    pcmpeqb %xmm0, %xmm3
1640 ; X86-SSE-NEXT:    pand %xmm2, %xmm3
1641 ; X86-SSE-NEXT:    pshufb %xmm0, %xmm1
1642 ; X86-SSE-NEXT:    paddb %xmm3, %xmm1
1643 ; X86-SSE-NEXT:    movdqa %xmm1, %xmm0
1644 ; X86-SSE-NEXT:    retl
1645   %out = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %in, i1 0)
1646   ret <16 x i8> %out
1649 define <16 x i8> @testv16i8u(<16 x i8> %in) nounwind {
1650 ; SSE2-LABEL: testv16i8u:
1651 ; SSE2:       # %bb.0:
1652 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1653 ; SSE2-NEXT:    psrlw $1, %xmm1
1654 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1655 ; SSE2-NEXT:    por %xmm1, %xmm0
1656 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1657 ; SSE2-NEXT:    psrlw $2, %xmm1
1658 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1659 ; SSE2-NEXT:    por %xmm1, %xmm0
1660 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1661 ; SSE2-NEXT:    psrlw $4, %xmm1
1662 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1663 ; SSE2-NEXT:    pand %xmm2, %xmm1
1664 ; SSE2-NEXT:    por %xmm1, %xmm0
1665 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
1666 ; SSE2-NEXT:    pxor %xmm1, %xmm0
1667 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1668 ; SSE2-NEXT:    psrlw $1, %xmm1
1669 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1670 ; SSE2-NEXT:    psubb %xmm1, %xmm0
1671 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1672 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1673 ; SSE2-NEXT:    pand %xmm1, %xmm3
1674 ; SSE2-NEXT:    psrlw $2, %xmm0
1675 ; SSE2-NEXT:    pand %xmm1, %xmm0
1676 ; SSE2-NEXT:    paddb %xmm3, %xmm0
1677 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1678 ; SSE2-NEXT:    psrlw $4, %xmm1
1679 ; SSE2-NEXT:    paddb %xmm1, %xmm0
1680 ; SSE2-NEXT:    pand %xmm2, %xmm0
1681 ; SSE2-NEXT:    retq
1683 ; SSE3-LABEL: testv16i8u:
1684 ; SSE3:       # %bb.0:
1685 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1686 ; SSE3-NEXT:    psrlw $1, %xmm1
1687 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1688 ; SSE3-NEXT:    por %xmm1, %xmm0
1689 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1690 ; SSE3-NEXT:    psrlw $2, %xmm1
1691 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1692 ; SSE3-NEXT:    por %xmm1, %xmm0
1693 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1694 ; SSE3-NEXT:    psrlw $4, %xmm1
1695 ; SSE3-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1696 ; SSE3-NEXT:    pand %xmm2, %xmm1
1697 ; SSE3-NEXT:    por %xmm1, %xmm0
1698 ; SSE3-NEXT:    pcmpeqd %xmm1, %xmm1
1699 ; SSE3-NEXT:    pxor %xmm1, %xmm0
1700 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1701 ; SSE3-NEXT:    psrlw $1, %xmm1
1702 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1703 ; SSE3-NEXT:    psubb %xmm1, %xmm0
1704 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
1705 ; SSE3-NEXT:    movdqa %xmm0, %xmm3
1706 ; SSE3-NEXT:    pand %xmm1, %xmm3
1707 ; SSE3-NEXT:    psrlw $2, %xmm0
1708 ; SSE3-NEXT:    pand %xmm1, %xmm0
1709 ; SSE3-NEXT:    paddb %xmm3, %xmm0
1710 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
1711 ; SSE3-NEXT:    psrlw $4, %xmm1
1712 ; SSE3-NEXT:    paddb %xmm1, %xmm0
1713 ; SSE3-NEXT:    pand %xmm2, %xmm0
1714 ; SSE3-NEXT:    retq
1716 ; SSSE3-LABEL: testv16i8u:
1717 ; SSSE3:       # %bb.0:
1718 ; SSSE3-NEXT:    movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1719 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1720 ; SSSE3-NEXT:    pshufb %xmm0, %xmm2
1721 ; SSSE3-NEXT:    psrlw $4, %xmm0
1722 ; SSSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1723 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
1724 ; SSSE3-NEXT:    pcmpeqb %xmm0, %xmm3
1725 ; SSSE3-NEXT:    pand %xmm2, %xmm3
1726 ; SSSE3-NEXT:    pshufb %xmm0, %xmm1
1727 ; SSSE3-NEXT:    paddb %xmm3, %xmm1
1728 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1729 ; SSSE3-NEXT:    retq
1731 ; SSE41-LABEL: testv16i8u:
1732 ; SSE41:       # %bb.0:
1733 ; SSE41-NEXT:    movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1734 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
1735 ; SSE41-NEXT:    pshufb %xmm0, %xmm2
1736 ; SSE41-NEXT:    psrlw $4, %xmm0
1737 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1738 ; SSE41-NEXT:    pxor %xmm3, %xmm3
1739 ; SSE41-NEXT:    pcmpeqb %xmm0, %xmm3
1740 ; SSE41-NEXT:    pand %xmm2, %xmm3
1741 ; SSE41-NEXT:    pshufb %xmm0, %xmm1
1742 ; SSE41-NEXT:    paddb %xmm3, %xmm1
1743 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1744 ; SSE41-NEXT:    retq
1746 ; AVX1OR2-LABEL: testv16i8u:
1747 ; AVX1OR2:       # %bb.0:
1748 ; AVX1OR2-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1749 ; AVX1OR2-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
1750 ; AVX1OR2-NEXT:    vpsrlw $4, %xmm0, %xmm0
1751 ; AVX1OR2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1752 ; AVX1OR2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1753 ; AVX1OR2-NEXT:    vpcmpeqb %xmm3, %xmm0, %xmm3
1754 ; AVX1OR2-NEXT:    vpand %xmm3, %xmm2, %xmm2
1755 ; AVX1OR2-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
1756 ; AVX1OR2-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
1757 ; AVX1OR2-NEXT:    retq
1759 ; AVX512VL-LABEL: testv16i8u:
1760 ; AVX512VL:       # %bb.0:
1761 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1762 ; AVX512VL-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
1763 ; AVX512VL-NEXT:    vpsrlw $4, %xmm0, %xmm0
1764 ; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
1765 ; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1766 ; AVX512VL-NEXT:    vpcmpeqb %xmm3, %xmm0, %xmm3
1767 ; AVX512VL-NEXT:    vpand %xmm3, %xmm2, %xmm2
1768 ; AVX512VL-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
1769 ; AVX512VL-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
1770 ; AVX512VL-NEXT:    retq
1772 ; AVX512VLBWDQ-LABEL: testv16i8u:
1773 ; AVX512VLBWDQ:       # %bb.0:
1774 ; AVX512VLBWDQ-NEXT:    vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1775 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm0, %xmm1, %xmm2
1776 ; AVX512VLBWDQ-NEXT:    vpsrlw $4, %xmm0, %xmm0
1777 ; AVX512VLBWDQ-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
1778 ; AVX512VLBWDQ-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1779 ; AVX512VLBWDQ-NEXT:    vpcmpeqb %xmm3, %xmm0, %xmm3
1780 ; AVX512VLBWDQ-NEXT:    vpand %xmm3, %xmm2, %xmm2
1781 ; AVX512VLBWDQ-NEXT:    vpshufb %xmm0, %xmm1, %xmm0
1782 ; AVX512VLBWDQ-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
1783 ; AVX512VLBWDQ-NEXT:    retq
1785 ; AVX512-LABEL: testv16i8u:
1786 ; AVX512:       # %bb.0:
1787 ; AVX512-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
1788 ; AVX512-NEXT:    vplzcntd %zmm0, %zmm0
1789 ; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
1790 ; AVX512-NEXT:    vpsubb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1791 ; AVX512-NEXT:    vzeroupper
1792 ; AVX512-NEXT:    retq
1794 ; X86-SSE-LABEL: testv16i8u:
1795 ; X86-SSE:       # %bb.0:
1796 ; X86-SSE-NEXT:    movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
1797 ; X86-SSE-NEXT:    movdqa %xmm1, %xmm2
1798 ; X86-SSE-NEXT:    pshufb %xmm0, %xmm2
1799 ; X86-SSE-NEXT:    psrlw $4, %xmm0
1800 ; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1801 ; X86-SSE-NEXT:    pxor %xmm3, %xmm3
1802 ; X86-SSE-NEXT:    pcmpeqb %xmm0, %xmm3
1803 ; X86-SSE-NEXT:    pand %xmm2, %xmm3
1804 ; X86-SSE-NEXT:    pshufb %xmm0, %xmm1
1805 ; X86-SSE-NEXT:    paddb %xmm3, %xmm1
1806 ; X86-SSE-NEXT:    movdqa %xmm1, %xmm0
1807 ; X86-SSE-NEXT:    retl
1808   %out = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %in, i1 -1)
1809   ret <16 x i8> %out
1812 define <2 x i64> @foldv2i64() nounwind {
1813 ; SSE-LABEL: foldv2i64:
1814 ; SSE:       # %bb.0:
1815 ; SSE-NEXT:    movss {{.*#+}} xmm0 = [55,0,0,0]
1816 ; SSE-NEXT:    retq
1818 ; NOBW-LABEL: foldv2i64:
1819 ; NOBW:       # %bb.0:
1820 ; NOBW-NEXT:    vmovss {{.*#+}} xmm0 = [55,0,0,0]
1821 ; NOBW-NEXT:    retq
1823 ; AVX512VLBWDQ-LABEL: foldv2i64:
1824 ; AVX512VLBWDQ:       # %bb.0:
1825 ; AVX512VLBWDQ-NEXT:    vmovss {{.*#+}} xmm0 = [55,0,0,0]
1826 ; AVX512VLBWDQ-NEXT:    retq
1828 ; X86-SSE-LABEL: foldv2i64:
1829 ; X86-SSE:       # %bb.0:
1830 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = [55,0,0,0]
1831 ; X86-SSE-NEXT:    retl
1832   %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> <i64 256, i64 -1>, i1 0)
1833   ret <2 x i64> %out
1836 define <2 x i64> @foldv2i64u() nounwind {
1837 ; SSE-LABEL: foldv2i64u:
1838 ; SSE:       # %bb.0:
1839 ; SSE-NEXT:    movss {{.*#+}} xmm0 = [55,0,0,0]
1840 ; SSE-NEXT:    retq
1842 ; NOBW-LABEL: foldv2i64u:
1843 ; NOBW:       # %bb.0:
1844 ; NOBW-NEXT:    vmovss {{.*#+}} xmm0 = [55,0,0,0]
1845 ; NOBW-NEXT:    retq
1847 ; AVX512VLBWDQ-LABEL: foldv2i64u:
1848 ; AVX512VLBWDQ:       # %bb.0:
1849 ; AVX512VLBWDQ-NEXT:    vmovss {{.*#+}} xmm0 = [55,0,0,0]
1850 ; AVX512VLBWDQ-NEXT:    retq
1852 ; X86-SSE-LABEL: foldv2i64u:
1853 ; X86-SSE:       # %bb.0:
1854 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = [55,0,0,0]
1855 ; X86-SSE-NEXT:    retl
1856   %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> <i64 256, i64 -1>, i1 -1)
1857   ret <2 x i64> %out
1860 define <4 x i32> @foldv4i32() nounwind {
1861 ; SSE-LABEL: foldv4i32:
1862 ; SSE:       # %bb.0:
1863 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [23,0,32,24]
1864 ; SSE-NEXT:    retq
1866 ; NOBW-LABEL: foldv4i32:
1867 ; NOBW:       # %bb.0:
1868 ; NOBW-NEXT:    vmovaps {{.*#+}} xmm0 = [23,0,32,24]
1869 ; NOBW-NEXT:    retq
1871 ; AVX512VLBWDQ-LABEL: foldv4i32:
1872 ; AVX512VLBWDQ:       # %bb.0:
1873 ; AVX512VLBWDQ-NEXT:    vmovaps {{.*#+}} xmm0 = [23,0,32,24]
1874 ; AVX512VLBWDQ-NEXT:    retq
1876 ; X86-SSE-LABEL: foldv4i32:
1877 ; X86-SSE:       # %bb.0:
1878 ; X86-SSE-NEXT:    movaps {{.*#+}} xmm0 = [23,0,32,24]
1879 ; X86-SSE-NEXT:    retl
1880   %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>, i1 0)
1881   ret <4 x i32> %out
1884 define <4 x i32> @foldv4i32u() nounwind {
1885 ; SSE-LABEL: foldv4i32u:
1886 ; SSE:       # %bb.0:
1887 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [23,0,32,24]
1888 ; SSE-NEXT:    retq
1890 ; NOBW-LABEL: foldv4i32u:
1891 ; NOBW:       # %bb.0:
1892 ; NOBW-NEXT:    vmovaps {{.*#+}} xmm0 = [23,0,32,24]
1893 ; NOBW-NEXT:    retq
1895 ; AVX512VLBWDQ-LABEL: foldv4i32u:
1896 ; AVX512VLBWDQ:       # %bb.0:
1897 ; AVX512VLBWDQ-NEXT:    vmovaps {{.*#+}} xmm0 = [23,0,32,24]
1898 ; AVX512VLBWDQ-NEXT:    retq
1900 ; X86-SSE-LABEL: foldv4i32u:
1901 ; X86-SSE:       # %bb.0:
1902 ; X86-SSE-NEXT:    movaps {{.*#+}} xmm0 = [23,0,32,24]
1903 ; X86-SSE-NEXT:    retl
1904   %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>, i1 -1)
1905   ret <4 x i32> %out
1908 define <8 x i16> @foldv8i16() nounwind {
1909 ; SSE-LABEL: foldv8i16:
1910 ; SSE:       # %bb.0:
1911 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
1912 ; SSE-NEXT:    retq
1914 ; NOBW-LABEL: foldv8i16:
1915 ; NOBW:       # %bb.0:
1916 ; NOBW-NEXT:    vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
1917 ; NOBW-NEXT:    retq
1919 ; AVX512VLBWDQ-LABEL: foldv8i16:
1920 ; AVX512VLBWDQ:       # %bb.0:
1921 ; AVX512VLBWDQ-NEXT:    vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
1922 ; AVX512VLBWDQ-NEXT:    retq
1924 ; X86-SSE-LABEL: foldv8i16:
1925 ; X86-SSE:       # %bb.0:
1926 ; X86-SSE-NEXT:    movaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
1927 ; X86-SSE-NEXT:    retl
1928   %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88>, i1 0)
1929   ret <8 x i16> %out
1932 define <8 x i16> @foldv8i16u() nounwind {
1933 ; SSE-LABEL: foldv8i16u:
1934 ; SSE:       # %bb.0:
1935 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
1936 ; SSE-NEXT:    retq
1938 ; NOBW-LABEL: foldv8i16u:
1939 ; NOBW:       # %bb.0:
1940 ; NOBW-NEXT:    vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
1941 ; NOBW-NEXT:    retq
1943 ; AVX512VLBWDQ-LABEL: foldv8i16u:
1944 ; AVX512VLBWDQ:       # %bb.0:
1945 ; AVX512VLBWDQ-NEXT:    vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
1946 ; AVX512VLBWDQ-NEXT:    retq
1948 ; X86-SSE-LABEL: foldv8i16u:
1949 ; X86-SSE:       # %bb.0:
1950 ; X86-SSE-NEXT:    movaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9]
1951 ; X86-SSE-NEXT:    retl
1952   %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88>, i1 -1)
1953   ret <8 x i16> %out
1956 define <16 x i8> @foldv16i8() nounwind {
1957 ; SSE-LABEL: foldv16i8:
1958 ; SSE:       # %bb.0:
1959 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
1960 ; SSE-NEXT:    retq
1962 ; NOBW-LABEL: foldv16i8:
1963 ; NOBW:       # %bb.0:
1964 ; NOBW-NEXT:    vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
1965 ; NOBW-NEXT:    retq
1967 ; AVX512VLBWDQ-LABEL: foldv16i8:
1968 ; AVX512VLBWDQ:       # %bb.0:
1969 ; AVX512VLBWDQ-NEXT:    vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
1970 ; AVX512VLBWDQ-NEXT:    retq
1972 ; X86-SSE-LABEL: foldv16i8:
1973 ; X86-SSE:       # %bb.0:
1974 ; X86-SSE-NEXT:    movaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
1975 ; X86-SSE-NEXT:    retl
1976   %out = call <16 x i8> @llvm.ctlz.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)
1977   ret <16 x i8> %out
1980 define <16 x i8> @foldv16i8u() nounwind {
1981 ; SSE-LABEL: foldv16i8u:
1982 ; SSE:       # %bb.0:
1983 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
1984 ; SSE-NEXT:    retq
1986 ; NOBW-LABEL: foldv16i8u:
1987 ; NOBW:       # %bb.0:
1988 ; NOBW-NEXT:    vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
1989 ; NOBW-NEXT:    retq
1991 ; AVX512VLBWDQ-LABEL: foldv16i8u:
1992 ; AVX512VLBWDQ:       # %bb.0:
1993 ; AVX512VLBWDQ-NEXT:    vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
1994 ; AVX512VLBWDQ-NEXT:    retq
1996 ; X86-SSE-LABEL: foldv16i8u:
1997 ; X86-SSE:       # %bb.0:
1998 ; X86-SSE-NEXT:    movaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2]
1999 ; X86-SSE-NEXT:    retl
2000   %out = call <16 x i8> @llvm.ctlz.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)
2001   ret <16 x i8> %out
2004 declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>, i1)
2005 declare <4 x i32> @llvm.ctlz.v4i32(<4 x i32>, i1)
2006 declare <8 x i16> @llvm.ctlz.v8i16(<8 x i16>, i1)
2007 declare <16 x i8> @llvm.ctlz.v16i8(<16 x i8>, i1)
2008 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
2009 ; AVX: {{.*}}