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