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-apple-darwin -mcpu=knl -mattr=+avx512cd | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512CD
      3 
      4 define <8 x i64> @testv8i64(<8 x i64> %in) nounwind {
      5 ; ALL-LABEL: testv8i64:
      6 ; ALL:       ## BB#0:
      7 ; ALL-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
      8 ; ALL-NEXT:    vpextrq $1, %xmm1, %rax
      9 ; ALL-NEXT:    tzcntq %rax, %rax
     10 ; ALL-NEXT:    vmovq %rax, %xmm2
     11 ; ALL-NEXT:    vmovq %xmm1, %rax
     12 ; ALL-NEXT:    tzcntq %rax, %rax
     13 ; ALL-NEXT:    vmovq %rax, %xmm1
     14 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
     15 ; ALL-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
     16 ; ALL-NEXT:    vpextrq $1, %xmm2, %rax
     17 ; ALL-NEXT:    tzcntq %rax, %rax
     18 ; ALL-NEXT:    vmovq %rax, %xmm3
     19 ; ALL-NEXT:    vmovq %xmm2, %rax
     20 ; ALL-NEXT:    tzcntq %rax, %rax
     21 ; ALL-NEXT:    vmovq %rax, %xmm2
     22 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
     23 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1
     24 ; ALL-NEXT:    vextracti32x4 $1, %zmm0, %xmm2
     25 ; ALL-NEXT:    vpextrq $1, %xmm2, %rax
     26 ; ALL-NEXT:    tzcntq %rax, %rax
     27 ; ALL-NEXT:    vmovq %rax, %xmm3
     28 ; ALL-NEXT:    vmovq %xmm2, %rax
     29 ; ALL-NEXT:    tzcntq %rax, %rax
     30 ; ALL-NEXT:    vmovq %rax, %xmm2
     31 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
     32 ; ALL-NEXT:    vpextrq $1, %xmm0, %rax
     33 ; ALL-NEXT:    tzcntq %rax, %rax
     34 ; ALL-NEXT:    vmovq %rax, %xmm3
     35 ; ALL-NEXT:    vmovq %xmm0, %rax
     36 ; ALL-NEXT:    tzcntq %rax, %rax
     37 ; ALL-NEXT:    vmovq %rax, %xmm0
     38 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
     39 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
     40 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
     41 ; ALL-NEXT:    retq
     42   %out = call <8 x i64> @llvm.cttz.v8i64(<8 x i64> %in, i1 0)
     43   ret <8 x i64> %out
     44 }
     45 
     46 define <8 x i64> @testv8i64u(<8 x i64> %in) nounwind {
     47 ; ALL-LABEL: testv8i64u:
     48 ; ALL:       ## BB#0:
     49 ; ALL-NEXT:    vpxord %zmm1, %zmm1, %zmm1
     50 ; ALL-NEXT:    vpsubq %zmm0, %zmm1, %zmm1
     51 ; ALL-NEXT:    vpandq %zmm1, %zmm0, %zmm0
     52 ; ALL-NEXT:    vplzcntq %zmm0, %zmm0
     53 ; ALL-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm1
     54 ; ALL-NEXT:    vpsubq %zmm0, %zmm1, %zmm0
     55 ; ALL-NEXT:    retq
     56   %out = call <8 x i64> @llvm.cttz.v8i64(<8 x i64> %in, i1 -1)
     57   ret <8 x i64> %out
     58 }
     59 
     60 define <16 x i32> @testv16i32(<16 x i32> %in) nounwind {
     61 ; ALL-LABEL: testv16i32:
     62 ; ALL:       ## BB#0:
     63 ; ALL-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
     64 ; ALL-NEXT:    vpextrd $1, %xmm1, %eax
     65 ; ALL-NEXT:    tzcntl %eax, %eax
     66 ; ALL-NEXT:    vmovd %xmm1, %ecx
     67 ; ALL-NEXT:    tzcntl %ecx, %ecx
     68 ; ALL-NEXT:    vmovd %ecx, %xmm2
     69 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
     70 ; ALL-NEXT:    vpextrd $2, %xmm1, %eax
     71 ; ALL-NEXT:    tzcntl %eax, %eax
     72 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
     73 ; ALL-NEXT:    vpextrd $3, %xmm1, %eax
     74 ; ALL-NEXT:    tzcntl %eax, %eax
     75 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm1
     76 ; ALL-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
     77 ; ALL-NEXT:    vpextrd $1, %xmm2, %eax
     78 ; ALL-NEXT:    tzcntl %eax, %eax
     79 ; ALL-NEXT:    vmovd %xmm2, %ecx
     80 ; ALL-NEXT:    tzcntl %ecx, %ecx
     81 ; ALL-NEXT:    vmovd %ecx, %xmm3
     82 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
     83 ; ALL-NEXT:    vpextrd $2, %xmm2, %eax
     84 ; ALL-NEXT:    tzcntl %eax, %eax
     85 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
     86 ; ALL-NEXT:    vpextrd $3, %xmm2, %eax
     87 ; ALL-NEXT:    tzcntl %eax, %eax
     88 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm2
     89 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1
     90 ; ALL-NEXT:    vextracti32x4 $1, %zmm0, %xmm2
     91 ; ALL-NEXT:    vpextrd $1, %xmm2, %eax
     92 ; ALL-NEXT:    tzcntl %eax, %eax
     93 ; ALL-NEXT:    vmovd %xmm2, %ecx
     94 ; ALL-NEXT:    tzcntl %ecx, %ecx
     95 ; ALL-NEXT:    vmovd %ecx, %xmm3
     96 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
     97 ; ALL-NEXT:    vpextrd $2, %xmm2, %eax
     98 ; ALL-NEXT:    tzcntl %eax, %eax
     99 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
    100 ; ALL-NEXT:    vpextrd $3, %xmm2, %eax
    101 ; ALL-NEXT:    tzcntl %eax, %eax
    102 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm2
    103 ; ALL-NEXT:    vpextrd $1, %xmm0, %eax
    104 ; ALL-NEXT:    tzcntl %eax, %eax
    105 ; ALL-NEXT:    vmovd %xmm0, %ecx
    106 ; ALL-NEXT:    tzcntl %ecx, %ecx
    107 ; ALL-NEXT:    vmovd %ecx, %xmm3
    108 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
    109 ; ALL-NEXT:    vpextrd $2, %xmm0, %eax
    110 ; ALL-NEXT:    tzcntl %eax, %eax
    111 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
    112 ; ALL-NEXT:    vpextrd $3, %xmm0, %eax
    113 ; ALL-NEXT:    tzcntl %eax, %eax
    114 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm0
    115 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    116 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
    117 ; ALL-NEXT:    retq
    118   %out = call <16 x i32> @llvm.cttz.v16i32(<16 x i32> %in, i1 0)
    119   ret <16 x i32> %out
    120 }
    121 
    122 define <16 x i32> @testv16i32u(<16 x i32> %in) nounwind {
    123 ; ALL-LABEL: testv16i32u:
    124 ; ALL:       ## BB#0:
    125 ; ALL-NEXT:    vpxord %zmm1, %zmm1, %zmm1
    126 ; ALL-NEXT:    vpsubd %zmm0, %zmm1, %zmm1
    127 ; ALL-NEXT:    vpandd %zmm1, %zmm0, %zmm0
    128 ; ALL-NEXT:    vplzcntd %zmm0, %zmm0
    129 ; ALL-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm1
    130 ; ALL-NEXT:    vpsubd %zmm0, %zmm1, %zmm0
    131 ; ALL-NEXT:    retq
    132   %out = call <16 x i32> @llvm.cttz.v16i32(<16 x i32> %in, i1 -1)
    133   ret <16 x i32> %out
    134 }
    135 
    136 define <32 x i16> @testv32i16(<32 x i16> %in) nounwind {
    137 ; ALL-LABEL: testv32i16:
    138 ; ALL:       ## BB#0:
    139 ; ALL-NEXT:    vpxor %ymm2, %ymm2, %ymm2
    140 ; ALL-NEXT:    vpsubw %ymm0, %ymm2, %ymm3
    141 ; ALL-NEXT:    vpand %ymm3, %ymm0, %ymm0
    142 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    143 ; ALL-NEXT:    vpsubw %ymm3, %ymm0, %ymm0
    144 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
    145 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm5
    146 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm6 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
    147 ; ALL-NEXT:    vpshufb %ymm5, %ymm6, %ymm5
    148 ; ALL-NEXT:    vpsrlw $4, %ymm0, %ymm0
    149 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm0
    150 ; ALL-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
    151 ; ALL-NEXT:    vpaddb %ymm5, %ymm0, %ymm0
    152 ; ALL-NEXT:    vpsllw $8, %ymm0, %ymm5
    153 ; ALL-NEXT:    vpaddb %ymm0, %ymm5, %ymm0
    154 ; ALL-NEXT:    vpsrlw $8, %ymm0, %ymm0
    155 ; ALL-NEXT:    vpsubw %ymm1, %ymm2, %ymm2
    156 ; ALL-NEXT:    vpand %ymm2, %ymm1, %ymm1
    157 ; ALL-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
    158 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm2
    159 ; ALL-NEXT:    vpshufb %ymm2, %ymm6, %ymm2
    160 ; ALL-NEXT:    vpsrlw $4, %ymm1, %ymm1
    161 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm1
    162 ; ALL-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
    163 ; ALL-NEXT:    vpaddb %ymm2, %ymm1, %ymm1
    164 ; ALL-NEXT:    vpsllw $8, %ymm1, %ymm2
    165 ; ALL-NEXT:    vpaddb %ymm1, %ymm2, %ymm1
    166 ; ALL-NEXT:    vpsrlw $8, %ymm1, %ymm1
    167 ; ALL-NEXT:    retq
    168   %out = call <32 x i16> @llvm.cttz.v32i16(<32 x i16> %in, i1 0)
    169   ret <32 x i16> %out
    170 }
    171 
    172 define <32 x i16> @testv32i16u(<32 x i16> %in) nounwind {
    173 ; ALL-LABEL: testv32i16u:
    174 ; ALL:       ## BB#0:
    175 ; ALL-NEXT:    vpxor %ymm2, %ymm2, %ymm2
    176 ; ALL-NEXT:    vpsubw %ymm0, %ymm2, %ymm3
    177 ; ALL-NEXT:    vpand %ymm3, %ymm0, %ymm0
    178 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    179 ; ALL-NEXT:    vpsubw %ymm3, %ymm0, %ymm0
    180 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
    181 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm5
    182 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm6 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
    183 ; ALL-NEXT:    vpshufb %ymm5, %ymm6, %ymm5
    184 ; ALL-NEXT:    vpsrlw $4, %ymm0, %ymm0
    185 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm0
    186 ; ALL-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
    187 ; ALL-NEXT:    vpaddb %ymm5, %ymm0, %ymm0
    188 ; ALL-NEXT:    vpsllw $8, %ymm0, %ymm5
    189 ; ALL-NEXT:    vpaddb %ymm0, %ymm5, %ymm0
    190 ; ALL-NEXT:    vpsrlw $8, %ymm0, %ymm0
    191 ; ALL-NEXT:    vpsubw %ymm1, %ymm2, %ymm2
    192 ; ALL-NEXT:    vpand %ymm2, %ymm1, %ymm1
    193 ; ALL-NEXT:    vpsubw %ymm3, %ymm1, %ymm1
    194 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm2
    195 ; ALL-NEXT:    vpshufb %ymm2, %ymm6, %ymm2
    196 ; ALL-NEXT:    vpsrlw $4, %ymm1, %ymm1
    197 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm1
    198 ; ALL-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
    199 ; ALL-NEXT:    vpaddb %ymm2, %ymm1, %ymm1
    200 ; ALL-NEXT:    vpsllw $8, %ymm1, %ymm2
    201 ; ALL-NEXT:    vpaddb %ymm1, %ymm2, %ymm1
    202 ; ALL-NEXT:    vpsrlw $8, %ymm1, %ymm1
    203 ; ALL-NEXT:    retq
    204   %out = call <32 x i16> @llvm.cttz.v32i16(<32 x i16> %in, i1 -1)
    205   ret <32 x i16> %out
    206 }
    207 
    208 define <64 x i8> @testv64i8(<64 x i8> %in) nounwind {
    209 ; ALL-LABEL: testv64i8:
    210 ; ALL:       ## BB#0:
    211 ; ALL-NEXT:    vpxor %ymm2, %ymm2, %ymm2
    212 ; ALL-NEXT:    vpsubb %ymm0, %ymm2, %ymm3
    213 ; ALL-NEXT:    vpand %ymm3, %ymm0, %ymm0
    214 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    215 ; ALL-NEXT:    vpsubb %ymm3, %ymm0, %ymm0
    216 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
    217 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm5
    218 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm6 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
    219 ; ALL-NEXT:    vpshufb %ymm5, %ymm6, %ymm5
    220 ; ALL-NEXT:    vpsrlw $4, %ymm0, %ymm0
    221 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm0
    222 ; ALL-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
    223 ; ALL-NEXT:    vpaddb %ymm5, %ymm0, %ymm0
    224 ; ALL-NEXT:    vpsubb %ymm1, %ymm2, %ymm2
    225 ; ALL-NEXT:    vpand %ymm2, %ymm1, %ymm1
    226 ; ALL-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
    227 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm2
    228 ; ALL-NEXT:    vpshufb %ymm2, %ymm6, %ymm2
    229 ; ALL-NEXT:    vpsrlw $4, %ymm1, %ymm1
    230 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm1
    231 ; ALL-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
    232 ; ALL-NEXT:    vpaddb %ymm2, %ymm1, %ymm1
    233 ; ALL-NEXT:    retq
    234   %out = call <64 x i8> @llvm.cttz.v64i8(<64 x i8> %in, i1 0)
    235   ret <64 x i8> %out
    236 }
    237 
    238 define <64 x i8> @testv64i8u(<64 x i8> %in) nounwind {
    239 ; ALL-LABEL: testv64i8u:
    240 ; ALL:       ## BB#0:
    241 ; ALL-NEXT:    vpxor %ymm2, %ymm2, %ymm2
    242 ; ALL-NEXT:    vpsubb %ymm0, %ymm2, %ymm3
    243 ; ALL-NEXT:    vpand %ymm3, %ymm0, %ymm0
    244 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    245 ; ALL-NEXT:    vpsubb %ymm3, %ymm0, %ymm0
    246 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
    247 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm5
    248 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm6 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
    249 ; ALL-NEXT:    vpshufb %ymm5, %ymm6, %ymm5
    250 ; ALL-NEXT:    vpsrlw $4, %ymm0, %ymm0
    251 ; ALL-NEXT:    vpand %ymm4, %ymm0, %ymm0
    252 ; ALL-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
    253 ; ALL-NEXT:    vpaddb %ymm5, %ymm0, %ymm0
    254 ; ALL-NEXT:    vpsubb %ymm1, %ymm2, %ymm2
    255 ; ALL-NEXT:    vpand %ymm2, %ymm1, %ymm1
    256 ; ALL-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
    257 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm2
    258 ; ALL-NEXT:    vpshufb %ymm2, %ymm6, %ymm2
    259 ; ALL-NEXT:    vpsrlw $4, %ymm1, %ymm1
    260 ; ALL-NEXT:    vpand %ymm4, %ymm1, %ymm1
    261 ; ALL-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
    262 ; ALL-NEXT:    vpaddb %ymm2, %ymm1, %ymm1
    263 ; ALL-NEXT:    retq
    264   %out = call <64 x i8> @llvm.cttz.v64i8(<64 x i8> %in, i1 -1)
    265   ret <64 x i8> %out
    266 }
    267 
    268 declare <8 x i64> @llvm.cttz.v8i64(<8 x i64>, i1)
    269 declare <16 x i32> @llvm.cttz.v16i32(<16 x i32>, i1)
    270 declare <32 x i16> @llvm.cttz.v32i16(<32 x i16>, i1)
    271 declare <64 x i8> @llvm.cttz.v64i8(<64 x i8>, i1)
    272