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-prefixes=AVX,AVX1
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
      4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F
      5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
      6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW
      7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLBW
      8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX1
      9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX2
     10 
     11 ;
     12 ; Variable Rotates
     13 ;
     14 
     15 define <4 x i64> @var_rotate_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
     16 ; AVX1-LABEL: var_rotate_v4i64:
     17 ; AVX1:       # %bb.0:
     18 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [64,64]
     19 ; AVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm3
     20 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
     21 ; AVX1-NEXT:    vpsubq %xmm4, %xmm2, %xmm2
     22 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
     23 ; AVX1-NEXT:    vpsllq %xmm4, %xmm5, %xmm6
     24 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[2,3,0,1]
     25 ; AVX1-NEXT:    vpsllq %xmm4, %xmm5, %xmm4
     26 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm6[0,1,2,3],xmm4[4,5,6,7]
     27 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm6
     28 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
     29 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm1
     30 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm6[0,1,2,3],xmm1[4,5,6,7]
     31 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm1
     32 ; AVX1-NEXT:    vpsrlq %xmm2, %xmm5, %xmm4
     33 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
     34 ; AVX1-NEXT:    vpsrlq %xmm2, %xmm5, %xmm2
     35 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
     36 ; AVX1-NEXT:    vpsrlq %xmm3, %xmm0, %xmm4
     37 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]
     38 ; AVX1-NEXT:    vpsrlq %xmm3, %xmm0, %xmm0
     39 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm4[0,1,2,3],xmm0[4,5,6,7]
     40 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
     41 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
     42 ; AVX1-NEXT:    retq
     43 ;
     44 ; AVX2-LABEL: var_rotate_v4i64:
     45 ; AVX2:       # %bb.0:
     46 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [64,64,64,64]
     47 ; AVX2-NEXT:    vpsubq %ymm1, %ymm2, %ymm2
     48 ; AVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm1
     49 ; AVX2-NEXT:    vpsrlvq %ymm2, %ymm0, %ymm0
     50 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
     51 ; AVX2-NEXT:    retq
     52 ;
     53 ; AVX512F-LABEL: var_rotate_v4i64:
     54 ; AVX512F:       # %bb.0:
     55 ; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
     56 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
     57 ; AVX512F-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
     58 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
     59 ; AVX512F-NEXT:    retq
     60 ;
     61 ; AVX512VL-LABEL: var_rotate_v4i64:
     62 ; AVX512VL:       # %bb.0:
     63 ; AVX512VL-NEXT:    vprolvq %ymm1, %ymm0, %ymm0
     64 ; AVX512VL-NEXT:    retq
     65 ;
     66 ; AVX512BW-LABEL: var_rotate_v4i64:
     67 ; AVX512BW:       # %bb.0:
     68 ; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
     69 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
     70 ; AVX512BW-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
     71 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
     72 ; AVX512BW-NEXT:    retq
     73 ;
     74 ; AVX512VLBW-LABEL: var_rotate_v4i64:
     75 ; AVX512VLBW:       # %bb.0:
     76 ; AVX512VLBW-NEXT:    vprolvq %ymm1, %ymm0, %ymm0
     77 ; AVX512VLBW-NEXT:    retq
     78 ;
     79 ; XOPAVX1-LABEL: var_rotate_v4i64:
     80 ; XOPAVX1:       # %bb.0:
     81 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
     82 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
     83 ; XOPAVX1-NEXT:    vprotq %xmm2, %xmm3, %xmm2
     84 ; XOPAVX1-NEXT:    vprotq %xmm1, %xmm0, %xmm0
     85 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
     86 ; XOPAVX1-NEXT:    retq
     87 ;
     88 ; XOPAVX2-LABEL: var_rotate_v4i64:
     89 ; XOPAVX2:       # %bb.0:
     90 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
     91 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
     92 ; XOPAVX2-NEXT:    vprotq %xmm2, %xmm3, %xmm2
     93 ; XOPAVX2-NEXT:    vprotq %xmm1, %xmm0, %xmm0
     94 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
     95 ; XOPAVX2-NEXT:    retq
     96   %b64 = sub <4 x i64> <i64 64, i64 64, i64 64, i64 64>, %b
     97   %shl = shl <4 x i64> %a, %b
     98   %lshr = lshr <4 x i64> %a, %b64
     99   %or = or <4 x i64> %shl, %lshr
    100   ret <4 x i64> %or
    101 }
    102 
    103 define <8 x i32> @var_rotate_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
    104 ; AVX1-LABEL: var_rotate_v8i32:
    105 ; AVX1:       # %bb.0:
    106 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    107 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
    108 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
    109 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
    110 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
    111 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
    112 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
    113 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
    114 ; AVX1-NEXT:    vpmuludq %xmm4, %xmm6, %xmm4
    115 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
    116 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
    117 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm5[0,1],xmm4[2,3],xmm5[4,5],xmm4[6,7]
    118 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[0,0,2,2]
    119 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
    120 ; AVX1-NEXT:    vpor %xmm5, %xmm2, %xmm2
    121 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
    122 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
    123 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
    124 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
    125 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
    126 ; AVX1-NEXT:    vpmuludq %xmm3, %xmm4, %xmm3
    127 ; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
    128 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
    129 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
    130 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[0,0,2,2]
    131 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
    132 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
    133 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    134 ; AVX1-NEXT:    retq
    135 ;
    136 ; AVX2-LABEL: var_rotate_v8i32:
    137 ; AVX2:       # %bb.0:
    138 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm2
    139 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [32,32,32,32,32,32,32,32]
    140 ; AVX2-NEXT:    vpsubd %ymm1, %ymm3, %ymm1
    141 ; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
    142 ; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
    143 ; AVX2-NEXT:    retq
    144 ;
    145 ; AVX512F-LABEL: var_rotate_v8i32:
    146 ; AVX512F:       # %bb.0:
    147 ; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
    148 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    149 ; AVX512F-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
    150 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
    151 ; AVX512F-NEXT:    retq
    152 ;
    153 ; AVX512VL-LABEL: var_rotate_v8i32:
    154 ; AVX512VL:       # %bb.0:
    155 ; AVX512VL-NEXT:    vprolvd %ymm1, %ymm0, %ymm0
    156 ; AVX512VL-NEXT:    retq
    157 ;
    158 ; AVX512BW-LABEL: var_rotate_v8i32:
    159 ; AVX512BW:       # %bb.0:
    160 ; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
    161 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    162 ; AVX512BW-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
    163 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
    164 ; AVX512BW-NEXT:    retq
    165 ;
    166 ; AVX512VLBW-LABEL: var_rotate_v8i32:
    167 ; AVX512VLBW:       # %bb.0:
    168 ; AVX512VLBW-NEXT:    vprolvd %ymm1, %ymm0, %ymm0
    169 ; AVX512VLBW-NEXT:    retq
    170 ;
    171 ; XOPAVX1-LABEL: var_rotate_v8i32:
    172 ; XOPAVX1:       # %bb.0:
    173 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    174 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    175 ; XOPAVX1-NEXT:    vprotd %xmm2, %xmm3, %xmm2
    176 ; XOPAVX1-NEXT:    vprotd %xmm1, %xmm0, %xmm0
    177 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    178 ; XOPAVX1-NEXT:    retq
    179 ;
    180 ; XOPAVX2-LABEL: var_rotate_v8i32:
    181 ; XOPAVX2:       # %bb.0:
    182 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
    183 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
    184 ; XOPAVX2-NEXT:    vprotd %xmm2, %xmm3, %xmm2
    185 ; XOPAVX2-NEXT:    vprotd %xmm1, %xmm0, %xmm0
    186 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    187 ; XOPAVX2-NEXT:    retq
    188   %b32 = sub <8 x i32> <i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32>, %b
    189   %shl = shl <8 x i32> %a, %b
    190   %lshr = lshr <8 x i32> %a, %b32
    191   %or = or <8 x i32> %shl, %lshr
    192   ret <8 x i32> %or
    193 }
    194 
    195 define <16 x i16> @var_rotate_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
    196 ; AVX1-LABEL: var_rotate_v16i16:
    197 ; AVX1:       # %bb.0:
    198 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    199 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
    200 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm4 = xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
    201 ; AVX1-NEXT:    vpslld $23, %xmm4, %xmm4
    202 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]
    203 ; AVX1-NEXT:    vpaddd %xmm5, %xmm4, %xmm4
    204 ; AVX1-NEXT:    vcvttps2dq %xmm4, %xmm4
    205 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
    206 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
    207 ; AVX1-NEXT:    vpaddd %xmm5, %xmm2, %xmm2
    208 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
    209 ; AVX1-NEXT:    vpackusdw %xmm4, %xmm2, %xmm2
    210 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
    211 ; AVX1-NEXT:    vpmulhuw %xmm2, %xmm4, %xmm6
    212 ; AVX1-NEXT:    vpmullw %xmm2, %xmm4, %xmm2
    213 ; AVX1-NEXT:    vpor %xmm6, %xmm2, %xmm2
    214 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm3 = xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
    215 ; AVX1-NEXT:    vpslld $23, %xmm3, %xmm3
    216 ; AVX1-NEXT:    vpaddd %xmm5, %xmm3, %xmm3
    217 ; AVX1-NEXT:    vcvttps2dq %xmm3, %xmm3
    218 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
    219 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
    220 ; AVX1-NEXT:    vpaddd %xmm5, %xmm1, %xmm1
    221 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
    222 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
    223 ; AVX1-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm3
    224 ; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
    225 ; AVX1-NEXT:    vpor %xmm3, %xmm0, %xmm0
    226 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    227 ; AVX1-NEXT:    retq
    228 ;
    229 ; AVX2-LABEL: var_rotate_v16i16:
    230 ; AVX2:       # %bb.0:
    231 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    232 ; 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]
    233 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
    234 ; AVX2-NEXT:    vpsllvd %ymm3, %ymm4, %ymm3
    235 ; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
    236 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm5 = 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]
    237 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
    238 ; AVX2-NEXT:    vpsllvd %ymm5, %ymm0, %ymm5
    239 ; AVX2-NEXT:    vpsrld $16, %ymm5, %ymm5
    240 ; AVX2-NEXT:    vpackusdw %ymm3, %ymm5, %ymm3
    241 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
    242 ; AVX2-NEXT:    vpsubw %ymm1, %ymm5, %ymm1
    243 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm5 = 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]
    244 ; AVX2-NEXT:    vpsrlvd %ymm5, %ymm4, %ymm4
    245 ; AVX2-NEXT:    vpsrld $16, %ymm4, %ymm4
    246 ; 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]
    247 ; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
    248 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
    249 ; AVX2-NEXT:    vpackusdw %ymm4, %ymm0, %ymm0
    250 ; AVX2-NEXT:    vpor %ymm0, %ymm3, %ymm0
    251 ; AVX2-NEXT:    retq
    252 ;
    253 ; AVX512F-LABEL: var_rotate_v16i16:
    254 ; AVX512F:       # %bb.0:
    255 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm2 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
    256 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
    257 ; AVX512F-NEXT:    vpsllvd %zmm2, %zmm0, %zmm2
    258 ; AVX512F-NEXT:    vpmovdw %zmm2, %ymm2
    259 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
    260 ; AVX512F-NEXT:    vpsubw %ymm1, %ymm3, %ymm1
    261 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
    262 ; AVX512F-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
    263 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
    264 ; AVX512F-NEXT:    vpor %ymm0, %ymm2, %ymm0
    265 ; AVX512F-NEXT:    retq
    266 ;
    267 ; AVX512VL-LABEL: var_rotate_v16i16:
    268 ; AVX512VL:       # %bb.0:
    269 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm2 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
    270 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
    271 ; AVX512VL-NEXT:    vpsllvd %zmm2, %zmm0, %zmm2
    272 ; AVX512VL-NEXT:    vpmovdw %zmm2, %ymm2
    273 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
    274 ; AVX512VL-NEXT:    vpsubw %ymm1, %ymm3, %ymm1
    275 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
    276 ; AVX512VL-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
    277 ; AVX512VL-NEXT:    vpmovdw %zmm0, %ymm0
    278 ; AVX512VL-NEXT:    vpor %ymm0, %ymm2, %ymm0
    279 ; AVX512VL-NEXT:    retq
    280 ;
    281 ; AVX512BW-LABEL: var_rotate_v16i16:
    282 ; AVX512BW:       # %bb.0:
    283 ; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
    284 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    285 ; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm2
    286 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
    287 ; AVX512BW-NEXT:    vpsubw %ymm1, %ymm3, %ymm1
    288 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
    289 ; AVX512BW-NEXT:    vpor %ymm0, %ymm2, %ymm0
    290 ; AVX512BW-NEXT:    retq
    291 ;
    292 ; AVX512VLBW-LABEL: var_rotate_v16i16:
    293 ; AVX512VLBW:       # %bb.0:
    294 ; AVX512VLBW-NEXT:    vpsllvw %ymm1, %ymm0, %ymm2
    295 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
    296 ; AVX512VLBW-NEXT:    vpsubw %ymm1, %ymm3, %ymm1
    297 ; AVX512VLBW-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
    298 ; AVX512VLBW-NEXT:    vpor %ymm0, %ymm2, %ymm0
    299 ; AVX512VLBW-NEXT:    retq
    300 ;
    301 ; XOPAVX1-LABEL: var_rotate_v16i16:
    302 ; XOPAVX1:       # %bb.0:
    303 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    304 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    305 ; XOPAVX1-NEXT:    vprotw %xmm2, %xmm3, %xmm2
    306 ; XOPAVX1-NEXT:    vprotw %xmm1, %xmm0, %xmm0
    307 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    308 ; XOPAVX1-NEXT:    retq
    309 ;
    310 ; XOPAVX2-LABEL: var_rotate_v16i16:
    311 ; XOPAVX2:       # %bb.0:
    312 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
    313 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
    314 ; XOPAVX2-NEXT:    vprotw %xmm2, %xmm3, %xmm2
    315 ; XOPAVX2-NEXT:    vprotw %xmm1, %xmm0, %xmm0
    316 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    317 ; XOPAVX2-NEXT:    retq
    318   %b16 = sub <16 x i16> <i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16>, %b
    319   %shl = shl <16 x i16> %a, %b
    320   %lshr = lshr <16 x i16> %a, %b16
    321   %or = or <16 x i16> %shl, %lshr
    322   ret <16 x i16> %or
    323 }
    324 
    325 define <32 x i8> @var_rotate_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
    326 ; AVX1-LABEL: var_rotate_v32i8:
    327 ; AVX1:       # %bb.0:
    328 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    329 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm3
    330 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
    331 ; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm3
    332 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm5
    333 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm9 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
    334 ; AVX1-NEXT:    vpand %xmm9, %xmm5, %xmm5
    335 ; AVX1-NEXT:    vpor %xmm3, %xmm5, %xmm3
    336 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
    337 ; AVX1-NEXT:    vpsllw $5, %xmm5, %xmm5
    338 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
    339 ; AVX1-NEXT:    vpsrlw $6, %xmm2, %xmm3
    340 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm10 = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
    341 ; AVX1-NEXT:    vpand %xmm10, %xmm3, %xmm3
    342 ; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm4
    343 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
    344 ; AVX1-NEXT:    vpand %xmm6, %xmm4, %xmm4
    345 ; AVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3
    346 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm4
    347 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm2, %xmm2
    348 ; AVX1-NEXT:    vpsrlw $7, %xmm2, %xmm3
    349 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    350 ; AVX1-NEXT:    vpand %xmm5, %xmm3, %xmm3
    351 ; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm7
    352 ; AVX1-NEXT:    vpor %xmm3, %xmm7, %xmm3
    353 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm4
    354 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm2, %xmm2
    355 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm3
    356 ; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm3
    357 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm4
    358 ; AVX1-NEXT:    vpand %xmm9, %xmm4, %xmm4
    359 ; AVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3
    360 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
    361 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
    362 ; AVX1-NEXT:    vpsrlw $6, %xmm0, %xmm3
    363 ; AVX1-NEXT:    vpand %xmm10, %xmm3, %xmm3
    364 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm4
    365 ; AVX1-NEXT:    vpand %xmm6, %xmm4, %xmm4
    366 ; AVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3
    367 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    368 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
    369 ; AVX1-NEXT:    vpsrlw $7, %xmm0, %xmm3
    370 ; AVX1-NEXT:    vpand %xmm5, %xmm3, %xmm3
    371 ; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm4
    372 ; AVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3
    373 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    374 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
    375 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    376 ; AVX1-NEXT:    retq
    377 ;
    378 ; AVX2-LABEL: var_rotate_v32i8:
    379 ; AVX2:       # %bb.0:
    380 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm2
    381 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    382 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm3
    383 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    384 ; AVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2
    385 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
    386 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    387 ; AVX2-NEXT:    vpsrlw $6, %ymm0, %ymm2
    388 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    389 ; AVX2-NEXT:    vpsllw $2, %ymm0, %ymm3
    390 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    391 ; AVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2
    392 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    393 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    394 ; AVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
    395 ; AVX2-NEXT:    vpsrlw $7, %ymm0, %ymm3
    396 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    397 ; AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm2
    398 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    399 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    400 ; AVX2-NEXT:    retq
    401 ;
    402 ; AVX512F-LABEL: var_rotate_v32i8:
    403 ; AVX512F:       # %bb.0:
    404 ; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm2
    405 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    406 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm3
    407 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    408 ; AVX512F-NEXT:    vpor %ymm2, %ymm3, %ymm2
    409 ; AVX512F-NEXT:    vpsllw $5, %ymm1, %ymm1
    410 ; AVX512F-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    411 ; AVX512F-NEXT:    vpsrlw $6, %ymm0, %ymm2
    412 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    413 ; AVX512F-NEXT:    vpsllw $2, %ymm0, %ymm3
    414 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    415 ; AVX512F-NEXT:    vpor %ymm2, %ymm3, %ymm2
    416 ; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    417 ; AVX512F-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    418 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
    419 ; AVX512F-NEXT:    vpsrlw $7, %ymm0, %ymm3
    420 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    421 ; AVX512F-NEXT:    vpor %ymm3, %ymm2, %ymm2
    422 ; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    423 ; AVX512F-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    424 ; AVX512F-NEXT:    retq
    425 ;
    426 ; AVX512VL-LABEL: var_rotate_v32i8:
    427 ; AVX512VL:       # %bb.0:
    428 ; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm2
    429 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    430 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm3
    431 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    432 ; AVX512VL-NEXT:    vpor %ymm2, %ymm3, %ymm2
    433 ; AVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1
    434 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    435 ; AVX512VL-NEXT:    vpsrlw $6, %ymm0, %ymm2
    436 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    437 ; AVX512VL-NEXT:    vpsllw $2, %ymm0, %ymm3
    438 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    439 ; AVX512VL-NEXT:    vpor %ymm2, %ymm3, %ymm2
    440 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    441 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    442 ; AVX512VL-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
    443 ; AVX512VL-NEXT:    vpsrlw $7, %ymm0, %ymm3
    444 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    445 ; AVX512VL-NEXT:    vpor %ymm3, %ymm2, %ymm2
    446 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    447 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    448 ; AVX512VL-NEXT:    retq
    449 ;
    450 ; AVX512BW-LABEL: var_rotate_v32i8:
    451 ; AVX512BW:       # %bb.0:
    452 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm2 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
    453 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
    454 ; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm2
    455 ; AVX512BW-NEXT:    vpmovwb %zmm2, %ymm2
    456 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
    457 ; AVX512BW-NEXT:    vpsubb %ymm1, %ymm3, %ymm1
    458 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
    459 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
    460 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
    461 ; AVX512BW-NEXT:    vpor %ymm0, %ymm2, %ymm0
    462 ; AVX512BW-NEXT:    retq
    463 ;
    464 ; AVX512VLBW-LABEL: var_rotate_v32i8:
    465 ; AVX512VLBW:       # %bb.0:
    466 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm2 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
    467 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
    468 ; AVX512VLBW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm2
    469 ; AVX512VLBW-NEXT:    vpmovwb %zmm2, %ymm2
    470 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
    471 ; AVX512VLBW-NEXT:    vpsubb %ymm1, %ymm3, %ymm1
    472 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
    473 ; AVX512VLBW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
    474 ; AVX512VLBW-NEXT:    vpmovwb %zmm0, %ymm0
    475 ; AVX512VLBW-NEXT:    vpor %ymm0, %ymm2, %ymm0
    476 ; AVX512VLBW-NEXT:    retq
    477 ;
    478 ; XOPAVX1-LABEL: var_rotate_v32i8:
    479 ; XOPAVX1:       # %bb.0:
    480 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    481 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    482 ; XOPAVX1-NEXT:    vprotb %xmm2, %xmm3, %xmm2
    483 ; XOPAVX1-NEXT:    vprotb %xmm1, %xmm0, %xmm0
    484 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    485 ; XOPAVX1-NEXT:    retq
    486 ;
    487 ; XOPAVX2-LABEL: var_rotate_v32i8:
    488 ; XOPAVX2:       # %bb.0:
    489 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
    490 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
    491 ; XOPAVX2-NEXT:    vprotb %xmm2, %xmm3, %xmm2
    492 ; XOPAVX2-NEXT:    vprotb %xmm1, %xmm0, %xmm0
    493 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    494 ; XOPAVX2-NEXT:    retq
    495   %b8 = sub <32 x i8> <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8>, %b
    496   %shl = shl <32 x i8> %a, %b
    497   %lshr = lshr <32 x i8> %a, %b8
    498   %or = or <32 x i8> %shl, %lshr
    499   ret <32 x i8> %or
    500 }
    501 
    502 ;
    503 ; Uniform Variable Rotates
    504 ;
    505 
    506 define <4 x i64> @splatvar_rotate_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
    507 ; AVX1-LABEL: splatvar_rotate_v4i64:
    508 ; AVX1:       # %bb.0:
    509 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = xmm1[0,0]
    510 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [64,64]
    511 ; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm2
    512 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    513 ; AVX1-NEXT:    vpsllq %xmm1, %xmm3, %xmm4
    514 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm1
    515 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm1
    516 ; AVX1-NEXT:    vpsrlq %xmm2, %xmm3, %xmm3
    517 ; AVX1-NEXT:    vpsrlq %xmm2, %xmm0, %xmm0
    518 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
    519 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
    520 ; AVX1-NEXT:    retq
    521 ;
    522 ; AVX2-LABEL: splatvar_rotate_v4i64:
    523 ; AVX2:       # %bb.0:
    524 ; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm2
    525 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [64,64,64,64]
    526 ; AVX2-NEXT:    vpsubq %ymm2, %ymm3, %ymm2
    527 ; AVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm1
    528 ; AVX2-NEXT:    vpsrlvq %ymm2, %ymm0, %ymm0
    529 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
    530 ; AVX2-NEXT:    retq
    531 ;
    532 ; AVX512F-LABEL: splatvar_rotate_v4i64:
    533 ; AVX512F:       # %bb.0:
    534 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    535 ; AVX512F-NEXT:    vpbroadcastq %xmm1, %ymm1
    536 ; AVX512F-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
    537 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
    538 ; AVX512F-NEXT:    retq
    539 ;
    540 ; AVX512VL-LABEL: splatvar_rotate_v4i64:
    541 ; AVX512VL:       # %bb.0:
    542 ; AVX512VL-NEXT:    vpbroadcastq %xmm1, %ymm1
    543 ; AVX512VL-NEXT:    vprolvq %ymm1, %ymm0, %ymm0
    544 ; AVX512VL-NEXT:    retq
    545 ;
    546 ; AVX512BW-LABEL: splatvar_rotate_v4i64:
    547 ; AVX512BW:       # %bb.0:
    548 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    549 ; AVX512BW-NEXT:    vpbroadcastq %xmm1, %ymm1
    550 ; AVX512BW-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
    551 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
    552 ; AVX512BW-NEXT:    retq
    553 ;
    554 ; AVX512VLBW-LABEL: splatvar_rotate_v4i64:
    555 ; AVX512VLBW:       # %bb.0:
    556 ; AVX512VLBW-NEXT:    vpbroadcastq %xmm1, %ymm1
    557 ; AVX512VLBW-NEXT:    vprolvq %ymm1, %ymm0, %ymm0
    558 ; AVX512VLBW-NEXT:    retq
    559 ;
    560 ; XOPAVX1-LABEL: splatvar_rotate_v4i64:
    561 ; XOPAVX1:       # %bb.0:
    562 ; XOPAVX1-NEXT:    vmovddup {{.*#+}} xmm1 = xmm1[0,0]
    563 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    564 ; XOPAVX1-NEXT:    vprotq %xmm1, %xmm2, %xmm2
    565 ; XOPAVX1-NEXT:    vprotq %xmm1, %xmm0, %xmm0
    566 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    567 ; XOPAVX1-NEXT:    retq
    568 ;
    569 ; XOPAVX2-LABEL: splatvar_rotate_v4i64:
    570 ; XOPAVX2:       # %bb.0:
    571 ; XOPAVX2-NEXT:    vpbroadcastq %xmm1, %ymm1
    572 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
    573 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
    574 ; XOPAVX2-NEXT:    vprotq %xmm3, %xmm2, %xmm2
    575 ; XOPAVX2-NEXT:    vprotq %xmm1, %xmm0, %xmm0
    576 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    577 ; XOPAVX2-NEXT:    retq
    578   %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
    579   %splat64 = sub <4 x i64> <i64 64, i64 64, i64 64, i64 64>, %splat
    580   %shl = shl <4 x i64> %a, %splat
    581   %lshr = lshr <4 x i64> %a, %splat64
    582   %or = or <4 x i64> %shl, %lshr
    583   ret <4 x i64> %or
    584 }
    585 
    586 define <8 x i32> @splatvar_rotate_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
    587 ; AVX1-LABEL: splatvar_rotate_v8i32:
    588 ; AVX1:       # %bb.0:
    589 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[0,0,0,0]
    590 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    591 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
    592 ; AVX1-NEXT:    vpslld %xmm1, %xmm3, %xmm4
    593 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [32,32,32,32]
    594 ; AVX1-NEXT:    vpsubd %xmm2, %xmm5, %xmm2
    595 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
    596 ; AVX1-NEXT:    vpsrld %xmm2, %xmm3, %xmm3
    597 ; AVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3
    598 ; AVX1-NEXT:    vpslld %xmm1, %xmm0, %xmm1
    599 ; AVX1-NEXT:    vpsrld %xmm2, %xmm0, %xmm0
    600 ; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
    601 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
    602 ; AVX1-NEXT:    retq
    603 ;
    604 ; AVX2-LABEL: splatvar_rotate_v8i32:
    605 ; AVX2:       # %bb.0:
    606 ; AVX2-NEXT:    vpbroadcastd %xmm1, %ymm2
    607 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
    608 ; AVX2-NEXT:    vpslld %xmm1, %ymm0, %ymm1
    609 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [32,32,32,32,32,32,32,32]
    610 ; AVX2-NEXT:    vpsubd %ymm2, %ymm3, %ymm2
    611 ; AVX2-NEXT:    vpsrlvd %ymm2, %ymm0, %ymm0
    612 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
    613 ; AVX2-NEXT:    retq
    614 ;
    615 ; AVX512F-LABEL: splatvar_rotate_v8i32:
    616 ; AVX512F:       # %bb.0:
    617 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    618 ; AVX512F-NEXT:    vpbroadcastd %xmm1, %ymm1
    619 ; AVX512F-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
    620 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
    621 ; AVX512F-NEXT:    retq
    622 ;
    623 ; AVX512VL-LABEL: splatvar_rotate_v8i32:
    624 ; AVX512VL:       # %bb.0:
    625 ; AVX512VL-NEXT:    vpbroadcastd %xmm1, %ymm1
    626 ; AVX512VL-NEXT:    vprolvd %ymm1, %ymm0, %ymm0
    627 ; AVX512VL-NEXT:    retq
    628 ;
    629 ; AVX512BW-LABEL: splatvar_rotate_v8i32:
    630 ; AVX512BW:       # %bb.0:
    631 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    632 ; AVX512BW-NEXT:    vpbroadcastd %xmm1, %ymm1
    633 ; AVX512BW-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
    634 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
    635 ; AVX512BW-NEXT:    retq
    636 ;
    637 ; AVX512VLBW-LABEL: splatvar_rotate_v8i32:
    638 ; AVX512VLBW:       # %bb.0:
    639 ; AVX512VLBW-NEXT:    vpbroadcastd %xmm1, %ymm1
    640 ; AVX512VLBW-NEXT:    vprolvd %ymm1, %ymm0, %ymm0
    641 ; AVX512VLBW-NEXT:    retq
    642 ;
    643 ; XOPAVX1-LABEL: splatvar_rotate_v8i32:
    644 ; XOPAVX1:       # %bb.0:
    645 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
    646 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    647 ; XOPAVX1-NEXT:    vprotd %xmm1, %xmm2, %xmm2
    648 ; XOPAVX1-NEXT:    vprotd %xmm1, %xmm0, %xmm0
    649 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    650 ; XOPAVX1-NEXT:    retq
    651 ;
    652 ; XOPAVX2-LABEL: splatvar_rotate_v8i32:
    653 ; XOPAVX2:       # %bb.0:
    654 ; XOPAVX2-NEXT:    vpbroadcastd %xmm1, %ymm1
    655 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
    656 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
    657 ; XOPAVX2-NEXT:    vprotd %xmm3, %xmm2, %xmm2
    658 ; XOPAVX2-NEXT:    vprotd %xmm1, %xmm0, %xmm0
    659 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    660 ; XOPAVX2-NEXT:    retq
    661   %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
    662   %splat32 = sub <8 x i32> <i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32>, %splat
    663   %shl = shl <8 x i32> %a, %splat
    664   %lshr = lshr <8 x i32> %a, %splat32
    665   %or = or <8 x i32> %shl, %lshr
    666   ret <8 x i32> %or
    667 }
    668 
    669 define <16 x i16> @splatvar_rotate_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
    670 ; AVX1-LABEL: splatvar_rotate_v16i16:
    671 ; AVX1:       # %bb.0:
    672 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm2 = xmm1[0,0,2,3,4,5,6,7]
    673 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
    674 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    675 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
    676 ; AVX1-NEXT:    vpsllw %xmm1, %xmm3, %xmm4
    677 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [16,16,16,16,16,16,16,16]
    678 ; AVX1-NEXT:    vpsubw %xmm2, %xmm5, %xmm2
    679 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
    680 ; AVX1-NEXT:    vpsrlw %xmm2, %xmm3, %xmm3
    681 ; AVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3
    682 ; AVX1-NEXT:    vpsllw %xmm1, %xmm0, %xmm1
    683 ; AVX1-NEXT:    vpsrlw %xmm2, %xmm0, %xmm0
    684 ; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
    685 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
    686 ; AVX1-NEXT:    retq
    687 ;
    688 ; AVX2-LABEL: splatvar_rotate_v16i16:
    689 ; AVX2:       # %bb.0:
    690 ; AVX2-NEXT:    vpbroadcastw %xmm1, %ymm2
    691 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
    692 ; AVX2-NEXT:    vpsllw %xmm1, %ymm0, %ymm1
    693 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
    694 ; AVX2-NEXT:    vpsubw %ymm2, %ymm3, %ymm2
    695 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
    696 ; AVX2-NEXT:    vpsrlw %xmm2, %ymm0, %ymm0
    697 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
    698 ; AVX2-NEXT:    retq
    699 ;
    700 ; AVX512F-LABEL: splatvar_rotate_v16i16:
    701 ; AVX512F:       # %bb.0:
    702 ; AVX512F-NEXT:    vpbroadcastw %xmm1, %ymm2
    703 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
    704 ; AVX512F-NEXT:    vpsllw %xmm1, %ymm0, %ymm1
    705 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
    706 ; AVX512F-NEXT:    vpsubw %ymm2, %ymm3, %ymm2
    707 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
    708 ; AVX512F-NEXT:    vpsrlw %xmm2, %ymm0, %ymm0
    709 ; AVX512F-NEXT:    vpor %ymm0, %ymm1, %ymm0
    710 ; AVX512F-NEXT:    retq
    711 ;
    712 ; AVX512VL-LABEL: splatvar_rotate_v16i16:
    713 ; AVX512VL:       # %bb.0:
    714 ; AVX512VL-NEXT:    vpbroadcastw %xmm1, %ymm2
    715 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
    716 ; AVX512VL-NEXT:    vpsllw %xmm1, %ymm0, %ymm1
    717 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
    718 ; AVX512VL-NEXT:    vpsubw %ymm2, %ymm3, %ymm2
    719 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
    720 ; AVX512VL-NEXT:    vpsrlw %xmm2, %ymm0, %ymm0
    721 ; AVX512VL-NEXT:    vpor %ymm0, %ymm1, %ymm0
    722 ; AVX512VL-NEXT:    retq
    723 ;
    724 ; AVX512BW-LABEL: splatvar_rotate_v16i16:
    725 ; AVX512BW:       # %bb.0:
    726 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    727 ; AVX512BW-NEXT:    vpbroadcastw %xmm1, %ymm2
    728 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
    729 ; AVX512BW-NEXT:    vpsubw %ymm2, %ymm3, %ymm2
    730 ; AVX512BW-NEXT:    vpsrlvw %zmm2, %zmm0, %zmm2
    731 ; AVX512BW-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
    732 ; AVX512BW-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
    733 ; AVX512BW-NEXT:    vpor %ymm2, %ymm0, %ymm0
    734 ; AVX512BW-NEXT:    retq
    735 ;
    736 ; AVX512VLBW-LABEL: splatvar_rotate_v16i16:
    737 ; AVX512VLBW:       # %bb.0:
    738 ; AVX512VLBW-NEXT:    vpbroadcastw %xmm1, %ymm2
    739 ; AVX512VLBW-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
    740 ; AVX512VLBW-NEXT:    vpsllw %xmm1, %ymm0, %ymm1
    741 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
    742 ; AVX512VLBW-NEXT:    vpsubw %ymm2, %ymm3, %ymm2
    743 ; AVX512VLBW-NEXT:    vpsrlvw %ymm2, %ymm0, %ymm0
    744 ; AVX512VLBW-NEXT:    vpor %ymm0, %ymm1, %ymm0
    745 ; AVX512VLBW-NEXT:    retq
    746 ;
    747 ; XOPAVX1-LABEL: splatvar_rotate_v16i16:
    748 ; XOPAVX1:       # %bb.0:
    749 ; XOPAVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
    750 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
    751 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    752 ; XOPAVX1-NEXT:    vprotw %xmm1, %xmm2, %xmm2
    753 ; XOPAVX1-NEXT:    vprotw %xmm1, %xmm0, %xmm0
    754 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    755 ; XOPAVX1-NEXT:    retq
    756 ;
    757 ; XOPAVX2-LABEL: splatvar_rotate_v16i16:
    758 ; XOPAVX2:       # %bb.0:
    759 ; XOPAVX2-NEXT:    vpbroadcastw %xmm1, %ymm1
    760 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
    761 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
    762 ; XOPAVX2-NEXT:    vprotw %xmm3, %xmm2, %xmm2
    763 ; XOPAVX2-NEXT:    vprotw %xmm1, %xmm0, %xmm0
    764 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    765 ; XOPAVX2-NEXT:    retq
    766   %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
    767   %splat16 = sub <16 x i16> <i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16>, %splat
    768   %shl = shl <16 x i16> %a, %splat
    769   %lshr = lshr <16 x i16> %a, %splat16
    770   %or = or <16 x i16> %shl, %lshr
    771   ret <16 x i16> %or
    772 }
    773 
    774 define <32 x i8> @splatvar_rotate_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
    775 ; AVX1-LABEL: splatvar_rotate_v32i8:
    776 ; AVX1:       # %bb.0:
    777 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    778 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
    779 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    780 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm3
    781 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
    782 ; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm3
    783 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm5
    784 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm9 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
    785 ; AVX1-NEXT:    vpand %xmm9, %xmm5, %xmm5
    786 ; AVX1-NEXT:    vpor %xmm3, %xmm5, %xmm3
    787 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
    788 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm2, %xmm2
    789 ; AVX1-NEXT:    vpsrlw $6, %xmm2, %xmm3
    790 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm10 = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
    791 ; AVX1-NEXT:    vpand %xmm10, %xmm3, %xmm3
    792 ; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm7
    793 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm11 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
    794 ; AVX1-NEXT:    vpand %xmm11, %xmm7, %xmm7
    795 ; AVX1-NEXT:    vpor %xmm3, %xmm7, %xmm3
    796 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm7
    797 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm3, %xmm2, %xmm2
    798 ; AVX1-NEXT:    vpsrlw $7, %xmm2, %xmm3
    799 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    800 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
    801 ; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm5
    802 ; AVX1-NEXT:    vpor %xmm3, %xmm5, %xmm3
    803 ; AVX1-NEXT:    vpaddb %xmm7, %xmm7, %xmm5
    804 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
    805 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm3
    806 ; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm3
    807 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm4
    808 ; AVX1-NEXT:    vpand %xmm9, %xmm4, %xmm4
    809 ; AVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3
    810 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
    811 ; AVX1-NEXT:    vpsrlw $6, %xmm0, %xmm1
    812 ; AVX1-NEXT:    vpand %xmm10, %xmm1, %xmm1
    813 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm3
    814 ; AVX1-NEXT:    vpand %xmm11, %xmm3, %xmm3
    815 ; AVX1-NEXT:    vpor %xmm1, %xmm3, %xmm1
    816 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
    817 ; AVX1-NEXT:    vpsrlw $7, %xmm0, %xmm1
    818 ; AVX1-NEXT:    vpand %xmm6, %xmm1, %xmm1
    819 ; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm3
    820 ; AVX1-NEXT:    vpor %xmm1, %xmm3, %xmm1
    821 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm1, %xmm0, %xmm0
    822 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    823 ; AVX1-NEXT:    retq
    824 ;
    825 ; AVX2-LABEL: splatvar_rotate_v32i8:
    826 ; AVX2:       # %bb.0:
    827 ; AVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
    828 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm2
    829 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    830 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm3
    831 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    832 ; AVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2
    833 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
    834 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    835 ; AVX2-NEXT:    vpsrlw $6, %ymm0, %ymm2
    836 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    837 ; AVX2-NEXT:    vpsllw $2, %ymm0, %ymm3
    838 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    839 ; AVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2
    840 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    841 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    842 ; AVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
    843 ; AVX2-NEXT:    vpsrlw $7, %ymm0, %ymm3
    844 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    845 ; AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm2
    846 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    847 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    848 ; AVX2-NEXT:    retq
    849 ;
    850 ; AVX512F-LABEL: splatvar_rotate_v32i8:
    851 ; AVX512F:       # %bb.0:
    852 ; AVX512F-NEXT:    vpbroadcastb %xmm1, %ymm1
    853 ; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm2
    854 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    855 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm3
    856 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    857 ; AVX512F-NEXT:    vpor %ymm2, %ymm3, %ymm2
    858 ; AVX512F-NEXT:    vpsllw $5, %ymm1, %ymm1
    859 ; AVX512F-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    860 ; AVX512F-NEXT:    vpsrlw $6, %ymm0, %ymm2
    861 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    862 ; AVX512F-NEXT:    vpsllw $2, %ymm0, %ymm3
    863 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    864 ; AVX512F-NEXT:    vpor %ymm2, %ymm3, %ymm2
    865 ; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    866 ; AVX512F-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    867 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
    868 ; AVX512F-NEXT:    vpsrlw $7, %ymm0, %ymm3
    869 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    870 ; AVX512F-NEXT:    vpor %ymm3, %ymm2, %ymm2
    871 ; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    872 ; AVX512F-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    873 ; AVX512F-NEXT:    retq
    874 ;
    875 ; AVX512VL-LABEL: splatvar_rotate_v32i8:
    876 ; AVX512VL:       # %bb.0:
    877 ; AVX512VL-NEXT:    vpbroadcastb %xmm1, %ymm1
    878 ; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm2
    879 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    880 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm3
    881 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    882 ; AVX512VL-NEXT:    vpor %ymm2, %ymm3, %ymm2
    883 ; AVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1
    884 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    885 ; AVX512VL-NEXT:    vpsrlw $6, %ymm0, %ymm2
    886 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
    887 ; AVX512VL-NEXT:    vpsllw $2, %ymm0, %ymm3
    888 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    889 ; AVX512VL-NEXT:    vpor %ymm2, %ymm3, %ymm2
    890 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    891 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    892 ; AVX512VL-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
    893 ; AVX512VL-NEXT:    vpsrlw $7, %ymm0, %ymm3
    894 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
    895 ; AVX512VL-NEXT:    vpor %ymm3, %ymm2, %ymm2
    896 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
    897 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
    898 ; AVX512VL-NEXT:    retq
    899 ;
    900 ; AVX512BW-LABEL: splatvar_rotate_v32i8:
    901 ; AVX512BW:       # %bb.0:
    902 ; AVX512BW-NEXT:    vpbroadcastb %xmm1, %ymm1
    903 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
    904 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm2 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
    905 ; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm2
    906 ; AVX512BW-NEXT:    vpmovwb %zmm2, %ymm2
    907 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
    908 ; AVX512BW-NEXT:    vpsubb %ymm1, %ymm3, %ymm1
    909 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
    910 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
    911 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
    912 ; AVX512BW-NEXT:    vpor %ymm0, %ymm2, %ymm0
    913 ; AVX512BW-NEXT:    retq
    914 ;
    915 ; AVX512VLBW-LABEL: splatvar_rotate_v32i8:
    916 ; AVX512VLBW:       # %bb.0:
    917 ; AVX512VLBW-NEXT:    vpbroadcastb %xmm1, %ymm1
    918 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
    919 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm2 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
    920 ; AVX512VLBW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm2
    921 ; AVX512VLBW-NEXT:    vpmovwb %zmm2, %ymm2
    922 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
    923 ; AVX512VLBW-NEXT:    vpsubb %ymm1, %ymm3, %ymm1
    924 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
    925 ; AVX512VLBW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
    926 ; AVX512VLBW-NEXT:    vpmovwb %zmm0, %ymm0
    927 ; AVX512VLBW-NEXT:    vpor %ymm0, %ymm2, %ymm0
    928 ; AVX512VLBW-NEXT:    retq
    929 ;
    930 ; XOPAVX1-LABEL: splatvar_rotate_v32i8:
    931 ; XOPAVX1:       # %bb.0:
    932 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    933 ; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
    934 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    935 ; XOPAVX1-NEXT:    vprotb %xmm1, %xmm2, %xmm2
    936 ; XOPAVX1-NEXT:    vprotb %xmm1, %xmm0, %xmm0
    937 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    938 ; XOPAVX1-NEXT:    retq
    939 ;
    940 ; XOPAVX2-LABEL: splatvar_rotate_v32i8:
    941 ; XOPAVX2:       # %bb.0:
    942 ; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
    943 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
    944 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
    945 ; XOPAVX2-NEXT:    vprotb %xmm3, %xmm2, %xmm2
    946 ; XOPAVX2-NEXT:    vprotb %xmm1, %xmm0, %xmm0
    947 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    948 ; XOPAVX2-NEXT:    retq
    949   %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
    950   %splat8 = sub <32 x i8> <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8>, %splat
    951   %shl = shl <32 x i8> %a, %splat
    952   %lshr = lshr <32 x i8> %a, %splat8
    953   %or = or <32 x i8> %shl, %lshr
    954   ret <32 x i8> %or
    955 }
    956 
    957 ;
    958 ; Constant Rotates
    959 ;
    960 
    961 define <4 x i64> @constant_rotate_v4i64(<4 x i64> %a) nounwind {
    962 ; AVX1-LABEL: constant_rotate_v4i64:
    963 ; AVX1:       # %bb.0:
    964 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    965 ; AVX1-NEXT:    vpsllq $60, %xmm1, %xmm2
    966 ; AVX1-NEXT:    vpsllq $50, %xmm1, %xmm3
    967 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
    968 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm3
    969 ; AVX1-NEXT:    vpsllq $4, %xmm0, %xmm4
    970 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
    971 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
    972 ; AVX1-NEXT:    vpsrlq $4, %xmm1, %xmm3
    973 ; AVX1-NEXT:    vpsrlq $14, %xmm1, %xmm1
    974 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]
    975 ; AVX1-NEXT:    vpsrlq $50, %xmm0, %xmm3
    976 ; AVX1-NEXT:    vpsrlq $60, %xmm0, %xmm0
    977 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
    978 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    979 ; AVX1-NEXT:    vorps %ymm0, %ymm2, %ymm0
    980 ; AVX1-NEXT:    retq
    981 ;
    982 ; AVX2-LABEL: constant_rotate_v4i64:
    983 ; AVX2:       # %bb.0:
    984 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm1
    985 ; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
    986 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
    987 ; AVX2-NEXT:    retq
    988 ;
    989 ; AVX512F-LABEL: constant_rotate_v4i64:
    990 ; AVX512F:       # %bb.0:
    991 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    992 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm1 = [4,14,50,60]
    993 ; AVX512F-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
    994 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
    995 ; AVX512F-NEXT:    retq
    996 ;
    997 ; AVX512VL-LABEL: constant_rotate_v4i64:
    998 ; AVX512VL:       # %bb.0:
    999 ; AVX512VL-NEXT:    vprolvq {{.*}}(%rip), %ymm0, %ymm0
   1000 ; AVX512VL-NEXT:    retq
   1001 ;
   1002 ; AVX512BW-LABEL: constant_rotate_v4i64:
   1003 ; AVX512BW:       # %bb.0:
   1004 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
   1005 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [4,14,50,60]
   1006 ; AVX512BW-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
   1007 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
   1008 ; AVX512BW-NEXT:    retq
   1009 ;
   1010 ; AVX512VLBW-LABEL: constant_rotate_v4i64:
   1011 ; AVX512VLBW:       # %bb.0:
   1012 ; AVX512VLBW-NEXT:    vprolvq {{.*}}(%rip), %ymm0, %ymm0
   1013 ; AVX512VLBW-NEXT:    retq
   1014 ;
   1015 ; XOPAVX1-LABEL: constant_rotate_v4i64:
   1016 ; XOPAVX1:       # %bb.0:
   1017 ; XOPAVX1-NEXT:    vprotq {{.*}}(%rip), %xmm0, %xmm1
   1018 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
   1019 ; XOPAVX1-NEXT:    vprotq {{.*}}(%rip), %xmm0, %xmm0
   1020 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
   1021 ; XOPAVX1-NEXT:    retq
   1022 ;
   1023 ; XOPAVX2-LABEL: constant_rotate_v4i64:
   1024 ; XOPAVX2:       # %bb.0:
   1025 ; XOPAVX2-NEXT:    vprotq {{.*}}(%rip), %xmm0, %xmm1
   1026 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
   1027 ; XOPAVX2-NEXT:    vprotq {{.*}}(%rip), %xmm0, %xmm0
   1028 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
   1029 ; XOPAVX2-NEXT:    retq
   1030   %shl = shl <4 x i64> %a, <i64 4, i64 14, i64 50, i64 60>
   1031   %lshr = lshr <4 x i64> %a, <i64 60, i64 50, i64 14, i64 4>
   1032   %or = or <4 x i64> %shl, %lshr
   1033   ret <4 x i64> %or
   1034 }
   1035 
   1036 define <8 x i32> @constant_rotate_v8i32(<8 x i32> %a) nounwind {
   1037 ; AVX1-LABEL: constant_rotate_v8i32:
   1038 ; AVX1:       # %bb.0:
   1039 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [256,512,1024,2048]
   1040 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
   1041 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
   1042 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
   1043 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm4, %xmm2
   1044 ; AVX1-NEXT:    vpmuludq %xmm1, %xmm3, %xmm1
   1045 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
   1046 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
   1047 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,2,2]
   1048 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
   1049 ; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
   1050 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [16,32,64,128]
   1051 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
   1052 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
   1053 ; AVX1-NEXT:    vpmuludq %xmm3, %xmm4, %xmm3
   1054 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm0, %xmm0
   1055 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
   1056 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
   1057 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[0,0,2,2]
   1058 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
   1059 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
   1060 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
   1061 ; AVX1-NEXT:    retq
   1062 ;
   1063 ; AVX2-LABEL: constant_rotate_v8i32:
   1064 ; AVX2:       # %bb.0:
   1065 ; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm0, %ymm1
   1066 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
   1067 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
   1068 ; AVX2-NEXT:    retq
   1069 ;
   1070 ; AVX512F-LABEL: constant_rotate_v8i32:
   1071 ; AVX512F:       # %bb.0:
   1072 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
   1073 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm1 = [4,5,6,7,8,9,10,11]
   1074 ; AVX512F-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
   1075 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
   1076 ; AVX512F-NEXT:    retq
   1077 ;
   1078 ; AVX512VL-LABEL: constant_rotate_v8i32:
   1079 ; AVX512VL:       # %bb.0:
   1080 ; AVX512VL-NEXT:    vprolvd {{.*}}(%rip), %ymm0, %ymm0
   1081 ; AVX512VL-NEXT:    retq
   1082 ;
   1083 ; AVX512BW-LABEL: constant_rotate_v8i32:
   1084 ; AVX512BW:       # %bb.0:
   1085 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
   1086 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [4,5,6,7,8,9,10,11]
   1087 ; AVX512BW-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
   1088 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
   1089 ; AVX512BW-NEXT:    retq
   1090 ;
   1091 ; AVX512VLBW-LABEL: constant_rotate_v8i32:
   1092 ; AVX512VLBW:       # %bb.0:
   1093 ; AVX512VLBW-NEXT:    vprolvd {{.*}}(%rip), %ymm0, %ymm0
   1094 ; AVX512VLBW-NEXT:    retq
   1095 ;
   1096 ; XOPAVX1-LABEL: constant_rotate_v8i32:
   1097 ; XOPAVX1:       # %bb.0:
   1098 ; XOPAVX1-NEXT:    vprotd {{.*}}(%rip), %xmm0, %xmm1
   1099 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
   1100 ; XOPAVX1-NEXT:    vprotd {{.*}}(%rip), %xmm0, %xmm0
   1101 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
   1102 ; XOPAVX1-NEXT:    retq
   1103 ;
   1104 ; XOPAVX2-LABEL: constant_rotate_v8i32:
   1105 ; XOPAVX2:       # %bb.0:
   1106 ; XOPAVX2-NEXT:    vprotd {{.*}}(%rip), %xmm0, %xmm1
   1107 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
   1108 ; XOPAVX2-NEXT:    vprotd {{.*}}(%rip), %xmm0, %xmm0
   1109 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
   1110 ; XOPAVX2-NEXT:    retq
   1111   %shl = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>
   1112   %lshr = lshr <8 x i32> %a, <i32 28, i32 27, i32 26, i32 25, i32 24, i32 23, i32 22, i32 21>
   1113   %or = or <8 x i32> %shl, %lshr
   1114   ret <8 x i32> %or
   1115 }
   1116 
   1117 define <16 x i16> @constant_rotate_v16i16(<16 x i16> %a) nounwind {
   1118 ; AVX1-LABEL: constant_rotate_v16i16:
   1119 ; AVX1:       # %bb.0:
   1120 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
   1121 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]
   1122 ; AVX1-NEXT:    vpmulhuw %xmm2, %xmm1, %xmm3
   1123 ; AVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
   1124 ; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
   1125 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
   1126 ; AVX1-NEXT:    vpmulhuw %xmm2, %xmm0, %xmm3
   1127 ; AVX1-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
   1128 ; AVX1-NEXT:    vpor %xmm3, %xmm0, %xmm0
   1129 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
   1130 ; AVX1-NEXT:    retq
   1131 ;
   1132 ; AVX2-LABEL: constant_rotate_v16i16:
   1133 ; AVX2:       # %bb.0:
   1134 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
   1135 ; AVX2-NEXT:    vpmulhuw %ymm1, %ymm0, %ymm2
   1136 ; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
   1137 ; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
   1138 ; AVX2-NEXT:    retq
   1139 ;
   1140 ; AVX512F-LABEL: constant_rotate_v16i16:
   1141 ; AVX512F:       # %bb.0:
   1142 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
   1143 ; AVX512F-NEXT:    vpmulhuw %ymm1, %ymm0, %ymm2
   1144 ; AVX512F-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
   1145 ; AVX512F-NEXT:    vpor %ymm2, %ymm0, %ymm0
   1146 ; AVX512F-NEXT:    retq
   1147 ;
   1148 ; AVX512VL-LABEL: constant_rotate_v16i16:
   1149 ; AVX512VL:       # %bb.0:
   1150 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
   1151 ; AVX512VL-NEXT:    vpmulhuw %ymm1, %ymm0, %ymm2
   1152 ; AVX512VL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
   1153 ; AVX512VL-NEXT:    vpor %ymm2, %ymm0, %ymm0
   1154 ; AVX512VL-NEXT:    retq
   1155 ;
   1156 ; AVX512BW-LABEL: constant_rotate_v16i16:
   1157 ; AVX512BW:       # %bb.0:
   1158 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
   1159 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
   1160 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
   1161 ; AVX512BW-NEXT:    vpsrlvw %zmm2, %zmm0, %zmm2
   1162 ; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
   1163 ; AVX512BW-NEXT:    vpor %ymm2, %ymm0, %ymm0
   1164 ; AVX512BW-NEXT:    retq
   1165 ;
   1166 ; AVX512VLBW-LABEL: constant_rotate_v16i16:
   1167 ; AVX512VLBW:       # %bb.0:
   1168 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %ymm0, %ymm1
   1169 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %ymm0, %ymm0
   1170 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
   1171 ; AVX512VLBW-NEXT:    retq
   1172 ;
   1173 ; XOPAVX1-LABEL: constant_rotate_v16i16:
   1174 ; XOPAVX1:       # %bb.0:
   1175 ; XOPAVX1-NEXT:    vprotw {{.*}}(%rip), %xmm0, %xmm1
   1176 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
   1177 ; XOPAVX1-NEXT:    vprotw {{.*}}(%rip), %xmm0, %xmm0
   1178 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
   1179 ; XOPAVX1-NEXT:    retq
   1180 ;
   1181 ; XOPAVX2-LABEL: constant_rotate_v16i16:
   1182 ; XOPAVX2:       # %bb.0:
   1183 ; XOPAVX2-NEXT:    vprotw {{.*}}(%rip), %xmm0, %xmm1
   1184 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
   1185 ; XOPAVX2-NEXT:    vprotw {{.*}}(%rip), %xmm0, %xmm0
   1186 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
   1187 ; XOPAVX2-NEXT:    retq
   1188   %shl = shl <16 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
   1189   %lshr = lshr <16 x i16> %a, <i16 16, i16 15, i16 14, i16 13, i16 12, i16 11, i16 10, i16 9, i16 8, i16 7, i16 6, i16 5, i16 4, i16 3, i16 2, i16 1>
   1190   %or = or <16 x i16> %shl, %lshr
   1191   ret <16 x i16> %or
   1192 }
   1193 
   1194 define <32 x i8> @constant_rotate_v32i8(<32 x i8> %a) nounwind {
   1195 ; AVX1-LABEL: constant_rotate_v32i8:
   1196 ; AVX1:       # %bb.0:
   1197 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
   1198 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm2
   1199 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
   1200 ; AVX1-NEXT:    vpand %xmm8, %xmm2, %xmm2
   1201 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm4
   1202 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm9 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
   1203 ; AVX1-NEXT:    vpand %xmm9, %xmm4, %xmm4
   1204 ; AVX1-NEXT:    vpor %xmm2, %xmm4, %xmm2
   1205 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [8192,24640,41088,57536,57600,41152,24704,8256]
   1206 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm1, %xmm1
   1207 ; AVX1-NEXT:    vpsrlw $6, %xmm1, %xmm2
   1208 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm10 = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
   1209 ; AVX1-NEXT:    vpand %xmm10, %xmm2, %xmm2
   1210 ; AVX1-NEXT:    vpsllw $2, %xmm1, %xmm7
   1211 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm11 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
   1212 ; AVX1-NEXT:    vpand %xmm11, %xmm7, %xmm7
   1213 ; AVX1-NEXT:    vpor %xmm2, %xmm7, %xmm2
   1214 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm7
   1215 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm2, %xmm1, %xmm1
   1216 ; AVX1-NEXT:    vpsrlw $7, %xmm1, %xmm2
   1217 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
   1218 ; AVX1-NEXT:    vpand %xmm5, %xmm2, %xmm2
   1219 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm6
   1220 ; AVX1-NEXT:    vpor %xmm2, %xmm6, %xmm2
   1221 ; AVX1-NEXT:    vpaddb %xmm7, %xmm7, %xmm6
   1222 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm2, %xmm1, %xmm1
   1223 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm2
   1224 ; AVX1-NEXT:    vpand %xmm8, %xmm2, %xmm2
   1225 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm3
   1226 ; AVX1-NEXT:    vpand %xmm9, %xmm3, %xmm3
   1227 ; AVX1-NEXT:    vpor %xmm2, %xmm3, %xmm2
   1228 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
   1229 ; AVX1-NEXT:    vpsrlw $6, %xmm0, %xmm2
   1230 ; AVX1-NEXT:    vpand %xmm10, %xmm2, %xmm2
   1231 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm3
   1232 ; AVX1-NEXT:    vpand %xmm11, %xmm3, %xmm3
   1233 ; AVX1-NEXT:    vpor %xmm2, %xmm3, %xmm2
   1234 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm2, %xmm0, %xmm0
   1235 ; AVX1-NEXT:    vpsrlw $7, %xmm0, %xmm2
   1236 ; AVX1-NEXT:    vpand %xmm5, %xmm2, %xmm2
   1237 ; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm3
   1238 ; AVX1-NEXT:    vpor %xmm2, %xmm3, %xmm2
   1239 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm2, %xmm0, %xmm0
   1240 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
   1241 ; AVX1-NEXT:    retq
   1242 ;
   1243 ; AVX2-LABEL: constant_rotate_v32i8:
   1244 ; AVX2:       # %bb.0:
   1245 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm1
   1246 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
   1247 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm2
   1248 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
   1249 ; AVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
   1250 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [8192,24640,41088,57536,57600,41152,24704,8256,8192,24640,41088,57536,57600,41152,24704,8256]
   1251 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
   1252 ; AVX2-NEXT:    vpsrlw $6, %ymm0, %ymm1
   1253 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
   1254 ; AVX2-NEXT:    vpsllw $2, %ymm0, %ymm3
   1255 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
   1256 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
   1257 ; AVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
   1258 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
   1259 ; AVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm1
   1260 ; AVX2-NEXT:    vpsrlw $7, %ymm0, %ymm3
   1261 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
   1262 ; AVX2-NEXT:    vpor %ymm3, %ymm1, %ymm1
   1263 ; AVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
   1264 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
   1265 ; AVX2-NEXT:    retq
   1266 ;
   1267 ; AVX512F-LABEL: constant_rotate_v32i8:
   1268 ; AVX512F:       # %bb.0:
   1269 ; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm1
   1270 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
   1271 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm2
   1272 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
   1273 ; AVX512F-NEXT:    vpor %ymm1, %ymm2, %ymm1
   1274 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [8192,24640,41088,57536,57600,41152,24704,8256,8192,24640,41088,57536,57600,41152,24704,8256]
   1275 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
   1276 ; AVX512F-NEXT:    vpsrlw $6, %ymm0, %ymm1
   1277 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
   1278 ; AVX512F-NEXT:    vpsllw $2, %ymm0, %ymm3
   1279 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
   1280 ; AVX512F-NEXT:    vpor %ymm1, %ymm3, %ymm1
   1281 ; AVX512F-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
   1282 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
   1283 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm0, %ymm1
   1284 ; AVX512F-NEXT:    vpsrlw $7, %ymm0, %ymm3
   1285 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
   1286 ; AVX512F-NEXT:    vpor %ymm3, %ymm1, %ymm1
   1287 ; AVX512F-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
   1288 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
   1289 ; AVX512F-NEXT:    retq
   1290 ;
   1291 ; AVX512VL-LABEL: constant_rotate_v32i8:
   1292 ; AVX512VL:       # %bb.0:
   1293 ; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm1
   1294 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
   1295 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm2
   1296 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
   1297 ; AVX512VL-NEXT:    vpor %ymm1, %ymm2, %ymm1
   1298 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm2 = [8192,24640,41088,57536,57600,41152,24704,8256,8192,24640,41088,57536,57600,41152,24704,8256]
   1299 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
   1300 ; AVX512VL-NEXT:    vpsrlw $6, %ymm0, %ymm1
   1301 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
   1302 ; AVX512VL-NEXT:    vpsllw $2, %ymm0, %ymm3
   1303 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
   1304 ; AVX512VL-NEXT:    vpor %ymm1, %ymm3, %ymm1
   1305 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
   1306 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
   1307 ; AVX512VL-NEXT:    vpaddb %ymm0, %ymm0, %ymm1
   1308 ; AVX512VL-NEXT:    vpsrlw $7, %ymm0, %ymm3
   1309 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
   1310 ; AVX512VL-NEXT:    vpor %ymm3, %ymm1, %ymm1
   1311 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
   1312 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
   1313 ; AVX512VL-NEXT:    retq
   1314 ;
   1315 ; AVX512BW-LABEL: constant_rotate_v32i8:
   1316 ; AVX512BW:       # %bb.0:
   1317 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
   1318 ; AVX512BW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm0, %zmm1
   1319 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
   1320 ; AVX512BW-NEXT:    vpsllvw {{.*}}(%rip), %zmm0, %zmm0
   1321 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
   1322 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
   1323 ; AVX512BW-NEXT:    retq
   1324 ;
   1325 ; AVX512VLBW-LABEL: constant_rotate_v32i8:
   1326 ; AVX512VLBW:       # %bb.0:
   1327 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
   1328 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm0, %zmm1
   1329 ; AVX512VLBW-NEXT:    vpmovwb %zmm1, %ymm1
   1330 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %zmm0, %zmm0
   1331 ; AVX512VLBW-NEXT:    vpmovwb %zmm0, %ymm0
   1332 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
   1333 ; AVX512VLBW-NEXT:    retq
   1334 ;
   1335 ; XOPAVX1-LABEL: constant_rotate_v32i8:
   1336 ; XOPAVX1:       # %bb.0:
   1337 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
   1338 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
   1339 ; XOPAVX1-NEXT:    vprotb %xmm2, %xmm1, %xmm1
   1340 ; XOPAVX1-NEXT:    vprotb %xmm2, %xmm0, %xmm0
   1341 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
   1342 ; XOPAVX1-NEXT:    retq
   1343 ;
   1344 ; XOPAVX2-LABEL: constant_rotate_v32i8:
   1345 ; XOPAVX2:       # %bb.0:
   1346 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1347 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
   1348 ; XOPAVX2-NEXT:    vprotb %xmm2, %xmm1, %xmm1
   1349 ; XOPAVX2-NEXT:    vprotb %xmm2, %xmm0, %xmm0
   1350 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
   1351 ; XOPAVX2-NEXT:    retq
   1352   %shl = shl <32 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>
   1353   %lshr = lshr <32 x i8> %a, <i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7>
   1354   %or = or <32 x i8> %shl, %lshr
   1355   ret <32 x i8> %or
   1356 }
   1357 
   1358 ;
   1359 ; Uniform Constant Rotates
   1360 ;
   1361 
   1362 define <4 x i64> @splatconstant_rotate_v4i64(<4 x i64> %a) nounwind {
   1363 ; AVX1-LABEL: splatconstant_rotate_v4i64:
   1364 ; AVX1:       # %bb.0:
   1365 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm1
   1366 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
   1367 ; AVX1-NEXT:    vpsllq $14, %xmm2, %xmm3
   1368 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
   1369 ; AVX1-NEXT:    vpsrlq $50, %xmm0, %xmm0
   1370 ; AVX1-NEXT:    vpsrlq $50, %xmm2, %xmm2
   1371 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
   1372 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
   1373 ; AVX1-NEXT:    retq
   1374 ;
   1375 ; AVX2-LABEL: splatconstant_rotate_v4i64:
   1376 ; AVX2:       # %bb.0:
   1377 ; AVX2-NEXT:    vpsllq $14, %ymm0, %ymm1
   1378 ; AVX2-NEXT:    vpsrlq $50, %ymm0, %ymm0
   1379 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
   1380 ; AVX2-NEXT:    retq
   1381 ;
   1382 ; AVX512F-LABEL: splatconstant_rotate_v4i64:
   1383 ; AVX512F:       # %bb.0:
   1384 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
   1385 ; AVX512F-NEXT:    vprolq $14, %zmm0, %zmm0
   1386 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
   1387 ; AVX512F-NEXT:    retq
   1388 ;
   1389 ; AVX512VL-LABEL: splatconstant_rotate_v4i64:
   1390 ; AVX512VL:       # %bb.0:
   1391 ; AVX512VL-NEXT:    vprolq $14, %ymm0, %ymm0
   1392 ; AVX512VL-NEXT:    retq
   1393 ;
   1394 ; AVX512BW-LABEL: splatconstant_rotate_v4i64:
   1395 ; AVX512BW:       # %bb.0:
   1396 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
   1397 ; AVX512BW-NEXT:    vprolq $14, %zmm0, %zmm0
   1398 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
   1399 ; AVX512BW-NEXT:    retq
   1400 ;
   1401 ; AVX512VLBW-LABEL: splatconstant_rotate_v4i64:
   1402 ; AVX512VLBW:       # %bb.0:
   1403 ; AVX512VLBW-NEXT:    vprolq $14, %ymm0, %ymm0
   1404 ; AVX512VLBW-NEXT:    retq
   1405 ;
   1406 ; XOPAVX1-LABEL: splatconstant_rotate_v4i64:
   1407 ; XOPAVX1:       # %bb.0:
   1408 ; XOPAVX1-NEXT:    vprotq $14, %xmm0, %xmm1
   1409 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
   1410 ; XOPAVX1-NEXT:    vprotq $14, %xmm0, %xmm0
   1411 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
   1412 ; XOPAVX1-NEXT:    retq
   1413 ;
   1414 ; XOPAVX2-LABEL: splatconstant_rotate_v4i64:
   1415 ; XOPAVX2:       # %bb.0:
   1416 ; XOPAVX2-NEXT:    vprotq $14, %xmm0, %xmm1
   1417 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
   1418 ; XOPAVX2-NEXT:    vprotq $14, %xmm0, %xmm0
   1419 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
   1420 ; XOPAVX2-NEXT:    retq
   1421   %shl = shl <4 x i64> %a, <i64 14, i64 14, i64 14, i64 14>
   1422   %lshr = lshr <4 x i64> %a, <i64 50, i64 50, i64 50, i64 50>
   1423   %or = or <4 x i64> %shl, %lshr
   1424   ret <4 x i64> %or
   1425 }
   1426 
   1427 define <8 x i32> @splatconstant_rotate_v8i32(<8 x i32> %a) nounwind {
   1428 ; AVX1-LABEL: splatconstant_rotate_v8i32:
   1429 ; AVX1:       # %bb.0:
   1430 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
   1431 ; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm2
   1432 ; AVX1-NEXT:    vpslld $4, %xmm1, %xmm1
   1433 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
   1434 ; AVX1-NEXT:    vpsrld $28, %xmm0, %xmm2
   1435 ; AVX1-NEXT:    vpslld $4, %xmm0, %xmm0
   1436 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
   1437 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
   1438 ; AVX1-NEXT:    retq
   1439 ;
   1440 ; AVX2-LABEL: splatconstant_rotate_v8i32:
   1441 ; AVX2:       # %bb.0:
   1442 ; AVX2-NEXT:    vpsrld $28, %ymm0, %ymm1
   1443 ; AVX2-NEXT:    vpslld $4, %ymm0, %ymm0
   1444 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
   1445 ; AVX2-NEXT:    retq
   1446 ;
   1447 ; AVX512F-LABEL: splatconstant_rotate_v8i32:
   1448 ; AVX512F:       # %bb.0:
   1449 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
   1450 ; AVX512F-NEXT:    vprold $4, %zmm0, %zmm0
   1451 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
   1452 ; AVX512F-NEXT:    retq
   1453 ;
   1454 ; AVX512VL-LABEL: splatconstant_rotate_v8i32:
   1455 ; AVX512VL:       # %bb.0:
   1456 ; AVX512VL-NEXT:    vprold $4, %ymm0, %ymm0
   1457 ; AVX512VL-NEXT:    retq
   1458 ;
   1459 ; AVX512BW-LABEL: splatconstant_rotate_v8i32:
   1460 ; AVX512BW:       # %bb.0:
   1461 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
   1462 ; AVX512BW-NEXT:    vprold $4, %zmm0, %zmm0
   1463 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
   1464 ; AVX512BW-NEXT:    retq
   1465 ;
   1466 ; AVX512VLBW-LABEL: splatconstant_rotate_v8i32:
   1467 ; AVX512VLBW:       # %bb.0:
   1468 ; AVX512VLBW-NEXT:    vprold $4, %ymm0, %ymm0
   1469 ; AVX512VLBW-NEXT:    retq
   1470 ;
   1471 ; XOPAVX1-LABEL: splatconstant_rotate_v8i32:
   1472 ; XOPAVX1:       # %bb.0:
   1473 ; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm1
   1474 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
   1475 ; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm0
   1476 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
   1477 ; XOPAVX1-NEXT:    retq
   1478 ;
   1479 ; XOPAVX2-LABEL: splatconstant_rotate_v8i32:
   1480 ; XOPAVX2:       # %bb.0:
   1481 ; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm1
   1482 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
   1483 ; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm0
   1484 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
   1485 ; XOPAVX2-NEXT:    retq
   1486   %shl = shl <8 x i32> %a, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
   1487   %lshr = lshr <8 x i32> %a, <i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28>
   1488   %or = or <8 x i32> %shl, %lshr
   1489   ret <8 x i32> %or
   1490 }
   1491 
   1492 define <16 x i16> @splatconstant_rotate_v16i16(<16 x i16> %a) nounwind {
   1493 ; AVX1-LABEL: splatconstant_rotate_v16i16:
   1494 ; AVX1:       # %bb.0:
   1495 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
   1496 ; AVX1-NEXT:    vpsrlw $9, %xmm1, %xmm2
   1497 ; AVX1-NEXT:    vpsllw $7, %xmm1, %xmm1
   1498 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
   1499 ; AVX1-NEXT:    vpsrlw $9, %xmm0, %xmm2
   1500 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
   1501 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
   1502 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
   1503 ; AVX1-NEXT:    retq
   1504 ;
   1505 ; AVX2-LABEL: splatconstant_rotate_v16i16:
   1506 ; AVX2:       # %bb.0:
   1507 ; AVX2-NEXT:    vpsrlw $9, %ymm0, %ymm1
   1508 ; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
   1509 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
   1510 ; AVX2-NEXT:    retq
   1511 ;
   1512 ; AVX512-LABEL: splatconstant_rotate_v16i16:
   1513 ; AVX512:       # %bb.0:
   1514 ; AVX512-NEXT:    vpsrlw $9, %ymm0, %ymm1
   1515 ; AVX512-NEXT:    vpsllw $7, %ymm0, %ymm0
   1516 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
   1517 ; AVX512-NEXT:    retq
   1518 ;
   1519 ; XOPAVX1-LABEL: splatconstant_rotate_v16i16:
   1520 ; XOPAVX1:       # %bb.0:
   1521 ; XOPAVX1-NEXT:    vprotw $7, %xmm0, %xmm1
   1522 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
   1523 ; XOPAVX1-NEXT:    vprotw $7, %xmm0, %xmm0
   1524 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
   1525 ; XOPAVX1-NEXT:    retq
   1526 ;
   1527 ; XOPAVX2-LABEL: splatconstant_rotate_v16i16:
   1528 ; XOPAVX2:       # %bb.0:
   1529 ; XOPAVX2-NEXT:    vprotw $7, %xmm0, %xmm1
   1530 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
   1531 ; XOPAVX2-NEXT:    vprotw $7, %xmm0, %xmm0
   1532 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
   1533 ; XOPAVX2-NEXT:    retq
   1534   %shl = shl <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
   1535   %lshr = lshr <16 x i16> %a, <i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9>
   1536   %or = or <16 x i16> %shl, %lshr
   1537   ret <16 x i16> %or
   1538 }
   1539 
   1540 define <32 x i8> @splatconstant_rotate_v32i8(<32 x i8> %a) nounwind {
   1541 ; AVX1-LABEL: splatconstant_rotate_v32i8:
   1542 ; AVX1:       # %bb.0:
   1543 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
   1544 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm2
   1545 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
   1546 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
   1547 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
   1548 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
   1549 ; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
   1550 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
   1551 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm2
   1552 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
   1553 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm0
   1554 ; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
   1555 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
   1556 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
   1557 ; AVX1-NEXT:    retq
   1558 ;
   1559 ; AVX2-LABEL: splatconstant_rotate_v32i8:
   1560 ; AVX2:       # %bb.0:
   1561 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm1
   1562 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
   1563 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm0
   1564 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1565 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
   1566 ; AVX2-NEXT:    retq
   1567 ;
   1568 ; AVX512-LABEL: splatconstant_rotate_v32i8:
   1569 ; AVX512:       # %bb.0:
   1570 ; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm1
   1571 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
   1572 ; AVX512-NEXT:    vpsllw $4, %ymm0, %ymm0
   1573 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1574 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
   1575 ; AVX512-NEXT:    retq
   1576 ;
   1577 ; XOPAVX1-LABEL: splatconstant_rotate_v32i8:
   1578 ; XOPAVX1:       # %bb.0:
   1579 ; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm1
   1580 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
   1581 ; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm0
   1582 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
   1583 ; XOPAVX1-NEXT:    retq
   1584 ;
   1585 ; XOPAVX2-LABEL: splatconstant_rotate_v32i8:
   1586 ; XOPAVX2:       # %bb.0:
   1587 ; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm1
   1588 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
   1589 ; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm0
   1590 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
   1591 ; XOPAVX2-NEXT:    retq
   1592   %shl = shl <32 x i8> %a, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
   1593   %lshr = lshr <32 x i8> %a, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
   1594   %or = or <32 x i8> %shl, %lshr
   1595   ret <32 x i8> %or
   1596 }
   1597 
   1598 ;
   1599 ; Masked Uniform Constant Rotates
   1600 ;
   1601 
   1602 define <4 x i64> @splatconstant_rotate_mask_v4i64(<4 x i64> %a) nounwind {
   1603 ; AVX1-LABEL: splatconstant_rotate_mask_v4i64:
   1604 ; AVX1:       # %bb.0:
   1605 ; AVX1-NEXT:    vpsrlq $49, %xmm0, %xmm1
   1606 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
   1607 ; AVX1-NEXT:    vpsrlq $49, %xmm0, %xmm0
   1608 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
   1609 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
   1610 ; AVX1-NEXT:    retq
   1611 ;
   1612 ; AVX2-LABEL: splatconstant_rotate_mask_v4i64:
   1613 ; AVX2:       # %bb.0:
   1614 ; AVX2-NEXT:    vpsrlq $49, %ymm0, %ymm0
   1615 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1616 ; AVX2-NEXT:    retq
   1617 ;
   1618 ; AVX512F-LABEL: splatconstant_rotate_mask_v4i64:
   1619 ; AVX512F:       # %bb.0:
   1620 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
   1621 ; AVX512F-NEXT:    vprolq $15, %zmm0, %zmm0
   1622 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1623 ; AVX512F-NEXT:    retq
   1624 ;
   1625 ; AVX512VL-LABEL: splatconstant_rotate_mask_v4i64:
   1626 ; AVX512VL:       # %bb.0:
   1627 ; AVX512VL-NEXT:    vprolq $15, %ymm0, %ymm0
   1628 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1629 ; AVX512VL-NEXT:    retq
   1630 ;
   1631 ; AVX512BW-LABEL: splatconstant_rotate_mask_v4i64:
   1632 ; AVX512BW:       # %bb.0:
   1633 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
   1634 ; AVX512BW-NEXT:    vprolq $15, %zmm0, %zmm0
   1635 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1636 ; AVX512BW-NEXT:    retq
   1637 ;
   1638 ; AVX512VLBW-LABEL: splatconstant_rotate_mask_v4i64:
   1639 ; AVX512VLBW:       # %bb.0:
   1640 ; AVX512VLBW-NEXT:    vprolq $15, %ymm0, %ymm0
   1641 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1642 ; AVX512VLBW-NEXT:    retq
   1643 ;
   1644 ; XOPAVX1-LABEL: splatconstant_rotate_mask_v4i64:
   1645 ; XOPAVX1:       # %bb.0:
   1646 ; XOPAVX1-NEXT:    vprotq $15, %xmm0, %xmm1
   1647 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
   1648 ; XOPAVX1-NEXT:    vprotq $15, %xmm0, %xmm0
   1649 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
   1650 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
   1651 ; XOPAVX1-NEXT:    retq
   1652 ;
   1653 ; XOPAVX2-LABEL: splatconstant_rotate_mask_v4i64:
   1654 ; XOPAVX2:       # %bb.0:
   1655 ; XOPAVX2-NEXT:    vprotq $15, %xmm0, %xmm1
   1656 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
   1657 ; XOPAVX2-NEXT:    vprotq $15, %xmm0, %xmm0
   1658 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
   1659 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1660 ; XOPAVX2-NEXT:    retq
   1661   %shl = shl <4 x i64> %a, <i64 15, i64 15, i64 15, i64 15>
   1662   %lshr = lshr <4 x i64> %a, <i64 49, i64 49, i64 49, i64 49>
   1663   %rmask = and <4 x i64> %lshr, <i64 255, i64 127, i64 127, i64 255>
   1664   %lmask = and <4 x i64> %shl, <i64 33, i64 65, i64 129, i64 257>
   1665   %or = or <4 x i64> %lmask, %rmask
   1666   ret <4 x i64> %or
   1667 }
   1668 
   1669 define <8 x i32> @splatconstant_rotate_mask_v8i32(<8 x i32> %a) nounwind {
   1670 ; AVX1-LABEL: splatconstant_rotate_mask_v8i32:
   1671 ; AVX1:       # %bb.0:
   1672 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
   1673 ; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm2
   1674 ; AVX1-NEXT:    vpslld $4, %xmm1, %xmm1
   1675 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
   1676 ; AVX1-NEXT:    vpsrld $28, %xmm0, %xmm2
   1677 ; AVX1-NEXT:    vpslld $4, %xmm0, %xmm0
   1678 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
   1679 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
   1680 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
   1681 ; AVX1-NEXT:    retq
   1682 ;
   1683 ; AVX2-LABEL: splatconstant_rotate_mask_v8i32:
   1684 ; AVX2:       # %bb.0:
   1685 ; AVX2-NEXT:    vpsrld $28, %ymm0, %ymm1
   1686 ; AVX2-NEXT:    vpslld $4, %ymm0, %ymm0
   1687 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
   1688 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1689 ; AVX2-NEXT:    retq
   1690 ;
   1691 ; AVX512F-LABEL: splatconstant_rotate_mask_v8i32:
   1692 ; AVX512F:       # %bb.0:
   1693 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
   1694 ; AVX512F-NEXT:    vprold $4, %zmm0, %zmm0
   1695 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1696 ; AVX512F-NEXT:    retq
   1697 ;
   1698 ; AVX512VL-LABEL: splatconstant_rotate_mask_v8i32:
   1699 ; AVX512VL:       # %bb.0:
   1700 ; AVX512VL-NEXT:    vprold $4, %ymm0, %ymm0
   1701 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1702 ; AVX512VL-NEXT:    retq
   1703 ;
   1704 ; AVX512BW-LABEL: splatconstant_rotate_mask_v8i32:
   1705 ; AVX512BW:       # %bb.0:
   1706 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
   1707 ; AVX512BW-NEXT:    vprold $4, %zmm0, %zmm0
   1708 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1709 ; AVX512BW-NEXT:    retq
   1710 ;
   1711 ; AVX512VLBW-LABEL: splatconstant_rotate_mask_v8i32:
   1712 ; AVX512VLBW:       # %bb.0:
   1713 ; AVX512VLBW-NEXT:    vprold $4, %ymm0, %ymm0
   1714 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1715 ; AVX512VLBW-NEXT:    retq
   1716 ;
   1717 ; XOPAVX1-LABEL: splatconstant_rotate_mask_v8i32:
   1718 ; XOPAVX1:       # %bb.0:
   1719 ; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm1
   1720 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
   1721 ; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm0
   1722 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
   1723 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
   1724 ; XOPAVX1-NEXT:    retq
   1725 ;
   1726 ; XOPAVX2-LABEL: splatconstant_rotate_mask_v8i32:
   1727 ; XOPAVX2:       # %bb.0:
   1728 ; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm1
   1729 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
   1730 ; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm0
   1731 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
   1732 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1733 ; XOPAVX2-NEXT:    retq
   1734   %shl = shl <8 x i32> %a, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
   1735   %lshr = lshr <8 x i32> %a, <i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28, i32 28>
   1736   %rmask = and <8 x i32> %lshr, <i32 3, i32 7, i32 15, i32 31, i32 63, i32 127, i32 255, i32 511>
   1737   %lmask = and <8 x i32> %shl, <i32 511, i32 255, i32 127, i32 63, i32 31, i32 15, i32 7, i32 3>
   1738   %or = or <8 x i32> %lmask, %rmask
   1739   ret <8 x i32> %or
   1740 }
   1741 
   1742 define <16 x i16> @splatconstant_rotate_mask_v16i16(<16 x i16> %a) nounwind {
   1743 ; AVX1-LABEL: splatconstant_rotate_mask_v16i16:
   1744 ; AVX1:       # %bb.0:
   1745 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
   1746 ; AVX1-NEXT:    vpsrlw $11, %xmm1, %xmm2
   1747 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
   1748 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
   1749 ; AVX1-NEXT:    vpsrlw $11, %xmm0, %xmm2
   1750 ; AVX1-NEXT:    vpsllw $5, %xmm0, %xmm0
   1751 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
   1752 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
   1753 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
   1754 ; AVX1-NEXT:    retq
   1755 ;
   1756 ; AVX2-LABEL: splatconstant_rotate_mask_v16i16:
   1757 ; AVX2:       # %bb.0:
   1758 ; AVX2-NEXT:    vpsrlw $11, %ymm0, %ymm1
   1759 ; AVX2-NEXT:    vpsllw $5, %ymm0, %ymm0
   1760 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
   1761 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1762 ; AVX2-NEXT:    retq
   1763 ;
   1764 ; AVX512-LABEL: splatconstant_rotate_mask_v16i16:
   1765 ; AVX512:       # %bb.0:
   1766 ; AVX512-NEXT:    vpsrlw $11, %ymm0, %ymm1
   1767 ; AVX512-NEXT:    vpsllw $5, %ymm0, %ymm0
   1768 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
   1769 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1770 ; AVX512-NEXT:    retq
   1771 ;
   1772 ; XOPAVX1-LABEL: splatconstant_rotate_mask_v16i16:
   1773 ; XOPAVX1:       # %bb.0:
   1774 ; XOPAVX1-NEXT:    vprotw $5, %xmm0, %xmm1
   1775 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
   1776 ; XOPAVX1-NEXT:    vprotw $5, %xmm0, %xmm0
   1777 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
   1778 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
   1779 ; XOPAVX1-NEXT:    retq
   1780 ;
   1781 ; XOPAVX2-LABEL: splatconstant_rotate_mask_v16i16:
   1782 ; XOPAVX2:       # %bb.0:
   1783 ; XOPAVX2-NEXT:    vprotw $5, %xmm0, %xmm1
   1784 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
   1785 ; XOPAVX2-NEXT:    vprotw $5, %xmm0, %xmm0
   1786 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
   1787 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1788 ; XOPAVX2-NEXT:    retq
   1789   %shl = shl <16 x i16> %a, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
   1790   %lshr = lshr <16 x i16> %a, <i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11>
   1791   %rmask = and <16 x i16> %lshr, <i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55>
   1792   %lmask = and <16 x i16> %shl, <i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33>
   1793   %or = or <16 x i16> %lmask, %rmask
   1794   ret <16 x i16> %or
   1795 }
   1796 
   1797 define <32 x i8> @splatconstant_rotate_mask_v32i8(<32 x i8> %a) nounwind {
   1798 ; AVX1-LABEL: splatconstant_rotate_mask_v32i8:
   1799 ; AVX1:       # %bb.0:
   1800 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
   1801 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm2
   1802 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
   1803 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
   1804 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
   1805 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
   1806 ; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
   1807 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
   1808 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm2
   1809 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
   1810 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm0
   1811 ; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
   1812 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
   1813 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
   1814 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
   1815 ; AVX1-NEXT:    retq
   1816 ;
   1817 ; AVX2-LABEL: splatconstant_rotate_mask_v32i8:
   1818 ; AVX2:       # %bb.0:
   1819 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm1
   1820 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
   1821 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm0
   1822 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1823 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
   1824 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1825 ; AVX2-NEXT:    retq
   1826 ;
   1827 ; AVX512-LABEL: splatconstant_rotate_mask_v32i8:
   1828 ; AVX512:       # %bb.0:
   1829 ; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm1
   1830 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
   1831 ; AVX512-NEXT:    vpsllw $4, %ymm0, %ymm0
   1832 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1833 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
   1834 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1835 ; AVX512-NEXT:    retq
   1836 ;
   1837 ; XOPAVX1-LABEL: splatconstant_rotate_mask_v32i8:
   1838 ; XOPAVX1:       # %bb.0:
   1839 ; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm1
   1840 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
   1841 ; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm0
   1842 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
   1843 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
   1844 ; XOPAVX1-NEXT:    retq
   1845 ;
   1846 ; XOPAVX2-LABEL: splatconstant_rotate_mask_v32i8:
   1847 ; XOPAVX2:       # %bb.0:
   1848 ; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm1
   1849 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
   1850 ; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm0
   1851 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
   1852 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
   1853 ; XOPAVX2-NEXT:    retq
   1854   %shl = shl <32 x i8> %a, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
   1855   %lshr = lshr <32 x i8> %a, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
   1856   %rmask = and <32 x i8> %lshr, <i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55, i8 55>
   1857   %lmask = and <32 x i8> %shl, <i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33>
   1858   %or = or <32 x i8> %lmask, %rmask
   1859   ret <32 x i8> %or
   1860 }
   1861