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-apple-darwin -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
      9 ;
     10 ; Just one 32-bit run to make sure we do reasonable things for i64 shifts.
     11 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=X32-SSE --check-prefix=X32-SSE2
     12 
     13 ;
     14 ; Variable Shifts
     15 ;
     16 
     17 define <2 x i64> @var_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
     18 ; SSE2-LABEL: var_shift_v2i64:
     19 ; SSE2:       # BB#0:
     20 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
     21 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
     22 ; SSE2-NEXT:    psrlq %xmm3, %xmm2
     23 ; SSE2-NEXT:    psrlq %xmm1, %xmm0
     24 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
     25 ; SSE2-NEXT:    movapd %xmm2, %xmm0
     26 ; SSE2-NEXT:    retq
     27 ;
     28 ; SSE41-LABEL: var_shift_v2i64:
     29 ; SSE41:       # BB#0:
     30 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
     31 ; SSE41-NEXT:    psrlq %xmm1, %xmm2
     32 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
     33 ; SSE41-NEXT:    psrlq %xmm1, %xmm0
     34 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]
     35 ; SSE41-NEXT:    retq
     36 ;
     37 ; AVX1-LABEL: var_shift_v2i64:
     38 ; AVX1:       # BB#0:
     39 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm2
     40 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
     41 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
     42 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]
     43 ; AVX1-NEXT:    retq
     44 ;
     45 ; AVX2-LABEL: var_shift_v2i64:
     46 ; AVX2:       # BB#0:
     47 ; AVX2-NEXT:    vpsrlvq %xmm1, %xmm0, %xmm0
     48 ; AVX2-NEXT:    retq
     49 ;
     50 ; XOPAVX1-LABEL: var_shift_v2i64:
     51 ; XOPAVX1:       # BB#0:
     52 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
     53 ; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm1
     54 ; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm0
     55 ; XOPAVX1-NEXT:    retq
     56 ;
     57 ; XOPAVX2-LABEL: var_shift_v2i64:
     58 ; XOPAVX2:       # BB#0:
     59 ; XOPAVX2-NEXT:    vpsrlvq %xmm1, %xmm0, %xmm0
     60 ; XOPAVX2-NEXT:    retq
     61 ;
     62 ; AVX512-LABEL: var_shift_v2i64:
     63 ; AVX512:       ## BB#0:
     64 ; AVX512-NEXT:    vpsrlvq %xmm1, %xmm0, %xmm0
     65 ; AVX512-NEXT:    retq
     66 ;
     67 ; X32-SSE-LABEL: var_shift_v2i64:
     68 ; X32-SSE:       # BB#0:
     69 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
     70 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
     71 ; X32-SSE-NEXT:    psrlq %xmm3, %xmm2
     72 ; X32-SSE-NEXT:    movq {{.*#+}} xmm1 = xmm1[0],zero
     73 ; X32-SSE-NEXT:    psrlq %xmm1, %xmm0
     74 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
     75 ; X32-SSE-NEXT:    movapd %xmm2, %xmm0
     76 ; X32-SSE-NEXT:    retl
     77   %shift = lshr <2 x i64> %a, %b
     78   ret <2 x i64> %shift
     79 }
     80 
     81 define <4 x i32> @var_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
     82 ; SSE2-LABEL: var_shift_v4i32:
     83 ; SSE2:       # BB#0:
     84 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
     85 ; SSE2-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
     86 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
     87 ; SSE2-NEXT:    psrld %xmm2, %xmm3
     88 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
     89 ; SSE2-NEXT:    psrlq $32, %xmm2
     90 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
     91 ; SSE2-NEXT:    psrld %xmm2, %xmm4
     92 ; SSE2-NEXT:    movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1]
     93 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3]
     94 ; SSE2-NEXT:    pxor %xmm3, %xmm3
     95 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
     96 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
     97 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
     98 ; SSE2-NEXT:    psrld %xmm4, %xmm5
     99 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
    100 ; SSE2-NEXT:    psrld %xmm1, %xmm0
    101 ; SSE2-NEXT:    movsd {{.*#+}} xmm5 = xmm0[0],xmm5[1]
    102 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
    103 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
    104 ; SSE2-NEXT:    retq
    105 ;
    106 ; SSE41-LABEL: var_shift_v4i32:
    107 ; SSE41:       # BB#0:
    108 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
    109 ; SSE41-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
    110 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
    111 ; SSE41-NEXT:    psrld %xmm2, %xmm3
    112 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
    113 ; SSE41-NEXT:    psrlq $32, %xmm2
    114 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
    115 ; SSE41-NEXT:    psrld %xmm2, %xmm4
    116 ; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm3[4,5,6,7]
    117 ; SSE41-NEXT:    pxor %xmm2, %xmm2
    118 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero
    119 ; SSE41-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
    120 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    121 ; SSE41-NEXT:    psrld %xmm1, %xmm2
    122 ; SSE41-NEXT:    psrld %xmm3, %xmm0
    123 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
    124 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3],xmm0[4,5],xmm4[6,7]
    125 ; SSE41-NEXT:    retq
    126 ;
    127 ; AVX1-LABEL: var_shift_v4i32:
    128 ; AVX1:       # BB#0:
    129 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm2 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
    130 ; AVX1-NEXT:    vpsrld %xmm2, %xmm0, %xmm2
    131 ; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm3
    132 ; AVX1-NEXT:    vpsrld %xmm3, %xmm0, %xmm3
    133 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
    134 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
    135 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
    136 ; AVX1-NEXT:    vpsrld %xmm3, %xmm0, %xmm3
    137 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
    138 ; AVX1-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
    139 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
    140 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
    141 ; AVX1-NEXT:    retq
    142 ;
    143 ; AVX2-LABEL: var_shift_v4i32:
    144 ; AVX2:       # BB#0:
    145 ; AVX2-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0
    146 ; AVX2-NEXT:    retq
    147 ;
    148 ; XOPAVX1-LABEL: var_shift_v4i32:
    149 ; XOPAVX1:       # BB#0:
    150 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    151 ; XOPAVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm1
    152 ; XOPAVX1-NEXT:    vpshld %xmm1, %xmm0, %xmm0
    153 ; XOPAVX1-NEXT:    retq
    154 ;
    155 ; XOPAVX2-LABEL: var_shift_v4i32:
    156 ; XOPAVX2:       # BB#0:
    157 ; XOPAVX2-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0
    158 ; XOPAVX2-NEXT:    retq
    159 ;
    160 ; AVX512-LABEL: var_shift_v4i32:
    161 ; AVX512:       ## BB#0:
    162 ; AVX512-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0
    163 ; AVX512-NEXT:    retq
    164 ;
    165 ; X32-SSE-LABEL: var_shift_v4i32:
    166 ; X32-SSE:       # BB#0:
    167 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
    168 ; X32-SSE-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
    169 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm3
    170 ; X32-SSE-NEXT:    psrld %xmm2, %xmm3
    171 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
    172 ; X32-SSE-NEXT:    psrlq $32, %xmm2
    173 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm4
    174 ; X32-SSE-NEXT:    psrld %xmm2, %xmm4
    175 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1]
    176 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3]
    177 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
    178 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm4
    179 ; X32-SSE-NEXT:    punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
    180 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm5
    181 ; X32-SSE-NEXT:    psrld %xmm4, %xmm5
    182 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
    183 ; X32-SSE-NEXT:    psrld %xmm1, %xmm0
    184 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm5 = xmm0[0],xmm5[1]
    185 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
    186 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
    187 ; X32-SSE-NEXT:    retl
    188   %shift = lshr <4 x i32> %a, %b
    189   ret <4 x i32> %shift
    190 }
    191 
    192 define <8 x i16> @var_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
    193 ; SSE2-LABEL: var_shift_v8i16:
    194 ; SSE2:       # BB#0:
    195 ; SSE2-NEXT:    psllw $12, %xmm1
    196 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    197 ; SSE2-NEXT:    psraw $15, %xmm2
    198 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
    199 ; SSE2-NEXT:    pandn %xmm0, %xmm3
    200 ; SSE2-NEXT:    psrlw $8, %xmm0
    201 ; SSE2-NEXT:    pand %xmm2, %xmm0
    202 ; SSE2-NEXT:    por %xmm3, %xmm0
    203 ; SSE2-NEXT:    paddw %xmm1, %xmm1
    204 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    205 ; SSE2-NEXT:    psraw $15, %xmm2
    206 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
    207 ; SSE2-NEXT:    pandn %xmm0, %xmm3
    208 ; SSE2-NEXT:    psrlw $4, %xmm0
    209 ; SSE2-NEXT:    pand %xmm2, %xmm0
    210 ; SSE2-NEXT:    por %xmm3, %xmm0
    211 ; SSE2-NEXT:    paddw %xmm1, %xmm1
    212 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    213 ; SSE2-NEXT:    psraw $15, %xmm2
    214 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
    215 ; SSE2-NEXT:    pandn %xmm0, %xmm3
    216 ; SSE2-NEXT:    psrlw $2, %xmm0
    217 ; SSE2-NEXT:    pand %xmm2, %xmm0
    218 ; SSE2-NEXT:    por %xmm3, %xmm0
    219 ; SSE2-NEXT:    paddw %xmm1, %xmm1
    220 ; SSE2-NEXT:    psraw $15, %xmm1
    221 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    222 ; SSE2-NEXT:    pandn %xmm0, %xmm2
    223 ; SSE2-NEXT:    psrlw $1, %xmm0
    224 ; SSE2-NEXT:    pand %xmm1, %xmm0
    225 ; SSE2-NEXT:    por %xmm2, %xmm0
    226 ; SSE2-NEXT:    retq
    227 ;
    228 ; SSE41-LABEL: var_shift_v8i16:
    229 ; SSE41:       # BB#0:
    230 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    231 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    232 ; SSE41-NEXT:    psllw $12, %xmm0
    233 ; SSE41-NEXT:    psllw $4, %xmm1
    234 ; SSE41-NEXT:    por %xmm0, %xmm1
    235 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
    236 ; SSE41-NEXT:    paddw %xmm3, %xmm3
    237 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
    238 ; SSE41-NEXT:    psrlw $8, %xmm4
    239 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    240 ; SSE41-NEXT:    pblendvb %xmm4, %xmm2
    241 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
    242 ; SSE41-NEXT:    psrlw $4, %xmm1
    243 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    244 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
    245 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
    246 ; SSE41-NEXT:    psrlw $2, %xmm1
    247 ; SSE41-NEXT:    paddw %xmm3, %xmm3
    248 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    249 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
    250 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
    251 ; SSE41-NEXT:    psrlw $1, %xmm1
    252 ; SSE41-NEXT:    paddw %xmm3, %xmm3
    253 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    254 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
    255 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
    256 ; SSE41-NEXT:    retq
    257 ;
    258 ; AVX1-LABEL: var_shift_v8i16:
    259 ; AVX1:       # BB#0:
    260 ; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm2
    261 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
    262 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
    263 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm2
    264 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm3
    265 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
    266 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm1
    267 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
    268 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm1
    269 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
    270 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
    271 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm1
    272 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
    273 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
    274 ; AVX1-NEXT:    retq
    275 ;
    276 ; AVX2-LABEL: var_shift_v8i16:
    277 ; AVX2:       # BB#0:
    278 ; 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
    279 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
    280 ; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
    281 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero,ymm0[16,17,20,21,24,25,28,29],zero,zero,zero,zero,zero,zero,zero,zero
    282 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
    283 ; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
    284 ; AVX2-NEXT:    vzeroupper
    285 ; AVX2-NEXT:    retq
    286 ;
    287 ; XOP-LABEL: var_shift_v8i16:
    288 ; XOP:       # BB#0:
    289 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    290 ; XOP-NEXT:    vpsubw %xmm1, %xmm2, %xmm1
    291 ; XOP-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
    292 ; XOP-NEXT:    retq
    293 ;
    294 ; AVX512-LABEL: var_shift_v8i16:
    295 ; AVX512:       ## BB#0:
    296 ; AVX512-NEXT:    ## kill: %XMM1<def> %XMM1<kill> %ZMM1<def>
    297 ; AVX512-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
    298 ; AVX512-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
    299 ; AVX512-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
    300 ; AVX512-NEXT:    retq
    301 ;
    302 ; X32-SSE-LABEL: var_shift_v8i16:
    303 ; X32-SSE:       # BB#0:
    304 ; X32-SSE-NEXT:    psllw $12, %xmm1
    305 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
    306 ; X32-SSE-NEXT:    psraw $15, %xmm2
    307 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
    308 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
    309 ; X32-SSE-NEXT:    psrlw $8, %xmm0
    310 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
    311 ; X32-SSE-NEXT:    por %xmm3, %xmm0
    312 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
    313 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
    314 ; X32-SSE-NEXT:    psraw $15, %xmm2
    315 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
    316 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
    317 ; X32-SSE-NEXT:    psrlw $4, %xmm0
    318 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
    319 ; X32-SSE-NEXT:    por %xmm3, %xmm0
    320 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
    321 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
    322 ; X32-SSE-NEXT:    psraw $15, %xmm2
    323 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
    324 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
    325 ; X32-SSE-NEXT:    psrlw $2, %xmm0
    326 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
    327 ; X32-SSE-NEXT:    por %xmm3, %xmm0
    328 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
    329 ; X32-SSE-NEXT:    psraw $15, %xmm1
    330 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
    331 ; X32-SSE-NEXT:    pandn %xmm0, %xmm2
    332 ; X32-SSE-NEXT:    psrlw $1, %xmm0
    333 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
    334 ; X32-SSE-NEXT:    por %xmm2, %xmm0
    335 ; X32-SSE-NEXT:    retl
    336   %shift = lshr <8 x i16> %a, %b
    337   ret <8 x i16> %shift
    338 }
    339 
    340 define <16 x i8> @var_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
    341 ; SSE2-LABEL: var_shift_v16i8:
    342 ; SSE2:       # BB#0:
    343 ; SSE2-NEXT:    psllw $5, %xmm1
    344 ; SSE2-NEXT:    pxor %xmm2, %xmm2
    345 ; SSE2-NEXT:    pxor %xmm3, %xmm3
    346 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
    347 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
    348 ; SSE2-NEXT:    pandn %xmm0, %xmm4
    349 ; SSE2-NEXT:    psrlw $4, %xmm0
    350 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
    351 ; SSE2-NEXT:    pand %xmm3, %xmm0
    352 ; SSE2-NEXT:    por %xmm4, %xmm0
    353 ; SSE2-NEXT:    paddb %xmm1, %xmm1
    354 ; SSE2-NEXT:    pxor %xmm3, %xmm3
    355 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
    356 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
    357 ; SSE2-NEXT:    pandn %xmm0, %xmm4
    358 ; SSE2-NEXT:    psrlw $2, %xmm0
    359 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
    360 ; SSE2-NEXT:    pand %xmm3, %xmm0
    361 ; SSE2-NEXT:    por %xmm4, %xmm0
    362 ; SSE2-NEXT:    paddb %xmm1, %xmm1
    363 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
    364 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
    365 ; SSE2-NEXT:    pandn %xmm0, %xmm1
    366 ; SSE2-NEXT:    psrlw $1, %xmm0
    367 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
    368 ; SSE2-NEXT:    pand %xmm2, %xmm0
    369 ; SSE2-NEXT:    por %xmm1, %xmm0
    370 ; SSE2-NEXT:    retq
    371 ;
    372 ; SSE41-LABEL: var_shift_v16i8:
    373 ; SSE41:       # BB#0:
    374 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    375 ; SSE41-NEXT:    psllw $5, %xmm1
    376 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
    377 ; SSE41-NEXT:    psrlw $4, %xmm3
    378 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
    379 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    380 ; SSE41-NEXT:    pblendvb %xmm3, %xmm2
    381 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
    382 ; SSE41-NEXT:    psrlw $2, %xmm3
    383 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
    384 ; SSE41-NEXT:    paddb %xmm1, %xmm1
    385 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    386 ; SSE41-NEXT:    pblendvb %xmm3, %xmm2
    387 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
    388 ; SSE41-NEXT:    psrlw $1, %xmm3
    389 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
    390 ; SSE41-NEXT:    paddb %xmm1, %xmm1
    391 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    392 ; SSE41-NEXT:    pblendvb %xmm3, %xmm2
    393 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
    394 ; SSE41-NEXT:    retq
    395 ;
    396 ; AVX-LABEL: var_shift_v16i8:
    397 ; AVX:       # BB#0:
    398 ; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
    399 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm2
    400 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    401 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    402 ; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm2
    403 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    404 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    405 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    406 ; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm2
    407 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    408 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    409 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    410 ; AVX-NEXT:    retq
    411 ;
    412 ; XOP-LABEL: var_shift_v16i8:
    413 ; XOP:       # BB#0:
    414 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    415 ; XOP-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
    416 ; XOP-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
    417 ; XOP-NEXT:    retq
    418 ;
    419 ; AVX512-LABEL: var_shift_v16i8:
    420 ; AVX512:       ## BB#0:
    421 ; AVX512-NEXT:    vpsllw $5, %xmm1, %xmm1
    422 ; AVX512-NEXT:    vpsrlw $4, %xmm0, %xmm2
    423 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    424 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    425 ; AVX512-NEXT:    vpsrlw $2, %xmm0, %xmm2
    426 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    427 ; AVX512-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    428 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    429 ; AVX512-NEXT:    vpsrlw $1, %xmm0, %xmm2
    430 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    431 ; AVX512-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    432 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    433 ; AVX512-NEXT:    retq
    434 ;
    435 ; X32-SSE-LABEL: var_shift_v16i8:
    436 ; X32-SSE:       # BB#0:
    437 ; X32-SSE-NEXT:    psllw $5, %xmm1
    438 ; X32-SSE-NEXT:    pxor %xmm2, %xmm2
    439 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
    440 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm3
    441 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
    442 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
    443 ; X32-SSE-NEXT:    psrlw $4, %xmm0
    444 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
    445 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
    446 ; X32-SSE-NEXT:    por %xmm4, %xmm0
    447 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
    448 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
    449 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm3
    450 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
    451 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
    452 ; X32-SSE-NEXT:    psrlw $2, %xmm0
    453 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
    454 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
    455 ; X32-SSE-NEXT:    por %xmm4, %xmm0
    456 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
    457 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm2
    458 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm1
    459 ; X32-SSE-NEXT:    pandn %xmm0, %xmm1
    460 ; X32-SSE-NEXT:    psrlw $1, %xmm0
    461 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
    462 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
    463 ; X32-SSE-NEXT:    por %xmm1, %xmm0
    464 ; X32-SSE-NEXT:    retl
    465   %shift = lshr <16 x i8> %a, %b
    466   ret <16 x i8> %shift
    467 }
    468 
    469 ;
    470 ; Uniform Variable Shifts
    471 ;
    472 
    473 define <2 x i64> @splatvar_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
    474 ; SSE-LABEL: splatvar_shift_v2i64:
    475 ; SSE:       # BB#0:
    476 ; SSE-NEXT:    psrlq %xmm1, %xmm0
    477 ; SSE-NEXT:    retq
    478 ;
    479 ; AVX-LABEL: splatvar_shift_v2i64:
    480 ; AVX:       # BB#0:
    481 ; AVX-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
    482 ; AVX-NEXT:    retq
    483 ;
    484 ; XOP-LABEL: splatvar_shift_v2i64:
    485 ; XOP:       # BB#0:
    486 ; XOP-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
    487 ; XOP-NEXT:    retq
    488 ;
    489 ; AVX512-LABEL: splatvar_shift_v2i64:
    490 ; AVX512:       ## BB#0:
    491 ; AVX512-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
    492 ; AVX512-NEXT:    retq
    493 ;
    494 ; X32-SSE-LABEL: splatvar_shift_v2i64:
    495 ; X32-SSE:       # BB#0:
    496 ; X32-SSE-NEXT:    movq {{.*#+}} xmm1 = xmm1[0],zero
    497 ; X32-SSE-NEXT:    psrlq %xmm1, %xmm0
    498 ; X32-SSE-NEXT:    retl
    499   %splat = shufflevector <2 x i64> %b, <2 x i64> undef, <2 x i32> zeroinitializer
    500   %shift = lshr <2 x i64> %a, %splat
    501   ret <2 x i64> %shift
    502 }
    503 
    504 define <4 x i32> @splatvar_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
    505 ; SSE2-LABEL: splatvar_shift_v4i32:
    506 ; SSE2:       # BB#0:
    507 ; SSE2-NEXT:    xorps %xmm2, %xmm2
    508 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
    509 ; SSE2-NEXT:    psrld %xmm2, %xmm0
    510 ; SSE2-NEXT:    retq
    511 ;
    512 ; SSE41-LABEL: splatvar_shift_v4i32:
    513 ; SSE41:       # BB#0:
    514 ; SSE41-NEXT:    pxor %xmm2, %xmm2
    515 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3,4,5,6,7]
    516 ; SSE41-NEXT:    psrld %xmm2, %xmm0
    517 ; SSE41-NEXT:    retq
    518 ;
    519 ; AVX-LABEL: splatvar_shift_v4i32:
    520 ; AVX:       # BB#0:
    521 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    522 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
    523 ; AVX-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
    524 ; AVX-NEXT:    retq
    525 ;
    526 ; XOP-LABEL: splatvar_shift_v4i32:
    527 ; XOP:       # BB#0:
    528 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    529 ; XOP-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
    530 ; XOP-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
    531 ; XOP-NEXT:    retq
    532 ;
    533 ; AVX512-LABEL: splatvar_shift_v4i32:
    534 ; AVX512:       ## BB#0:
    535 ; AVX512-NEXT:    vxorps %xmm2, %xmm2, %xmm2
    536 ; AVX512-NEXT:    vmovss {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3]
    537 ; AVX512-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
    538 ; AVX512-NEXT:    retq
    539 ;
    540 ; X32-SSE-LABEL: splatvar_shift_v4i32:
    541 ; X32-SSE:       # BB#0:
    542 ; X32-SSE-NEXT:    xorps %xmm2, %xmm2
    543 ; X32-SSE-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
    544 ; X32-SSE-NEXT:    psrld %xmm2, %xmm0
    545 ; X32-SSE-NEXT:    retl
    546   %splat = shufflevector <4 x i32> %b, <4 x i32> undef, <4 x i32> zeroinitializer
    547   %shift = lshr <4 x i32> %a, %splat
    548   ret <4 x i32> %shift
    549 }
    550 
    551 define <8 x i16> @splatvar_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
    552 ; SSE2-LABEL: splatvar_shift_v8i16:
    553 ; SSE2:       # BB#0:
    554 ; SSE2-NEXT:    movd %xmm1, %eax
    555 ; SSE2-NEXT:    movzwl %ax, %eax
    556 ; SSE2-NEXT:    movd %eax, %xmm1
    557 ; SSE2-NEXT:    psrlw %xmm1, %xmm0
    558 ; SSE2-NEXT:    retq
    559 ;
    560 ; SSE41-LABEL: splatvar_shift_v8i16:
    561 ; SSE41:       # BB#0:
    562 ; SSE41-NEXT:    pxor %xmm2, %xmm2
    563 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3,4,5,6,7]
    564 ; SSE41-NEXT:    psrlw %xmm2, %xmm0
    565 ; SSE41-NEXT:    retq
    566 ;
    567 ; AVX-LABEL: splatvar_shift_v8i16:
    568 ; AVX:       # BB#0:
    569 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    570 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
    571 ; AVX-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
    572 ; AVX-NEXT:    retq
    573 ;
    574 ; XOP-LABEL: splatvar_shift_v8i16:
    575 ; XOP:       # BB#0:
    576 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    577 ; XOP-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
    578 ; XOP-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
    579 ; XOP-NEXT:    retq
    580 ;
    581 ; AVX512-LABEL: splatvar_shift_v8i16:
    582 ; AVX512:       ## BB#0:
    583 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    584 ; AVX512-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
    585 ; AVX512-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
    586 ; AVX512-NEXT:    retq
    587 ;
    588 ; X32-SSE-LABEL: splatvar_shift_v8i16:
    589 ; X32-SSE:       # BB#0:
    590 ; X32-SSE-NEXT:    movd %xmm1, %eax
    591 ; X32-SSE-NEXT:    movzwl %ax, %eax
    592 ; X32-SSE-NEXT:    movd %eax, %xmm1
    593 ; X32-SSE-NEXT:    psrlw %xmm1, %xmm0
    594 ; X32-SSE-NEXT:    retl
    595   %splat = shufflevector <8 x i16> %b, <8 x i16> undef, <8 x i32> zeroinitializer
    596   %shift = lshr <8 x i16> %a, %splat
    597   ret <8 x i16> %shift
    598 }
    599 
    600 define <16 x i8> @splatvar_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
    601 ; SSE2-LABEL: splatvar_shift_v16i8:
    602 ; SSE2:       # BB#0:
    603 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
    604 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
    605 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,1,1]
    606 ; SSE2-NEXT:    psllw $5, %xmm2
    607 ; SSE2-NEXT:    pxor %xmm1, %xmm1
    608 ; SSE2-NEXT:    pxor %xmm3, %xmm3
    609 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
    610 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
    611 ; SSE2-NEXT:    pandn %xmm0, %xmm4
    612 ; SSE2-NEXT:    psrlw $4, %xmm0
    613 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
    614 ; SSE2-NEXT:    pand %xmm3, %xmm0
    615 ; SSE2-NEXT:    por %xmm4, %xmm0
    616 ; SSE2-NEXT:    paddb %xmm2, %xmm2
    617 ; SSE2-NEXT:    pxor %xmm3, %xmm3
    618 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
    619 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
    620 ; SSE2-NEXT:    pandn %xmm0, %xmm4
    621 ; SSE2-NEXT:    psrlw $2, %xmm0
    622 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
    623 ; SSE2-NEXT:    pand %xmm3, %xmm0
    624 ; SSE2-NEXT:    por %xmm4, %xmm0
    625 ; SSE2-NEXT:    paddb %xmm2, %xmm2
    626 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
    627 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    628 ; SSE2-NEXT:    pandn %xmm0, %xmm2
    629 ; SSE2-NEXT:    psrlw $1, %xmm0
    630 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
    631 ; SSE2-NEXT:    pand %xmm1, %xmm0
    632 ; SSE2-NEXT:    por %xmm2, %xmm0
    633 ; SSE2-NEXT:    retq
    634 ;
    635 ; SSE41-LABEL: splatvar_shift_v16i8:
    636 ; SSE41:       # BB#0:
    637 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    638 ; SSE41-NEXT:    pxor %xmm0, %xmm0
    639 ; SSE41-NEXT:    pshufb %xmm0, %xmm1
    640 ; SSE41-NEXT:    psllw $5, %xmm1
    641 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
    642 ; SSE41-NEXT:    paddb %xmm3, %xmm3
    643 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
    644 ; SSE41-NEXT:    psrlw $4, %xmm4
    645 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm4
    646 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    647 ; SSE41-NEXT:    pblendvb %xmm4, %xmm2
    648 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
    649 ; SSE41-NEXT:    psrlw $2, %xmm1
    650 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
    651 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    652 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
    653 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
    654 ; SSE41-NEXT:    psrlw $1, %xmm1
    655 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
    656 ; SSE41-NEXT:    paddb %xmm3, %xmm3
    657 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    658 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
    659 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
    660 ; SSE41-NEXT:    retq
    661 ;
    662 ; AVX1-LABEL: splatvar_shift_v16i8:
    663 ; AVX1:       # BB#0:
    664 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    665 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
    666 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
    667 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm2
    668 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm3
    669 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
    670 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
    671 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm1
    672 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
    673 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
    674 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm1
    675 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
    676 ; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm2
    677 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
    678 ; AVX1-NEXT:    retq
    679 ;
    680 ; AVX2-LABEL: splatvar_shift_v16i8:
    681 ; AVX2:       # BB#0:
    682 ; AVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
    683 ; AVX2-NEXT:    vpsllw $5, %xmm1, %xmm1
    684 ; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm2
    685 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    686 ; AVX2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    687 ; AVX2-NEXT:    vpsrlw $2, %xmm0, %xmm2
    688 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    689 ; AVX2-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    690 ; AVX2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    691 ; AVX2-NEXT:    vpsrlw $1, %xmm0, %xmm2
    692 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    693 ; AVX2-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    694 ; AVX2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    695 ; AVX2-NEXT:    retq
    696 ;
    697 ; XOPAVX1-LABEL: splatvar_shift_v16i8:
    698 ; XOPAVX1:       # BB#0:
    699 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    700 ; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
    701 ; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
    702 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
    703 ; XOPAVX1-NEXT:    retq
    704 ;
    705 ; XOPAVX2-LABEL: splatvar_shift_v16i8:
    706 ; XOPAVX2:       # BB#0:
    707 ; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
    708 ; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    709 ; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
    710 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
    711 ; XOPAVX2-NEXT:    retq
    712 ;
    713 ; AVX512-LABEL: splatvar_shift_v16i8:
    714 ; AVX512:       ## BB#0:
    715 ; AVX512-NEXT:    vpbroadcastb %xmm1, %xmm1
    716 ; AVX512-NEXT:    vpsllw $5, %xmm1, %xmm1
    717 ; AVX512-NEXT:    vpsrlw $4, %xmm0, %xmm2
    718 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    719 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    720 ; AVX512-NEXT:    vpsrlw $2, %xmm0, %xmm2
    721 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    722 ; AVX512-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    723 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    724 ; AVX512-NEXT:    vpsrlw $1, %xmm0, %xmm2
    725 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    726 ; AVX512-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    727 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
    728 ; AVX512-NEXT:    retq
    729 ;
    730 ; X32-SSE-LABEL: splatvar_shift_v16i8:
    731 ; X32-SSE:       # BB#0:
    732 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
    733 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
    734 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,1,1]
    735 ; X32-SSE-NEXT:    psllw $5, %xmm2
    736 ; X32-SSE-NEXT:    pxor %xmm1, %xmm1
    737 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
    738 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm3
    739 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
    740 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
    741 ; X32-SSE-NEXT:    psrlw $4, %xmm0
    742 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
    743 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
    744 ; X32-SSE-NEXT:    por %xmm4, %xmm0
    745 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
    746 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
    747 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm3
    748 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
    749 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
    750 ; X32-SSE-NEXT:    psrlw $2, %xmm0
    751 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
    752 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
    753 ; X32-SSE-NEXT:    por %xmm4, %xmm0
    754 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
    755 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm1
    756 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
    757 ; X32-SSE-NEXT:    pandn %xmm0, %xmm2
    758 ; X32-SSE-NEXT:    psrlw $1, %xmm0
    759 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
    760 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
    761 ; X32-SSE-NEXT:    por %xmm2, %xmm0
    762 ; X32-SSE-NEXT:    retl
    763   %splat = shufflevector <16 x i8> %b, <16 x i8> undef, <16 x i32> zeroinitializer
    764   %shift = lshr <16 x i8> %a, %splat
    765   ret <16 x i8> %shift
    766 }
    767 
    768 ;
    769 ; Constant Shifts
    770 ;
    771 
    772 define <2 x i64> @constant_shift_v2i64(<2 x i64> %a) nounwind {
    773 ; SSE2-LABEL: constant_shift_v2i64:
    774 ; SSE2:       # BB#0:
    775 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    776 ; SSE2-NEXT:    psrlq $7, %xmm1
    777 ; SSE2-NEXT:    psrlq $1, %xmm0
    778 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
    779 ; SSE2-NEXT:    movapd %xmm1, %xmm0
    780 ; SSE2-NEXT:    retq
    781 ;
    782 ; SSE41-LABEL: constant_shift_v2i64:
    783 ; SSE41:       # BB#0:
    784 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    785 ; SSE41-NEXT:    psrlq $7, %xmm1
    786 ; SSE41-NEXT:    psrlq $1, %xmm0
    787 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
    788 ; SSE41-NEXT:    retq
    789 ;
    790 ; AVX1-LABEL: constant_shift_v2i64:
    791 ; AVX1:       # BB#0:
    792 ; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm1
    793 ; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
    794 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
    795 ; AVX1-NEXT:    retq
    796 ;
    797 ; AVX2-LABEL: constant_shift_v2i64:
    798 ; AVX2:       # BB#0:
    799 ; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
    800 ; AVX2-NEXT:    retq
    801 ;
    802 ; XOPAVX1-LABEL: constant_shift_v2i64:
    803 ; XOPAVX1:       # BB#0:
    804 ; XOPAVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
    805 ; XOPAVX1-NEXT:    vpsubq {{.*}}(%rip), %xmm1, %xmm1
    806 ; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm0
    807 ; XOPAVX1-NEXT:    retq
    808 ;
    809 ; XOPAVX2-LABEL: constant_shift_v2i64:
    810 ; XOPAVX2:       # BB#0:
    811 ; XOPAVX2-NEXT:    vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
    812 ; XOPAVX2-NEXT:    retq
    813 ;
    814 ; AVX512-LABEL: constant_shift_v2i64:
    815 ; AVX512:       ## BB#0:
    816 ; AVX512-NEXT:    vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
    817 ; AVX512-NEXT:    retq
    818 ;
    819 ; X32-SSE-LABEL: constant_shift_v2i64:
    820 ; X32-SSE:       # BB#0:
    821 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
    822 ; X32-SSE-NEXT:    psrlq $7, %xmm1
    823 ; X32-SSE-NEXT:    psrlq $1, %xmm0
    824 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
    825 ; X32-SSE-NEXT:    movapd %xmm1, %xmm0
    826 ; X32-SSE-NEXT:    retl
    827   %shift = lshr <2 x i64> %a, <i64 1, i64 7>
    828   ret <2 x i64> %shift
    829 }
    830 
    831 define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind {
    832 ; SSE2-LABEL: constant_shift_v4i32:
    833 ; SSE2:       # BB#0:
    834 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    835 ; SSE2-NEXT:    psrld $7, %xmm1
    836 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    837 ; SSE2-NEXT:    psrld $5, %xmm2
    838 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
    839 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
    840 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    841 ; SSE2-NEXT:    psrld $6, %xmm2
    842 ; SSE2-NEXT:    psrld $4, %xmm0
    843 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
    844 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
    845 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
    846 ; SSE2-NEXT:    retq
    847 ;
    848 ; SSE41-LABEL: constant_shift_v4i32:
    849 ; SSE41:       # BB#0:
    850 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    851 ; SSE41-NEXT:    psrld $7, %xmm1
    852 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    853 ; SSE41-NEXT:    psrld $5, %xmm2
    854 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]
    855 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    856 ; SSE41-NEXT:    psrld $6, %xmm1
    857 ; SSE41-NEXT:    psrld $4, %xmm0
    858 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
    859 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
    860 ; SSE41-NEXT:    retq
    861 ;
    862 ; AVX1-LABEL: constant_shift_v4i32:
    863 ; AVX1:       # BB#0:
    864 ; AVX1-NEXT:    vpsrld $7, %xmm0, %xmm1
    865 ; AVX1-NEXT:    vpsrld $5, %xmm0, %xmm2
    866 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
    867 ; AVX1-NEXT:    vpsrld $6, %xmm0, %xmm2
    868 ; AVX1-NEXT:    vpsrld $4, %xmm0, %xmm0
    869 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
    870 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
    871 ; AVX1-NEXT:    retq
    872 ;
    873 ; AVX2-LABEL: constant_shift_v4i32:
    874 ; AVX2:       # BB#0:
    875 ; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %xmm0, %xmm0
    876 ; AVX2-NEXT:    retq
    877 ;
    878 ; XOPAVX1-LABEL: constant_shift_v4i32:
    879 ; XOPAVX1:       # BB#0:
    880 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
    881 ; XOPAVX1-NEXT:    retq
    882 ;
    883 ; XOPAVX2-LABEL: constant_shift_v4i32:
    884 ; XOPAVX2:       # BB#0:
    885 ; XOPAVX2-NEXT:    vpsrlvd {{.*}}(%rip), %xmm0, %xmm0
    886 ; XOPAVX2-NEXT:    retq
    887 ;
    888 ; AVX512-LABEL: constant_shift_v4i32:
    889 ; AVX512:       ## BB#0:
    890 ; AVX512-NEXT:    vpsrlvd {{.*}}(%rip), %xmm0, %xmm0
    891 ; AVX512-NEXT:    retq
    892 ;
    893 ; X32-SSE-LABEL: constant_shift_v4i32:
    894 ; X32-SSE:       # BB#0:
    895 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
    896 ; X32-SSE-NEXT:    psrld $7, %xmm1
    897 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
    898 ; X32-SSE-NEXT:    psrld $5, %xmm2
    899 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
    900 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
    901 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
    902 ; X32-SSE-NEXT:    psrld $6, %xmm2
    903 ; X32-SSE-NEXT:    psrld $4, %xmm0
    904 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
    905 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
    906 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
    907 ; X32-SSE-NEXT:    retl
    908   %shift = lshr <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>
    909   ret <4 x i32> %shift
    910 }
    911 
    912 define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind {
    913 ; SSE2-LABEL: constant_shift_v8i16:
    914 ; SSE2:       # BB#0:
    915 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    916 ; SSE2-NEXT:    psrlw $4, %xmm1
    917 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
    918 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
    919 ; SSE2-NEXT:    psrlw $2, %xmm1
    920 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
    921 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
    922 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]
    923 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
    924 ; SSE2-NEXT:    pand %xmm0, %xmm1
    925 ; SSE2-NEXT:    psrlw $1, %xmm2
    926 ; SSE2-NEXT:    pandn %xmm2, %xmm0
    927 ; SSE2-NEXT:    por %xmm1, %xmm0
    928 ; SSE2-NEXT:    retq
    929 ;
    930 ; SSE41-LABEL: constant_shift_v8i16:
    931 ; SSE41:       # BB#0:
    932 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    933 ; SSE41-NEXT:    psrlw $4, %xmm1
    934 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1,2,3],xmm1[4,5,6,7]
    935 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
    936 ; SSE41-NEXT:    psrlw $2, %xmm2
    937 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
    938 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
    939 ; SSE41-NEXT:    psrlw $1, %xmm0
    940 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3],xmm2[4],xmm0[5],xmm2[6],xmm0[7]
    941 ; SSE41-NEXT:    retq
    942 ;
    943 ; AVX1-LABEL: constant_shift_v8i16:
    944 ; AVX1:       # BB#0:
    945 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm1
    946 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
    947 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm1
    948 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
    949 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm1
    950 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
    951 ; AVX1-NEXT:    retq
    952 ;
    953 ; AVX2-LABEL: constant_shift_v8i16:
    954 ; AVX2:       # BB#0:
    955 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
    956 ; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm0, %ymm0
    957 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero,ymm0[16,17,20,21,24,25,28,29],zero,zero,zero,zero,zero,zero,zero,zero
    958 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
    959 ; AVX2-NEXT:    # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
    960 ; AVX2-NEXT:    vzeroupper
    961 ; AVX2-NEXT:    retq
    962 ;
    963 ; XOP-LABEL: constant_shift_v8i16:
    964 ; XOP:       # BB#0:
    965 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
    966 ; XOP-NEXT:    vpsubw {{.*}}(%rip), %xmm1, %xmm1
    967 ; XOP-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
    968 ; XOP-NEXT:    retq
    969 ;
    970 ; AVX512-LABEL: constant_shift_v8i16:
    971 ; AVX512:       ## BB#0:
    972 ; AVX512-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
    973 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]
    974 ; AVX512-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
    975 ; AVX512-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
    976 ; AVX512-NEXT:    retq
    977 ;
    978 ; X32-SSE-LABEL: constant_shift_v8i16:
    979 ; X32-SSE:       # BB#0:
    980 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
    981 ; X32-SSE-NEXT:    psrlw $4, %xmm1
    982 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
    983 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
    984 ; X32-SSE-NEXT:    psrlw $2, %xmm1
    985 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
    986 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
    987 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]
    988 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm1
    989 ; X32-SSE-NEXT:    pand %xmm0, %xmm1
    990 ; X32-SSE-NEXT:    psrlw $1, %xmm2
    991 ; X32-SSE-NEXT:    pandn %xmm2, %xmm0
    992 ; X32-SSE-NEXT:    por %xmm1, %xmm0
    993 ; X32-SSE-NEXT:    retl
    994   %shift = lshr <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>
    995   ret <8 x i16> %shift
    996 }
    997 
    998 define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind {
    999 ; SSE2-LABEL: constant_shift_v16i8:
   1000 ; SSE2:       # BB#0:
   1001 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
   1002 ; SSE2-NEXT:    psllw $5, %xmm2
   1003 ; SSE2-NEXT:    pxor %xmm1, %xmm1
   1004 ; SSE2-NEXT:    pxor %xmm3, %xmm3
   1005 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
   1006 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
   1007 ; SSE2-NEXT:    pandn %xmm0, %xmm4
   1008 ; SSE2-NEXT:    psrlw $4, %xmm0
   1009 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
   1010 ; SSE2-NEXT:    pand %xmm3, %xmm0
   1011 ; SSE2-NEXT:    por %xmm4, %xmm0
   1012 ; SSE2-NEXT:    paddb %xmm2, %xmm2
   1013 ; SSE2-NEXT:    pxor %xmm3, %xmm3
   1014 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
   1015 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
   1016 ; SSE2-NEXT:    pandn %xmm0, %xmm4
   1017 ; SSE2-NEXT:    psrlw $2, %xmm0
   1018 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
   1019 ; SSE2-NEXT:    pand %xmm3, %xmm0
   1020 ; SSE2-NEXT:    por %xmm4, %xmm0
   1021 ; SSE2-NEXT:    paddb %xmm2, %xmm2
   1022 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
   1023 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
   1024 ; SSE2-NEXT:    pandn %xmm0, %xmm2
   1025 ; SSE2-NEXT:    psrlw $1, %xmm0
   1026 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
   1027 ; SSE2-NEXT:    pand %xmm1, %xmm0
   1028 ; SSE2-NEXT:    por %xmm2, %xmm0
   1029 ; SSE2-NEXT:    retq
   1030 ;
   1031 ; SSE41-LABEL: constant_shift_v16i8:
   1032 ; SSE41:       # BB#0:
   1033 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
   1034 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
   1035 ; SSE41-NEXT:    psllw $5, %xmm0
   1036 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
   1037 ; SSE41-NEXT:    psrlw $4, %xmm2
   1038 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
   1039 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
   1040 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
   1041 ; SSE41-NEXT:    psrlw $2, %xmm2
   1042 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
   1043 ; SSE41-NEXT:    paddb %xmm0, %xmm0
   1044 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
   1045 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
   1046 ; SSE41-NEXT:    psrlw $1, %xmm2
   1047 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
   1048 ; SSE41-NEXT:    paddb %xmm0, %xmm0
   1049 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
   1050 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
   1051 ; SSE41-NEXT:    retq
   1052 ;
   1053 ; AVX-LABEL: constant_shift_v16i8:
   1054 ; AVX:       # BB#0:
   1055 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
   1056 ; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
   1057 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm2
   1058 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
   1059 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
   1060 ; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm2
   1061 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
   1062 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
   1063 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
   1064 ; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm2
   1065 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
   1066 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
   1067 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
   1068 ; AVX-NEXT:    retq
   1069 ;
   1070 ; XOP-LABEL: constant_shift_v16i8:
   1071 ; XOP:       # BB#0:
   1072 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
   1073 ; XOP-NEXT:    vpsubb {{.*}}(%rip), %xmm1, %xmm1
   1074 ; XOP-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
   1075 ; XOP-NEXT:    retq
   1076 ;
   1077 ; AVX512-LABEL: constant_shift_v16i8:
   1078 ; AVX512:       ## BB#0:
   1079 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
   1080 ; AVX512-NEXT:    vpsllw $5, %xmm1, %xmm1
   1081 ; AVX512-NEXT:    vpsrlw $4, %xmm0, %xmm2
   1082 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
   1083 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
   1084 ; AVX512-NEXT:    vpsrlw $2, %xmm0, %xmm2
   1085 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
   1086 ; AVX512-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
   1087 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
   1088 ; AVX512-NEXT:    vpsrlw $1, %xmm0, %xmm2
   1089 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
   1090 ; AVX512-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
   1091 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
   1092 ; AVX512-NEXT:    retq
   1093 ;
   1094 ; X32-SSE-LABEL: constant_shift_v16i8:
   1095 ; X32-SSE:       # BB#0:
   1096 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
   1097 ; X32-SSE-NEXT:    psllw $5, %xmm2
   1098 ; X32-SSE-NEXT:    pxor %xmm1, %xmm1
   1099 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
   1100 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm3
   1101 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
   1102 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
   1103 ; X32-SSE-NEXT:    psrlw $4, %xmm0
   1104 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
   1105 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
   1106 ; X32-SSE-NEXT:    por %xmm4, %xmm0
   1107 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
   1108 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
   1109 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm3
   1110 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
   1111 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
   1112 ; X32-SSE-NEXT:    psrlw $2, %xmm0
   1113 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
   1114 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
   1115 ; X32-SSE-NEXT:    por %xmm4, %xmm0
   1116 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
   1117 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm1
   1118 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
   1119 ; X32-SSE-NEXT:    pandn %xmm0, %xmm2
   1120 ; X32-SSE-NEXT:    psrlw $1, %xmm0
   1121 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
   1122 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
   1123 ; X32-SSE-NEXT:    por %xmm2, %xmm0
   1124 ; X32-SSE-NEXT:    retl
   1125   %shift = lshr <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>
   1126   ret <16 x i8> %shift
   1127 }
   1128 
   1129 ;
   1130 ; Uniform Constant Shifts
   1131 ;
   1132 
   1133 define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind {
   1134 ; SSE-LABEL: splatconstant_shift_v2i64:
   1135 ; SSE:       # BB#0:
   1136 ; SSE-NEXT:    psrlq $7, %xmm0
   1137 ; SSE-NEXT:    retq
   1138 ;
   1139 ; AVX-LABEL: splatconstant_shift_v2i64:
   1140 ; AVX:       # BB#0:
   1141 ; AVX-NEXT:    vpsrlq $7, %xmm0, %xmm0
   1142 ; AVX-NEXT:    retq
   1143 ;
   1144 ; XOP-LABEL: splatconstant_shift_v2i64:
   1145 ; XOP:       # BB#0:
   1146 ; XOP-NEXT:    vpsrlq $7, %xmm0, %xmm0
   1147 ; XOP-NEXT:    retq
   1148 ;
   1149 ; AVX512-LABEL: splatconstant_shift_v2i64:
   1150 ; AVX512:       ## BB#0:
   1151 ; AVX512-NEXT:    vpsrlq $7, %xmm0, %xmm0
   1152 ; AVX512-NEXT:    retq
   1153 ;
   1154 ; X32-SSE-LABEL: splatconstant_shift_v2i64:
   1155 ; X32-SSE:       # BB#0:
   1156 ; X32-SSE-NEXT:    psrlq $7, %xmm0
   1157 ; X32-SSE-NEXT:    retl
   1158   %shift = lshr <2 x i64> %a, <i64 7, i64 7>
   1159   ret <2 x i64> %shift
   1160 }
   1161 
   1162 define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind {
   1163 ; SSE-LABEL: splatconstant_shift_v4i32:
   1164 ; SSE:       # BB#0:
   1165 ; SSE-NEXT:    psrld $5, %xmm0
   1166 ; SSE-NEXT:    retq
   1167 ;
   1168 ; AVX-LABEL: splatconstant_shift_v4i32:
   1169 ; AVX:       # BB#0:
   1170 ; AVX-NEXT:    vpsrld $5, %xmm0, %xmm0
   1171 ; AVX-NEXT:    retq
   1172 ;
   1173 ; XOP-LABEL: splatconstant_shift_v4i32:
   1174 ; XOP:       # BB#0:
   1175 ; XOP-NEXT:    vpsrld $5, %xmm0, %xmm0
   1176 ; XOP-NEXT:    retq
   1177 ;
   1178 ; AVX512-LABEL: splatconstant_shift_v4i32:
   1179 ; AVX512:       ## BB#0:
   1180 ; AVX512-NEXT:    vpsrld $5, %xmm0, %xmm0
   1181 ; AVX512-NEXT:    retq
   1182 ;
   1183 ; X32-SSE-LABEL: splatconstant_shift_v4i32:
   1184 ; X32-SSE:       # BB#0:
   1185 ; X32-SSE-NEXT:    psrld $5, %xmm0
   1186 ; X32-SSE-NEXT:    retl
   1187   %shift = lshr <4 x i32> %a, <i32 5, i32 5, i32 5, i32 5>
   1188   ret <4 x i32> %shift
   1189 }
   1190 
   1191 define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind {
   1192 ; SSE-LABEL: splatconstant_shift_v8i16:
   1193 ; SSE:       # BB#0:
   1194 ; SSE-NEXT:    psrlw $3, %xmm0
   1195 ; SSE-NEXT:    retq
   1196 ;
   1197 ; AVX-LABEL: splatconstant_shift_v8i16:
   1198 ; AVX:       # BB#0:
   1199 ; AVX-NEXT:    vpsrlw $3, %xmm0, %xmm0
   1200 ; AVX-NEXT:    retq
   1201 ;
   1202 ; XOP-LABEL: splatconstant_shift_v8i16:
   1203 ; XOP:       # BB#0:
   1204 ; XOP-NEXT:    vpsrlw $3, %xmm0, %xmm0
   1205 ; XOP-NEXT:    retq
   1206 ;
   1207 ; AVX512-LABEL: splatconstant_shift_v8i16:
   1208 ; AVX512:       ## BB#0:
   1209 ; AVX512-NEXT:    vpsrlw $3, %xmm0, %xmm0
   1210 ; AVX512-NEXT:    retq
   1211 ;
   1212 ; X32-SSE-LABEL: splatconstant_shift_v8i16:
   1213 ; X32-SSE:       # BB#0:
   1214 ; X32-SSE-NEXT:    psrlw $3, %xmm0
   1215 ; X32-SSE-NEXT:    retl
   1216   %shift = lshr <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
   1217   ret <8 x i16> %shift
   1218 }
   1219 
   1220 define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind {
   1221 ; SSE-LABEL: splatconstant_shift_v16i8:
   1222 ; SSE:       # BB#0:
   1223 ; SSE-NEXT:    psrlw $3, %xmm0
   1224 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
   1225 ; SSE-NEXT:    retq
   1226 ;
   1227 ; AVX-LABEL: splatconstant_shift_v16i8:
   1228 ; AVX:       # BB#0:
   1229 ; AVX-NEXT:    vpsrlw $3, %xmm0, %xmm0
   1230 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
   1231 ; AVX-NEXT:    retq
   1232 ;
   1233 ; XOP-LABEL: splatconstant_shift_v16i8:
   1234 ; XOP:       # BB#0:
   1235 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
   1236 ; XOP-NEXT:    vpsubb {{.*}}(%rip), %xmm1, %xmm1
   1237 ; XOP-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
   1238 ; XOP-NEXT:    retq
   1239 ;
   1240 ; AVX512-LABEL: splatconstant_shift_v16i8:
   1241 ; AVX512:       ## BB#0:
   1242 ; AVX512-NEXT:    vpsrlw $3, %xmm0, %xmm0
   1243 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
   1244 ; AVX512-NEXT:    retq
   1245 ;
   1246 ; X32-SSE-LABEL: splatconstant_shift_v16i8:
   1247 ; X32-SSE:       # BB#0:
   1248 ; X32-SSE-NEXT:    psrlw $3, %xmm0
   1249 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
   1250 ; X32-SSE-NEXT:    retl
   1251   %shift = lshr <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>
   1252   ret <16 x i8> %shift
   1253 }
   1254