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