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=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
      4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
      5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
      6 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
      7 
      8 ;
      9 ; Variable Shifts
     10 ;
     11 
     12 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
     13 ; AVX1-LABEL: var_shift_v4i64:
     14 ; AVX1:       # BB#0:
     15 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
     16 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
     17 ; AVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm4
     18 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
     19 ; AVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm2
     20 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
     21 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm3
     22 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
     23 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
     24 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
     25 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
     26 ; AVX1-NEXT:    retq
     27 ;
     28 ; AVX2-LABEL: var_shift_v4i64:
     29 ; AVX2:       # BB#0:
     30 ; AVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
     31 ; AVX2-NEXT:    retq
     32 ;
     33 ; XOPAVX1-LABEL: var_shift_v4i64:
     34 ; XOPAVX1:       # BB#0:
     35 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
     36 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
     37 ; XOPAVX1-NEXT:    vpshlq %xmm2, %xmm3, %xmm2
     38 ; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm0
     39 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
     40 ; XOPAVX1-NEXT:    retq
     41 ;
     42 ; XOPAVX2-LABEL: var_shift_v4i64:
     43 ; XOPAVX2:       # BB#0:
     44 ; XOPAVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
     45 ; XOPAVX2-NEXT:    retq
     46 ;
     47 ; AVX512-LABEL: var_shift_v4i64:
     48 ; AVX512:       ## BB#0:
     49 ; AVX512-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
     50 ; AVX512-NEXT:    retq
     51   %shift = shl <4 x i64> %a, %b
     52   ret <4 x i64> %shift
     53 }
     54 
     55 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
     56 ; AVX1-LABEL: var_shift_v8i32:
     57 ; AVX1:       # BB#0:
     58 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
     59 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
     60 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
     61 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
     62 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
     63 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
     64 ; AVX1-NEXT:    vpmulld %xmm4, %xmm2, %xmm2
     65 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
     66 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
     67 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
     68 ; AVX1-NEXT:    vpmulld %xmm0, %xmm1, %xmm0
     69 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
     70 ; AVX1-NEXT:    retq
     71 ;
     72 ; AVX2-LABEL: var_shift_v8i32:
     73 ; AVX2:       # BB#0:
     74 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
     75 ; AVX2-NEXT:    retq
     76 ;
     77 ; XOPAVX1-LABEL: var_shift_v8i32:
     78 ; XOPAVX1:       # BB#0:
     79 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
     80 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
     81 ; XOPAVX1-NEXT:    vpshld %xmm2, %xmm3, %xmm2
     82 ; XOPAVX1-NEXT:    vpshld %xmm1, %xmm0, %xmm0
     83 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
     84 ; XOPAVX1-NEXT:    retq
     85 ;
     86 ; XOPAVX2-LABEL: var_shift_v8i32:
     87 ; XOPAVX2:       # BB#0:
     88 ; XOPAVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
     89 ; XOPAVX2-NEXT:    retq
     90 ;
     91 ; AVX512-LABEL: var_shift_v8i32:
     92 ; AVX512:       ## BB#0:
     93 ; AVX512-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
     94 ; AVX512-NEXT:    retq
     95   %shift = shl <8 x i32> %a, %b
     96   ret <8 x i32> %shift
     97 }
     98 
     99 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
    100 ; AVX1-LABEL: var_shift_v16i16:
    101 ; AVX1:       # BB#0:
    102 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    103 ; AVX1-NEXT:    vpsllw $12, %xmm2, %xmm3
    104 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
    105 ; AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2
    106 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm3
    107 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
    108 ; AVX1-NEXT:    vpsllw $8, %xmm4, %xmm5
    109 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
    110 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm4
    111 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
    112 ; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm4
    113 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
    114 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
    115 ; AVX1-NEXT:    vpsllw $1, %xmm2, %xmm4
    116 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
    117 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
    118 ; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm3
    119 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
    120 ; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
    121 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm3
    122 ; AVX1-NEXT:    vpsllw $8, %xmm0, %xmm4
    123 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
    124 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm1
    125 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
    126 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm1
    127 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
    128 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
    129 ; AVX1-NEXT:    vpsllw $1, %xmm0, %xmm1
    130 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
    131 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
    132 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    133 ; AVX1-NEXT:    retq
    134 ;
    135 ; AVX2-LABEL: var_shift_v16i16:
    136 ; AVX2:       # BB#0:
    137 ; AVX2-NEXT:    vpxor %ymm2, %ymm2, %ymm2
    138 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
    139 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
    140 ; AVX2-NEXT:    vpsllvd %ymm3, %ymm4, %ymm3
    141 ; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
    142 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
    143 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
    144 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
    145 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
    146 ; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
    147 ; AVX2-NEXT:    retq
    148 ;
    149 ; XOPAVX1-LABEL: var_shift_v16i16:
    150 ; XOPAVX1:       # BB#0:
    151 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    152 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    153 ; XOPAVX1-NEXT:    vpshlw %xmm2, %xmm3, %xmm2
    154 ; XOPAVX1-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
    155 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    156 ; XOPAVX1-NEXT:    retq
    157 ;
    158 ; XOPAVX2-LABEL: var_shift_v16i16:
    159 ; XOPAVX2:       # BB#0:
    160 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
    161 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
    162 ; XOPAVX2-NEXT:    vpshlw %xmm2, %xmm3, %xmm2
    163 ; XOPAVX2-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
    164 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    165 ; XOPAVX2-NEXT:    retq
    166 ;
    167 ; AVX512-LABEL: var_shift_v16i16:
    168 ; AVX512:       ## BB#0:
    169 ; AVX512-NEXT:    ## kill: %YMM1<def> %YMM1<kill> %ZMM1<def>
    170 ; AVX512-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
    171 ; AVX512-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
    172 ; AVX512-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
    173 ; AVX512-NEXT:    retq
    174   %shift = shl <16 x i16> %a, %b
    175   ret <16 x i16> %shift
    176 }
    177 
    178 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
    179 ; AVX1-LABEL: var_shift_v32i8:
    180 ; AVX1:       # BB#0:
    181 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    182 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm3
    183 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
    184 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
    185 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
    186 ; AVX1-NEXT:    vpsllw $5, %xmm5, %xmm5
    187 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
    188 ; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm3
    189 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
    190 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
    191 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
    192 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
    193 ; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm3
    194 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
    195 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
    196 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm3
    197 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
    198 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
    199 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
    200 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm3
    201 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
    202 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    203 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
    204 ; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm3
    205 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    206 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
    207 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    208 ; AVX1-NEXT:    retq
    209 ;
    210 ; AVX2-LABEL: var_shift_v32i8:
    211 ; AVX2:       # BB#0:
    212 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
    213 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm2
    214 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    215 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    216 ; AVX2-NEXT:    vpsllw $2, %ymm0, %ymm2
    217 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    218 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    219 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    220 ; AVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
    221 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    222 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    223 ; AVX2-NEXT:    retq
    224 ;
    225 ; XOPAVX1-LABEL: var_shift_v32i8:
    226 ; XOPAVX1:       # BB#0:
    227 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    228 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    229 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm3, %xmm2
    230 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
    231 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    232 ; XOPAVX1-NEXT:    retq
    233 ;
    234 ; XOPAVX2-LABEL: var_shift_v32i8:
    235 ; XOPAVX2:       # BB#0:
    236 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
    237 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
    238 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm3, %xmm2
    239 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
    240 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    241 ; XOPAVX2-NEXT:    retq
    242 ;
    243 ; AVX512-LABEL: var_shift_v32i8:
    244 ; AVX512:       ## BB#0:
    245 ; AVX512-NEXT:    vpsllw $5, %ymm1, %ymm1
    246 ; AVX512-NEXT:    vpsllw $4, %ymm0, %ymm2
    247 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    248 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    249 ; AVX512-NEXT:    vpsllw $2, %ymm0, %ymm2
    250 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    251 ; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    252 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    253 ; AVX512-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
    254 ; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    255 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    256 ; AVX512-NEXT:    retq
    257   %shift = shl <32 x i8> %a, %b
    258   ret <32 x i8> %shift
    259 }
    260 
    261 ;
    262 ; Uniform Variable Shifts
    263 ;
    264 
    265 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
    266 ; AVX1-LABEL: splatvar_shift_v4i64:
    267 ; AVX1:       # BB#0:
    268 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    269 ; AVX1-NEXT:    vpsllq %xmm1, %xmm2, %xmm2
    270 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
    271 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    272 ; AVX1-NEXT:    retq
    273 ;
    274 ; AVX2-LABEL: splatvar_shift_v4i64:
    275 ; AVX2:       # BB#0:
    276 ; AVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
    277 ; AVX2-NEXT:    retq
    278 ;
    279 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
    280 ; XOPAVX1:       # BB#0:
    281 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    282 ; XOPAVX1-NEXT:    vpsllq %xmm1, %xmm2, %xmm2
    283 ; XOPAVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
    284 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    285 ; XOPAVX1-NEXT:    retq
    286 ;
    287 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
    288 ; XOPAVX2:       # BB#0:
    289 ; XOPAVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
    290 ; XOPAVX2-NEXT:    retq
    291 ;
    292 ; AVX512-LABEL: splatvar_shift_v4i64:
    293 ; AVX512:       ## BB#0:
    294 ; AVX512-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
    295 ; AVX512-NEXT:    retq
    296   %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
    297   %shift = shl <4 x i64> %a, %splat
    298   ret <4 x i64> %shift
    299 }
    300 
    301 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
    302 ; AVX1-LABEL: splatvar_shift_v8i32:
    303 ; AVX1:       # BB#0:
    304 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    305 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
    306 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    307 ; AVX1-NEXT:    vpslld %xmm1, %xmm2, %xmm2
    308 ; AVX1-NEXT:    vpslld %xmm1, %xmm0, %xmm0
    309 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    310 ; AVX1-NEXT:    retq
    311 ;
    312 ; AVX2-LABEL: splatvar_shift_v8i32:
    313 ; AVX2:       # BB#0:
    314 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    315 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
    316 ; AVX2-NEXT:    vpslld %xmm1, %ymm0, %ymm0
    317 ; AVX2-NEXT:    retq
    318 ;
    319 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
    320 ; XOPAVX1:       # BB#0:
    321 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    322 ; XOPAVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
    323 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    324 ; XOPAVX1-NEXT:    vpslld %xmm1, %xmm2, %xmm2
    325 ; XOPAVX1-NEXT:    vpslld %xmm1, %xmm0, %xmm0
    326 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    327 ; XOPAVX1-NEXT:    retq
    328 ;
    329 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
    330 ; XOPAVX2:       # BB#0:
    331 ; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    332 ; XOPAVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
    333 ; XOPAVX2-NEXT:    vpslld %xmm1, %ymm0, %ymm0
    334 ; XOPAVX2-NEXT:    retq
    335 ;
    336 ; AVX512-LABEL: splatvar_shift_v8i32:
    337 ; AVX512:       ## BB#0:
    338 ; AVX512-NEXT:    vxorps %xmm2, %xmm2, %xmm2
    339 ; AVX512-NEXT:    vmovss {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3]
    340 ; AVX512-NEXT:    vpslld %xmm1, %ymm0, %ymm0
    341 ; AVX512-NEXT:    retq
    342   %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
    343   %shift = shl <8 x i32> %a, %splat
    344   ret <8 x i32> %shift
    345 }
    346 
    347 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
    348 ; AVX1-LABEL: splatvar_shift_v16i16:
    349 ; AVX1:       # BB#0:
    350 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    351 ; AVX1-NEXT:    vmovd %xmm1, %eax
    352 ; AVX1-NEXT:    movzwl %ax, %eax
    353 ; AVX1-NEXT:    vmovd %eax, %xmm1
    354 ; AVX1-NEXT:    vpsllw %xmm1, %xmm2, %xmm2
    355 ; AVX1-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
    356 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    357 ; AVX1-NEXT:    retq
    358 ;
    359 ; AVX2-LABEL: splatvar_shift_v16i16:
    360 ; AVX2:       # BB#0:
    361 ; AVX2-NEXT:    vmovd %xmm1, %eax
    362 ; AVX2-NEXT:    movzwl %ax, %eax
    363 ; AVX2-NEXT:    vmovd %eax, %xmm1
    364 ; AVX2-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
    365 ; AVX2-NEXT:    retq
    366 ;
    367 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
    368 ; XOPAVX1:       # BB#0:
    369 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    370 ; XOPAVX1-NEXT:    vmovd %xmm1, %eax
    371 ; XOPAVX1-NEXT:    movzwl %ax, %eax
    372 ; XOPAVX1-NEXT:    vmovd %eax, %xmm1
    373 ; XOPAVX1-NEXT:    vpsllw %xmm1, %xmm2, %xmm2
    374 ; XOPAVX1-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
    375 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    376 ; XOPAVX1-NEXT:    retq
    377 ;
    378 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
    379 ; XOPAVX2:       # BB#0:
    380 ; XOPAVX2-NEXT:    vmovd %xmm1, %eax
    381 ; XOPAVX2-NEXT:    movzwl %ax, %eax
    382 ; XOPAVX2-NEXT:    vmovd %eax, %xmm1
    383 ; XOPAVX2-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
    384 ; XOPAVX2-NEXT:    retq
    385 ;
    386 ; AVX512-LABEL: splatvar_shift_v16i16:
    387 ; AVX512:       ## BB#0:
    388 ; AVX512-NEXT:    vmovd %xmm1, %eax
    389 ; AVX512-NEXT:    movzwl %ax, %eax
    390 ; AVX512-NEXT:    vmovd %eax, %xmm1
    391 ; AVX512-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
    392 ; AVX512-NEXT:    retq
    393   %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
    394   %shift = shl <16 x i16> %a, %splat
    395   ret <16 x i16> %shift
    396 }
    397 
    398 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
    399 ; AVX1-LABEL: splatvar_shift_v32i8:
    400 ; AVX1:       # BB#0:
    401 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    402 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
    403 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    404 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm3
    405 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
    406 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
    407 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
    408 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm2, %xmm2
    409 ; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm3
    410 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
    411 ; AVX1-NEXT:    vpand %xmm5, %xmm3, %xmm3
    412 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm6
    413 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
    414 ; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm3
    415 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm7
    416 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm3, %xmm2, %xmm2
    417 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm3
    418 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
    419 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
    420 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm1
    421 ; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
    422 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm1, %xmm0, %xmm0
    423 ; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm1
    424 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
    425 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    426 ; AVX1-NEXT:    retq
    427 ;
    428 ; AVX2-LABEL: splatvar_shift_v32i8:
    429 ; AVX2:       # BB#0:
    430 ; AVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
    431 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm2
    432 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    433 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
    434 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    435 ; AVX2-NEXT:    vpsllw $2, %ymm0, %ymm2
    436 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    437 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    438 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    439 ; AVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
    440 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    441 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    442 ; AVX2-NEXT:    retq
    443 ;
    444 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
    445 ; XOPAVX1:       # BB#0:
    446 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    447 ; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
    448 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    449 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm2, %xmm2
    450 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
    451 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    452 ; XOPAVX1-NEXT:    retq
    453 ;
    454 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
    455 ; XOPAVX2:       # BB#0:
    456 ; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
    457 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
    458 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
    459 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
    460 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
    461 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    462 ; XOPAVX2-NEXT:    retq
    463 ;
    464 ; AVX512-LABEL: splatvar_shift_v32i8:
    465 ; AVX512:       ## BB#0:
    466 ; AVX512-NEXT:    vpbroadcastb %xmm1, %ymm1
    467 ; AVX512-NEXT:    vpsllw $4, %ymm0, %ymm2
    468 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    469 ; AVX512-NEXT:    vpsllw $5, %ymm1, %ymm1
    470 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    471 ; AVX512-NEXT:    vpsllw $2, %ymm0, %ymm2
    472 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    473 ; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    474 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    475 ; AVX512-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
    476 ; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    477 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    478 ; AVX512-NEXT:    retq
    479   %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
    480   %shift = shl <32 x i8> %a, %splat
    481   ret <32 x i8> %shift
    482 }
    483 
    484 ;
    485 ; Constant Shifts
    486 ;
    487 
    488 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
    489 ; AVX1-LABEL: constant_shift_v4i64:
    490 ; AVX1:       # BB#0:
    491 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    492 ; AVX1-NEXT:    vpsllq $62, %xmm1, %xmm2
    493 ; AVX1-NEXT:    vpsllq $31, %xmm1, %xmm1
    494 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
    495 ; AVX1-NEXT:    vpsllq $7, %xmm0, %xmm2
    496 ; AVX1-NEXT:    vpsllq $1, %xmm0, %xmm0
    497 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
    498 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    499 ; AVX1-NEXT:    retq
    500 ;
    501 ; AVX2-LABEL: constant_shift_v4i64:
    502 ; AVX2:       # BB#0:
    503 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
    504 ; AVX2-NEXT:    retq
    505 ;
    506 ; XOPAVX1-LABEL: constant_shift_v4i64:
    507 ; XOPAVX1:       # BB#0:
    508 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm1
    509 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
    510 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm0
    511 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    512 ; XOPAVX1-NEXT:    retq
    513 ;
    514 ; XOPAVX2-LABEL: constant_shift_v4i64:
    515 ; XOPAVX2:       # BB#0:
    516 ; XOPAVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
    517 ; XOPAVX2-NEXT:    retq
    518 ;
    519 ; AVX512-LABEL: constant_shift_v4i64:
    520 ; AVX512:       ## BB#0:
    521 ; AVX512-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
    522 ; AVX512-NEXT:    retq
    523   %shift = shl <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
    524   ret <4 x i64> %shift
    525 }
    526 
    527 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
    528 ; AVX1-LABEL: constant_shift_v8i32:
    529 ; AVX1:       # BB#0:
    530 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm1
    531 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
    532 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
    533 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    534 ; AVX1-NEXT:    retq
    535 ;
    536 ; AVX2-LABEL: constant_shift_v8i32:
    537 ; AVX2:       # BB#0:
    538 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
    539 ; AVX2-NEXT:    retq
    540 ;
    541 ; XOPAVX1-LABEL: constant_shift_v8i32:
    542 ; XOPAVX1:       # BB#0:
    543 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm1
    544 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
    545 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
    546 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    547 ; XOPAVX1-NEXT:    retq
    548 ;
    549 ; XOPAVX2-LABEL: constant_shift_v8i32:
    550 ; XOPAVX2:       # BB#0:
    551 ; XOPAVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
    552 ; XOPAVX2-NEXT:    retq
    553 ;
    554 ; AVX512-LABEL: constant_shift_v8i32:
    555 ; AVX512:       ## BB#0:
    556 ; AVX512-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
    557 ; AVX512-NEXT:    retq
    558   %shift = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
    559   ret <8 x i32> %shift
    560 }
    561 
    562 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
    563 ; AVX1-LABEL: constant_shift_v16i16:
    564 ; AVX1:       # BB#0:
    565 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm1
    566 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
    567 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
    568 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    569 ; AVX1-NEXT:    retq
    570 ;
    571 ; AVX2-LABEL: constant_shift_v16i16:
    572 ; AVX2:       # BB#0:
    573 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
    574 ; AVX2-NEXT:    retq
    575 ;
    576 ; XOPAVX1-LABEL: constant_shift_v16i16:
    577 ; XOPAVX1:       # BB#0:
    578 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm0, %xmm1
    579 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
    580 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm0, %xmm0
    581 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    582 ; XOPAVX1-NEXT:    retq
    583 ;
    584 ; XOPAVX2-LABEL: constant_shift_v16i16:
    585 ; XOPAVX2:       # BB#0:
    586 ; XOPAVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
    587 ; XOPAVX2-NEXT:    retq
    588 ;
    589 ; AVX512-LABEL: constant_shift_v16i16:
    590 ; AVX512:       ## BB#0:
    591 ; AVX512-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
    592 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
    593 ; AVX512-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
    594 ; AVX512-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
    595 ; AVX512-NEXT:    retq
    596   %shift = shl <16 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
    597   ret <16 x i16> %shift
    598 }
    599 
    600 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
    601 ; AVX1-LABEL: constant_shift_v32i8:
    602 ; AVX1:       # BB#0:
    603 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    604 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm2
    605 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
    606 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
    607 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
    608 ; AVX1-NEXT:    vpsllw $5, %xmm4, %xmm4
    609 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm1, %xmm1
    610 ; AVX1-NEXT:    vpsllw $2, %xmm1, %xmm2
    611 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
    612 ; AVX1-NEXT:    vpand %xmm5, %xmm2, %xmm2
    613 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm6
    614 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm2, %xmm1, %xmm1
    615 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm2
    616 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm7
    617 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm2, %xmm1, %xmm1
    618 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm2
    619 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
    620 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
    621 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm2
    622 ; AVX1-NEXT:    vpand %xmm5, %xmm2, %xmm2
    623 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm2, %xmm0, %xmm0
    624 ; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm2
    625 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm2, %xmm0, %xmm0
    626 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    627 ; AVX1-NEXT:    retq
    628 ;
    629 ; AVX2-LABEL: constant_shift_v32i8:
    630 ; AVX2:       # BB#0:
    631 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
    632 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
    633 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm2
    634 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    635 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    636 ; AVX2-NEXT:    vpsllw $2, %ymm0, %ymm2
    637 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    638 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    639 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    640 ; AVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
    641 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    642 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    643 ; AVX2-NEXT:    retq
    644 ;
    645 ; XOPAVX1-LABEL: constant_shift_v32i8:
    646 ; XOPAVX1:       # BB#0:
    647 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    648 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
    649 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm1, %xmm1
    650 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
    651 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    652 ; XOPAVX1-NEXT:    retq
    653 ;
    654 ; XOPAVX2-LABEL: constant_shift_v32i8:
    655 ; XOPAVX2:       # BB#0:
    656 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    657 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
    658 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm1, %xmm1
    659 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
    660 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
    661 ; XOPAVX2-NEXT:    retq
    662 ;
    663 ; AVX512-LABEL: constant_shift_v32i8:
    664 ; AVX512:       ## BB#0:
    665 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
    666 ; AVX512-NEXT:    vpsllw $5, %ymm1, %ymm1
    667 ; AVX512-NEXT:    vpsllw $4, %ymm0, %ymm2
    668 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    669 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    670 ; AVX512-NEXT:    vpsllw $2, %ymm0, %ymm2
    671 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    672 ; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    673 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    674 ; AVX512-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
    675 ; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    676 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    677 ; AVX512-NEXT:    retq
    678   %shift = shl <32 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, 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>
    679   ret <32 x i8> %shift
    680 }
    681 
    682 ;
    683 ; Uniform Constant Shifts
    684 ;
    685 
    686 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
    687 ; AVX1-LABEL: splatconstant_shift_v4i64:
    688 ; AVX1:       # BB#0:
    689 ; AVX1-NEXT:    vpsllq $7, %xmm0, %xmm1
    690 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
    691 ; AVX1-NEXT:    vpsllq $7, %xmm0, %xmm0
    692 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    693 ; AVX1-NEXT:    retq
    694 ;
    695 ; AVX2-LABEL: splatconstant_shift_v4i64:
    696 ; AVX2:       # BB#0:
    697 ; AVX2-NEXT:    vpsllq $7, %ymm0, %ymm0
    698 ; AVX2-NEXT:    retq
    699 ;
    700 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
    701 ; XOPAVX1:       # BB#0:
    702 ; XOPAVX1-NEXT:    vpsllq $7, %xmm0, %xmm1
    703 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
    704 ; XOPAVX1-NEXT:    vpsllq $7, %xmm0, %xmm0
    705 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    706 ; XOPAVX1-NEXT:    retq
    707 ;
    708 ; XOPAVX2-LABEL: splatconstant_shift_v4i64:
    709 ; XOPAVX2:       # BB#0:
    710 ; XOPAVX2-NEXT:    vpsllq $7, %ymm0, %ymm0
    711 ; XOPAVX2-NEXT:    retq
    712 ;
    713 ; AVX512-LABEL: splatconstant_shift_v4i64:
    714 ; AVX512:       ## BB#0:
    715 ; AVX512-NEXT:    vpsllq $7, %ymm0, %ymm0
    716 ; AVX512-NEXT:    retq
    717   %shift = shl <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
    718   ret <4 x i64> %shift
    719 }
    720 
    721 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
    722 ; AVX1-LABEL: splatconstant_shift_v8i32:
    723 ; AVX1:       # BB#0:
    724 ; AVX1-NEXT:    vpslld $5, %xmm0, %xmm1
    725 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
    726 ; AVX1-NEXT:    vpslld $5, %xmm0, %xmm0
    727 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    728 ; AVX1-NEXT:    retq
    729 ;
    730 ; AVX2-LABEL: splatconstant_shift_v8i32:
    731 ; AVX2:       # BB#0:
    732 ; AVX2-NEXT:    vpslld $5, %ymm0, %ymm0
    733 ; AVX2-NEXT:    retq
    734 ;
    735 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
    736 ; XOPAVX1:       # BB#0:
    737 ; XOPAVX1-NEXT:    vpslld $5, %xmm0, %xmm1
    738 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
    739 ; XOPAVX1-NEXT:    vpslld $5, %xmm0, %xmm0
    740 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    741 ; XOPAVX1-NEXT:    retq
    742 ;
    743 ; XOPAVX2-LABEL: splatconstant_shift_v8i32:
    744 ; XOPAVX2:       # BB#0:
    745 ; XOPAVX2-NEXT:    vpslld $5, %ymm0, %ymm0
    746 ; XOPAVX2-NEXT:    retq
    747 ;
    748 ; AVX512-LABEL: splatconstant_shift_v8i32:
    749 ; AVX512:       ## BB#0:
    750 ; AVX512-NEXT:    vpslld $5, %ymm0, %ymm0
    751 ; AVX512-NEXT:    retq
    752   %shift = shl <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
    753   ret <8 x i32> %shift
    754 }
    755 
    756 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
    757 ; AVX1-LABEL: splatconstant_shift_v16i16:
    758 ; AVX1:       # BB#0:
    759 ; AVX1-NEXT:    vpsllw $3, %xmm0, %xmm1
    760 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
    761 ; AVX1-NEXT:    vpsllw $3, %xmm0, %xmm0
    762 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    763 ; AVX1-NEXT:    retq
    764 ;
    765 ; AVX2-LABEL: splatconstant_shift_v16i16:
    766 ; AVX2:       # BB#0:
    767 ; AVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
    768 ; AVX2-NEXT:    retq
    769 ;
    770 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
    771 ; XOPAVX1:       # BB#0:
    772 ; XOPAVX1-NEXT:    vpsllw $3, %xmm0, %xmm1
    773 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
    774 ; XOPAVX1-NEXT:    vpsllw $3, %xmm0, %xmm0
    775 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    776 ; XOPAVX1-NEXT:    retq
    777 ;
    778 ; XOPAVX2-LABEL: splatconstant_shift_v16i16:
    779 ; XOPAVX2:       # BB#0:
    780 ; XOPAVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
    781 ; XOPAVX2-NEXT:    retq
    782 ;
    783 ; AVX512-LABEL: splatconstant_shift_v16i16:
    784 ; AVX512:       ## BB#0:
    785 ; AVX512-NEXT:    vpsllw $3, %ymm0, %ymm0
    786 ; AVX512-NEXT:    retq
    787   %shift = shl <16 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
    788   ret <16 x i16> %shift
    789 }
    790 
    791 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
    792 ; AVX1-LABEL: splatconstant_shift_v32i8:
    793 ; AVX1:       # BB#0:
    794 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    795 ; AVX1-NEXT:    vpsllw $3, %xmm1, %xmm1
    796 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
    797 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
    798 ; AVX1-NEXT:    vpsllw $3, %xmm0, %xmm0
    799 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
    800 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    801 ; AVX1-NEXT:    retq
    802 ;
    803 ; AVX2-LABEL: splatconstant_shift_v32i8:
    804 ; AVX2:       # BB#0:
    805 ; AVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
    806 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
    807 ; AVX2-NEXT:    retq
    808 ;
    809 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
    810 ; XOPAVX1:       # BB#0:
    811 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    812 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
    813 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm1, %xmm1
    814 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
    815 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    816 ; XOPAVX1-NEXT:    retq
    817 ;
    818 ; XOPAVX2-LABEL: splatconstant_shift_v32i8:
    819 ; XOPAVX2:       # BB#0:
    820 ; XOPAVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
    821 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
    822 ; XOPAVX2-NEXT:    retq
    823 ;
    824 ; AVX512-LABEL: splatconstant_shift_v32i8:
    825 ; AVX512:       ## BB#0:
    826 ; AVX512-NEXT:    vpsllw $3, %ymm0, %ymm0
    827 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
    828 ; AVX512-NEXT:    retq
    829   %shift = shl <32 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, 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>
    830   ret <32 x i8> %shift
    831 }
    832