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