Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; TODO: Add AVX512BW shift support
      3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512DQ
      4 
      5 ;
      6 ; Variable Shifts
      7 ;
      8 
      9 define <8 x i64> @var_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind {
     10 ; ALL-LABEL: var_shift_v8i64:
     11 ; ALL:       ## BB#0:
     12 ; ALL-NEXT:    vpsravq %zmm1, %zmm0, %zmm0
     13 ; ALL-NEXT:    retq
     14   %shift = ashr <8 x i64> %a, %b
     15   ret <8 x i64> %shift
     16 }
     17 
     18 define <16 x i32> @var_shift_v16i32(<16 x i32> %a, <16 x i32> %b) nounwind {
     19 ; ALL-LABEL: var_shift_v16i32:
     20 ; ALL:       ## BB#0:
     21 ; ALL-NEXT:    vpsravd %zmm1, %zmm0, %zmm0
     22 ; ALL-NEXT:    retq
     23   %shift = ashr <16 x i32> %a, %b
     24   ret <16 x i32> %shift
     25 }
     26 
     27 define <32 x i16> @var_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind {
     28 ; ALL-LABEL: var_shift_v32i16:
     29 ; ALL:       ## BB#0:
     30 ; ALL-NEXT:    vpxor %ymm4, %ymm4, %ymm4
     31 ; ALL-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm4[4],ymm2[5],ymm4[5],ymm2[6],ymm4[6],ymm2[7],ymm4[7],ymm2[12],ymm4[12],ymm2[13],ymm4[13],ymm2[14],ymm4[14],ymm2[15],ymm4[15]
     32 ; ALL-NEXT:    vpunpckhwd {{.*#+}} ymm6 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
     33 ; ALL-NEXT:    vpsravd %ymm5, %ymm6, %ymm5
     34 ; ALL-NEXT:    vpsrld $16, %ymm5, %ymm5
     35 ; ALL-NEXT:    vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[8],ymm4[8],ymm2[9],ymm4[9],ymm2[10],ymm4[10],ymm2[11],ymm4[11]
     36 ; ALL-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
     37 ; ALL-NEXT:    vpsravd %ymm2, %ymm0, %ymm0
     38 ; ALL-NEXT:    vpsrld $16, %ymm0, %ymm0
     39 ; ALL-NEXT:    vpackusdw %ymm5, %ymm0, %ymm0
     40 ; ALL-NEXT:    vpunpckhwd {{.*#+}} ymm2 = ymm3[4],ymm4[4],ymm3[5],ymm4[5],ymm3[6],ymm4[6],ymm3[7],ymm4[7],ymm3[12],ymm4[12],ymm3[13],ymm4[13],ymm3[14],ymm4[14],ymm3[15],ymm4[15]
     41 ; ALL-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm1[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
     42 ; ALL-NEXT:    vpsravd %ymm2, %ymm5, %ymm2
     43 ; ALL-NEXT:    vpsrld $16, %ymm2, %ymm2
     44 ; ALL-NEXT:    vpunpcklwd {{.*#+}} ymm3 = ymm3[0],ymm4[0],ymm3[1],ymm4[1],ymm3[2],ymm4[2],ymm3[3],ymm4[3],ymm3[8],ymm4[8],ymm3[9],ymm4[9],ymm3[10],ymm4[10],ymm3[11],ymm4[11]
     45 ; ALL-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
     46 ; ALL-NEXT:    vpsravd %ymm3, %ymm1, %ymm1
     47 ; ALL-NEXT:    vpsrld $16, %ymm1, %ymm1
     48 ; ALL-NEXT:    vpackusdw %ymm2, %ymm1, %ymm1
     49 ; ALL-NEXT:    retq
     50   %shift = ashr <32 x i16> %a, %b
     51   ret <32 x i16> %shift
     52 }
     53 
     54 define <64 x i8> @var_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind {
     55 ; ALL-LABEL: var_shift_v64i8:
     56 ; ALL:       ## BB#0:
     57 ; ALL-NEXT:    vpsllw $5, %ymm2, %ymm2
     58 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]
     59 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm5 = 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]
     60 ; ALL-NEXT:    vpsraw $4, %ymm5, %ymm6
     61 ; ALL-NEXT:    vpblendvb %ymm4, %ymm6, %ymm5, %ymm5
     62 ; ALL-NEXT:    vpsraw $2, %ymm5, %ymm6
     63 ; ALL-NEXT:    vpaddw %ymm4, %ymm4, %ymm4
     64 ; ALL-NEXT:    vpblendvb %ymm4, %ymm6, %ymm5, %ymm5
     65 ; ALL-NEXT:    vpsraw $1, %ymm5, %ymm6
     66 ; ALL-NEXT:    vpaddw %ymm4, %ymm4, %ymm4
     67 ; ALL-NEXT:    vpblendvb %ymm4, %ymm6, %ymm5, %ymm4
     68 ; ALL-NEXT:    vpsrlw $8, %ymm4, %ymm4
     69 ; ALL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]
     70 ; ALL-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]
     71 ; ALL-NEXT:    vpsraw $4, %ymm0, %ymm5
     72 ; ALL-NEXT:    vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
     73 ; ALL-NEXT:    vpsraw $2, %ymm0, %ymm5
     74 ; ALL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
     75 ; ALL-NEXT:    vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
     76 ; ALL-NEXT:    vpsraw $1, %ymm0, %ymm5
     77 ; ALL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
     78 ; ALL-NEXT:    vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
     79 ; ALL-NEXT:    vpsrlw $8, %ymm0, %ymm0
     80 ; ALL-NEXT:    vpackuswb %ymm4, %ymm0, %ymm0
     81 ; ALL-NEXT:    vpsllw $5, %ymm3, %ymm2
     82 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]
     83 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm4 = 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]
     84 ; ALL-NEXT:    vpsraw $4, %ymm4, %ymm5
     85 ; ALL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
     86 ; ALL-NEXT:    vpsraw $2, %ymm4, %ymm5
     87 ; ALL-NEXT:    vpaddw %ymm3, %ymm3, %ymm3
     88 ; ALL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
     89 ; ALL-NEXT:    vpsraw $1, %ymm4, %ymm5
     90 ; ALL-NEXT:    vpaddw %ymm3, %ymm3, %ymm3
     91 ; ALL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
     92 ; ALL-NEXT:    vpsrlw $8, %ymm3, %ymm3
     93 ; ALL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]
     94 ; ALL-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]
     95 ; ALL-NEXT:    vpsraw $4, %ymm1, %ymm4
     96 ; ALL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
     97 ; ALL-NEXT:    vpsraw $2, %ymm1, %ymm4
     98 ; ALL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
     99 ; ALL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
    100 ; ALL-NEXT:    vpsraw $1, %ymm1, %ymm4
    101 ; ALL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
    102 ; ALL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
    103 ; ALL-NEXT:    vpsrlw $8, %ymm1, %ymm1
    104 ; ALL-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
    105 ; ALL-NEXT:    retq
    106   %shift = ashr <64 x i8> %a, %b
    107   ret <64 x i8> %shift
    108 }
    109 
    110 ;
    111 ; Uniform Variable Shifts
    112 ;
    113 
    114 define <8 x i64> @splatvar_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind {
    115 ; ALL-LABEL: splatvar_shift_v8i64:
    116 ; ALL:       ## BB#0:
    117 ; ALL-NEXT:    vpsraq %xmm1, %zmm0, %zmm0
    118 ; ALL-NEXT:    retq
    119   %splat = shufflevector <8 x i64> %b, <8 x i64> undef, <8 x i32> zeroinitializer
    120   %shift = ashr <8 x i64> %a, %splat
    121   ret <8 x i64> %shift
    122 }
    123 
    124 define <16 x i32> @splatvar_shift_v16i32(<16 x i32> %a, <16 x i32> %b) nounwind {
    125 ; ALL-LABEL: splatvar_shift_v16i32:
    126 ; ALL:       ## BB#0:
    127 ; ALL-NEXT:    vxorps %xmm2, %xmm2, %xmm2
    128 ; ALL-NEXT:    vmovss %xmm1, %xmm2, %xmm1
    129 ; ALL-NEXT:    vpsrad %xmm1, %zmm0, %zmm0
    130 ; ALL-NEXT:    retq
    131   %splat = shufflevector <16 x i32> %b, <16 x i32> undef, <16 x i32> zeroinitializer
    132   %shift = ashr <16 x i32> %a, %splat
    133   ret <16 x i32> %shift
    134 }
    135 
    136 define <32 x i16> @splatvar_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind {
    137 ; ALL-LABEL: splatvar_shift_v32i16:
    138 ; ALL:       ## BB#0:
    139 ; ALL-NEXT:    vmovd %xmm2, %eax
    140 ; ALL-NEXT:    movzwl %ax, %eax
    141 ; ALL-NEXT:    vmovd %eax, %xmm2
    142 ; ALL-NEXT:    vpsraw %xmm2, %ymm0, %ymm0
    143 ; ALL-NEXT:    vpsraw %xmm2, %ymm1, %ymm1
    144 ; ALL-NEXT:    retq
    145   %splat = shufflevector <32 x i16> %b, <32 x i16> undef, <32 x i32> zeroinitializer
    146   %shift = ashr <32 x i16> %a, %splat
    147   ret <32 x i16> %shift
    148 }
    149 
    150 define <64 x i8> @splatvar_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind {
    151 ; ALL-LABEL: splatvar_shift_v64i8:
    152 ; ALL:       ## BB#0:
    153 ; ALL-NEXT:    vpbroadcastb %xmm2, %ymm2
    154 ; ALL-NEXT:    vpsllw $5, %ymm2, %ymm2
    155 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]
    156 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm4 = 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]
    157 ; ALL-NEXT:    vpsraw $4, %ymm4, %ymm5
    158 ; ALL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
    159 ; ALL-NEXT:    vpsraw $2, %ymm4, %ymm5
    160 ; ALL-NEXT:    vpaddw %ymm3, %ymm3, %ymm6
    161 ; ALL-NEXT:    vpblendvb %ymm6, %ymm5, %ymm4, %ymm4
    162 ; ALL-NEXT:    vpsraw $1, %ymm4, %ymm5
    163 ; ALL-NEXT:    vpaddw %ymm6, %ymm6, %ymm7
    164 ; ALL-NEXT:    vpblendvb %ymm7, %ymm5, %ymm4, %ymm4
    165 ; ALL-NEXT:    vpsrlw $8, %ymm4, %ymm4
    166 ; ALL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]
    167 ; ALL-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]
    168 ; ALL-NEXT:    vpsraw $4, %ymm0, %ymm5
    169 ; ALL-NEXT:    vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
    170 ; ALL-NEXT:    vpsraw $2, %ymm0, %ymm5
    171 ; ALL-NEXT:    vpaddw %ymm2, %ymm2, %ymm8
    172 ; ALL-NEXT:    vpblendvb %ymm8, %ymm5, %ymm0, %ymm0
    173 ; ALL-NEXT:    vpsraw $1, %ymm0, %ymm5
    174 ; ALL-NEXT:    vpaddw %ymm8, %ymm8, %ymm9
    175 ; ALL-NEXT:    vpblendvb %ymm9, %ymm5, %ymm0, %ymm0
    176 ; ALL-NEXT:    vpsrlw $8, %ymm0, %ymm0
    177 ; ALL-NEXT:    vpackuswb %ymm4, %ymm0, %ymm0
    178 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm4 = 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]
    179 ; ALL-NEXT:    vpsraw $4, %ymm4, %ymm5
    180 ; ALL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
    181 ; ALL-NEXT:    vpsraw $2, %ymm3, %ymm4
    182 ; ALL-NEXT:    vpblendvb %ymm6, %ymm4, %ymm3, %ymm3
    183 ; ALL-NEXT:    vpsraw $1, %ymm3, %ymm4
    184 ; ALL-NEXT:    vpblendvb %ymm7, %ymm4, %ymm3, %ymm3
    185 ; ALL-NEXT:    vpsrlw $8, %ymm3, %ymm3
    186 ; ALL-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]
    187 ; ALL-NEXT:    vpsraw $4, %ymm1, %ymm4
    188 ; ALL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
    189 ; ALL-NEXT:    vpsraw $2, %ymm1, %ymm2
    190 ; ALL-NEXT:    vpblendvb %ymm8, %ymm2, %ymm1, %ymm1
    191 ; ALL-NEXT:    vpsraw $1, %ymm1, %ymm2
    192 ; ALL-NEXT:    vpblendvb %ymm9, %ymm2, %ymm1, %ymm1
    193 ; ALL-NEXT:    vpsrlw $8, %ymm1, %ymm1
    194 ; ALL-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
    195 ; ALL-NEXT:    retq
    196   %splat = shufflevector <64 x i8> %b, <64 x i8> undef, <64 x i32> zeroinitializer
    197   %shift = ashr <64 x i8> %a, %splat
    198   ret <64 x i8> %shift
    199 }
    200 
    201 ;
    202 ; Constant Shifts
    203 ;
    204 
    205 define <8 x i64> @constant_shift_v8i64(<8 x i64> %a) nounwind {
    206 ; ALL-LABEL: constant_shift_v8i64:
    207 ; ALL:       ## BB#0:
    208 ; ALL-NEXT:    vpsravq {{.*}}(%rip), %zmm0, %zmm0
    209 ; ALL-NEXT:    retq
    210   %shift = ashr <8 x i64> %a, <i64 1, i64 7, i64 31, i64 62, i64 1, i64 7, i64 31, i64 62>
    211   ret <8 x i64> %shift
    212 }
    213 
    214 define <16 x i32> @constant_shift_v16i32(<16 x i32> %a) nounwind {
    215 ; ALL-LABEL: constant_shift_v16i32:
    216 ; ALL:       ## BB#0:
    217 ; ALL-NEXT:    vpsravd {{.*}}(%rip), %zmm0, %zmm0
    218 ; ALL-NEXT:    retq
    219   %shift = ashr <16 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
    220   ret <16 x i32> %shift
    221 }
    222 
    223 define <32 x i16> @constant_shift_v32i16(<32 x i16> %a) nounwind {
    224 ; ALL-LABEL: constant_shift_v32i16:
    225 ; ALL:       ## BB#0:
    226 ; ALL-NEXT:    vpxor %ymm2, %ymm2, %ymm2
    227 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
    228 ; ALL-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm3[4],ymm2[4],ymm3[5],ymm2[5],ymm3[6],ymm2[6],ymm3[7],ymm2[7],ymm3[12],ymm2[12],ymm3[13],ymm2[13],ymm3[14],ymm2[14],ymm3[15],ymm2[15]
    229 ; ALL-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
    230 ; ALL-NEXT:    vpsravd %ymm4, %ymm5, %ymm5
    231 ; ALL-NEXT:    vpsrld $16, %ymm5, %ymm5
    232 ; ALL-NEXT:    vpunpcklwd {{.*#+}} ymm2 = ymm3[0],ymm2[0],ymm3[1],ymm2[1],ymm3[2],ymm2[2],ymm3[3],ymm2[3],ymm3[8],ymm2[8],ymm3[9],ymm2[9],ymm3[10],ymm2[10],ymm3[11],ymm2[11]
    233 ; ALL-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
    234 ; ALL-NEXT:    vpsravd %ymm2, %ymm0, %ymm0
    235 ; ALL-NEXT:    vpsrld $16, %ymm0, %ymm0
    236 ; ALL-NEXT:    vpackusdw %ymm5, %ymm0, %ymm0
    237 ; ALL-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm1[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
    238 ; ALL-NEXT:    vpsravd %ymm4, %ymm3, %ymm3
    239 ; ALL-NEXT:    vpsrld $16, %ymm3, %ymm3
    240 ; ALL-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
    241 ; ALL-NEXT:    vpsravd %ymm2, %ymm1, %ymm1
    242 ; ALL-NEXT:    vpsrld $16, %ymm1, %ymm1
    243 ; ALL-NEXT:    vpackusdw %ymm3, %ymm1, %ymm1
    244 ; ALL-NEXT:    retq
    245   %shift = ashr <32 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, 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>
    246   ret <32 x i16> %shift
    247 }
    248 
    249 define <64 x i8> @constant_shift_v64i8(<64 x i8> %a) nounwind {
    250 ; ALL-LABEL: constant_shift_v64i8:
    251 ; ALL:       ## BB#0:
    252 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm2 = [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]
    253 ; ALL-NEXT:    vpsllw $5, %ymm2, %ymm2
    254 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]
    255 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm4 = 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]
    256 ; ALL-NEXT:    vpsraw $4, %ymm4, %ymm5
    257 ; ALL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
    258 ; ALL-NEXT:    vpsraw $2, %ymm4, %ymm5
    259 ; ALL-NEXT:    vpaddw %ymm3, %ymm3, %ymm6
    260 ; ALL-NEXT:    vpblendvb %ymm6, %ymm5, %ymm4, %ymm4
    261 ; ALL-NEXT:    vpsraw $1, %ymm4, %ymm5
    262 ; ALL-NEXT:    vpaddw %ymm6, %ymm6, %ymm7
    263 ; ALL-NEXT:    vpblendvb %ymm7, %ymm5, %ymm4, %ymm4
    264 ; ALL-NEXT:    vpsrlw $8, %ymm4, %ymm4
    265 ; ALL-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]
    266 ; ALL-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]
    267 ; ALL-NEXT:    vpsraw $4, %ymm0, %ymm5
    268 ; ALL-NEXT:    vpblendvb %ymm2, %ymm5, %ymm0, %ymm0
    269 ; ALL-NEXT:    vpsraw $2, %ymm0, %ymm5
    270 ; ALL-NEXT:    vpaddw %ymm2, %ymm2, %ymm8
    271 ; ALL-NEXT:    vpblendvb %ymm8, %ymm5, %ymm0, %ymm0
    272 ; ALL-NEXT:    vpsraw $1, %ymm0, %ymm5
    273 ; ALL-NEXT:    vpaddw %ymm8, %ymm8, %ymm9
    274 ; ALL-NEXT:    vpblendvb %ymm9, %ymm5, %ymm0, %ymm0
    275 ; ALL-NEXT:    vpsrlw $8, %ymm0, %ymm0
    276 ; ALL-NEXT:    vpackuswb %ymm4, %ymm0, %ymm0
    277 ; ALL-NEXT:    vpunpckhbw {{.*#+}} ymm4 = 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]
    278 ; ALL-NEXT:    vpsraw $4, %ymm4, %ymm5
    279 ; ALL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
    280 ; ALL-NEXT:    vpsraw $2, %ymm3, %ymm4
    281 ; ALL-NEXT:    vpblendvb %ymm6, %ymm4, %ymm3, %ymm3
    282 ; ALL-NEXT:    vpsraw $1, %ymm3, %ymm4
    283 ; ALL-NEXT:    vpblendvb %ymm7, %ymm4, %ymm3, %ymm3
    284 ; ALL-NEXT:    vpsrlw $8, %ymm3, %ymm3
    285 ; ALL-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]
    286 ; ALL-NEXT:    vpsraw $4, %ymm1, %ymm4
    287 ; ALL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm1, %ymm1
    288 ; ALL-NEXT:    vpsraw $2, %ymm1, %ymm2
    289 ; ALL-NEXT:    vpblendvb %ymm8, %ymm2, %ymm1, %ymm1
    290 ; ALL-NEXT:    vpsraw $1, %ymm1, %ymm2
    291 ; ALL-NEXT:    vpblendvb %ymm9, %ymm2, %ymm1, %ymm1
    292 ; ALL-NEXT:    vpsrlw $8, %ymm1, %ymm1
    293 ; ALL-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
    294 ; ALL-NEXT:    retq
    295   %shift = ashr <64 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, 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>
    296   ret <64 x i8> %shift
    297 }
    298 
    299 ;
    300 ; Uniform Constant Shifts
    301 ;
    302 
    303 define <8 x i64> @splatconstant_shift_v8i64(<8 x i64> %a) nounwind {
    304 ; ALL-LABEL: splatconstant_shift_v8i64:
    305 ; ALL:       ## BB#0:
    306 ; ALL-NEXT:    vpsraq $7, %zmm0, %zmm0
    307 ; ALL-NEXT:    retq
    308   %shift = ashr <8 x i64> %a, <i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7>
    309   ret <8 x i64> %shift
    310 }
    311 
    312 define <16 x i32> @splatconstant_shift_v16i32(<16 x i32> %a) nounwind {
    313 ; ALL-LABEL: splatconstant_shift_v16i32:
    314 ; ALL:       ## BB#0:
    315 ; ALL-NEXT:    vpsrad $5, %zmm0, %zmm0
    316 ; ALL-NEXT:    retq
    317   %shift = ashr <16 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
    318   ret <16 x i32> %shift
    319 }
    320 
    321 define <32 x i16> @splatconstant_shift_v32i16(<32 x i16> %a) nounwind {
    322 ; ALL-LABEL: splatconstant_shift_v32i16:
    323 ; ALL:       ## BB#0:
    324 ; ALL-NEXT:    vpsraw $3, %ymm0, %ymm0
    325 ; ALL-NEXT:    vpsraw $3, %ymm1, %ymm1
    326 ; ALL-NEXT:    retq
    327   %shift = ashr <32 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, 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>
    328   ret <32 x i16> %shift
    329 }
    330 
    331 define <64 x i8> @splatconstant_shift_v64i8(<64 x i8> %a) nounwind {
    332 ; ALL-LABEL: splatconstant_shift_v64i8:
    333 ; ALL:       ## BB#0:
    334 ; ALL-NEXT:    vpsrlw $3, %ymm0, %ymm0
    335 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]
    336 ; ALL-NEXT:    vpand %ymm2, %ymm0, %ymm0
    337 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm3 = [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]
    338 ; ALL-NEXT:    vpxor %ymm3, %ymm0, %ymm0
    339 ; ALL-NEXT:    vpsubb %ymm3, %ymm0, %ymm0
    340 ; ALL-NEXT:    vpsrlw $3, %ymm1, %ymm1
    341 ; ALL-NEXT:    vpand %ymm2, %ymm1, %ymm1
    342 ; ALL-NEXT:    vpxor %ymm3, %ymm1, %ymm1
    343 ; ALL-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
    344 ; ALL-NEXT:    retq
    345   %shift = ashr <64 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, 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>
    346   ret <64 x i8> %shift
    347 }
    348