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