Home | History | Annotate | Download | only in X86
      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