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