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