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