1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2 4 ; 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 5 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512cd | FileCheck %s --check-prefix=AVX512CD --check-prefix=ALL --check-prefix=AVX512 6 7 define <4 x i64> @testv4i64(<4 x i64> %in) nounwind { 8 ; AVX1-LABEL: testv4i64: 9 ; AVX1: # BB#0: 10 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 11 ; AVX1-NEXT: vpextrq $1, %xmm1, %rax 12 ; AVX1-NEXT: bsrq %rax, %rax 13 ; AVX1-NEXT: movl $127, %ecx 14 ; AVX1-NEXT: cmoveq %rcx, %rax 15 ; AVX1-NEXT: xorq $63, %rax 16 ; AVX1-NEXT: vmovq %rax, %xmm2 17 ; AVX1-NEXT: vmovq %xmm1, %rax 18 ; AVX1-NEXT: bsrq %rax, %rax 19 ; AVX1-NEXT: cmoveq %rcx, %rax 20 ; AVX1-NEXT: xorq $63, %rax 21 ; AVX1-NEXT: vmovq %rax, %xmm1 22 ; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 23 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax 24 ; AVX1-NEXT: bsrq %rax, %rax 25 ; AVX1-NEXT: cmoveq %rcx, %rax 26 ; AVX1-NEXT: xorq $63, %rax 27 ; AVX1-NEXT: vmovq %rax, %xmm2 28 ; AVX1-NEXT: vmovq %xmm0, %rax 29 ; AVX1-NEXT: bsrq %rax, %rax 30 ; AVX1-NEXT: cmoveq %rcx, %rax 31 ; AVX1-NEXT: xorq $63, %rax 32 ; AVX1-NEXT: vmovq %rax, %xmm0 33 ; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 34 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 35 ; AVX1-NEXT: retq 36 ; 37 ; AVX2-LABEL: testv4i64: 38 ; AVX2: # BB#0: 39 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 40 ; AVX2-NEXT: vpextrq $1, %xmm1, %rax 41 ; AVX2-NEXT: bsrq %rax, %rax 42 ; AVX2-NEXT: movl $127, %ecx 43 ; AVX2-NEXT: cmoveq %rcx, %rax 44 ; AVX2-NEXT: xorq $63, %rax 45 ; AVX2-NEXT: vmovq %rax, %xmm2 46 ; AVX2-NEXT: vmovq %xmm1, %rax 47 ; AVX2-NEXT: bsrq %rax, %rax 48 ; AVX2-NEXT: cmoveq %rcx, %rax 49 ; AVX2-NEXT: xorq $63, %rax 50 ; AVX2-NEXT: vmovq %rax, %xmm1 51 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 52 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax 53 ; AVX2-NEXT: bsrq %rax, %rax 54 ; AVX2-NEXT: cmoveq %rcx, %rax 55 ; AVX2-NEXT: xorq $63, %rax 56 ; AVX2-NEXT: vmovq %rax, %xmm2 57 ; AVX2-NEXT: vmovq %xmm0, %rax 58 ; AVX2-NEXT: bsrq %rax, %rax 59 ; AVX2-NEXT: cmoveq %rcx, %rax 60 ; AVX2-NEXT: xorq $63, %rax 61 ; AVX2-NEXT: vmovq %rax, %xmm0 62 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 63 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 64 ; AVX2-NEXT: retq 65 ; 66 ; AVX512VLCD-LABEL: testv4i64: 67 ; AVX512VLCD: ## BB#0: 68 ; AVX512VLCD-NEXT: vplzcntq %ymm0, %ymm0 69 ; AVX512VLCD-NEXT: retq 70 ; 71 ; AVX512CD-LABEL: testv4i64: 72 ; AVX512CD: ## BB#0: 73 ; AVX512CD-NEXT: vplzcntq %zmm0, %zmm0 74 ; AVX512CD-NEXT: retq 75 76 %out = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %in, i1 0) 77 ret <4 x i64> %out 78 } 79 80 define <4 x i64> @testv4i64u(<4 x i64> %in) nounwind { 81 ; AVX1-LABEL: testv4i64u: 82 ; AVX1: # BB#0: 83 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 84 ; AVX1-NEXT: vpextrq $1, %xmm1, %rax 85 ; AVX1-NEXT: bsrq %rax, %rax 86 ; AVX1-NEXT: xorq $63, %rax 87 ; AVX1-NEXT: vmovq %rax, %xmm2 88 ; AVX1-NEXT: vmovq %xmm1, %rax 89 ; AVX1-NEXT: bsrq %rax, %rax 90 ; AVX1-NEXT: xorq $63, %rax 91 ; AVX1-NEXT: vmovq %rax, %xmm1 92 ; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 93 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax 94 ; AVX1-NEXT: bsrq %rax, %rax 95 ; AVX1-NEXT: xorq $63, %rax 96 ; AVX1-NEXT: vmovq %rax, %xmm2 97 ; AVX1-NEXT: vmovq %xmm0, %rax 98 ; AVX1-NEXT: bsrq %rax, %rax 99 ; AVX1-NEXT: xorq $63, %rax 100 ; AVX1-NEXT: vmovq %rax, %xmm0 101 ; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 102 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 103 ; AVX1-NEXT: retq 104 ; 105 ; AVX2-LABEL: testv4i64u: 106 ; AVX2: # BB#0: 107 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 108 ; AVX2-NEXT: vpextrq $1, %xmm1, %rax 109 ; AVX2-NEXT: bsrq %rax, %rax 110 ; AVX2-NEXT: xorq $63, %rax 111 ; AVX2-NEXT: vmovq %rax, %xmm2 112 ; AVX2-NEXT: vmovq %xmm1, %rax 113 ; AVX2-NEXT: bsrq %rax, %rax 114 ; AVX2-NEXT: xorq $63, %rax 115 ; AVX2-NEXT: vmovq %rax, %xmm1 116 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 117 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax 118 ; AVX2-NEXT: bsrq %rax, %rax 119 ; AVX2-NEXT: xorq $63, %rax 120 ; AVX2-NEXT: vmovq %rax, %xmm2 121 ; AVX2-NEXT: vmovq %xmm0, %rax 122 ; AVX2-NEXT: bsrq %rax, %rax 123 ; AVX2-NEXT: xorq $63, %rax 124 ; AVX2-NEXT: vmovq %rax, %xmm0 125 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 126 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 127 ; AVX2-NEXT: retq 128 ; 129 ; AVX512VLCD-LABEL: testv4i64u: 130 ; AVX512VLCD: ## BB#0: 131 ; AVX512VLCD-NEXT: vplzcntq %ymm0, %ymm0 132 ; AVX512VLCD-NEXT: retq 133 ; 134 ; AVX512CD-LABEL: testv4i64u: 135 ; AVX512CD: ## BB#0: 136 ; AVX512CD-NEXT: vplzcntq %zmm0, %zmm0 137 ; AVX512CD-NEXT: retq 138 139 %out = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %in, i1 -1) 140 ret <4 x i64> %out 141 } 142 143 define <8 x i32> @testv8i32(<8 x i32> %in) nounwind { 144 ; AVX1-LABEL: testv8i32: 145 ; AVX1: # BB#0: 146 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 147 ; AVX1-NEXT: vpextrd $1, %xmm1, %eax 148 ; AVX1-NEXT: bsrl %eax, %ecx 149 ; AVX1-NEXT: movl $63, %eax 150 ; AVX1-NEXT: cmovel %eax, %ecx 151 ; AVX1-NEXT: xorl $31, %ecx 152 ; AVX1-NEXT: vmovd %xmm1, %edx 153 ; AVX1-NEXT: bsrl %edx, %edx 154 ; AVX1-NEXT: cmovel %eax, %edx 155 ; AVX1-NEXT: xorl $31, %edx 156 ; AVX1-NEXT: vmovd %edx, %xmm2 157 ; AVX1-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2 158 ; AVX1-NEXT: vpextrd $2, %xmm1, %ecx 159 ; AVX1-NEXT: bsrl %ecx, %ecx 160 ; AVX1-NEXT: cmovel %eax, %ecx 161 ; AVX1-NEXT: xorl $31, %ecx 162 ; AVX1-NEXT: vpinsrd $2, %ecx, %xmm2, %xmm2 163 ; AVX1-NEXT: vpextrd $3, %xmm1, %ecx 164 ; AVX1-NEXT: bsrl %ecx, %ecx 165 ; AVX1-NEXT: cmovel %eax, %ecx 166 ; AVX1-NEXT: xorl $31, %ecx 167 ; AVX1-NEXT: vpinsrd $3, %ecx, %xmm2, %xmm1 168 ; AVX1-NEXT: vpextrd $1, %xmm0, %ecx 169 ; AVX1-NEXT: bsrl %ecx, %ecx 170 ; AVX1-NEXT: cmovel %eax, %ecx 171 ; AVX1-NEXT: xorl $31, %ecx 172 ; AVX1-NEXT: vmovd %xmm0, %edx 173 ; AVX1-NEXT: bsrl %edx, %edx 174 ; AVX1-NEXT: cmovel %eax, %edx 175 ; AVX1-NEXT: xorl $31, %edx 176 ; AVX1-NEXT: vmovd %edx, %xmm2 177 ; AVX1-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2 178 ; AVX1-NEXT: vpextrd $2, %xmm0, %ecx 179 ; AVX1-NEXT: bsrl %ecx, %ecx 180 ; AVX1-NEXT: cmovel %eax, %ecx 181 ; AVX1-NEXT: xorl $31, %ecx 182 ; AVX1-NEXT: vpinsrd $2, %ecx, %xmm2, %xmm2 183 ; AVX1-NEXT: vpextrd $3, %xmm0, %ecx 184 ; AVX1-NEXT: bsrl %ecx, %ecx 185 ; AVX1-NEXT: cmovel %eax, %ecx 186 ; AVX1-NEXT: xorl $31, %ecx 187 ; AVX1-NEXT: vpinsrd $3, %ecx, %xmm2, %xmm0 188 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 189 ; AVX1-NEXT: retq 190 ; 191 ; AVX2-LABEL: testv8i32: 192 ; AVX2: # BB#0: 193 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 194 ; AVX2-NEXT: vpextrd $1, %xmm1, %eax 195 ; AVX2-NEXT: bsrl %eax, %ecx 196 ; AVX2-NEXT: movl $63, %eax 197 ; AVX2-NEXT: cmovel %eax, %ecx 198 ; AVX2-NEXT: xorl $31, %ecx 199 ; AVX2-NEXT: vmovd %xmm1, %edx 200 ; AVX2-NEXT: bsrl %edx, %edx 201 ; AVX2-NEXT: cmovel %eax, %edx 202 ; AVX2-NEXT: xorl $31, %edx 203 ; AVX2-NEXT: vmovd %edx, %xmm2 204 ; AVX2-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2 205 ; AVX2-NEXT: vpextrd $2, %xmm1, %ecx 206 ; AVX2-NEXT: bsrl %ecx, %ecx 207 ; AVX2-NEXT: cmovel %eax, %ecx 208 ; AVX2-NEXT: xorl $31, %ecx 209 ; AVX2-NEXT: vpinsrd $2, %ecx, %xmm2, %xmm2 210 ; AVX2-NEXT: vpextrd $3, %xmm1, %ecx 211 ; AVX2-NEXT: bsrl %ecx, %ecx 212 ; AVX2-NEXT: cmovel %eax, %ecx 213 ; AVX2-NEXT: xorl $31, %ecx 214 ; AVX2-NEXT: vpinsrd $3, %ecx, %xmm2, %xmm1 215 ; AVX2-NEXT: vpextrd $1, %xmm0, %ecx 216 ; AVX2-NEXT: bsrl %ecx, %ecx 217 ; AVX2-NEXT: cmovel %eax, %ecx 218 ; AVX2-NEXT: xorl $31, %ecx 219 ; AVX2-NEXT: vmovd %xmm0, %edx 220 ; AVX2-NEXT: bsrl %edx, %edx 221 ; AVX2-NEXT: cmovel %eax, %edx 222 ; AVX2-NEXT: xorl $31, %edx 223 ; AVX2-NEXT: vmovd %edx, %xmm2 224 ; AVX2-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2 225 ; AVX2-NEXT: vpextrd $2, %xmm0, %ecx 226 ; AVX2-NEXT: bsrl %ecx, %ecx 227 ; AVX2-NEXT: cmovel %eax, %ecx 228 ; AVX2-NEXT: xorl $31, %ecx 229 ; AVX2-NEXT: vpinsrd $2, %ecx, %xmm2, %xmm2 230 ; AVX2-NEXT: vpextrd $3, %xmm0, %ecx 231 ; AVX2-NEXT: bsrl %ecx, %ecx 232 ; AVX2-NEXT: cmovel %eax, %ecx 233 ; AVX2-NEXT: xorl $31, %ecx 234 ; AVX2-NEXT: vpinsrd $3, %ecx, %xmm2, %xmm0 235 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 236 ; AVX2-NEXT: retq 237 ; 238 ; AVX512VLCD-LABEL: testv8i32: 239 ; AVX512VLCD: ## BB#0: 240 ; AVX512VLCD-NEXT: vplzcntd %ymm0, %ymm0 241 ; AVX512VLCD-NEXT: retq 242 ; 243 ; AVX512CD-LABEL: testv8i32: 244 ; AVX512CD: ## BB#0: 245 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 246 ; AVX512CD-NEXT: retq 247 248 %out = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %in, i1 0) 249 ret <8 x i32> %out 250 } 251 252 define <8 x i32> @testv8i32u(<8 x i32> %in) nounwind { 253 ; AVX1-LABEL: testv8i32u: 254 ; AVX1: # BB#0: 255 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 256 ; AVX1-NEXT: vpextrd $1, %xmm1, %eax 257 ; AVX1-NEXT: bsrl %eax, %eax 258 ; AVX1-NEXT: xorl $31, %eax 259 ; AVX1-NEXT: vmovd %xmm1, %ecx 260 ; AVX1-NEXT: bsrl %ecx, %ecx 261 ; AVX1-NEXT: xorl $31, %ecx 262 ; AVX1-NEXT: vmovd %ecx, %xmm2 263 ; AVX1-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2 264 ; AVX1-NEXT: vpextrd $2, %xmm1, %eax 265 ; AVX1-NEXT: bsrl %eax, %eax 266 ; AVX1-NEXT: xorl $31, %eax 267 ; AVX1-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2 268 ; AVX1-NEXT: vpextrd $3, %xmm1, %eax 269 ; AVX1-NEXT: bsrl %eax, %eax 270 ; AVX1-NEXT: xorl $31, %eax 271 ; AVX1-NEXT: vpinsrd $3, %eax, %xmm2, %xmm1 272 ; AVX1-NEXT: vpextrd $1, %xmm0, %eax 273 ; AVX1-NEXT: bsrl %eax, %eax 274 ; AVX1-NEXT: xorl $31, %eax 275 ; AVX1-NEXT: vmovd %xmm0, %ecx 276 ; AVX1-NEXT: bsrl %ecx, %ecx 277 ; AVX1-NEXT: xorl $31, %ecx 278 ; AVX1-NEXT: vmovd %ecx, %xmm2 279 ; AVX1-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2 280 ; AVX1-NEXT: vpextrd $2, %xmm0, %eax 281 ; AVX1-NEXT: bsrl %eax, %eax 282 ; AVX1-NEXT: xorl $31, %eax 283 ; AVX1-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2 284 ; AVX1-NEXT: vpextrd $3, %xmm0, %eax 285 ; AVX1-NEXT: bsrl %eax, %eax 286 ; AVX1-NEXT: xorl $31, %eax 287 ; AVX1-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0 288 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 289 ; AVX1-NEXT: retq 290 ; 291 ; AVX2-LABEL: testv8i32u: 292 ; AVX2: # BB#0: 293 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 294 ; AVX2-NEXT: vpextrd $1, %xmm1, %eax 295 ; AVX2-NEXT: bsrl %eax, %eax 296 ; AVX2-NEXT: xorl $31, %eax 297 ; AVX2-NEXT: vmovd %xmm1, %ecx 298 ; AVX2-NEXT: bsrl %ecx, %ecx 299 ; AVX2-NEXT: xorl $31, %ecx 300 ; AVX2-NEXT: vmovd %ecx, %xmm2 301 ; AVX2-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2 302 ; AVX2-NEXT: vpextrd $2, %xmm1, %eax 303 ; AVX2-NEXT: bsrl %eax, %eax 304 ; AVX2-NEXT: xorl $31, %eax 305 ; AVX2-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2 306 ; AVX2-NEXT: vpextrd $3, %xmm1, %eax 307 ; AVX2-NEXT: bsrl %eax, %eax 308 ; AVX2-NEXT: xorl $31, %eax 309 ; AVX2-NEXT: vpinsrd $3, %eax, %xmm2, %xmm1 310 ; AVX2-NEXT: vpextrd $1, %xmm0, %eax 311 ; AVX2-NEXT: bsrl %eax, %eax 312 ; AVX2-NEXT: xorl $31, %eax 313 ; AVX2-NEXT: vmovd %xmm0, %ecx 314 ; AVX2-NEXT: bsrl %ecx, %ecx 315 ; AVX2-NEXT: xorl $31, %ecx 316 ; AVX2-NEXT: vmovd %ecx, %xmm2 317 ; AVX2-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2 318 ; AVX2-NEXT: vpextrd $2, %xmm0, %eax 319 ; AVX2-NEXT: bsrl %eax, %eax 320 ; AVX2-NEXT: xorl $31, %eax 321 ; AVX2-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2 322 ; AVX2-NEXT: vpextrd $3, %xmm0, %eax 323 ; AVX2-NEXT: bsrl %eax, %eax 324 ; AVX2-NEXT: xorl $31, %eax 325 ; AVX2-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0 326 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 327 ; AVX2-NEXT: retq 328 ; 329 ; AVX512VLCD-LABEL: testv8i32u: 330 ; AVX512VLCD: ## BB#0: 331 ; AVX512VLCD-NEXT: vplzcntd %ymm0, %ymm0 332 ; AVX512VLCD-NEXT: retq 333 ; 334 ; AVX512CD-LABEL: testv8i32u: 335 ; AVX512CD: ## BB#0: 336 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 337 ; AVX512CD-NEXT: retq 338 339 %out = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %in, i1 -1) 340 ret <8 x i32> %out 341 } 342 343 define <16 x i16> @testv16i16(<16 x i16> %in) nounwind { 344 ; AVX1-LABEL: testv16i16: 345 ; AVX1: # BB#0: 346 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 347 ; AVX1-NEXT: vpextrw $1, %xmm1, %eax 348 ; AVX1-NEXT: bsrw %ax, %cx 349 ; AVX1-NEXT: movw $31, %ax 350 ; AVX1-NEXT: cmovew %ax, %cx 351 ; AVX1-NEXT: xorl $15, %ecx 352 ; AVX1-NEXT: vmovd %xmm1, %edx 353 ; AVX1-NEXT: bsrw %dx, %dx 354 ; AVX1-NEXT: cmovew %ax, %dx 355 ; AVX1-NEXT: xorl $15, %edx 356 ; AVX1-NEXT: vmovd %edx, %xmm2 357 ; AVX1-NEXT: vpinsrw $1, %ecx, %xmm2, %xmm2 358 ; AVX1-NEXT: vpextrw $2, %xmm1, %ecx 359 ; AVX1-NEXT: bsrw %cx, %cx 360 ; AVX1-NEXT: cmovew %ax, %cx 361 ; AVX1-NEXT: xorl $15, %ecx 362 ; AVX1-NEXT: vpinsrw $2, %ecx, %xmm2, %xmm2 363 ; AVX1-NEXT: vpextrw $3, %xmm1, %ecx 364 ; AVX1-NEXT: bsrw %cx, %cx 365 ; AVX1-NEXT: cmovew %ax, %cx 366 ; AVX1-NEXT: xorl $15, %ecx 367 ; AVX1-NEXT: vpinsrw $3, %ecx, %xmm2, %xmm2 368 ; AVX1-NEXT: vpextrw $4, %xmm1, %ecx 369 ; AVX1-NEXT: bsrw %cx, %cx 370 ; AVX1-NEXT: cmovew %ax, %cx 371 ; AVX1-NEXT: xorl $15, %ecx 372 ; AVX1-NEXT: vpinsrw $4, %ecx, %xmm2, %xmm2 373 ; AVX1-NEXT: vpextrw $5, %xmm1, %ecx 374 ; AVX1-NEXT: bsrw %cx, %cx 375 ; AVX1-NEXT: cmovew %ax, %cx 376 ; AVX1-NEXT: xorl $15, %ecx 377 ; AVX1-NEXT: vpinsrw $5, %ecx, %xmm2, %xmm2 378 ; AVX1-NEXT: vpextrw $6, %xmm1, %ecx 379 ; AVX1-NEXT: bsrw %cx, %cx 380 ; AVX1-NEXT: cmovew %ax, %cx 381 ; AVX1-NEXT: xorl $15, %ecx 382 ; AVX1-NEXT: vpinsrw $6, %ecx, %xmm2, %xmm2 383 ; AVX1-NEXT: vpextrw $7, %xmm1, %ecx 384 ; AVX1-NEXT: bsrw %cx, %cx 385 ; AVX1-NEXT: cmovew %ax, %cx 386 ; AVX1-NEXT: xorl $15, %ecx 387 ; AVX1-NEXT: vpinsrw $7, %ecx, %xmm2, %xmm1 388 ; AVX1-NEXT: vpextrw $1, %xmm0, %ecx 389 ; AVX1-NEXT: bsrw %cx, %cx 390 ; AVX1-NEXT: cmovew %ax, %cx 391 ; AVX1-NEXT: xorl $15, %ecx 392 ; AVX1-NEXT: vmovd %xmm0, %edx 393 ; AVX1-NEXT: bsrw %dx, %dx 394 ; AVX1-NEXT: cmovew %ax, %dx 395 ; AVX1-NEXT: xorl $15, %edx 396 ; AVX1-NEXT: vmovd %edx, %xmm2 397 ; AVX1-NEXT: vpinsrw $1, %ecx, %xmm2, %xmm2 398 ; AVX1-NEXT: vpextrw $2, %xmm0, %ecx 399 ; AVX1-NEXT: bsrw %cx, %cx 400 ; AVX1-NEXT: cmovew %ax, %cx 401 ; AVX1-NEXT: xorl $15, %ecx 402 ; AVX1-NEXT: vpinsrw $2, %ecx, %xmm2, %xmm2 403 ; AVX1-NEXT: vpextrw $3, %xmm0, %ecx 404 ; AVX1-NEXT: bsrw %cx, %cx 405 ; AVX1-NEXT: cmovew %ax, %cx 406 ; AVX1-NEXT: xorl $15, %ecx 407 ; AVX1-NEXT: vpinsrw $3, %ecx, %xmm2, %xmm2 408 ; AVX1-NEXT: vpextrw $4, %xmm0, %ecx 409 ; AVX1-NEXT: bsrw %cx, %cx 410 ; AVX1-NEXT: cmovew %ax, %cx 411 ; AVX1-NEXT: xorl $15, %ecx 412 ; AVX1-NEXT: vpinsrw $4, %ecx, %xmm2, %xmm2 413 ; AVX1-NEXT: vpextrw $5, %xmm0, %ecx 414 ; AVX1-NEXT: bsrw %cx, %cx 415 ; AVX1-NEXT: cmovew %ax, %cx 416 ; AVX1-NEXT: xorl $15, %ecx 417 ; AVX1-NEXT: vpinsrw $5, %ecx, %xmm2, %xmm2 418 ; AVX1-NEXT: vpextrw $6, %xmm0, %ecx 419 ; AVX1-NEXT: bsrw %cx, %cx 420 ; AVX1-NEXT: cmovew %ax, %cx 421 ; AVX1-NEXT: xorl $15, %ecx 422 ; AVX1-NEXT: vpinsrw $6, %ecx, %xmm2, %xmm2 423 ; AVX1-NEXT: vpextrw $7, %xmm0, %ecx 424 ; AVX1-NEXT: bsrw %cx, %cx 425 ; AVX1-NEXT: cmovew %ax, %cx 426 ; AVX1-NEXT: xorl $15, %ecx 427 ; AVX1-NEXT: vpinsrw $7, %ecx, %xmm2, %xmm0 428 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 429 ; AVX1-NEXT: retq 430 ; 431 ; AVX2-LABEL: testv16i16: 432 ; AVX2: # BB#0: 433 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 434 ; AVX2-NEXT: vpextrw $1, %xmm1, %eax 435 ; AVX2-NEXT: bsrw %ax, %cx 436 ; AVX2-NEXT: movw $31, %ax 437 ; AVX2-NEXT: cmovew %ax, %cx 438 ; AVX2-NEXT: xorl $15, %ecx 439 ; AVX2-NEXT: vmovd %xmm1, %edx 440 ; AVX2-NEXT: bsrw %dx, %dx 441 ; AVX2-NEXT: cmovew %ax, %dx 442 ; AVX2-NEXT: xorl $15, %edx 443 ; AVX2-NEXT: vmovd %edx, %xmm2 444 ; AVX2-NEXT: vpinsrw $1, %ecx, %xmm2, %xmm2 445 ; AVX2-NEXT: vpextrw $2, %xmm1, %ecx 446 ; AVX2-NEXT: bsrw %cx, %cx 447 ; AVX2-NEXT: cmovew %ax, %cx 448 ; AVX2-NEXT: xorl $15, %ecx 449 ; AVX2-NEXT: vpinsrw $2, %ecx, %xmm2, %xmm2 450 ; AVX2-NEXT: vpextrw $3, %xmm1, %ecx 451 ; AVX2-NEXT: bsrw %cx, %cx 452 ; AVX2-NEXT: cmovew %ax, %cx 453 ; AVX2-NEXT: xorl $15, %ecx 454 ; AVX2-NEXT: vpinsrw $3, %ecx, %xmm2, %xmm2 455 ; AVX2-NEXT: vpextrw $4, %xmm1, %ecx 456 ; AVX2-NEXT: bsrw %cx, %cx 457 ; AVX2-NEXT: cmovew %ax, %cx 458 ; AVX2-NEXT: xorl $15, %ecx 459 ; AVX2-NEXT: vpinsrw $4, %ecx, %xmm2, %xmm2 460 ; AVX2-NEXT: vpextrw $5, %xmm1, %ecx 461 ; AVX2-NEXT: bsrw %cx, %cx 462 ; AVX2-NEXT: cmovew %ax, %cx 463 ; AVX2-NEXT: xorl $15, %ecx 464 ; AVX2-NEXT: vpinsrw $5, %ecx, %xmm2, %xmm2 465 ; AVX2-NEXT: vpextrw $6, %xmm1, %ecx 466 ; AVX2-NEXT: bsrw %cx, %cx 467 ; AVX2-NEXT: cmovew %ax, %cx 468 ; AVX2-NEXT: xorl $15, %ecx 469 ; AVX2-NEXT: vpinsrw $6, %ecx, %xmm2, %xmm2 470 ; AVX2-NEXT: vpextrw $7, %xmm1, %ecx 471 ; AVX2-NEXT: bsrw %cx, %cx 472 ; AVX2-NEXT: cmovew %ax, %cx 473 ; AVX2-NEXT: xorl $15, %ecx 474 ; AVX2-NEXT: vpinsrw $7, %ecx, %xmm2, %xmm1 475 ; AVX2-NEXT: vpextrw $1, %xmm0, %ecx 476 ; AVX2-NEXT: bsrw %cx, %cx 477 ; AVX2-NEXT: cmovew %ax, %cx 478 ; AVX2-NEXT: xorl $15, %ecx 479 ; AVX2-NEXT: vmovd %xmm0, %edx 480 ; AVX2-NEXT: bsrw %dx, %dx 481 ; AVX2-NEXT: cmovew %ax, %dx 482 ; AVX2-NEXT: xorl $15, %edx 483 ; AVX2-NEXT: vmovd %edx, %xmm2 484 ; AVX2-NEXT: vpinsrw $1, %ecx, %xmm2, %xmm2 485 ; AVX2-NEXT: vpextrw $2, %xmm0, %ecx 486 ; AVX2-NEXT: bsrw %cx, %cx 487 ; AVX2-NEXT: cmovew %ax, %cx 488 ; AVX2-NEXT: xorl $15, %ecx 489 ; AVX2-NEXT: vpinsrw $2, %ecx, %xmm2, %xmm2 490 ; AVX2-NEXT: vpextrw $3, %xmm0, %ecx 491 ; AVX2-NEXT: bsrw %cx, %cx 492 ; AVX2-NEXT: cmovew %ax, %cx 493 ; AVX2-NEXT: xorl $15, %ecx 494 ; AVX2-NEXT: vpinsrw $3, %ecx, %xmm2, %xmm2 495 ; AVX2-NEXT: vpextrw $4, %xmm0, %ecx 496 ; AVX2-NEXT: bsrw %cx, %cx 497 ; AVX2-NEXT: cmovew %ax, %cx 498 ; AVX2-NEXT: xorl $15, %ecx 499 ; AVX2-NEXT: vpinsrw $4, %ecx, %xmm2, %xmm2 500 ; AVX2-NEXT: vpextrw $5, %xmm0, %ecx 501 ; AVX2-NEXT: bsrw %cx, %cx 502 ; AVX2-NEXT: cmovew %ax, %cx 503 ; AVX2-NEXT: xorl $15, %ecx 504 ; AVX2-NEXT: vpinsrw $5, %ecx, %xmm2, %xmm2 505 ; AVX2-NEXT: vpextrw $6, %xmm0, %ecx 506 ; AVX2-NEXT: bsrw %cx, %cx 507 ; AVX2-NEXT: cmovew %ax, %cx 508 ; AVX2-NEXT: xorl $15, %ecx 509 ; AVX2-NEXT: vpinsrw $6, %ecx, %xmm2, %xmm2 510 ; AVX2-NEXT: vpextrw $7, %xmm0, %ecx 511 ; AVX2-NEXT: bsrw %cx, %cx 512 ; AVX2-NEXT: cmovew %ax, %cx 513 ; AVX2-NEXT: xorl $15, %ecx 514 ; AVX2-NEXT: vpinsrw $7, %ecx, %xmm2, %xmm0 515 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 516 ; AVX2-NEXT: retq 517 ; 518 ; AVX512VLCD-LABEL: testv16i16: 519 ; AVX512VLCD: ## BB#0: 520 ; AVX512VLCD-NEXT: vpmovzxwd %ymm0, %zmm0 521 ; AVX512VLCD-NEXT: vplzcntd %zmm0, %zmm0 522 ; AVX512VLCD-NEXT: vpmovdw %zmm0, %ymm0 523 ; AVX512VLCD-NEXT: vpsubw {{.*}}(%rip), %ymm0, %ymm0 524 ; AVX512VLCD-NEXT: retq 525 ; 526 ; AVX512CD-LABEL: testv16i16: 527 ; AVX512CD: ## BB#0: 528 ; AVX512CD-NEXT: vpmovzxwd %ymm0, %zmm0 529 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 530 ; AVX512CD-NEXT: vpmovdw %zmm0, %ymm0 531 ; AVX512CD-NEXT: vpsubw {{.*}}(%rip), %ymm0, %ymm0 532 ; AVX512CD-NEXT: retq 533 %out = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> %in, i1 0) 534 ret <16 x i16> %out 535 } 536 537 define <16 x i16> @testv16i16u(<16 x i16> %in) nounwind { 538 ; AVX1-LABEL: testv16i16u: 539 ; AVX1: # BB#0: 540 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 541 ; AVX1-NEXT: vpextrw $1, %xmm1, %eax 542 ; AVX1-NEXT: bsrw %ax, %ax 543 ; AVX1-NEXT: xorl $15, %eax 544 ; AVX1-NEXT: vmovd %xmm1, %ecx 545 ; AVX1-NEXT: bsrw %cx, %cx 546 ; AVX1-NEXT: xorl $15, %ecx 547 ; AVX1-NEXT: vmovd %ecx, %xmm2 548 ; AVX1-NEXT: vpinsrw $1, %eax, %xmm2, %xmm2 549 ; AVX1-NEXT: vpextrw $2, %xmm1, %eax 550 ; AVX1-NEXT: bsrw %ax, %ax 551 ; AVX1-NEXT: xorl $15, %eax 552 ; AVX1-NEXT: vpinsrw $2, %eax, %xmm2, %xmm2 553 ; AVX1-NEXT: vpextrw $3, %xmm1, %eax 554 ; AVX1-NEXT: bsrw %ax, %ax 555 ; AVX1-NEXT: xorl $15, %eax 556 ; AVX1-NEXT: vpinsrw $3, %eax, %xmm2, %xmm2 557 ; AVX1-NEXT: vpextrw $4, %xmm1, %eax 558 ; AVX1-NEXT: bsrw %ax, %ax 559 ; AVX1-NEXT: xorl $15, %eax 560 ; AVX1-NEXT: vpinsrw $4, %eax, %xmm2, %xmm2 561 ; AVX1-NEXT: vpextrw $5, %xmm1, %eax 562 ; AVX1-NEXT: bsrw %ax, %ax 563 ; AVX1-NEXT: xorl $15, %eax 564 ; AVX1-NEXT: vpinsrw $5, %eax, %xmm2, %xmm2 565 ; AVX1-NEXT: vpextrw $6, %xmm1, %eax 566 ; AVX1-NEXT: bsrw %ax, %ax 567 ; AVX1-NEXT: xorl $15, %eax 568 ; AVX1-NEXT: vpinsrw $6, %eax, %xmm2, %xmm2 569 ; AVX1-NEXT: vpextrw $7, %xmm1, %eax 570 ; AVX1-NEXT: bsrw %ax, %ax 571 ; AVX1-NEXT: xorl $15, %eax 572 ; AVX1-NEXT: vpinsrw $7, %eax, %xmm2, %xmm1 573 ; AVX1-NEXT: vpextrw $1, %xmm0, %eax 574 ; AVX1-NEXT: bsrw %ax, %ax 575 ; AVX1-NEXT: xorl $15, %eax 576 ; AVX1-NEXT: vmovd %xmm0, %ecx 577 ; AVX1-NEXT: bsrw %cx, %cx 578 ; AVX1-NEXT: xorl $15, %ecx 579 ; AVX1-NEXT: vmovd %ecx, %xmm2 580 ; AVX1-NEXT: vpinsrw $1, %eax, %xmm2, %xmm2 581 ; AVX1-NEXT: vpextrw $2, %xmm0, %eax 582 ; AVX1-NEXT: bsrw %ax, %ax 583 ; AVX1-NEXT: xorl $15, %eax 584 ; AVX1-NEXT: vpinsrw $2, %eax, %xmm2, %xmm2 585 ; AVX1-NEXT: vpextrw $3, %xmm0, %eax 586 ; AVX1-NEXT: bsrw %ax, %ax 587 ; AVX1-NEXT: xorl $15, %eax 588 ; AVX1-NEXT: vpinsrw $3, %eax, %xmm2, %xmm2 589 ; AVX1-NEXT: vpextrw $4, %xmm0, %eax 590 ; AVX1-NEXT: bsrw %ax, %ax 591 ; AVX1-NEXT: xorl $15, %eax 592 ; AVX1-NEXT: vpinsrw $4, %eax, %xmm2, %xmm2 593 ; AVX1-NEXT: vpextrw $5, %xmm0, %eax 594 ; AVX1-NEXT: bsrw %ax, %ax 595 ; AVX1-NEXT: xorl $15, %eax 596 ; AVX1-NEXT: vpinsrw $5, %eax, %xmm2, %xmm2 597 ; AVX1-NEXT: vpextrw $6, %xmm0, %eax 598 ; AVX1-NEXT: bsrw %ax, %ax 599 ; AVX1-NEXT: xorl $15, %eax 600 ; AVX1-NEXT: vpinsrw $6, %eax, %xmm2, %xmm2 601 ; AVX1-NEXT: vpextrw $7, %xmm0, %eax 602 ; AVX1-NEXT: bsrw %ax, %ax 603 ; AVX1-NEXT: xorl $15, %eax 604 ; AVX1-NEXT: vpinsrw $7, %eax, %xmm2, %xmm0 605 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 606 ; AVX1-NEXT: retq 607 ; 608 ; AVX2-LABEL: testv16i16u: 609 ; AVX2: # BB#0: 610 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 611 ; AVX2-NEXT: vpextrw $1, %xmm1, %eax 612 ; AVX2-NEXT: bsrw %ax, %ax 613 ; AVX2-NEXT: xorl $15, %eax 614 ; AVX2-NEXT: vmovd %xmm1, %ecx 615 ; AVX2-NEXT: bsrw %cx, %cx 616 ; AVX2-NEXT: xorl $15, %ecx 617 ; AVX2-NEXT: vmovd %ecx, %xmm2 618 ; AVX2-NEXT: vpinsrw $1, %eax, %xmm2, %xmm2 619 ; AVX2-NEXT: vpextrw $2, %xmm1, %eax 620 ; AVX2-NEXT: bsrw %ax, %ax 621 ; AVX2-NEXT: xorl $15, %eax 622 ; AVX2-NEXT: vpinsrw $2, %eax, %xmm2, %xmm2 623 ; AVX2-NEXT: vpextrw $3, %xmm1, %eax 624 ; AVX2-NEXT: bsrw %ax, %ax 625 ; AVX2-NEXT: xorl $15, %eax 626 ; AVX2-NEXT: vpinsrw $3, %eax, %xmm2, %xmm2 627 ; AVX2-NEXT: vpextrw $4, %xmm1, %eax 628 ; AVX2-NEXT: bsrw %ax, %ax 629 ; AVX2-NEXT: xorl $15, %eax 630 ; AVX2-NEXT: vpinsrw $4, %eax, %xmm2, %xmm2 631 ; AVX2-NEXT: vpextrw $5, %xmm1, %eax 632 ; AVX2-NEXT: bsrw %ax, %ax 633 ; AVX2-NEXT: xorl $15, %eax 634 ; AVX2-NEXT: vpinsrw $5, %eax, %xmm2, %xmm2 635 ; AVX2-NEXT: vpextrw $6, %xmm1, %eax 636 ; AVX2-NEXT: bsrw %ax, %ax 637 ; AVX2-NEXT: xorl $15, %eax 638 ; AVX2-NEXT: vpinsrw $6, %eax, %xmm2, %xmm2 639 ; AVX2-NEXT: vpextrw $7, %xmm1, %eax 640 ; AVX2-NEXT: bsrw %ax, %ax 641 ; AVX2-NEXT: xorl $15, %eax 642 ; AVX2-NEXT: vpinsrw $7, %eax, %xmm2, %xmm1 643 ; AVX2-NEXT: vpextrw $1, %xmm0, %eax 644 ; AVX2-NEXT: bsrw %ax, %ax 645 ; AVX2-NEXT: xorl $15, %eax 646 ; AVX2-NEXT: vmovd %xmm0, %ecx 647 ; AVX2-NEXT: bsrw %cx, %cx 648 ; AVX2-NEXT: xorl $15, %ecx 649 ; AVX2-NEXT: vmovd %ecx, %xmm2 650 ; AVX2-NEXT: vpinsrw $1, %eax, %xmm2, %xmm2 651 ; AVX2-NEXT: vpextrw $2, %xmm0, %eax 652 ; AVX2-NEXT: bsrw %ax, %ax 653 ; AVX2-NEXT: xorl $15, %eax 654 ; AVX2-NEXT: vpinsrw $2, %eax, %xmm2, %xmm2 655 ; AVX2-NEXT: vpextrw $3, %xmm0, %eax 656 ; AVX2-NEXT: bsrw %ax, %ax 657 ; AVX2-NEXT: xorl $15, %eax 658 ; AVX2-NEXT: vpinsrw $3, %eax, %xmm2, %xmm2 659 ; AVX2-NEXT: vpextrw $4, %xmm0, %eax 660 ; AVX2-NEXT: bsrw %ax, %ax 661 ; AVX2-NEXT: xorl $15, %eax 662 ; AVX2-NEXT: vpinsrw $4, %eax, %xmm2, %xmm2 663 ; AVX2-NEXT: vpextrw $5, %xmm0, %eax 664 ; AVX2-NEXT: bsrw %ax, %ax 665 ; AVX2-NEXT: xorl $15, %eax 666 ; AVX2-NEXT: vpinsrw $5, %eax, %xmm2, %xmm2 667 ; AVX2-NEXT: vpextrw $6, %xmm0, %eax 668 ; AVX2-NEXT: bsrw %ax, %ax 669 ; AVX2-NEXT: xorl $15, %eax 670 ; AVX2-NEXT: vpinsrw $6, %eax, %xmm2, %xmm2 671 ; AVX2-NEXT: vpextrw $7, %xmm0, %eax 672 ; AVX2-NEXT: bsrw %ax, %ax 673 ; AVX2-NEXT: xorl $15, %eax 674 ; AVX2-NEXT: vpinsrw $7, %eax, %xmm2, %xmm0 675 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 676 ; AVX2-NEXT: retq 677 ; 678 ; AVX512VLCD-LABEL: testv16i16u: 679 ; AVX512VLCD: ## BB#0: 680 ; AVX512VLCD-NEXT: vpmovzxwd %ymm0, %zmm0 681 ; AVX512VLCD-NEXT: vplzcntd %zmm0, %zmm0 682 ; AVX512VLCD-NEXT: vpmovdw %zmm0, %ymm0 683 ; AVX512VLCD-NEXT: vpsubw {{.*}}(%rip), %ymm0, %ymm0 684 ; AVX512VLCD-NEXT: retq 685 ; 686 ; AVX512CD-LABEL: testv16i16u: 687 ; AVX512CD: ## BB#0: 688 ; AVX512CD-NEXT: vpmovzxwd %ymm0, %zmm0 689 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 690 ; AVX512CD-NEXT: vpmovdw %zmm0, %ymm0 691 ; AVX512CD-NEXT: vpsubw {{.*}}(%rip), %ymm0, %ymm0 692 ; AVX512CD-NEXT: retq 693 %out = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> %in, i1 -1) 694 ret <16 x i16> %out 695 } 696 697 define <32 x i8> @testv32i8(<32 x i8> %in) nounwind { 698 ; AVX1-LABEL: testv32i8: 699 ; AVX1: # BB#0: 700 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 701 ; AVX1-NEXT: vpextrb $1, %xmm1, %eax 702 ; AVX1-NEXT: bsrl %eax, %ecx 703 ; AVX1-NEXT: movl $15, %eax 704 ; AVX1-NEXT: cmovel %eax, %ecx 705 ; AVX1-NEXT: xorl $7, %ecx 706 ; AVX1-NEXT: vpextrb $0, %xmm1, %edx 707 ; AVX1-NEXT: bsrl %edx, %edx 708 ; AVX1-NEXT: cmovel %eax, %edx 709 ; AVX1-NEXT: xorl $7, %edx 710 ; AVX1-NEXT: vmovd %edx, %xmm2 711 ; AVX1-NEXT: vpinsrb $1, %ecx, %xmm2, %xmm2 712 ; AVX1-NEXT: vpextrb $2, %xmm1, %ecx 713 ; AVX1-NEXT: bsrl %ecx, %ecx 714 ; AVX1-NEXT: cmovel %eax, %ecx 715 ; AVX1-NEXT: xorl $7, %ecx 716 ; AVX1-NEXT: vpinsrb $2, %ecx, %xmm2, %xmm2 717 ; AVX1-NEXT: vpextrb $3, %xmm1, %ecx 718 ; AVX1-NEXT: bsrl %ecx, %ecx 719 ; AVX1-NEXT: cmovel %eax, %ecx 720 ; AVX1-NEXT: xorl $7, %ecx 721 ; AVX1-NEXT: vpinsrb $3, %ecx, %xmm2, %xmm2 722 ; AVX1-NEXT: vpextrb $4, %xmm1, %ecx 723 ; AVX1-NEXT: bsrl %ecx, %ecx 724 ; AVX1-NEXT: cmovel %eax, %ecx 725 ; AVX1-NEXT: xorl $7, %ecx 726 ; AVX1-NEXT: vpinsrb $4, %ecx, %xmm2, %xmm2 727 ; AVX1-NEXT: vpextrb $5, %xmm1, %ecx 728 ; AVX1-NEXT: bsrl %ecx, %ecx 729 ; AVX1-NEXT: cmovel %eax, %ecx 730 ; AVX1-NEXT: xorl $7, %ecx 731 ; AVX1-NEXT: vpinsrb $5, %ecx, %xmm2, %xmm2 732 ; AVX1-NEXT: vpextrb $6, %xmm1, %ecx 733 ; AVX1-NEXT: bsrl %ecx, %ecx 734 ; AVX1-NEXT: cmovel %eax, %ecx 735 ; AVX1-NEXT: xorl $7, %ecx 736 ; AVX1-NEXT: vpinsrb $6, %ecx, %xmm2, %xmm2 737 ; AVX1-NEXT: vpextrb $7, %xmm1, %ecx 738 ; AVX1-NEXT: bsrl %ecx, %ecx 739 ; AVX1-NEXT: cmovel %eax, %ecx 740 ; AVX1-NEXT: xorl $7, %ecx 741 ; AVX1-NEXT: vpinsrb $7, %ecx, %xmm2, %xmm2 742 ; AVX1-NEXT: vpextrb $8, %xmm1, %ecx 743 ; AVX1-NEXT: bsrl %ecx, %ecx 744 ; AVX1-NEXT: cmovel %eax, %ecx 745 ; AVX1-NEXT: xorl $7, %ecx 746 ; AVX1-NEXT: vpinsrb $8, %ecx, %xmm2, %xmm2 747 ; AVX1-NEXT: vpextrb $9, %xmm1, %ecx 748 ; AVX1-NEXT: bsrl %ecx, %ecx 749 ; AVX1-NEXT: cmovel %eax, %ecx 750 ; AVX1-NEXT: xorl $7, %ecx 751 ; AVX1-NEXT: vpinsrb $9, %ecx, %xmm2, %xmm2 752 ; AVX1-NEXT: vpextrb $10, %xmm1, %ecx 753 ; AVX1-NEXT: bsrl %ecx, %ecx 754 ; AVX1-NEXT: cmovel %eax, %ecx 755 ; AVX1-NEXT: xorl $7, %ecx 756 ; AVX1-NEXT: vpinsrb $10, %ecx, %xmm2, %xmm2 757 ; AVX1-NEXT: vpextrb $11, %xmm1, %ecx 758 ; AVX1-NEXT: bsrl %ecx, %ecx 759 ; AVX1-NEXT: cmovel %eax, %ecx 760 ; AVX1-NEXT: xorl $7, %ecx 761 ; AVX1-NEXT: vpinsrb $11, %ecx, %xmm2, %xmm2 762 ; AVX1-NEXT: vpextrb $12, %xmm1, %ecx 763 ; AVX1-NEXT: bsrl %ecx, %ecx 764 ; AVX1-NEXT: cmovel %eax, %ecx 765 ; AVX1-NEXT: xorl $7, %ecx 766 ; AVX1-NEXT: vpinsrb $12, %ecx, %xmm2, %xmm2 767 ; AVX1-NEXT: vpextrb $13, %xmm1, %ecx 768 ; AVX1-NEXT: bsrl %ecx, %ecx 769 ; AVX1-NEXT: cmovel %eax, %ecx 770 ; AVX1-NEXT: xorl $7, %ecx 771 ; AVX1-NEXT: vpinsrb $13, %ecx, %xmm2, %xmm2 772 ; AVX1-NEXT: vpextrb $14, %xmm1, %ecx 773 ; AVX1-NEXT: bsrl %ecx, %ecx 774 ; AVX1-NEXT: cmovel %eax, %ecx 775 ; AVX1-NEXT: xorl $7, %ecx 776 ; AVX1-NEXT: vpinsrb $14, %ecx, %xmm2, %xmm2 777 ; AVX1-NEXT: vpextrb $15, %xmm1, %ecx 778 ; AVX1-NEXT: bsrl %ecx, %ecx 779 ; AVX1-NEXT: cmovel %eax, %ecx 780 ; AVX1-NEXT: xorl $7, %ecx 781 ; AVX1-NEXT: vpinsrb $15, %ecx, %xmm2, %xmm1 782 ; AVX1-NEXT: vpextrb $1, %xmm0, %ecx 783 ; AVX1-NEXT: bsrl %ecx, %ecx 784 ; AVX1-NEXT: cmovel %eax, %ecx 785 ; AVX1-NEXT: xorl $7, %ecx 786 ; AVX1-NEXT: vpextrb $0, %xmm0, %edx 787 ; AVX1-NEXT: bsrl %edx, %edx 788 ; AVX1-NEXT: cmovel %eax, %edx 789 ; AVX1-NEXT: xorl $7, %edx 790 ; AVX1-NEXT: vmovd %edx, %xmm2 791 ; AVX1-NEXT: vpinsrb $1, %ecx, %xmm2, %xmm2 792 ; AVX1-NEXT: vpextrb $2, %xmm0, %ecx 793 ; AVX1-NEXT: bsrl %ecx, %ecx 794 ; AVX1-NEXT: cmovel %eax, %ecx 795 ; AVX1-NEXT: xorl $7, %ecx 796 ; AVX1-NEXT: vpinsrb $2, %ecx, %xmm2, %xmm2 797 ; AVX1-NEXT: vpextrb $3, %xmm0, %ecx 798 ; AVX1-NEXT: bsrl %ecx, %ecx 799 ; AVX1-NEXT: cmovel %eax, %ecx 800 ; AVX1-NEXT: xorl $7, %ecx 801 ; AVX1-NEXT: vpinsrb $3, %ecx, %xmm2, %xmm2 802 ; AVX1-NEXT: vpextrb $4, %xmm0, %ecx 803 ; AVX1-NEXT: bsrl %ecx, %ecx 804 ; AVX1-NEXT: cmovel %eax, %ecx 805 ; AVX1-NEXT: xorl $7, %ecx 806 ; AVX1-NEXT: vpinsrb $4, %ecx, %xmm2, %xmm2 807 ; AVX1-NEXT: vpextrb $5, %xmm0, %ecx 808 ; AVX1-NEXT: bsrl %ecx, %ecx 809 ; AVX1-NEXT: cmovel %eax, %ecx 810 ; AVX1-NEXT: xorl $7, %ecx 811 ; AVX1-NEXT: vpinsrb $5, %ecx, %xmm2, %xmm2 812 ; AVX1-NEXT: vpextrb $6, %xmm0, %ecx 813 ; AVX1-NEXT: bsrl %ecx, %ecx 814 ; AVX1-NEXT: cmovel %eax, %ecx 815 ; AVX1-NEXT: xorl $7, %ecx 816 ; AVX1-NEXT: vpinsrb $6, %ecx, %xmm2, %xmm2 817 ; AVX1-NEXT: vpextrb $7, %xmm0, %ecx 818 ; AVX1-NEXT: bsrl %ecx, %ecx 819 ; AVX1-NEXT: cmovel %eax, %ecx 820 ; AVX1-NEXT: xorl $7, %ecx 821 ; AVX1-NEXT: vpinsrb $7, %ecx, %xmm2, %xmm2 822 ; AVX1-NEXT: vpextrb $8, %xmm0, %ecx 823 ; AVX1-NEXT: bsrl %ecx, %ecx 824 ; AVX1-NEXT: cmovel %eax, %ecx 825 ; AVX1-NEXT: xorl $7, %ecx 826 ; AVX1-NEXT: vpinsrb $8, %ecx, %xmm2, %xmm2 827 ; AVX1-NEXT: vpextrb $9, %xmm0, %ecx 828 ; AVX1-NEXT: bsrl %ecx, %ecx 829 ; AVX1-NEXT: cmovel %eax, %ecx 830 ; AVX1-NEXT: xorl $7, %ecx 831 ; AVX1-NEXT: vpinsrb $9, %ecx, %xmm2, %xmm2 832 ; AVX1-NEXT: vpextrb $10, %xmm0, %ecx 833 ; AVX1-NEXT: bsrl %ecx, %ecx 834 ; AVX1-NEXT: cmovel %eax, %ecx 835 ; AVX1-NEXT: xorl $7, %ecx 836 ; AVX1-NEXT: vpinsrb $10, %ecx, %xmm2, %xmm2 837 ; AVX1-NEXT: vpextrb $11, %xmm0, %ecx 838 ; AVX1-NEXT: bsrl %ecx, %ecx 839 ; AVX1-NEXT: cmovel %eax, %ecx 840 ; AVX1-NEXT: xorl $7, %ecx 841 ; AVX1-NEXT: vpinsrb $11, %ecx, %xmm2, %xmm2 842 ; AVX1-NEXT: vpextrb $12, %xmm0, %ecx 843 ; AVX1-NEXT: bsrl %ecx, %ecx 844 ; AVX1-NEXT: cmovel %eax, %ecx 845 ; AVX1-NEXT: xorl $7, %ecx 846 ; AVX1-NEXT: vpinsrb $12, %ecx, %xmm2, %xmm2 847 ; AVX1-NEXT: vpextrb $13, %xmm0, %ecx 848 ; AVX1-NEXT: bsrl %ecx, %ecx 849 ; AVX1-NEXT: cmovel %eax, %ecx 850 ; AVX1-NEXT: xorl $7, %ecx 851 ; AVX1-NEXT: vpinsrb $13, %ecx, %xmm2, %xmm2 852 ; AVX1-NEXT: vpextrb $14, %xmm0, %ecx 853 ; AVX1-NEXT: bsrl %ecx, %ecx 854 ; AVX1-NEXT: cmovel %eax, %ecx 855 ; AVX1-NEXT: xorl $7, %ecx 856 ; AVX1-NEXT: vpinsrb $14, %ecx, %xmm2, %xmm2 857 ; AVX1-NEXT: vpextrb $15, %xmm0, %ecx 858 ; AVX1-NEXT: bsrl %ecx, %ecx 859 ; AVX1-NEXT: cmovel %eax, %ecx 860 ; AVX1-NEXT: xorl $7, %ecx 861 ; AVX1-NEXT: vpinsrb $15, %ecx, %xmm2, %xmm0 862 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 863 ; AVX1-NEXT: retq 864 ; 865 ; AVX2-LABEL: testv32i8: 866 ; AVX2: # BB#0: 867 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 868 ; AVX2-NEXT: vpextrb $1, %xmm1, %eax 869 ; AVX2-NEXT: bsrl %eax, %ecx 870 ; AVX2-NEXT: movl $15, %eax 871 ; AVX2-NEXT: cmovel %eax, %ecx 872 ; AVX2-NEXT: xorl $7, %ecx 873 ; AVX2-NEXT: vpextrb $0, %xmm1, %edx 874 ; AVX2-NEXT: bsrl %edx, %edx 875 ; AVX2-NEXT: cmovel %eax, %edx 876 ; AVX2-NEXT: xorl $7, %edx 877 ; AVX2-NEXT: vmovd %edx, %xmm2 878 ; AVX2-NEXT: vpinsrb $1, %ecx, %xmm2, %xmm2 879 ; AVX2-NEXT: vpextrb $2, %xmm1, %ecx 880 ; AVX2-NEXT: bsrl %ecx, %ecx 881 ; AVX2-NEXT: cmovel %eax, %ecx 882 ; AVX2-NEXT: xorl $7, %ecx 883 ; AVX2-NEXT: vpinsrb $2, %ecx, %xmm2, %xmm2 884 ; AVX2-NEXT: vpextrb $3, %xmm1, %ecx 885 ; AVX2-NEXT: bsrl %ecx, %ecx 886 ; AVX2-NEXT: cmovel %eax, %ecx 887 ; AVX2-NEXT: xorl $7, %ecx 888 ; AVX2-NEXT: vpinsrb $3, %ecx, %xmm2, %xmm2 889 ; AVX2-NEXT: vpextrb $4, %xmm1, %ecx 890 ; AVX2-NEXT: bsrl %ecx, %ecx 891 ; AVX2-NEXT: cmovel %eax, %ecx 892 ; AVX2-NEXT: xorl $7, %ecx 893 ; AVX2-NEXT: vpinsrb $4, %ecx, %xmm2, %xmm2 894 ; AVX2-NEXT: vpextrb $5, %xmm1, %ecx 895 ; AVX2-NEXT: bsrl %ecx, %ecx 896 ; AVX2-NEXT: cmovel %eax, %ecx 897 ; AVX2-NEXT: xorl $7, %ecx 898 ; AVX2-NEXT: vpinsrb $5, %ecx, %xmm2, %xmm2 899 ; AVX2-NEXT: vpextrb $6, %xmm1, %ecx 900 ; AVX2-NEXT: bsrl %ecx, %ecx 901 ; AVX2-NEXT: cmovel %eax, %ecx 902 ; AVX2-NEXT: xorl $7, %ecx 903 ; AVX2-NEXT: vpinsrb $6, %ecx, %xmm2, %xmm2 904 ; AVX2-NEXT: vpextrb $7, %xmm1, %ecx 905 ; AVX2-NEXT: bsrl %ecx, %ecx 906 ; AVX2-NEXT: cmovel %eax, %ecx 907 ; AVX2-NEXT: xorl $7, %ecx 908 ; AVX2-NEXT: vpinsrb $7, %ecx, %xmm2, %xmm2 909 ; AVX2-NEXT: vpextrb $8, %xmm1, %ecx 910 ; AVX2-NEXT: bsrl %ecx, %ecx 911 ; AVX2-NEXT: cmovel %eax, %ecx 912 ; AVX2-NEXT: xorl $7, %ecx 913 ; AVX2-NEXT: vpinsrb $8, %ecx, %xmm2, %xmm2 914 ; AVX2-NEXT: vpextrb $9, %xmm1, %ecx 915 ; AVX2-NEXT: bsrl %ecx, %ecx 916 ; AVX2-NEXT: cmovel %eax, %ecx 917 ; AVX2-NEXT: xorl $7, %ecx 918 ; AVX2-NEXT: vpinsrb $9, %ecx, %xmm2, %xmm2 919 ; AVX2-NEXT: vpextrb $10, %xmm1, %ecx 920 ; AVX2-NEXT: bsrl %ecx, %ecx 921 ; AVX2-NEXT: cmovel %eax, %ecx 922 ; AVX2-NEXT: xorl $7, %ecx 923 ; AVX2-NEXT: vpinsrb $10, %ecx, %xmm2, %xmm2 924 ; AVX2-NEXT: vpextrb $11, %xmm1, %ecx 925 ; AVX2-NEXT: bsrl %ecx, %ecx 926 ; AVX2-NEXT: cmovel %eax, %ecx 927 ; AVX2-NEXT: xorl $7, %ecx 928 ; AVX2-NEXT: vpinsrb $11, %ecx, %xmm2, %xmm2 929 ; AVX2-NEXT: vpextrb $12, %xmm1, %ecx 930 ; AVX2-NEXT: bsrl %ecx, %ecx 931 ; AVX2-NEXT: cmovel %eax, %ecx 932 ; AVX2-NEXT: xorl $7, %ecx 933 ; AVX2-NEXT: vpinsrb $12, %ecx, %xmm2, %xmm2 934 ; AVX2-NEXT: vpextrb $13, %xmm1, %ecx 935 ; AVX2-NEXT: bsrl %ecx, %ecx 936 ; AVX2-NEXT: cmovel %eax, %ecx 937 ; AVX2-NEXT: xorl $7, %ecx 938 ; AVX2-NEXT: vpinsrb $13, %ecx, %xmm2, %xmm2 939 ; AVX2-NEXT: vpextrb $14, %xmm1, %ecx 940 ; AVX2-NEXT: bsrl %ecx, %ecx 941 ; AVX2-NEXT: cmovel %eax, %ecx 942 ; AVX2-NEXT: xorl $7, %ecx 943 ; AVX2-NEXT: vpinsrb $14, %ecx, %xmm2, %xmm2 944 ; AVX2-NEXT: vpextrb $15, %xmm1, %ecx 945 ; AVX2-NEXT: bsrl %ecx, %ecx 946 ; AVX2-NEXT: cmovel %eax, %ecx 947 ; AVX2-NEXT: xorl $7, %ecx 948 ; AVX2-NEXT: vpinsrb $15, %ecx, %xmm2, %xmm1 949 ; AVX2-NEXT: vpextrb $1, %xmm0, %ecx 950 ; AVX2-NEXT: bsrl %ecx, %ecx 951 ; AVX2-NEXT: cmovel %eax, %ecx 952 ; AVX2-NEXT: xorl $7, %ecx 953 ; AVX2-NEXT: vpextrb $0, %xmm0, %edx 954 ; AVX2-NEXT: bsrl %edx, %edx 955 ; AVX2-NEXT: cmovel %eax, %edx 956 ; AVX2-NEXT: xorl $7, %edx 957 ; AVX2-NEXT: vmovd %edx, %xmm2 958 ; AVX2-NEXT: vpinsrb $1, %ecx, %xmm2, %xmm2 959 ; AVX2-NEXT: vpextrb $2, %xmm0, %ecx 960 ; AVX2-NEXT: bsrl %ecx, %ecx 961 ; AVX2-NEXT: cmovel %eax, %ecx 962 ; AVX2-NEXT: xorl $7, %ecx 963 ; AVX2-NEXT: vpinsrb $2, %ecx, %xmm2, %xmm2 964 ; AVX2-NEXT: vpextrb $3, %xmm0, %ecx 965 ; AVX2-NEXT: bsrl %ecx, %ecx 966 ; AVX2-NEXT: cmovel %eax, %ecx 967 ; AVX2-NEXT: xorl $7, %ecx 968 ; AVX2-NEXT: vpinsrb $3, %ecx, %xmm2, %xmm2 969 ; AVX2-NEXT: vpextrb $4, %xmm0, %ecx 970 ; AVX2-NEXT: bsrl %ecx, %ecx 971 ; AVX2-NEXT: cmovel %eax, %ecx 972 ; AVX2-NEXT: xorl $7, %ecx 973 ; AVX2-NEXT: vpinsrb $4, %ecx, %xmm2, %xmm2 974 ; AVX2-NEXT: vpextrb $5, %xmm0, %ecx 975 ; AVX2-NEXT: bsrl %ecx, %ecx 976 ; AVX2-NEXT: cmovel %eax, %ecx 977 ; AVX2-NEXT: xorl $7, %ecx 978 ; AVX2-NEXT: vpinsrb $5, %ecx, %xmm2, %xmm2 979 ; AVX2-NEXT: vpextrb $6, %xmm0, %ecx 980 ; AVX2-NEXT: bsrl %ecx, %ecx 981 ; AVX2-NEXT: cmovel %eax, %ecx 982 ; AVX2-NEXT: xorl $7, %ecx 983 ; AVX2-NEXT: vpinsrb $6, %ecx, %xmm2, %xmm2 984 ; AVX2-NEXT: vpextrb $7, %xmm0, %ecx 985 ; AVX2-NEXT: bsrl %ecx, %ecx 986 ; AVX2-NEXT: cmovel %eax, %ecx 987 ; AVX2-NEXT: xorl $7, %ecx 988 ; AVX2-NEXT: vpinsrb $7, %ecx, %xmm2, %xmm2 989 ; AVX2-NEXT: vpextrb $8, %xmm0, %ecx 990 ; AVX2-NEXT: bsrl %ecx, %ecx 991 ; AVX2-NEXT: cmovel %eax, %ecx 992 ; AVX2-NEXT: xorl $7, %ecx 993 ; AVX2-NEXT: vpinsrb $8, %ecx, %xmm2, %xmm2 994 ; AVX2-NEXT: vpextrb $9, %xmm0, %ecx 995 ; AVX2-NEXT: bsrl %ecx, %ecx 996 ; AVX2-NEXT: cmovel %eax, %ecx 997 ; AVX2-NEXT: xorl $7, %ecx 998 ; AVX2-NEXT: vpinsrb $9, %ecx, %xmm2, %xmm2 999 ; AVX2-NEXT: vpextrb $10, %xmm0, %ecx 1000 ; AVX2-NEXT: bsrl %ecx, %ecx 1001 ; AVX2-NEXT: cmovel %eax, %ecx 1002 ; AVX2-NEXT: xorl $7, %ecx 1003 ; AVX2-NEXT: vpinsrb $10, %ecx, %xmm2, %xmm2 1004 ; AVX2-NEXT: vpextrb $11, %xmm0, %ecx 1005 ; AVX2-NEXT: bsrl %ecx, %ecx 1006 ; AVX2-NEXT: cmovel %eax, %ecx 1007 ; AVX2-NEXT: xorl $7, %ecx 1008 ; AVX2-NEXT: vpinsrb $11, %ecx, %xmm2, %xmm2 1009 ; AVX2-NEXT: vpextrb $12, %xmm0, %ecx 1010 ; AVX2-NEXT: bsrl %ecx, %ecx 1011 ; AVX2-NEXT: cmovel %eax, %ecx 1012 ; AVX2-NEXT: xorl $7, %ecx 1013 ; AVX2-NEXT: vpinsrb $12, %ecx, %xmm2, %xmm2 1014 ; AVX2-NEXT: vpextrb $13, %xmm0, %ecx 1015 ; AVX2-NEXT: bsrl %ecx, %ecx 1016 ; AVX2-NEXT: cmovel %eax, %ecx 1017 ; AVX2-NEXT: xorl $7, %ecx 1018 ; AVX2-NEXT: vpinsrb $13, %ecx, %xmm2, %xmm2 1019 ; AVX2-NEXT: vpextrb $14, %xmm0, %ecx 1020 ; AVX2-NEXT: bsrl %ecx, %ecx 1021 ; AVX2-NEXT: cmovel %eax, %ecx 1022 ; AVX2-NEXT: xorl $7, %ecx 1023 ; AVX2-NEXT: vpinsrb $14, %ecx, %xmm2, %xmm2 1024 ; AVX2-NEXT: vpextrb $15, %xmm0, %ecx 1025 ; AVX2-NEXT: bsrl %ecx, %ecx 1026 ; AVX2-NEXT: cmovel %eax, %ecx 1027 ; AVX2-NEXT: xorl $7, %ecx 1028 ; AVX2-NEXT: vpinsrb $15, %ecx, %xmm2, %xmm0 1029 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1030 ; AVX2-NEXT: retq 1031 ; 1032 ; AVX512VLCD-LABEL: testv32i8: 1033 ; AVX512VLCD: ## BB#0: 1034 ; AVX512VLCD-NEXT: vextractf128 $1, %ymm0, %xmm1 1035 ; AVX512VLCD-NEXT: vpmovzxbd %xmm1, %zmm1 1036 ; AVX512VLCD-NEXT: vplzcntd %zmm1, %zmm1 1037 ; AVX512VLCD-NEXT: vpmovdb %zmm1, %xmm1 1038 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} xmm2 = [24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24] 1039 ; AVX512VLCD-NEXT: vpsubb %xmm2, %xmm1, %xmm1 1040 ; AVX512VLCD-NEXT: vpmovzxbd %xmm0, %zmm0 1041 ; AVX512VLCD-NEXT: vplzcntd %zmm0, %zmm0 1042 ; AVX512VLCD-NEXT: vpmovdb %zmm0, %xmm0 1043 ; AVX512VLCD-NEXT: vpsubb %xmm2, %xmm0, %xmm0 1044 ; AVX512VLCD-NEXT: vinserti32x4 $1, %xmm1, %ymm0, %ymm0 1045 ; AVX512VLCD-NEXT: retq 1046 ; 1047 ; AVX512CD-LABEL: testv32i8: 1048 ; AVX512CD: ## BB#0: 1049 ; AVX512CD-NEXT: vextractf128 $1, %ymm0, %xmm1 1050 ; AVX512CD-NEXT: vpmovzxbd %xmm1, %zmm1 1051 ; AVX512CD-NEXT: vplzcntd %zmm1, %zmm1 1052 ; AVX512CD-NEXT: vpmovdb %zmm1, %xmm1 1053 ; AVX512CD-NEXT: vmovdqa {{.*#+}} xmm2 = [24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24] 1054 ; AVX512CD-NEXT: vpsubb %xmm2, %xmm1, %xmm1 1055 ; AVX512CD-NEXT: vpmovzxbd %xmm0, %zmm0 1056 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 1057 ; AVX512CD-NEXT: vpmovdb %zmm0, %xmm0 1058 ; AVX512CD-NEXT: vpsubb %xmm2, %xmm0, %xmm0 1059 ; AVX512CD-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1060 ; AVX512CD-NEXT: retq 1061 %out = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %in, i1 0) 1062 ret <32 x i8> %out 1063 } 1064 1065 define <32 x i8> @testv32i8u(<32 x i8> %in) nounwind { 1066 ; AVX1-LABEL: testv32i8u: 1067 ; AVX1: # BB#0: 1068 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1069 ; AVX1-NEXT: vpextrb $1, %xmm1, %eax 1070 ; AVX1-NEXT: bsrl %eax, %eax 1071 ; AVX1-NEXT: xorl $7, %eax 1072 ; AVX1-NEXT: vpextrb $0, %xmm1, %ecx 1073 ; AVX1-NEXT: bsrl %ecx, %ecx 1074 ; AVX1-NEXT: xorl $7, %ecx 1075 ; AVX1-NEXT: vmovd %ecx, %xmm2 1076 ; AVX1-NEXT: vpinsrb $1, %eax, %xmm2, %xmm2 1077 ; AVX1-NEXT: vpextrb $2, %xmm1, %eax 1078 ; AVX1-NEXT: bsrl %eax, %eax 1079 ; AVX1-NEXT: xorl $7, %eax 1080 ; AVX1-NEXT: vpinsrb $2, %eax, %xmm2, %xmm2 1081 ; AVX1-NEXT: vpextrb $3, %xmm1, %eax 1082 ; AVX1-NEXT: bsrl %eax, %eax 1083 ; AVX1-NEXT: xorl $7, %eax 1084 ; AVX1-NEXT: vpinsrb $3, %eax, %xmm2, %xmm2 1085 ; AVX1-NEXT: vpextrb $4, %xmm1, %eax 1086 ; AVX1-NEXT: bsrl %eax, %eax 1087 ; AVX1-NEXT: xorl $7, %eax 1088 ; AVX1-NEXT: vpinsrb $4, %eax, %xmm2, %xmm2 1089 ; AVX1-NEXT: vpextrb $5, %xmm1, %eax 1090 ; AVX1-NEXT: bsrl %eax, %eax 1091 ; AVX1-NEXT: xorl $7, %eax 1092 ; AVX1-NEXT: vpinsrb $5, %eax, %xmm2, %xmm2 1093 ; AVX1-NEXT: vpextrb $6, %xmm1, %eax 1094 ; AVX1-NEXT: bsrl %eax, %eax 1095 ; AVX1-NEXT: xorl $7, %eax 1096 ; AVX1-NEXT: vpinsrb $6, %eax, %xmm2, %xmm2 1097 ; AVX1-NEXT: vpextrb $7, %xmm1, %eax 1098 ; AVX1-NEXT: bsrl %eax, %eax 1099 ; AVX1-NEXT: xorl $7, %eax 1100 ; AVX1-NEXT: vpinsrb $7, %eax, %xmm2, %xmm2 1101 ; AVX1-NEXT: vpextrb $8, %xmm1, %eax 1102 ; AVX1-NEXT: bsrl %eax, %eax 1103 ; AVX1-NEXT: xorl $7, %eax 1104 ; AVX1-NEXT: vpinsrb $8, %eax, %xmm2, %xmm2 1105 ; AVX1-NEXT: vpextrb $9, %xmm1, %eax 1106 ; AVX1-NEXT: bsrl %eax, %eax 1107 ; AVX1-NEXT: xorl $7, %eax 1108 ; AVX1-NEXT: vpinsrb $9, %eax, %xmm2, %xmm2 1109 ; AVX1-NEXT: vpextrb $10, %xmm1, %eax 1110 ; AVX1-NEXT: bsrl %eax, %eax 1111 ; AVX1-NEXT: xorl $7, %eax 1112 ; AVX1-NEXT: vpinsrb $10, %eax, %xmm2, %xmm2 1113 ; AVX1-NEXT: vpextrb $11, %xmm1, %eax 1114 ; AVX1-NEXT: bsrl %eax, %eax 1115 ; AVX1-NEXT: xorl $7, %eax 1116 ; AVX1-NEXT: vpinsrb $11, %eax, %xmm2, %xmm2 1117 ; AVX1-NEXT: vpextrb $12, %xmm1, %eax 1118 ; AVX1-NEXT: bsrl %eax, %eax 1119 ; AVX1-NEXT: xorl $7, %eax 1120 ; AVX1-NEXT: vpinsrb $12, %eax, %xmm2, %xmm2 1121 ; AVX1-NEXT: vpextrb $13, %xmm1, %eax 1122 ; AVX1-NEXT: bsrl %eax, %eax 1123 ; AVX1-NEXT: xorl $7, %eax 1124 ; AVX1-NEXT: vpinsrb $13, %eax, %xmm2, %xmm2 1125 ; AVX1-NEXT: vpextrb $14, %xmm1, %eax 1126 ; AVX1-NEXT: bsrl %eax, %eax 1127 ; AVX1-NEXT: xorl $7, %eax 1128 ; AVX1-NEXT: vpinsrb $14, %eax, %xmm2, %xmm2 1129 ; AVX1-NEXT: vpextrb $15, %xmm1, %eax 1130 ; AVX1-NEXT: bsrl %eax, %eax 1131 ; AVX1-NEXT: xorl $7, %eax 1132 ; AVX1-NEXT: vpinsrb $15, %eax, %xmm2, %xmm1 1133 ; AVX1-NEXT: vpextrb $1, %xmm0, %eax 1134 ; AVX1-NEXT: bsrl %eax, %eax 1135 ; AVX1-NEXT: xorl $7, %eax 1136 ; AVX1-NEXT: vpextrb $0, %xmm0, %ecx 1137 ; AVX1-NEXT: bsrl %ecx, %ecx 1138 ; AVX1-NEXT: xorl $7, %ecx 1139 ; AVX1-NEXT: vmovd %ecx, %xmm2 1140 ; AVX1-NEXT: vpinsrb $1, %eax, %xmm2, %xmm2 1141 ; AVX1-NEXT: vpextrb $2, %xmm0, %eax 1142 ; AVX1-NEXT: bsrl %eax, %eax 1143 ; AVX1-NEXT: xorl $7, %eax 1144 ; AVX1-NEXT: vpinsrb $2, %eax, %xmm2, %xmm2 1145 ; AVX1-NEXT: vpextrb $3, %xmm0, %eax 1146 ; AVX1-NEXT: bsrl %eax, %eax 1147 ; AVX1-NEXT: xorl $7, %eax 1148 ; AVX1-NEXT: vpinsrb $3, %eax, %xmm2, %xmm2 1149 ; AVX1-NEXT: vpextrb $4, %xmm0, %eax 1150 ; AVX1-NEXT: bsrl %eax, %eax 1151 ; AVX1-NEXT: xorl $7, %eax 1152 ; AVX1-NEXT: vpinsrb $4, %eax, %xmm2, %xmm2 1153 ; AVX1-NEXT: vpextrb $5, %xmm0, %eax 1154 ; AVX1-NEXT: bsrl %eax, %eax 1155 ; AVX1-NEXT: xorl $7, %eax 1156 ; AVX1-NEXT: vpinsrb $5, %eax, %xmm2, %xmm2 1157 ; AVX1-NEXT: vpextrb $6, %xmm0, %eax 1158 ; AVX1-NEXT: bsrl %eax, %eax 1159 ; AVX1-NEXT: xorl $7, %eax 1160 ; AVX1-NEXT: vpinsrb $6, %eax, %xmm2, %xmm2 1161 ; AVX1-NEXT: vpextrb $7, %xmm0, %eax 1162 ; AVX1-NEXT: bsrl %eax, %eax 1163 ; AVX1-NEXT: xorl $7, %eax 1164 ; AVX1-NEXT: vpinsrb $7, %eax, %xmm2, %xmm2 1165 ; AVX1-NEXT: vpextrb $8, %xmm0, %eax 1166 ; AVX1-NEXT: bsrl %eax, %eax 1167 ; AVX1-NEXT: xorl $7, %eax 1168 ; AVX1-NEXT: vpinsrb $8, %eax, %xmm2, %xmm2 1169 ; AVX1-NEXT: vpextrb $9, %xmm0, %eax 1170 ; AVX1-NEXT: bsrl %eax, %eax 1171 ; AVX1-NEXT: xorl $7, %eax 1172 ; AVX1-NEXT: vpinsrb $9, %eax, %xmm2, %xmm2 1173 ; AVX1-NEXT: vpextrb $10, %xmm0, %eax 1174 ; AVX1-NEXT: bsrl %eax, %eax 1175 ; AVX1-NEXT: xorl $7, %eax 1176 ; AVX1-NEXT: vpinsrb $10, %eax, %xmm2, %xmm2 1177 ; AVX1-NEXT: vpextrb $11, %xmm0, %eax 1178 ; AVX1-NEXT: bsrl %eax, %eax 1179 ; AVX1-NEXT: xorl $7, %eax 1180 ; AVX1-NEXT: vpinsrb $11, %eax, %xmm2, %xmm2 1181 ; AVX1-NEXT: vpextrb $12, %xmm0, %eax 1182 ; AVX1-NEXT: bsrl %eax, %eax 1183 ; AVX1-NEXT: xorl $7, %eax 1184 ; AVX1-NEXT: vpinsrb $12, %eax, %xmm2, %xmm2 1185 ; AVX1-NEXT: vpextrb $13, %xmm0, %eax 1186 ; AVX1-NEXT: bsrl %eax, %eax 1187 ; AVX1-NEXT: xorl $7, %eax 1188 ; AVX1-NEXT: vpinsrb $13, %eax, %xmm2, %xmm2 1189 ; AVX1-NEXT: vpextrb $14, %xmm0, %eax 1190 ; AVX1-NEXT: bsrl %eax, %eax 1191 ; AVX1-NEXT: xorl $7, %eax 1192 ; AVX1-NEXT: vpinsrb $14, %eax, %xmm2, %xmm2 1193 ; AVX1-NEXT: vpextrb $15, %xmm0, %eax 1194 ; AVX1-NEXT: bsrl %eax, %eax 1195 ; AVX1-NEXT: xorl $7, %eax 1196 ; AVX1-NEXT: vpinsrb $15, %eax, %xmm2, %xmm0 1197 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1198 ; AVX1-NEXT: retq 1199 ; 1200 ; AVX2-LABEL: testv32i8u: 1201 ; AVX2: # BB#0: 1202 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1203 ; AVX2-NEXT: vpextrb $1, %xmm1, %eax 1204 ; AVX2-NEXT: bsrl %eax, %eax 1205 ; AVX2-NEXT: xorl $7, %eax 1206 ; AVX2-NEXT: vpextrb $0, %xmm1, %ecx 1207 ; AVX2-NEXT: bsrl %ecx, %ecx 1208 ; AVX2-NEXT: xorl $7, %ecx 1209 ; AVX2-NEXT: vmovd %ecx, %xmm2 1210 ; AVX2-NEXT: vpinsrb $1, %eax, %xmm2, %xmm2 1211 ; AVX2-NEXT: vpextrb $2, %xmm1, %eax 1212 ; AVX2-NEXT: bsrl %eax, %eax 1213 ; AVX2-NEXT: xorl $7, %eax 1214 ; AVX2-NEXT: vpinsrb $2, %eax, %xmm2, %xmm2 1215 ; AVX2-NEXT: vpextrb $3, %xmm1, %eax 1216 ; AVX2-NEXT: bsrl %eax, %eax 1217 ; AVX2-NEXT: xorl $7, %eax 1218 ; AVX2-NEXT: vpinsrb $3, %eax, %xmm2, %xmm2 1219 ; AVX2-NEXT: vpextrb $4, %xmm1, %eax 1220 ; AVX2-NEXT: bsrl %eax, %eax 1221 ; AVX2-NEXT: xorl $7, %eax 1222 ; AVX2-NEXT: vpinsrb $4, %eax, %xmm2, %xmm2 1223 ; AVX2-NEXT: vpextrb $5, %xmm1, %eax 1224 ; AVX2-NEXT: bsrl %eax, %eax 1225 ; AVX2-NEXT: xorl $7, %eax 1226 ; AVX2-NEXT: vpinsrb $5, %eax, %xmm2, %xmm2 1227 ; AVX2-NEXT: vpextrb $6, %xmm1, %eax 1228 ; AVX2-NEXT: bsrl %eax, %eax 1229 ; AVX2-NEXT: xorl $7, %eax 1230 ; AVX2-NEXT: vpinsrb $6, %eax, %xmm2, %xmm2 1231 ; AVX2-NEXT: vpextrb $7, %xmm1, %eax 1232 ; AVX2-NEXT: bsrl %eax, %eax 1233 ; AVX2-NEXT: xorl $7, %eax 1234 ; AVX2-NEXT: vpinsrb $7, %eax, %xmm2, %xmm2 1235 ; AVX2-NEXT: vpextrb $8, %xmm1, %eax 1236 ; AVX2-NEXT: bsrl %eax, %eax 1237 ; AVX2-NEXT: xorl $7, %eax 1238 ; AVX2-NEXT: vpinsrb $8, %eax, %xmm2, %xmm2 1239 ; AVX2-NEXT: vpextrb $9, %xmm1, %eax 1240 ; AVX2-NEXT: bsrl %eax, %eax 1241 ; AVX2-NEXT: xorl $7, %eax 1242 ; AVX2-NEXT: vpinsrb $9, %eax, %xmm2, %xmm2 1243 ; AVX2-NEXT: vpextrb $10, %xmm1, %eax 1244 ; AVX2-NEXT: bsrl %eax, %eax 1245 ; AVX2-NEXT: xorl $7, %eax 1246 ; AVX2-NEXT: vpinsrb $10, %eax, %xmm2, %xmm2 1247 ; AVX2-NEXT: vpextrb $11, %xmm1, %eax 1248 ; AVX2-NEXT: bsrl %eax, %eax 1249 ; AVX2-NEXT: xorl $7, %eax 1250 ; AVX2-NEXT: vpinsrb $11, %eax, %xmm2, %xmm2 1251 ; AVX2-NEXT: vpextrb $12, %xmm1, %eax 1252 ; AVX2-NEXT: bsrl %eax, %eax 1253 ; AVX2-NEXT: xorl $7, %eax 1254 ; AVX2-NEXT: vpinsrb $12, %eax, %xmm2, %xmm2 1255 ; AVX2-NEXT: vpextrb $13, %xmm1, %eax 1256 ; AVX2-NEXT: bsrl %eax, %eax 1257 ; AVX2-NEXT: xorl $7, %eax 1258 ; AVX2-NEXT: vpinsrb $13, %eax, %xmm2, %xmm2 1259 ; AVX2-NEXT: vpextrb $14, %xmm1, %eax 1260 ; AVX2-NEXT: bsrl %eax, %eax 1261 ; AVX2-NEXT: xorl $7, %eax 1262 ; AVX2-NEXT: vpinsrb $14, %eax, %xmm2, %xmm2 1263 ; AVX2-NEXT: vpextrb $15, %xmm1, %eax 1264 ; AVX2-NEXT: bsrl %eax, %eax 1265 ; AVX2-NEXT: xorl $7, %eax 1266 ; AVX2-NEXT: vpinsrb $15, %eax, %xmm2, %xmm1 1267 ; AVX2-NEXT: vpextrb $1, %xmm0, %eax 1268 ; AVX2-NEXT: bsrl %eax, %eax 1269 ; AVX2-NEXT: xorl $7, %eax 1270 ; AVX2-NEXT: vpextrb $0, %xmm0, %ecx 1271 ; AVX2-NEXT: bsrl %ecx, %ecx 1272 ; AVX2-NEXT: xorl $7, %ecx 1273 ; AVX2-NEXT: vmovd %ecx, %xmm2 1274 ; AVX2-NEXT: vpinsrb $1, %eax, %xmm2, %xmm2 1275 ; AVX2-NEXT: vpextrb $2, %xmm0, %eax 1276 ; AVX2-NEXT: bsrl %eax, %eax 1277 ; AVX2-NEXT: xorl $7, %eax 1278 ; AVX2-NEXT: vpinsrb $2, %eax, %xmm2, %xmm2 1279 ; AVX2-NEXT: vpextrb $3, %xmm0, %eax 1280 ; AVX2-NEXT: bsrl %eax, %eax 1281 ; AVX2-NEXT: xorl $7, %eax 1282 ; AVX2-NEXT: vpinsrb $3, %eax, %xmm2, %xmm2 1283 ; AVX2-NEXT: vpextrb $4, %xmm0, %eax 1284 ; AVX2-NEXT: bsrl %eax, %eax 1285 ; AVX2-NEXT: xorl $7, %eax 1286 ; AVX2-NEXT: vpinsrb $4, %eax, %xmm2, %xmm2 1287 ; AVX2-NEXT: vpextrb $5, %xmm0, %eax 1288 ; AVX2-NEXT: bsrl %eax, %eax 1289 ; AVX2-NEXT: xorl $7, %eax 1290 ; AVX2-NEXT: vpinsrb $5, %eax, %xmm2, %xmm2 1291 ; AVX2-NEXT: vpextrb $6, %xmm0, %eax 1292 ; AVX2-NEXT: bsrl %eax, %eax 1293 ; AVX2-NEXT: xorl $7, %eax 1294 ; AVX2-NEXT: vpinsrb $6, %eax, %xmm2, %xmm2 1295 ; AVX2-NEXT: vpextrb $7, %xmm0, %eax 1296 ; AVX2-NEXT: bsrl %eax, %eax 1297 ; AVX2-NEXT: xorl $7, %eax 1298 ; AVX2-NEXT: vpinsrb $7, %eax, %xmm2, %xmm2 1299 ; AVX2-NEXT: vpextrb $8, %xmm0, %eax 1300 ; AVX2-NEXT: bsrl %eax, %eax 1301 ; AVX2-NEXT: xorl $7, %eax 1302 ; AVX2-NEXT: vpinsrb $8, %eax, %xmm2, %xmm2 1303 ; AVX2-NEXT: vpextrb $9, %xmm0, %eax 1304 ; AVX2-NEXT: bsrl %eax, %eax 1305 ; AVX2-NEXT: xorl $7, %eax 1306 ; AVX2-NEXT: vpinsrb $9, %eax, %xmm2, %xmm2 1307 ; AVX2-NEXT: vpextrb $10, %xmm0, %eax 1308 ; AVX2-NEXT: bsrl %eax, %eax 1309 ; AVX2-NEXT: xorl $7, %eax 1310 ; AVX2-NEXT: vpinsrb $10, %eax, %xmm2, %xmm2 1311 ; AVX2-NEXT: vpextrb $11, %xmm0, %eax 1312 ; AVX2-NEXT: bsrl %eax, %eax 1313 ; AVX2-NEXT: xorl $7, %eax 1314 ; AVX2-NEXT: vpinsrb $11, %eax, %xmm2, %xmm2 1315 ; AVX2-NEXT: vpextrb $12, %xmm0, %eax 1316 ; AVX2-NEXT: bsrl %eax, %eax 1317 ; AVX2-NEXT: xorl $7, %eax 1318 ; AVX2-NEXT: vpinsrb $12, %eax, %xmm2, %xmm2 1319 ; AVX2-NEXT: vpextrb $13, %xmm0, %eax 1320 ; AVX2-NEXT: bsrl %eax, %eax 1321 ; AVX2-NEXT: xorl $7, %eax 1322 ; AVX2-NEXT: vpinsrb $13, %eax, %xmm2, %xmm2 1323 ; AVX2-NEXT: vpextrb $14, %xmm0, %eax 1324 ; AVX2-NEXT: bsrl %eax, %eax 1325 ; AVX2-NEXT: xorl $7, %eax 1326 ; AVX2-NEXT: vpinsrb $14, %eax, %xmm2, %xmm2 1327 ; AVX2-NEXT: vpextrb $15, %xmm0, %eax 1328 ; AVX2-NEXT: bsrl %eax, %eax 1329 ; AVX2-NEXT: xorl $7, %eax 1330 ; AVX2-NEXT: vpinsrb $15, %eax, %xmm2, %xmm0 1331 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1332 ; AVX2-NEXT: retq 1333 ; 1334 ; AVX512VLCD-LABEL: testv32i8u: 1335 ; AVX512VLCD: ## BB#0: 1336 ; AVX512VLCD-NEXT: vextractf128 $1, %ymm0, %xmm1 1337 ; AVX512VLCD-NEXT: vpmovzxbd %xmm1, %zmm1 1338 ; AVX512VLCD-NEXT: vplzcntd %zmm1, %zmm1 1339 ; AVX512VLCD-NEXT: vpmovdb %zmm1, %xmm1 1340 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} xmm2 = [24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24] 1341 ; AVX512VLCD-NEXT: vpsubb %xmm2, %xmm1, %xmm1 1342 ; AVX512VLCD-NEXT: vpmovzxbd %xmm0, %zmm0 1343 ; AVX512VLCD-NEXT: vplzcntd %zmm0, %zmm0 1344 ; AVX512VLCD-NEXT: vpmovdb %zmm0, %xmm0 1345 ; AVX512VLCD-NEXT: vpsubb %xmm2, %xmm0, %xmm0 1346 ; AVX512VLCD-NEXT: vinserti32x4 $1, %xmm1, %ymm0, %ymm0 1347 ; AVX512VLCD-NEXT: retq 1348 ; 1349 ; AVX512CD-LABEL: testv32i8u: 1350 ; AVX512CD: ## BB#0: 1351 ; AVX512CD-NEXT: vextractf128 $1, %ymm0, %xmm1 1352 ; AVX512CD-NEXT: vpmovzxbd %xmm1, %zmm1 1353 ; AVX512CD-NEXT: vplzcntd %zmm1, %zmm1 1354 ; AVX512CD-NEXT: vpmovdb %zmm1, %xmm1 1355 ; AVX512CD-NEXT: vmovdqa {{.*#+}} xmm2 = [24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24] 1356 ; AVX512CD-NEXT: vpsubb %xmm2, %xmm1, %xmm1 1357 ; AVX512CD-NEXT: vpmovzxbd %xmm0, %zmm0 1358 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 1359 ; AVX512CD-NEXT: vpmovdb %zmm0, %xmm0 1360 ; AVX512CD-NEXT: vpsubb %xmm2, %xmm0, %xmm0 1361 ; AVX512CD-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1362 ; AVX512CD-NEXT: retq 1363 %out = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %in, i1 -1) 1364 ret <32 x i8> %out 1365 } 1366 1367 define <4 x i64> @foldv4i64() nounwind { 1368 ; AVX-LABEL: foldv4i64: 1369 ; AVX: # BB#0: 1370 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [55,0,64,56] 1371 ; AVX-NEXT: retq 1372 ; 1373 ; AVX512VLCD-LABEL: foldv4i64: 1374 ; AVX512VLCD: ## BB#0: 1375 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} ymm0 = [55,0,64,56] 1376 ; AVX512VLCD-NEXT: retq 1377 ; 1378 ; AVX512CD-LABEL: foldv4i64: 1379 ; AVX512CD: ## BB#0: 1380 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [55,0,64,56] 1381 ; AVX512CD-NEXT: retq 1382 %out = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> <i64 256, i64 -1, i64 0, i64 255>, i1 0) 1383 ret <4 x i64> %out 1384 } 1385 1386 define <4 x i64> @foldv4i64u() nounwind { 1387 ; AVX-LABEL: foldv4i64u: 1388 ; AVX: # BB#0: 1389 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [55,0,64,56] 1390 ; AVX-NEXT: retq 1391 ; 1392 ; AVX512VLCD-LABEL: foldv4i64u: 1393 ; AVX512VLCD: ## BB#0: 1394 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} ymm0 = [55,0,64,56] 1395 ; AVX512VLCD-NEXT: retq 1396 ; 1397 ; AVX512CD-LABEL: foldv4i64u: 1398 ; AVX512CD: ## BB#0: 1399 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [55,0,64,56] 1400 ; AVX512CD-NEXT: retq 1401 %out = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> <i64 256, i64 -1, i64 0, i64 255>, i1 -1) 1402 ret <4 x i64> %out 1403 } 1404 1405 define <8 x i32> @foldv8i32() nounwind { 1406 ; AVX-LABEL: foldv8i32: 1407 ; AVX: # BB#0: 1408 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [23,0,32,24,0,29,27,25] 1409 ; AVX-NEXT: retq 1410 ; 1411 ; AVX512VLCD-LABEL: foldv8i32: 1412 ; AVX512VLCD: ## BB#0: 1413 ; AVX512VLCD-NEXT: vmovdqa32 {{.*#+}} ymm0 = [23,0,32,24,0,29,27,25] 1414 ; AVX512VLCD-NEXT: retq 1415 ; 1416 ; AVX512CD-LABEL: foldv8i32: 1417 ; AVX512CD: ## BB#0: 1418 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [23,0,32,24,0,29,27,25] 1419 ; AVX512CD-NEXT: retq 1420 %out = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> <i32 256, i32 -1, i32 0, i32 255, i32 -65536, i32 7, i32 24, i32 88>, i1 0) 1421 ret <8 x i32> %out 1422 } 1423 1424 define <8 x i32> @foldv8i32u() nounwind { 1425 ; AVX-LABEL: foldv8i32u: 1426 ; AVX: # BB#0: 1427 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [23,0,32,24,0,29,27,25] 1428 ; AVX-NEXT: retq 1429 ; 1430 ; AVX512VLCD-LABEL: foldv8i32u: 1431 ; AVX512VLCD: ## BB#0: 1432 ; AVX512VLCD-NEXT: vmovdqa32 {{.*#+}} ymm0 = [23,0,32,24,0,29,27,25] 1433 ; AVX512VLCD-NEXT: retq 1434 ; 1435 ; AVX512CD-LABEL: foldv8i32u: 1436 ; AVX512CD: ## BB#0: 1437 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [23,0,32,24,0,29,27,25] 1438 ; AVX512CD-NEXT: retq 1439 %out = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> <i32 256, i32 -1, i32 0, i32 255, i32 -65536, i32 7, i32 24, i32 88>, i1 -1) 1440 ret <8 x i32> %out 1441 } 1442 1443 define <16 x i16> @foldv16i16() nounwind { 1444 ; AVX-LABEL: foldv16i16: 1445 ; AVX: # BB#0: 1446 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [7,0,16,8,16,13,11,9,0,8,15,14,13,12,11,10] 1447 ; AVX-NEXT: retq 1448 ; 1449 ; AVX512VLCD-LABEL: foldv16i16: 1450 ; AVX512VLCD: ## BB#0: 1451 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} ymm0 = [7,0,16,8,16,13,11,9,0,8,15,14,13,12,11,10] 1452 ; AVX512VLCD-NEXT: retq 1453 ; 1454 ; AVX512CD-LABEL: foldv16i16: 1455 ; AVX512CD: ## BB#0: 1456 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [7,0,16,8,16,13,11,9,0,8,15,14,13,12,11,10] 1457 ; AVX512CD-NEXT: retq 1458 %out = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88, i16 -2, i16 254, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32>, i1 0) 1459 ret <16 x i16> %out 1460 } 1461 1462 define <16 x i16> @foldv16i16u() nounwind { 1463 ; AVX-LABEL: foldv16i16u: 1464 ; AVX: # BB#0: 1465 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [7,0,16,8,16,13,11,9,0,8,15,14,13,12,11,10] 1466 ; AVX-NEXT: retq 1467 ; 1468 ; AVX512VLCD-LABEL: foldv16i16u: 1469 ; AVX512VLCD: ## BB#0: 1470 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} ymm0 = [7,0,16,8,16,13,11,9,0,8,15,14,13,12,11,10] 1471 ; AVX512VLCD-NEXT: retq 1472 ; 1473 ; AVX512CD-LABEL: foldv16i16u: 1474 ; AVX512CD: ## BB#0: 1475 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [7,0,16,8,16,13,11,9,0,8,15,14,13,12,11,10] 1476 ; AVX512CD-NEXT: retq 1477 %out = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88, i16 -2, i16 254, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32>, i1 -1) 1478 ret <16 x i16> %out 1479 } 1480 1481 define <32 x i8> @foldv32i8() nounwind { 1482 ; AVX-LABEL: foldv32i8: 1483 ; AVX: # BB#0: 1484 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2,1,0,8,8,0,0,0,0,0,0,0,0,6,5,5,1] 1485 ; AVX-NEXT: retq 1486 ; 1487 ; AVX512VLCD-LABEL: foldv32i8: 1488 ; AVX512VLCD: ## BB#0: 1489 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} ymm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2,1,0,8,8,0,0,0,0,0,0,0,0,6,5,5,1] 1490 ; AVX512VLCD-NEXT: retq 1491 ; 1492 ; AVX512CD-LABEL: foldv32i8: 1493 ; AVX512CD: ## BB#0: 1494 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2,1,0,8,8,0,0,0,0,0,0,0,0,6,5,5,1] 1495 ; AVX512CD-NEXT: retq 1496 %out = call <32 x i8> @llvm.ctlz.v32i8(<32 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, i8 64, i8 128, i8 256, i8 -256, i8 -128, i8 -64, i8 -32, i8 -16, i8 -8, i8 -4, i8 -2, i8 -1, i8 3, i8 5, i8 7, i8 127>, i1 0) 1497 ret <32 x i8> %out 1498 } 1499 1500 define <32 x i8> @foldv32i8u() nounwind { 1501 ; AVX-LABEL: foldv32i8u: 1502 ; AVX: # BB#0: 1503 ; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2,1,0,8,8,0,0,0,0,0,0,0,0,6,5,5,1] 1504 ; AVX-NEXT: retq 1505 ; 1506 ; AVX512VLCD-LABEL: foldv32i8u: 1507 ; AVX512VLCD: ## BB#0: 1508 ; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} ymm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2,1,0,8,8,0,0,0,0,0,0,0,0,6,5,5,1] 1509 ; AVX512VLCD-NEXT: retq 1510 ; 1511 ; AVX512CD-LABEL: foldv32i8u: 1512 ; AVX512CD: ## BB#0: 1513 ; AVX512CD-NEXT: vmovaps {{.*#+}} ymm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2,1,0,8,8,0,0,0,0,0,0,0,0,6,5,5,1] 1514 ; AVX512CD-NEXT: retq 1515 %out = call <32 x i8> @llvm.ctlz.v32i8(<32 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, i8 64, i8 128, i8 256, i8 -256, i8 -128, i8 -64, i8 -32, i8 -16, i8 -8, i8 -4, i8 -2, i8 -1, i8 3, i8 5, i8 7, i8 127>, i1 -1) 1516 ret <32 x i8> %out 1517 } 1518 1519 declare <4 x i64> @llvm.ctlz.v4i64(<4 x i64>, i1) 1520 declare <8 x i32> @llvm.ctlz.v8i32(<8 x i32>, i1) 1521 declare <16 x i16> @llvm.ctlz.v16i16(<16 x i16>, i1) 1522 declare <32 x i8> @llvm.ctlz.v32i8(<32 x i8>, i1) 1523