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 -mattr=+avx512bw,+avx512vl,+prefer-256-bit | FileCheck %s --check-prefix=ALL --check-prefix=AVX256 --check-prefix=AVX256BW --check-prefix=AVX256BWVL
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,-prefer-256-bit | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW --check-prefix=AVX512BWVL
      4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+prefer-256-bit | FileCheck %s --check-prefix=ALL --check-prefix=AVX256 --check-prefix=AVX256VL
      5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,-prefer-256-bit | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL
      6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+prefer-256-bit | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW --check-prefix=AVX512BWNOVL
      7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,-prefer-256-bit | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW --check-prefix=AVX512BWNOVL
      8 
      9 define <32 x i8> @var_shl_v32i8(<32 x i8> %a, <32 x i8> %b) {
     10 ; AVX256-LABEL: var_shl_v32i8:
     11 ; AVX256:       # %bb.0:
     12 ; AVX256-NEXT:    vpsllw $5, %ymm1, %ymm1
     13 ; AVX256-NEXT:    vpsllw $4, %ymm0, %ymm2
     14 ; AVX256-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
     15 ; AVX256-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
     16 ; AVX256-NEXT:    vpsllw $2, %ymm0, %ymm2
     17 ; AVX256-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
     18 ; AVX256-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
     19 ; AVX256-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
     20 ; AVX256-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
     21 ; AVX256-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
     22 ; AVX256-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
     23 ; AVX256-NEXT:    retq
     24 ;
     25 ; AVX512BW-LABEL: var_shl_v32i8:
     26 ; AVX512BW:       # %bb.0:
     27 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
     28 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
     29 ; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
     30 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
     31 ; AVX512BW-NEXT:    retq
     32 ;
     33 ; AVX512VL-LABEL: var_shl_v32i8:
     34 ; AVX512VL:       # %bb.0:
     35 ; AVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1
     36 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm2
     37 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
     38 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
     39 ; AVX512VL-NEXT:    vpsllw $2, %ymm0, %ymm2
     40 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
     41 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
     42 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
     43 ; AVX512VL-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
     44 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
     45 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
     46 ; AVX512VL-NEXT:    retq
     47   %shift = shl <32 x i8> %a, %b
     48   ret <32 x i8> %shift
     49 }
     50 
     51 define <16 x i16> @var_shl_v16i16(<16 x i16> %a, <16 x i16> %b) {
     52 ; AVX256BW-LABEL: var_shl_v16i16:
     53 ; AVX256BW:       # %bb.0:
     54 ; AVX256BW-NEXT:    vpsllvw %ymm1, %ymm0, %ymm0
     55 ; AVX256BW-NEXT:    retq
     56 ;
     57 ; AVX512BWVL-LABEL: var_shl_v16i16:
     58 ; AVX512BWVL:       # %bb.0:
     59 ; AVX512BWVL-NEXT:    vpsllvw %ymm1, %ymm0, %ymm0
     60 ; AVX512BWVL-NEXT:    retq
     61 ;
     62 ; AVX256VL-LABEL: var_shl_v16i16:
     63 ; AVX256VL:       # %bb.0:
     64 ; AVX256VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
     65 ; AVX256VL-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
     66 ; AVX256VL-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
     67 ; AVX256VL-NEXT:    vpsllvd %ymm3, %ymm4, %ymm3
     68 ; AVX256VL-NEXT:    vpsrld $16, %ymm3, %ymm3
     69 ; AVX256VL-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
     70 ; AVX256VL-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
     71 ; AVX256VL-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
     72 ; AVX256VL-NEXT:    vpsrld $16, %ymm0, %ymm0
     73 ; AVX256VL-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
     74 ; AVX256VL-NEXT:    retq
     75 ;
     76 ; AVX512VL-LABEL: var_shl_v16i16:
     77 ; AVX512VL:       # %bb.0:
     78 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
     79 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
     80 ; AVX512VL-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
     81 ; AVX512VL-NEXT:    vpmovdw %zmm0, %ymm0
     82 ; AVX512VL-NEXT:    retq
     83 ;
     84 ; AVX512BWNOVL-LABEL: var_shl_v16i16:
     85 ; AVX512BWNOVL:       # %bb.0:
     86 ; AVX512BWNOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
     87 ; AVX512BWNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
     88 ; AVX512BWNOVL-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
     89 ; AVX512BWNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
     90 ; AVX512BWNOVL-NEXT:    retq
     91   %shift = shl <16 x i16> %a, %b
     92   ret <16 x i16> %shift
     93 }
     94 
     95 define <16 x i8> @var_shl_v16i8(<16 x i8> %a, <16 x i8> %b) {
     96 ; AVX256BW-LABEL: var_shl_v16i8:
     97 ; AVX256BW:       # %bb.0:
     98 ; AVX256BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
     99 ; AVX256BW-NEXT:    vpmovzxbw {{.*#+}} 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,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
    100 ; AVX256BW-NEXT:    vpsllvw %ymm1, %ymm0, %ymm0
    101 ; AVX256BW-NEXT:    vpmovwb %ymm0, %xmm0
    102 ; AVX256BW-NEXT:    vzeroupper
    103 ; AVX256BW-NEXT:    retq
    104 ;
    105 ; AVX512BWVL-LABEL: var_shl_v16i8:
    106 ; AVX512BWVL:       # %bb.0:
    107 ; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
    108 ; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} 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,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
    109 ; AVX512BWVL-NEXT:    vpsllvw %ymm1, %ymm0, %ymm0
    110 ; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0
    111 ; AVX512BWVL-NEXT:    vzeroupper
    112 ; AVX512BWVL-NEXT:    retq
    113 ;
    114 ; AVX256VL-LABEL: var_shl_v16i8:
    115 ; AVX256VL:       # %bb.0:
    116 ; AVX256VL-NEXT:    vpsllw $5, %xmm1, %xmm1
    117 ; AVX256VL-NEXT:    vpsllw $4, %xmm0, %xmm2
    118 ; AVX256VL-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    119 ; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    120 ; AVX256VL-NEXT:    vpsllw $2, %xmm0, %xmm2
    121 ; AVX256VL-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    122 ; AVX256VL-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    123 ; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    124 ; AVX256VL-NEXT:    vpaddb %xmm0, %xmm0, %xmm2
    125 ; AVX256VL-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    126 ; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    127 ; AVX256VL-NEXT:    retq
    128 ;
    129 ; AVX512VL-LABEL: var_shl_v16i8:
    130 ; AVX512VL:       # %bb.0:
    131 ; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
    132 ; AVX512VL-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
    133 ; AVX512VL-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
    134 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
    135 ; AVX512VL-NEXT:    vzeroupper
    136 ; AVX512VL-NEXT:    retq
    137 ;
    138 ; AVX512BWNOVL-LABEL: var_shl_v16i8:
    139 ; AVX512BWNOVL:       # %bb.0:
    140 ; AVX512BWNOVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
    141 ; AVX512BWNOVL-NEXT:    vpmovzxbw {{.*#+}} 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,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
    142 ; AVX512BWNOVL-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
    143 ; AVX512BWNOVL-NEXT:    vpmovwb %zmm0, %ymm0
    144 ; AVX512BWNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
    145 ; AVX512BWNOVL-NEXT:    vzeroupper
    146 ; AVX512BWNOVL-NEXT:    retq
    147   %shift = shl <16 x i8> %a, %b
    148   ret <16 x i8> %shift
    149 }
    150 
    151 define <32 x i8> @var_lshr_v32i8(<32 x i8> %a, <32 x i8> %b) {
    152 ; AVX256-LABEL: var_lshr_v32i8:
    153 ; AVX256:       # %bb.0:
    154 ; AVX256-NEXT:    vpsllw $5, %ymm1, %ymm1
    155 ; AVX256-NEXT:    vpsrlw $4, %ymm0, %ymm2
    156 ; AVX256-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    157 ; AVX256-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    158 ; AVX256-NEXT:    vpsrlw $2, %ymm0, %ymm2
    159 ; AVX256-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    160 ; AVX256-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    161 ; AVX256-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    162 ; AVX256-NEXT:    vpsrlw $1, %ymm0, %ymm2
    163 ; AVX256-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    164 ; AVX256-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    165 ; AVX256-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    166 ; AVX256-NEXT:    retq
    167 ;
    168 ; AVX512BW-LABEL: var_lshr_v32i8:
    169 ; AVX512BW:       # %bb.0:
    170 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
    171 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
    172 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
    173 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
    174 ; AVX512BW-NEXT:    retq
    175 ;
    176 ; AVX512VL-LABEL: var_lshr_v32i8:
    177 ; AVX512VL:       # %bb.0:
    178 ; AVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1
    179 ; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm2
    180 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    181 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    182 ; AVX512VL-NEXT:    vpsrlw $2, %ymm0, %ymm2
    183 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    184 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    185 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    186 ; AVX512VL-NEXT:    vpsrlw $1, %ymm0, %ymm2
    187 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    188 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    189 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    190 ; AVX512VL-NEXT:    retq
    191   %shift = lshr <32 x i8> %a, %b
    192   ret <32 x i8> %shift
    193 }
    194 
    195 define <16 x i16> @var_lshr_v16i16(<16 x i16> %a, <16 x i16> %b) {
    196 ; AVX256BW-LABEL: var_lshr_v16i16:
    197 ; AVX256BW:       # %bb.0:
    198 ; AVX256BW-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
    199 ; AVX256BW-NEXT:    retq
    200 ;
    201 ; AVX512BWVL-LABEL: var_lshr_v16i16:
    202 ; AVX512BWVL:       # %bb.0:
    203 ; AVX512BWVL-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
    204 ; AVX512BWVL-NEXT:    retq
    205 ;
    206 ; AVX256VL-LABEL: var_lshr_v16i16:
    207 ; AVX256VL:       # %bb.0:
    208 ; AVX256VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    209 ; AVX256VL-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
    210 ; AVX256VL-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
    211 ; AVX256VL-NEXT:    vpsrlvd %ymm3, %ymm4, %ymm3
    212 ; AVX256VL-NEXT:    vpsrld $16, %ymm3, %ymm3
    213 ; AVX256VL-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
    214 ; AVX256VL-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
    215 ; AVX256VL-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
    216 ; AVX256VL-NEXT:    vpsrld $16, %ymm0, %ymm0
    217 ; AVX256VL-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
    218 ; AVX256VL-NEXT:    retq
    219 ;
    220 ; AVX512VL-LABEL: var_lshr_v16i16:
    221 ; AVX512VL:       # %bb.0:
    222 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
    223 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
    224 ; AVX512VL-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
    225 ; AVX512VL-NEXT:    vpmovdw %zmm0, %ymm0
    226 ; AVX512VL-NEXT:    retq
    227 ;
    228 ; AVX512BWNOVL-LABEL: var_lshr_v16i16:
    229 ; AVX512BWNOVL:       # %bb.0:
    230 ; AVX512BWNOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
    231 ; AVX512BWNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    232 ; AVX512BWNOVL-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
    233 ; AVX512BWNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
    234 ; AVX512BWNOVL-NEXT:    retq
    235   %shift = lshr <16 x i16> %a, %b
    236   ret <16 x i16> %shift
    237 }
    238 
    239 define <16 x i8> @var_lshr_v16i8(<16 x i8> %a, <16 x i8> %b) {
    240 ; AVX256BW-LABEL: var_lshr_v16i8:
    241 ; AVX256BW:       # %bb.0:
    242 ; AVX256BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
    243 ; AVX256BW-NEXT:    vpmovzxbw {{.*#+}} 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,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
    244 ; AVX256BW-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
    245 ; AVX256BW-NEXT:    vpmovwb %ymm0, %xmm0
    246 ; AVX256BW-NEXT:    vzeroupper
    247 ; AVX256BW-NEXT:    retq
    248 ;
    249 ; AVX512BWVL-LABEL: var_lshr_v16i8:
    250 ; AVX512BWVL:       # %bb.0:
    251 ; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
    252 ; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} 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,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
    253 ; AVX512BWVL-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
    254 ; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0
    255 ; AVX512BWVL-NEXT:    vzeroupper
    256 ; AVX512BWVL-NEXT:    retq
    257 ;
    258 ; AVX256VL-LABEL: var_lshr_v16i8:
    259 ; AVX256VL:       # %bb.0:
    260 ; AVX256VL-NEXT:    vpsllw $5, %xmm1, %xmm1
    261 ; AVX256VL-NEXT:    vpsrlw $4, %xmm0, %xmm2
    262 ; AVX256VL-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    263 ; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    264 ; AVX256VL-NEXT:    vpsrlw $2, %xmm0, %xmm2
    265 ; AVX256VL-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    266 ; AVX256VL-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    267 ; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    268 ; AVX256VL-NEXT:    vpsrlw $1, %xmm0, %xmm2
    269 ; AVX256VL-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    270 ; AVX256VL-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    271 ; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    272 ; AVX256VL-NEXT:    retq
    273 ;
    274 ; AVX512VL-LABEL: var_lshr_v16i8:
    275 ; AVX512VL:       # %bb.0:
    276 ; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
    277 ; AVX512VL-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
    278 ; AVX512VL-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
    279 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
    280 ; AVX512VL-NEXT:    vzeroupper
    281 ; AVX512VL-NEXT:    retq
    282 ;
    283 ; AVX512BWNOVL-LABEL: var_lshr_v16i8:
    284 ; AVX512BWNOVL:       # %bb.0:
    285 ; AVX512BWNOVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
    286 ; AVX512BWNOVL-NEXT:    vpmovzxbw {{.*#+}} 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,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
    287 ; AVX512BWNOVL-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
    288 ; AVX512BWNOVL-NEXT:    vpmovwb %zmm0, %ymm0
    289 ; AVX512BWNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
    290 ; AVX512BWNOVL-NEXT:    vzeroupper
    291 ; AVX512BWNOVL-NEXT:    retq
    292   %shift = lshr <16 x i8> %a, %b
    293   ret <16 x i8> %shift
    294 }
    295 
    296 define <32 x i8> @var_ashr_v32i8(<32 x i8> %a, <32 x i8> %b) {
    297 ; AVX256-LABEL: var_ashr_v32i8:
    298 ; AVX256:       # %bb.0:
    299 ; AVX256-NEXT:    vpsllw $5, %ymm1, %ymm1
    300 ; AVX256-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
    301 ; AVX256-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
    302 ; AVX256-NEXT:    vpsraw $4, %ymm3, %ymm4
    303 ; AVX256-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
    304 ; AVX256-NEXT:    vpsraw $2, %ymm3, %ymm4
    305 ; AVX256-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
    306 ; AVX256-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
    307 ; AVX256-NEXT:    vpsraw $1, %ymm3, %ymm4
    308 ; AVX256-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
    309 ; AVX256-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
    310 ; AVX256-NEXT:    vpsrlw $8, %ymm2, %ymm2
    311 ; AVX256-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
    312 ; AVX256-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
    313 ; AVX256-NEXT:    vpsraw $4, %ymm0, %ymm3
    314 ; AVX256-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
    315 ; AVX256-NEXT:    vpsraw $2, %ymm0, %ymm3
    316 ; AVX256-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
    317 ; AVX256-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
    318 ; AVX256-NEXT:    vpsraw $1, %ymm0, %ymm3
    319 ; AVX256-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
    320 ; AVX256-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
    321 ; AVX256-NEXT:    vpsrlw $8, %ymm0, %ymm0
    322 ; AVX256-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
    323 ; AVX256-NEXT:    retq
    324 ;
    325 ; AVX512BW-LABEL: var_ashr_v32i8:
    326 ; AVX512BW:       # %bb.0:
    327 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
    328 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
    329 ; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
    330 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
    331 ; AVX512BW-NEXT:    retq
    332 ;
    333 ; AVX512VL-LABEL: var_ashr_v32i8:
    334 ; AVX512VL:       # %bb.0:
    335 ; AVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1
    336 ; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
    337 ; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
    338 ; AVX512VL-NEXT:    vpsraw $4, %ymm3, %ymm4
    339 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
    340 ; AVX512VL-NEXT:    vpsraw $2, %ymm3, %ymm4
    341 ; AVX512VL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
    342 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
    343 ; AVX512VL-NEXT:    vpsraw $1, %ymm3, %ymm4
    344 ; AVX512VL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
    345 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
    346 ; AVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2
    347 ; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
    348 ; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
    349 ; AVX512VL-NEXT:    vpsraw $4, %ymm0, %ymm3
    350 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
    351 ; AVX512VL-NEXT:    vpsraw $2, %ymm0, %ymm3
    352 ; AVX512VL-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
    353 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
    354 ; AVX512VL-NEXT:    vpsraw $1, %ymm0, %ymm3
    355 ; AVX512VL-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
    356 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
    357 ; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
    358 ; AVX512VL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
    359 ; AVX512VL-NEXT:    retq
    360   %shift = ashr <32 x i8> %a, %b
    361   ret <32 x i8> %shift
    362 }
    363 
    364 define <16 x i16> @var_ashr_v16i16(<16 x i16> %a, <16 x i16> %b) {
    365 ; AVX256BW-LABEL: var_ashr_v16i16:
    366 ; AVX256BW:       # %bb.0:
    367 ; AVX256BW-NEXT:    vpsravw %ymm1, %ymm0, %ymm0
    368 ; AVX256BW-NEXT:    retq
    369 ;
    370 ; AVX512BWVL-LABEL: var_ashr_v16i16:
    371 ; AVX512BWVL:       # %bb.0:
    372 ; AVX512BWVL-NEXT:    vpsravw %ymm1, %ymm0, %ymm0
    373 ; AVX512BWVL-NEXT:    retq
    374 ;
    375 ; AVX256VL-LABEL: var_ashr_v16i16:
    376 ; AVX256VL:       # %bb.0:
    377 ; AVX256VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    378 ; AVX256VL-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
    379 ; AVX256VL-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
    380 ; AVX256VL-NEXT:    vpsravd %ymm3, %ymm4, %ymm3
    381 ; AVX256VL-NEXT:    vpsrld $16, %ymm3, %ymm3
    382 ; AVX256VL-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
    383 ; AVX256VL-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
    384 ; AVX256VL-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
    385 ; AVX256VL-NEXT:    vpsrld $16, %ymm0, %ymm0
    386 ; AVX256VL-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
    387 ; AVX256VL-NEXT:    retq
    388 ;
    389 ; AVX512VL-LABEL: var_ashr_v16i16:
    390 ; AVX512VL:       # %bb.0:
    391 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
    392 ; AVX512VL-NEXT:    vpmovsxwd %ymm0, %zmm0
    393 ; AVX512VL-NEXT:    vpsravd %zmm1, %zmm0, %zmm0
    394 ; AVX512VL-NEXT:    vpmovdw %zmm0, %ymm0
    395 ; AVX512VL-NEXT:    retq
    396 ;
    397 ; AVX512BWNOVL-LABEL: var_ashr_v16i16:
    398 ; AVX512BWNOVL:       # %bb.0:
    399 ; AVX512BWNOVL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
    400 ; AVX512BWNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    401 ; AVX512BWNOVL-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
    402 ; AVX512BWNOVL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
    403 ; AVX512BWNOVL-NEXT:    retq
    404   %shift = ashr <16 x i16> %a, %b
    405   ret <16 x i16> %shift
    406 }
    407 
    408 define <16 x i8> @var_ashr_v16i8(<16 x i8> %a, <16 x i8> %b) {
    409 ; AVX256BW-LABEL: var_ashr_v16i8:
    410 ; AVX256BW:       # %bb.0:
    411 ; AVX256BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
    412 ; AVX256BW-NEXT:    vpmovsxbw %xmm0, %ymm0
    413 ; AVX256BW-NEXT:    vpsravw %ymm1, %ymm0, %ymm0
    414 ; AVX256BW-NEXT:    vpmovwb %ymm0, %xmm0
    415 ; AVX256BW-NEXT:    vzeroupper
    416 ; AVX256BW-NEXT:    retq
    417 ;
    418 ; AVX512BWVL-LABEL: var_ashr_v16i8:
    419 ; AVX512BWVL:       # %bb.0:
    420 ; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
    421 ; AVX512BWVL-NEXT:    vpmovsxbw %xmm0, %ymm0
    422 ; AVX512BWVL-NEXT:    vpsravw %ymm1, %ymm0, %ymm0
    423 ; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0
    424 ; AVX512BWVL-NEXT:    vzeroupper
    425 ; AVX512BWVL-NEXT:    retq
    426 ;
    427 ; AVX256VL-LABEL: var_ashr_v16i8:
    428 ; AVX256VL:       # %bb.0:
    429 ; AVX256VL-NEXT:    vpsllw $5, %xmm1, %xmm1
    430 ; AVX256VL-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
    431 ; AVX256VL-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    432 ; AVX256VL-NEXT:    vpsraw $4, %xmm3, %xmm4
    433 ; AVX256VL-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
    434 ; AVX256VL-NEXT:    vpsraw $2, %xmm3, %xmm4
    435 ; AVX256VL-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
    436 ; AVX256VL-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
    437 ; AVX256VL-NEXT:    vpsraw $1, %xmm3, %xmm4
    438 ; AVX256VL-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
    439 ; AVX256VL-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
    440 ; AVX256VL-NEXT:    vpsrlw $8, %xmm2, %xmm2
    441 ; AVX256VL-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
    442 ; AVX256VL-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
    443 ; AVX256VL-NEXT:    vpsraw $4, %xmm0, %xmm3
    444 ; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
    445 ; AVX256VL-NEXT:    vpsraw $2, %xmm0, %xmm3
    446 ; AVX256VL-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
    447 ; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
    448 ; AVX256VL-NEXT:    vpsraw $1, %xmm0, %xmm3
    449 ; AVX256VL-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
    450 ; AVX256VL-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
    451 ; AVX256VL-NEXT:    vpsrlw $8, %xmm0, %xmm0
    452 ; AVX256VL-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
    453 ; AVX256VL-NEXT:    retq
    454 ;
    455 ; AVX512VL-LABEL: var_ashr_v16i8:
    456 ; AVX512VL:       # %bb.0:
    457 ; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
    458 ; AVX512VL-NEXT:    vpmovsxbd %xmm0, %zmm0
    459 ; AVX512VL-NEXT:    vpsravd %zmm1, %zmm0, %zmm0
    460 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
    461 ; AVX512VL-NEXT:    vzeroupper
    462 ; AVX512VL-NEXT:    retq
    463 ;
    464 ; AVX512BWNOVL-LABEL: var_ashr_v16i8:
    465 ; AVX512BWNOVL:       # %bb.0:
    466 ; AVX512BWNOVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
    467 ; AVX512BWNOVL-NEXT:    vpmovsxbw %xmm0, %ymm0
    468 ; AVX512BWNOVL-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
    469 ; AVX512BWNOVL-NEXT:    vpmovwb %zmm0, %ymm0
    470 ; AVX512BWNOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
    471 ; AVX512BWNOVL-NEXT:    vzeroupper
    472 ; AVX512BWNOVL-NEXT:    retq
    473   %shift = ashr <16 x i8> %a, %b
    474   ret <16 x i8> %shift
    475 }
    476