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