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=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
      4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
      5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
      6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
      7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
      8 ;
      9 ; Just one 32-bit run to make sure we do reasonable things for i64 rotates.
     10 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=X32-SSE --check-prefix=X32-SSE2
     11 
     12 ;
     13 ; Variable Rotates
     14 ;
     15 
     16 define <2 x i64> @var_rotate_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
     17 ; SSE2-LABEL: var_rotate_v2i64:
     18 ; SSE2:       # BB#0:
     19 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [64,64]
     20 ; SSE2-NEXT:    psubq %xmm1, %xmm2
     21 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
     22 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
     23 ; SSE2-NEXT:    psllq %xmm3, %xmm4
     24 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
     25 ; SSE2-NEXT:    psllq %xmm1, %xmm3
     26 ; SSE2-NEXT:    movsd {{.*#+}} xmm4 = xmm3[0],xmm4[1]
     27 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,0,1]
     28 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
     29 ; SSE2-NEXT:    psrlq %xmm3, %xmm1
     30 ; SSE2-NEXT:    psrlq %xmm2, %xmm0
     31 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
     32 ; SSE2-NEXT:    orpd %xmm4, %xmm1
     33 ; SSE2-NEXT:    movapd %xmm1, %xmm0
     34 ; SSE2-NEXT:    retq
     35 ;
     36 ; SSE41-LABEL: var_rotate_v2i64:
     37 ; SSE41:       # BB#0:
     38 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [64,64]
     39 ; SSE41-NEXT:    psubq %xmm1, %xmm2
     40 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
     41 ; SSE41-NEXT:    psllq %xmm1, %xmm3
     42 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
     43 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
     44 ; SSE41-NEXT:    psllq %xmm1, %xmm4
     45 ; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm3[0,1,2,3],xmm4[4,5,6,7]
     46 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
     47 ; SSE41-NEXT:    psrlq %xmm2, %xmm1
     48 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
     49 ; SSE41-NEXT:    psrlq %xmm2, %xmm0
     50 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
     51 ; SSE41-NEXT:    por %xmm4, %xmm0
     52 ; SSE41-NEXT:    retq
     53 ;
     54 ; AVX1-LABEL: var_rotate_v2i64:
     55 ; AVX1:       # BB#0:
     56 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [64,64]
     57 ; AVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm2
     58 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm3
     59 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
     60 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm1
     61 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm3[0,1,2,3],xmm1[4,5,6,7]
     62 ; AVX1-NEXT:    vpsrlq %xmm2, %xmm0, %xmm3
     63 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
     64 ; AVX1-NEXT:    vpsrlq %xmm2, %xmm0, %xmm0
     65 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
     66 ; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
     67 ; AVX1-NEXT:    retq
     68 ;
     69 ; AVX2-LABEL: var_rotate_v2i64:
     70 ; AVX2:       # BB#0:
     71 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [64,64]
     72 ; AVX2-NEXT:    vpsubq %xmm1, %xmm2, %xmm2
     73 ; AVX2-NEXT:    vpsllvq %xmm1, %xmm0, %xmm1
     74 ; AVX2-NEXT:    vpsrlvq %xmm2, %xmm0, %xmm0
     75 ; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
     76 ; AVX2-NEXT:    retq
     77 ;
     78 ; XOP-LABEL: var_rotate_v2i64:
     79 ; XOP:       # BB#0:
     80 ; XOP-NEXT:    vprotq %xmm1, %xmm0, %xmm0
     81 ; XOP-NEXT:    retq
     82 ;
     83 ; X32-SSE-LABEL: var_rotate_v2i64:
     84 ; X32-SSE:       # BB#0:
     85 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [64,0,64,0]
     86 ; X32-SSE-NEXT:    psubq %xmm1, %xmm2
     87 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
     88 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm4
     89 ; X32-SSE-NEXT:    psllq %xmm3, %xmm4
     90 ; X32-SSE-NEXT:    movq {{.*#+}} xmm1 = xmm1[0],zero
     91 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm3
     92 ; X32-SSE-NEXT:    psllq %xmm1, %xmm3
     93 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm4 = xmm3[0],xmm4[1]
     94 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,0,1]
     95 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
     96 ; X32-SSE-NEXT:    psrlq %xmm3, %xmm1
     97 ; X32-SSE-NEXT:    movq {{.*#+}} xmm2 = xmm2[0],zero
     98 ; X32-SSE-NEXT:    psrlq %xmm2, %xmm0
     99 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
    100 ; X32-SSE-NEXT:    orpd %xmm4, %xmm1
    101 ; X32-SSE-NEXT:    movapd %xmm1, %xmm0
    102 ; X32-SSE-NEXT:    retl
    103   %b64 = sub <2 x i64> <i64 64, i64 64>, %b
    104   %shl = shl <2 x i64> %a, %b
    105   %lshr = lshr <2 x i64> %a, %b64
    106   %or = or <2 x i64> %shl, %lshr
    107   ret <2 x i64> %or
    108 }
    109 
    110 define <4 x i32> @var_rotate_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
    111 ; SSE2-LABEL: var_rotate_v4i32:
    112 ; SSE2:       # BB#0:
    113 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32,32,32,32]
    114 ; SSE2-NEXT:    psubd %xmm1, %xmm2
    115 ; SSE2-NEXT:    pslld $23, %xmm1
    116 ; SSE2-NEXT:    paddd {{.*}}(%rip), %xmm1
    117 ; SSE2-NEXT:    cvttps2dq %xmm1, %xmm1
    118 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
    119 ; SSE2-NEXT:    pmuludq %xmm0, %xmm1
    120 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
    121 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
    122 ; SSE2-NEXT:    pmuludq %xmm3, %xmm4
    123 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,2,2,3]
    124 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
    125 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
    126 ; SSE2-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
    127 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
    128 ; SSE2-NEXT:    psrld %xmm3, %xmm4
    129 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
    130 ; SSE2-NEXT:    psrlq $32, %xmm3
    131 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
    132 ; SSE2-NEXT:    psrld %xmm3, %xmm5
    133 ; SSE2-NEXT:    movsd {{.*#+}} xmm4 = xmm5[0],xmm4[1]
    134 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,3,2,3]
    135 ; SSE2-NEXT:    pxor %xmm4, %xmm4
    136 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
    137 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm5 = xmm5[2],xmm4[2],xmm5[3],xmm4[3]
    138 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
    139 ; SSE2-NEXT:    psrld %xmm5, %xmm6
    140 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
    141 ; SSE2-NEXT:    psrld %xmm2, %xmm0
    142 ; SSE2-NEXT:    movsd {{.*#+}} xmm6 = xmm0[0],xmm6[1]
    143 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
    144 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
    145 ; SSE2-NEXT:    por %xmm1, %xmm0
    146 ; SSE2-NEXT:    retq
    147 ;
    148 ; SSE41-LABEL: var_rotate_v4i32:
    149 ; SSE41:       # BB#0:
    150 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [32,32,32,32]
    151 ; SSE41-NEXT:    psubd %xmm1, %xmm2
    152 ; SSE41-NEXT:    pslld $23, %xmm1
    153 ; SSE41-NEXT:    paddd {{.*}}(%rip), %xmm1
    154 ; SSE41-NEXT:    cvttps2dq %xmm1, %xmm1
    155 ; SSE41-NEXT:    pmulld %xmm0, %xmm1
    156 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
    157 ; SSE41-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
    158 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
    159 ; SSE41-NEXT:    psrld %xmm3, %xmm4
    160 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
    161 ; SSE41-NEXT:    psrlq $32, %xmm3
    162 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
    163 ; SSE41-NEXT:    psrld %xmm3, %xmm5
    164 ; SSE41-NEXT:    pblendw {{.*#+}} xmm5 = xmm5[0,1,2,3],xmm4[4,5,6,7]
    165 ; SSE41-NEXT:    pxor %xmm3, %xmm3
    166 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm4 = xmm2[0],zero,xmm2[1],zero
    167 ; SSE41-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm3[2],xmm2[3],xmm3[3]
    168 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
    169 ; SSE41-NEXT:    psrld %xmm2, %xmm3
    170 ; SSE41-NEXT:    psrld %xmm4, %xmm0
    171 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
    172 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm5[2,3],xmm0[4,5],xmm5[6,7]
    173 ; SSE41-NEXT:    por %xmm1, %xmm0
    174 ; SSE41-NEXT:    retq
    175 ;
    176 ; AVX1-LABEL: var_rotate_v4i32:
    177 ; AVX1:       # BB#0:
    178 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [32,32,32,32]
    179 ; AVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm2
    180 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
    181 ; AVX1-NEXT:    vpaddd {{.*}}(%rip), %xmm1, %xmm1
    182 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
    183 ; AVX1-NEXT:    vpmulld %xmm0, %xmm1, %xmm1
    184 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
    185 ; AVX1-NEXT:    vpsrld %xmm3, %xmm0, %xmm3
    186 ; AVX1-NEXT:    vpsrlq $32, %xmm2, %xmm4
    187 ; AVX1-NEXT:    vpsrld %xmm4, %xmm0, %xmm4
    188 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
    189 ; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
    190 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm4 = xmm2[2],xmm4[2],xmm2[3],xmm4[3]
    191 ; AVX1-NEXT:    vpsrld %xmm4, %xmm0, %xmm4
    192 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
    193 ; AVX1-NEXT:    vpsrld %xmm2, %xmm0, %xmm0
    194 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
    195 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
    196 ; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
    197 ; AVX1-NEXT:    retq
    198 ;
    199 ; AVX2-LABEL: var_rotate_v4i32:
    200 ; AVX2:       # BB#0:
    201 ; AVX2-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm2
    202 ; AVX2-NEXT:    vpsubd %xmm1, %xmm2, %xmm2
    203 ; AVX2-NEXT:    vpsllvd %xmm1, %xmm0, %xmm1
    204 ; AVX2-NEXT:    vpsrlvd %xmm2, %xmm0, %xmm0
    205 ; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
    206 ; AVX2-NEXT:    retq
    207 ;
    208 ; XOP-LABEL: var_rotate_v4i32:
    209 ; XOP:       # BB#0:
    210 ; XOP-NEXT:    vprotd %xmm1, %xmm0, %xmm0
    211 ; XOP-NEXT:    retq
    212 ;
    213 ; X32-SSE-LABEL: var_rotate_v4i32:
    214 ; X32-SSE:       # BB#0:
    215 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [32,32,32,32]
    216 ; X32-SSE-NEXT:    psubd %xmm1, %xmm2
    217 ; X32-SSE-NEXT:    pslld $23, %xmm1
    218 ; X32-SSE-NEXT:    paddd .LCPI1_1, %xmm1
    219 ; X32-SSE-NEXT:    cvttps2dq %xmm1, %xmm1
    220 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
    221 ; X32-SSE-NEXT:    pmuludq %xmm0, %xmm1
    222 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
    223 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
    224 ; X32-SSE-NEXT:    pmuludq %xmm3, %xmm4
    225 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,2,2,3]
    226 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
    227 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
    228 ; X32-SSE-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
    229 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm4
    230 ; X32-SSE-NEXT:    psrld %xmm3, %xmm4
    231 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
    232 ; X32-SSE-NEXT:    psrlq $32, %xmm3
    233 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm5
    234 ; X32-SSE-NEXT:    psrld %xmm3, %xmm5
    235 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm4 = xmm5[0],xmm4[1]
    236 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,3,2,3]
    237 ; X32-SSE-NEXT:    pxor %xmm4, %xmm4
    238 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm5
    239 ; X32-SSE-NEXT:    punpckhdq {{.*#+}} xmm5 = xmm5[2],xmm4[2],xmm5[3],xmm4[3]
    240 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm6
    241 ; X32-SSE-NEXT:    psrld %xmm5, %xmm6
    242 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
    243 ; X32-SSE-NEXT:    psrld %xmm2, %xmm0
    244 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm6 = xmm0[0],xmm6[1]
    245 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
    246 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
    247 ; X32-SSE-NEXT:    por %xmm1, %xmm0
    248 ; X32-SSE-NEXT:    retl
    249   %b32 = sub <4 x i32> <i32 32, i32 32, i32 32, i32 32>, %b
    250   %shl = shl <4 x i32> %a, %b
    251   %lshr = lshr <4 x i32> %a, %b32
    252   %or = or <4 x i32> %shl, %lshr
    253   ret <4 x i32> %or
    254 }
    255 
    256 define <8 x i16> @var_rotate_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
    257 ; SSE2-LABEL: var_rotate_v8i16:
    258 ; SSE2:       # BB#0:
    259 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
    260 ; SSE2-NEXT:    psubw %xmm1, %xmm3
    261 ; SSE2-NEXT:    psllw $12, %xmm1
    262 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    263 ; SSE2-NEXT:    psraw $15, %xmm2
    264 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
    265 ; SSE2-NEXT:    psllw $8, %xmm4
    266 ; SSE2-NEXT:    pand %xmm2, %xmm4
    267 ; SSE2-NEXT:    pandn %xmm0, %xmm2
    268 ; SSE2-NEXT:    por %xmm4, %xmm2
    269 ; SSE2-NEXT:    paddw %xmm1, %xmm1
    270 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
    271 ; SSE2-NEXT:    psraw $15, %xmm4
    272 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
    273 ; SSE2-NEXT:    pandn %xmm2, %xmm5
    274 ; SSE2-NEXT:    psllw $4, %xmm2
    275 ; SSE2-NEXT:    pand %xmm4, %xmm2
    276 ; SSE2-NEXT:    por %xmm5, %xmm2
    277 ; SSE2-NEXT:    paddw %xmm1, %xmm1
    278 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
    279 ; SSE2-NEXT:    psraw $15, %xmm4
    280 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
    281 ; SSE2-NEXT:    pandn %xmm2, %xmm5
    282 ; SSE2-NEXT:    psllw $2, %xmm2
    283 ; SSE2-NEXT:    pand %xmm4, %xmm2
    284 ; SSE2-NEXT:    por %xmm5, %xmm2
    285 ; SSE2-NEXT:    paddw %xmm1, %xmm1
    286 ; SSE2-NEXT:    psraw $15, %xmm1
    287 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
    288 ; SSE2-NEXT:    pandn %xmm2, %xmm4
    289 ; SSE2-NEXT:    psllw $1, %xmm2
    290 ; SSE2-NEXT:    pand %xmm1, %xmm2
    291 ; SSE2-NEXT:    psllw $12, %xmm3
    292 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
    293 ; SSE2-NEXT:    psraw $15, %xmm1
    294 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
    295 ; SSE2-NEXT:    pandn %xmm0, %xmm5
    296 ; SSE2-NEXT:    psrlw $8, %xmm0
    297 ; SSE2-NEXT:    pand %xmm1, %xmm0
    298 ; SSE2-NEXT:    por %xmm5, %xmm0
    299 ; SSE2-NEXT:    paddw %xmm3, %xmm3
    300 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
    301 ; SSE2-NEXT:    psraw $15, %xmm1
    302 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
    303 ; SSE2-NEXT:    pandn %xmm0, %xmm5
    304 ; SSE2-NEXT:    psrlw $4, %xmm0
    305 ; SSE2-NEXT:    pand %xmm1, %xmm0
    306 ; SSE2-NEXT:    por %xmm5, %xmm0
    307 ; SSE2-NEXT:    paddw %xmm3, %xmm3
    308 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
    309 ; SSE2-NEXT:    psraw $15, %xmm1
    310 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
    311 ; SSE2-NEXT:    pandn %xmm0, %xmm5
    312 ; SSE2-NEXT:    psrlw $2, %xmm0
    313 ; SSE2-NEXT:    pand %xmm1, %xmm0
    314 ; SSE2-NEXT:    por %xmm5, %xmm0
    315 ; SSE2-NEXT:    paddw %xmm3, %xmm3
    316 ; SSE2-NEXT:    psraw $15, %xmm3
    317 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
    318 ; SSE2-NEXT:    pandn %xmm0, %xmm1
    319 ; SSE2-NEXT:    psrlw $1, %xmm0
    320 ; SSE2-NEXT:    pand %xmm3, %xmm0
    321 ; SSE2-NEXT:    por %xmm1, %xmm0
    322 ; SSE2-NEXT:    por %xmm4, %xmm0
    323 ; SSE2-NEXT:    por %xmm2, %xmm0
    324 ; SSE2-NEXT:    retq
    325 ;
    326 ; SSE41-LABEL: var_rotate_v8i16:
    327 ; SSE41:       # BB#0:
    328 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
    329 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [16,16,16,16,16,16,16,16]
    330 ; SSE41-NEXT:    psubw %xmm1, %xmm2
    331 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    332 ; SSE41-NEXT:    psllw $12, %xmm0
    333 ; SSE41-NEXT:    psllw $4, %xmm1
    334 ; SSE41-NEXT:    por %xmm0, %xmm1
    335 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
    336 ; SSE41-NEXT:    paddw %xmm4, %xmm4
    337 ; SSE41-NEXT:    movdqa %xmm3, %xmm6
    338 ; SSE41-NEXT:    psllw $8, %xmm6
    339 ; SSE41-NEXT:    movdqa %xmm3, %xmm5
    340 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    341 ; SSE41-NEXT:    pblendvb %xmm6, %xmm5
    342 ; SSE41-NEXT:    movdqa %xmm5, %xmm1
    343 ; SSE41-NEXT:    psllw $4, %xmm1
    344 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
    345 ; SSE41-NEXT:    pblendvb %xmm1, %xmm5
    346 ; SSE41-NEXT:    movdqa %xmm5, %xmm1
    347 ; SSE41-NEXT:    psllw $2, %xmm1
    348 ; SSE41-NEXT:    paddw %xmm4, %xmm4
    349 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
    350 ; SSE41-NEXT:    pblendvb %xmm1, %xmm5
    351 ; SSE41-NEXT:    movdqa %xmm5, %xmm1
    352 ; SSE41-NEXT:    psllw $1, %xmm1
    353 ; SSE41-NEXT:    paddw %xmm4, %xmm4
    354 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
    355 ; SSE41-NEXT:    pblendvb %xmm1, %xmm5
    356 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
    357 ; SSE41-NEXT:    psllw $12, %xmm0
    358 ; SSE41-NEXT:    psllw $4, %xmm2
    359 ; SSE41-NEXT:    por %xmm0, %xmm2
    360 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
    361 ; SSE41-NEXT:    paddw %xmm1, %xmm1
    362 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
    363 ; SSE41-NEXT:    psrlw $8, %xmm4
    364 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
    365 ; SSE41-NEXT:    pblendvb %xmm4, %xmm3
    366 ; SSE41-NEXT:    movdqa %xmm3, %xmm2
    367 ; SSE41-NEXT:    psrlw $4, %xmm2
    368 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    369 ; SSE41-NEXT:    pblendvb %xmm2, %xmm3
    370 ; SSE41-NEXT:    movdqa %xmm3, %xmm2
    371 ; SSE41-NEXT:    psrlw $2, %xmm2
    372 ; SSE41-NEXT:    paddw %xmm1, %xmm1
    373 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    374 ; SSE41-NEXT:    pblendvb %xmm2, %xmm3
    375 ; SSE41-NEXT:    movdqa %xmm3, %xmm2
    376 ; SSE41-NEXT:    psrlw $1, %xmm2
    377 ; SSE41-NEXT:    paddw %xmm1, %xmm1
    378 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    379 ; SSE41-NEXT:    pblendvb %xmm2, %xmm3
    380 ; SSE41-NEXT:    por %xmm5, %xmm3
    381 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    382 ; SSE41-NEXT:    retq
    383 ;
    384 ; AVX1-LABEL: var_rotate_v8i16:
    385 ; AVX1:       # BB#0:
    386 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [16,16,16,16,16,16,16,16]
    387 ; AVX1-NEXT:    vpsubw %xmm1, %xmm2, %xmm2
    388 ; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm3
    389 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
    390 ; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
    391 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm3
    392 ; AVX1-NEXT:    vpsllw $8, %xmm0, %xmm4
    393 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm1
    394 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm4
    395 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm1, %xmm1
    396 ; AVX1-NEXT:    vpsllw $2, %xmm1, %xmm4
    397 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
    398 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm1, %xmm1
    399 ; AVX1-NEXT:    vpsllw $1, %xmm1, %xmm4
    400 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
    401 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm1, %xmm1
    402 ; AVX1-NEXT:    vpsllw $12, %xmm2, %xmm3
    403 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
    404 ; AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2
    405 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm3
    406 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm4
    407 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm4, %xmm0, %xmm0
    408 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm2
    409 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
    410 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm2
    411 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
    412 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
    413 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm2
    414 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
    415 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
    416 ; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
    417 ; AVX1-NEXT:    retq
    418 ;
    419 ; AVX2-LABEL: var_rotate_v8i16:
    420 ; AVX2:       # BB#0:
    421 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [16,16,16,16,16,16,16,16]
    422 ; AVX2-NEXT:    vpsubw %xmm1, %xmm2, %xmm2
    423 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
    424 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
    425 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm1
    426 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,128,128,128,128,128,128,128,128,0,1,4,5,8,9,12,13,128,128,128,128,128,128,128,128]
    427 ; AVX2-NEXT:    vpshufb %ymm3, %ymm1, %ymm1
    428 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
    429 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
    430 ; AVX2-NEXT:    vpsrlvd %ymm2, %ymm0, %ymm0
    431 ; AVX2-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
    432 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
    433 ; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
    434 ; AVX2-NEXT:    vzeroupper
    435 ; AVX2-NEXT:    retq
    436 ;
    437 ; XOP-LABEL: var_rotate_v8i16:
    438 ; XOP:       # BB#0:
    439 ; XOP-NEXT:    vprotw %xmm1, %xmm0, %xmm0
    440 ; XOP-NEXT:    retq
    441 ;
    442 ; X32-SSE-LABEL: var_rotate_v8i16:
    443 ; X32-SSE:       # BB#0:
    444 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
    445 ; X32-SSE-NEXT:    psubw %xmm1, %xmm3
    446 ; X32-SSE-NEXT:    psllw $12, %xmm1
    447 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
    448 ; X32-SSE-NEXT:    psraw $15, %xmm2
    449 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm4
    450 ; X32-SSE-NEXT:    psllw $8, %xmm4
    451 ; X32-SSE-NEXT:    pand %xmm2, %xmm4
    452 ; X32-SSE-NEXT:    pandn %xmm0, %xmm2
    453 ; X32-SSE-NEXT:    por %xmm4, %xmm2
    454 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
    455 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm4
    456 ; X32-SSE-NEXT:    psraw $15, %xmm4
    457 ; X32-SSE-NEXT:    movdqa %xmm4, %xmm5
    458 ; X32-SSE-NEXT:    pandn %xmm2, %xmm5
    459 ; X32-SSE-NEXT:    psllw $4, %xmm2
    460 ; X32-SSE-NEXT:    pand %xmm4, %xmm2
    461 ; X32-SSE-NEXT:    por %xmm5, %xmm2
    462 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
    463 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm4
    464 ; X32-SSE-NEXT:    psraw $15, %xmm4
    465 ; X32-SSE-NEXT:    movdqa %xmm4, %xmm5
    466 ; X32-SSE-NEXT:    pandn %xmm2, %xmm5
    467 ; X32-SSE-NEXT:    psllw $2, %xmm2
    468 ; X32-SSE-NEXT:    pand %xmm4, %xmm2
    469 ; X32-SSE-NEXT:    por %xmm5, %xmm2
    470 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
    471 ; X32-SSE-NEXT:    psraw $15, %xmm1
    472 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm4
    473 ; X32-SSE-NEXT:    pandn %xmm2, %xmm4
    474 ; X32-SSE-NEXT:    psllw $1, %xmm2
    475 ; X32-SSE-NEXT:    pand %xmm1, %xmm2
    476 ; X32-SSE-NEXT:    psllw $12, %xmm3
    477 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm1
    478 ; X32-SSE-NEXT:    psraw $15, %xmm1
    479 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm5
    480 ; X32-SSE-NEXT:    pandn %xmm0, %xmm5
    481 ; X32-SSE-NEXT:    psrlw $8, %xmm0
    482 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
    483 ; X32-SSE-NEXT:    por %xmm5, %xmm0
    484 ; X32-SSE-NEXT:    paddw %xmm3, %xmm3
    485 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm1
    486 ; X32-SSE-NEXT:    psraw $15, %xmm1
    487 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm5
    488 ; X32-SSE-NEXT:    pandn %xmm0, %xmm5
    489 ; X32-SSE-NEXT:    psrlw $4, %xmm0
    490 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
    491 ; X32-SSE-NEXT:    por %xmm5, %xmm0
    492 ; X32-SSE-NEXT:    paddw %xmm3, %xmm3
    493 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm1
    494 ; X32-SSE-NEXT:    psraw $15, %xmm1
    495 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm5
    496 ; X32-SSE-NEXT:    pandn %xmm0, %xmm5
    497 ; X32-SSE-NEXT:    psrlw $2, %xmm0
    498 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
    499 ; X32-SSE-NEXT:    por %xmm5, %xmm0
    500 ; X32-SSE-NEXT:    paddw %xmm3, %xmm3
    501 ; X32-SSE-NEXT:    psraw $15, %xmm3
    502 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm1
    503 ; X32-SSE-NEXT:    pandn %xmm0, %xmm1
    504 ; X32-SSE-NEXT:    psrlw $1, %xmm0
    505 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
    506 ; X32-SSE-NEXT:    por %xmm1, %xmm0
    507 ; X32-SSE-NEXT:    por %xmm4, %xmm0
    508 ; X32-SSE-NEXT:    por %xmm2, %xmm0
    509 ; X32-SSE-NEXT:    retl
    510   %b16 = sub <8 x i16> <i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16>, %b
    511   %shl = shl <8 x i16> %a, %b
    512   %lshr = lshr <8 x i16> %a, %b16
    513   %or = or <8 x i16> %shl, %lshr
    514   ret <8 x i16> %or
    515 }
    516 
    517 define <16 x i8> @var_rotate_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
    518 ; SSE2-LABEL: var_rotate_v16i8:
    519 ; SSE2:       # BB#0:
    520 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
    521 ; SSE2-NEXT:    psubb %xmm1, %xmm4
    522 ; SSE2-NEXT:    psllw $5, %xmm1
    523 ; SSE2-NEXT:    pxor %xmm3, %xmm3
    524 ; SSE2-NEXT:    pxor %xmm2, %xmm2
    525 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
    526 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
    527 ; SSE2-NEXT:    psllw $4, %xmm5
    528 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm5
    529 ; SSE2-NEXT:    pand %xmm2, %xmm5
    530 ; SSE2-NEXT:    pandn %xmm0, %xmm2
    531 ; SSE2-NEXT:    por %xmm5, %xmm2
    532 ; SSE2-NEXT:    paddb %xmm1, %xmm1
    533 ; SSE2-NEXT:    pxor %xmm5, %xmm5
    534 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm5
    535 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
    536 ; SSE2-NEXT:    pandn %xmm2, %xmm6
    537 ; SSE2-NEXT:    psllw $2, %xmm2
    538 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
    539 ; SSE2-NEXT:    pand %xmm5, %xmm2
    540 ; SSE2-NEXT:    por %xmm6, %xmm2
    541 ; SSE2-NEXT:    paddb %xmm1, %xmm1
    542 ; SSE2-NEXT:    pxor %xmm5, %xmm5
    543 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm5
    544 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
    545 ; SSE2-NEXT:    pandn %xmm2, %xmm1
    546 ; SSE2-NEXT:    paddb %xmm2, %xmm2
    547 ; SSE2-NEXT:    pand %xmm5, %xmm2
    548 ; SSE2-NEXT:    psllw $5, %xmm4
    549 ; SSE2-NEXT:    pxor %xmm5, %xmm5
    550 ; SSE2-NEXT:    pcmpgtb %xmm4, %xmm5
    551 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
    552 ; SSE2-NEXT:    pandn %xmm0, %xmm6
    553 ; SSE2-NEXT:    psrlw $4, %xmm0
    554 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
    555 ; SSE2-NEXT:    pand %xmm5, %xmm0
    556 ; SSE2-NEXT:    por %xmm6, %xmm0
    557 ; SSE2-NEXT:    paddb %xmm4, %xmm4
    558 ; SSE2-NEXT:    pxor %xmm5, %xmm5
    559 ; SSE2-NEXT:    pcmpgtb %xmm4, %xmm5
    560 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
    561 ; SSE2-NEXT:    pandn %xmm0, %xmm6
    562 ; SSE2-NEXT:    psrlw $2, %xmm0
    563 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
    564 ; SSE2-NEXT:    pand %xmm5, %xmm0
    565 ; SSE2-NEXT:    por %xmm6, %xmm0
    566 ; SSE2-NEXT:    paddb %xmm4, %xmm4
    567 ; SSE2-NEXT:    pcmpgtb %xmm4, %xmm3
    568 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
    569 ; SSE2-NEXT:    pandn %xmm0, %xmm4
    570 ; SSE2-NEXT:    psrlw $1, %xmm0
    571 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
    572 ; SSE2-NEXT:    pand %xmm3, %xmm0
    573 ; SSE2-NEXT:    por %xmm4, %xmm0
    574 ; SSE2-NEXT:    por %xmm1, %xmm0
    575 ; SSE2-NEXT:    por %xmm2, %xmm0
    576 ; SSE2-NEXT:    retq
    577 ;
    578 ; SSE41-LABEL: var_rotate_v16i8:
    579 ; SSE41:       # BB#0:
    580 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
    581 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    582 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
    583 ; SSE41-NEXT:    psubb %xmm3, %xmm2
    584 ; SSE41-NEXT:    psllw $5, %xmm3
    585 ; SSE41-NEXT:    movdqa %xmm1, %xmm5
    586 ; SSE41-NEXT:    psllw $4, %xmm5
    587 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm5
    588 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
    589 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    590 ; SSE41-NEXT:    pblendvb %xmm5, %xmm4
    591 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
    592 ; SSE41-NEXT:    psllw $2, %xmm5
    593 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm5
    594 ; SSE41-NEXT:    paddb %xmm3, %xmm3
    595 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    596 ; SSE41-NEXT:    pblendvb %xmm5, %xmm4
    597 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
    598 ; SSE41-NEXT:    paddb %xmm5, %xmm5
    599 ; SSE41-NEXT:    paddb %xmm3, %xmm3
    600 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    601 ; SSE41-NEXT:    pblendvb %xmm5, %xmm4
    602 ; SSE41-NEXT:    psllw $5, %xmm2
    603 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
    604 ; SSE41-NEXT:    paddb %xmm3, %xmm3
    605 ; SSE41-NEXT:    movdqa %xmm1, %xmm5
    606 ; SSE41-NEXT:    psrlw $4, %xmm5
    607 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm5
    608 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
    609 ; SSE41-NEXT:    pblendvb %xmm5, %xmm1
    610 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
    611 ; SSE41-NEXT:    psrlw $2, %xmm2
    612 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
    613 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    614 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
    615 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
    616 ; SSE41-NEXT:    psrlw $1, %xmm2
    617 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
    618 ; SSE41-NEXT:    paddb %xmm3, %xmm3
    619 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    620 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
    621 ; SSE41-NEXT:    por %xmm4, %xmm1
    622 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    623 ; SSE41-NEXT:    retq
    624 ;
    625 ; AVX-LABEL: var_rotate_v16i8:
    626 ; AVX:       # BB#0:
    627 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
    628 ; AVX-NEXT:    vpsubb %xmm1, %xmm2, %xmm2
    629 ; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
    630 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm3
    631 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
    632 ; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm3
    633 ; AVX-NEXT:    vpsllw $2, %xmm3, %xmm4
    634 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm4, %xmm4
    635 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    636 ; AVX-NEXT:    vpblendvb %xmm1, %xmm4, %xmm3, %xmm3
    637 ; AVX-NEXT:    vpaddb %xmm3, %xmm3, %xmm4
    638 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
    639 ; AVX-NEXT:    vpblendvb %xmm1, %xmm4, %xmm3, %xmm1
    640 ; AVX-NEXT:    vpsllw $5, %xmm2, %xmm2
    641 ; AVX-NEXT:    vpaddb %xmm2, %xmm2, %xmm3
    642 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm4
    643 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm4, %xmm4
    644 ; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm0, %xmm0
    645 ; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm2
    646 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    647 ; AVX-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
    648 ; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm2
    649 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    650 ; AVX-NEXT:    vpaddb %xmm3, %xmm3, %xmm3
    651 ; AVX-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
    652 ; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
    653 ; AVX-NEXT:    retq
    654 ;
    655 ; XOP-LABEL: var_rotate_v16i8:
    656 ; XOP:       # BB#0:
    657 ; XOP-NEXT:    vprotb %xmm1, %xmm0, %xmm0
    658 ; XOP-NEXT:    retq
    659 ;
    660 ; X32-SSE-LABEL: var_rotate_v16i8:
    661 ; X32-SSE:       # BB#0:
    662 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
    663 ; X32-SSE-NEXT:    psubb %xmm1, %xmm4
    664 ; X32-SSE-NEXT:    psllw $5, %xmm1
    665 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
    666 ; X32-SSE-NEXT:    pxor %xmm2, %xmm2
    667 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm2
    668 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm5
    669 ; X32-SSE-NEXT:    psllw $4, %xmm5
    670 ; X32-SSE-NEXT:    pand .LCPI3_1, %xmm5
    671 ; X32-SSE-NEXT:    pand %xmm2, %xmm5
    672 ; X32-SSE-NEXT:    pandn %xmm0, %xmm2
    673 ; X32-SSE-NEXT:    por %xmm5, %xmm2
    674 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
    675 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
    676 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm5
    677 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
    678 ; X32-SSE-NEXT:    pandn %xmm2, %xmm6
    679 ; X32-SSE-NEXT:    psllw $2, %xmm2
    680 ; X32-SSE-NEXT:    pand .LCPI3_2, %xmm2
    681 ; X32-SSE-NEXT:    pand %xmm5, %xmm2
    682 ; X32-SSE-NEXT:    por %xmm6, %xmm2
    683 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
    684 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
    685 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm5
    686 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm1
    687 ; X32-SSE-NEXT:    pandn %xmm2, %xmm1
    688 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
    689 ; X32-SSE-NEXT:    pand %xmm5, %xmm2
    690 ; X32-SSE-NEXT:    psllw $5, %xmm4
    691 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
    692 ; X32-SSE-NEXT:    pcmpgtb %xmm4, %xmm5
    693 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
    694 ; X32-SSE-NEXT:    pandn %xmm0, %xmm6
    695 ; X32-SSE-NEXT:    psrlw $4, %xmm0
    696 ; X32-SSE-NEXT:    pand .LCPI3_3, %xmm0
    697 ; X32-SSE-NEXT:    pand %xmm5, %xmm0
    698 ; X32-SSE-NEXT:    por %xmm6, %xmm0
    699 ; X32-SSE-NEXT:    paddb %xmm4, %xmm4
    700 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
    701 ; X32-SSE-NEXT:    pcmpgtb %xmm4, %xmm5
    702 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
    703 ; X32-SSE-NEXT:    pandn %xmm0, %xmm6
    704 ; X32-SSE-NEXT:    psrlw $2, %xmm0
    705 ; X32-SSE-NEXT:    pand .LCPI3_4, %xmm0
    706 ; X32-SSE-NEXT:    pand %xmm5, %xmm0
    707 ; X32-SSE-NEXT:    por %xmm6, %xmm0
    708 ; X32-SSE-NEXT:    paddb %xmm4, %xmm4
    709 ; X32-SSE-NEXT:    pcmpgtb %xmm4, %xmm3
    710 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
    711 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
    712 ; X32-SSE-NEXT:    psrlw $1, %xmm0
    713 ; X32-SSE-NEXT:    pand .LCPI3_5, %xmm0
    714 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
    715 ; X32-SSE-NEXT:    por %xmm4, %xmm0
    716 ; X32-SSE-NEXT:    por %xmm1, %xmm0
    717 ; X32-SSE-NEXT:    por %xmm2, %xmm0
    718 ; X32-SSE-NEXT:    retl
    719   %b8 = sub <16 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>, %b
    720   %shl = shl <16 x i8> %a, %b
    721   %lshr = lshr <16 x i8> %a, %b8
    722   %or = or <16 x i8> %shl, %lshr
    723   ret <16 x i8> %or
    724 }
    725 
    726 ;
    727 ; Constant Rotates
    728 ;
    729 
    730 define <2 x i64> @constant_rotate_v2i64(<2 x i64> %a) nounwind {
    731 ; SSE2-LABEL: constant_rotate_v2i64:
    732 ; SSE2:       # BB#0:
    733 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    734 ; SSE2-NEXT:    psllq $14, %xmm2
    735 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    736 ; SSE2-NEXT:    psllq $4, %xmm1
    737 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]
    738 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    739 ; SSE2-NEXT:    psrlq $50, %xmm1
    740 ; SSE2-NEXT:    psrlq $60, %xmm0
    741 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
    742 ; SSE2-NEXT:    orpd %xmm2, %xmm1
    743 ; SSE2-NEXT:    movapd %xmm1, %xmm0
    744 ; SSE2-NEXT:    retq
    745 ;
    746 ; SSE41-LABEL: constant_rotate_v2i64:
    747 ; SSE41:       # BB#0:
    748 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    749 ; SSE41-NEXT:    psllq $14, %xmm1
    750 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    751 ; SSE41-NEXT:    psllq $4, %xmm2
    752 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]
    753 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    754 ; SSE41-NEXT:    psrlq $50, %xmm1
    755 ; SSE41-NEXT:    psrlq $60, %xmm0
    756 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
    757 ; SSE41-NEXT:    por %xmm2, %xmm0
    758 ; SSE41-NEXT:    retq
    759 ;
    760 ; AVX1-LABEL: constant_rotate_v2i64:
    761 ; AVX1:       # BB#0:
    762 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm1
    763 ; AVX1-NEXT:    vpsllq $4, %xmm0, %xmm2
    764 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
    765 ; AVX1-NEXT:    vpsrlq $50, %xmm0, %xmm2
    766 ; AVX1-NEXT:    vpsrlq $60, %xmm0, %xmm0
    767 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
    768 ; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
    769 ; AVX1-NEXT:    retq
    770 ;
    771 ; AVX2-LABEL: constant_rotate_v2i64:
    772 ; AVX2:       # BB#0:
    773 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %xmm0, %xmm1
    774 ; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
    775 ; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
    776 ; AVX2-NEXT:    retq
    777 ;
    778 ; XOPAVX1-LABEL: constant_rotate_v2i64:
    779 ; XOPAVX1:       # BB#0:
    780 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm1
    781 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    782 ; XOPAVX1-NEXT:    vpsubq {{.*}}(%rip), %xmm2, %xmm2
    783 ; XOPAVX1-NEXT:    vpshlq %xmm2, %xmm0, %xmm0
    784 ; XOPAVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
    785 ; XOPAVX1-NEXT:    retq
    786 ;
    787 ; XOPAVX2-LABEL: constant_rotate_v2i64:
    788 ; XOPAVX2:       # BB#0:
    789 ; XOPAVX2-NEXT:    vpsllvq {{.*}}(%rip), %xmm0, %xmm1
    790 ; XOPAVX2-NEXT:    vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
    791 ; XOPAVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
    792 ; XOPAVX2-NEXT:    retq
    793 ;
    794 ; X32-SSE-LABEL: constant_rotate_v2i64:
    795 ; X32-SSE:       # BB#0:
    796 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
    797 ; X32-SSE-NEXT:    psllq $14, %xmm2
    798 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
    799 ; X32-SSE-NEXT:    psllq $4, %xmm1
    800 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]
    801 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
    802 ; X32-SSE-NEXT:    psrlq $50, %xmm1
    803 ; X32-SSE-NEXT:    psrlq $60, %xmm0
    804 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
    805 ; X32-SSE-NEXT:    orpd %xmm2, %xmm1
    806 ; X32-SSE-NEXT:    movapd %xmm1, %xmm0
    807 ; X32-SSE-NEXT:    retl
    808   %shl = shl <2 x i64> %a, <i64 4, i64 14>
    809   %lshr = lshr <2 x i64> %a, <i64 60, i64 50>
    810   %or = or <2 x i64> %shl, %lshr
    811   ret <2 x i64> %or
    812 }
    813 
    814 define <4 x i32> @constant_rotate_v4i32(<4 x i32> %a) nounwind {
    815 ; SSE2-LABEL: constant_rotate_v4i32:
    816 ; SSE2:       # BB#0:
    817 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
    818 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    819 ; SSE2-NEXT:    pmuludq %xmm1, %xmm2
    820 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
    821 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    822 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
    823 ; SSE2-NEXT:    pmuludq %xmm1, %xmm3
    824 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
    825 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
    826 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    827 ; SSE2-NEXT:    psrld $25, %xmm1
    828 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
    829 ; SSE2-NEXT:    psrld $27, %xmm3
    830 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm3[0],xmm1[1]
    831 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
    832 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
    833 ; SSE2-NEXT:    psrld $26, %xmm3
    834 ; SSE2-NEXT:    psrld $28, %xmm0
    835 ; SSE2-NEXT:    movsd {{.*#+}} xmm3 = xmm0[0],xmm3[1]
    836 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
    837 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
    838 ; SSE2-NEXT:    por %xmm2, %xmm0
    839 ; SSE2-NEXT:    retq
    840 ;
    841 ; SSE41-LABEL: constant_rotate_v4i32:
    842 ; SSE41:       # BB#0:
    843 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
    844 ; SSE41-NEXT:    pmulld %xmm0, %xmm1
    845 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    846 ; SSE41-NEXT:    psrld $25, %xmm2
    847 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
    848 ; SSE41-NEXT:    psrld $27, %xmm3
    849 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm2[4,5,6,7]
    850 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    851 ; SSE41-NEXT:    psrld $26, %xmm2
    852 ; SSE41-NEXT:    psrld $28, %xmm0
    853 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
    854 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
    855 ; SSE41-NEXT:    por %xmm1, %xmm0
    856 ; SSE41-NEXT:    retq
    857 ;
    858 ; AVX1-LABEL: constant_rotate_v4i32:
    859 ; AVX1:       # BB#0:
    860 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm1
    861 ; AVX1-NEXT:    vpsrld $25, %xmm0, %xmm2
    862 ; AVX1-NEXT:    vpsrld $27, %xmm0, %xmm3
    863 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
    864 ; AVX1-NEXT:    vpsrld $26, %xmm0, %xmm3
    865 ; AVX1-NEXT:    vpsrld $28, %xmm0, %xmm0
    866 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
    867 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
    868 ; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
    869 ; AVX1-NEXT:    retq
    870 ;
    871 ; AVX2-LABEL: constant_rotate_v4i32:
    872 ; AVX2:       # BB#0:
    873 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %xmm0, %xmm1
    874 ; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %xmm0, %xmm0
    875 ; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
    876 ; AVX2-NEXT:    retq
    877 ;
    878 ; XOPAVX1-LABEL: constant_rotate_v4i32:
    879 ; XOPAVX1:       # BB#0:
    880 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm1
    881 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
    882 ; XOPAVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
    883 ; XOPAVX1-NEXT:    retq
    884 ;
    885 ; XOPAVX2-LABEL: constant_rotate_v4i32:
    886 ; XOPAVX2:       # BB#0:
    887 ; XOPAVX2-NEXT:    vpsllvd {{.*}}(%rip), %xmm0, %xmm1
    888 ; XOPAVX2-NEXT:    vpsrlvd {{.*}}(%rip), %xmm0, %xmm0
    889 ; XOPAVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
    890 ; XOPAVX2-NEXT:    retq
    891 ;
    892 ; X32-SSE-LABEL: constant_rotate_v4i32:
    893 ; X32-SSE:       # BB#0:
    894 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
    895 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
    896 ; X32-SSE-NEXT:    pmuludq %xmm1, %xmm2
    897 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
    898 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    899 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
    900 ; X32-SSE-NEXT:    pmuludq %xmm1, %xmm3
    901 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
    902 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
    903 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
    904 ; X32-SSE-NEXT:    psrld $25, %xmm1
    905 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm3
    906 ; X32-SSE-NEXT:    psrld $27, %xmm3
    907 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm3[0],xmm1[1]
    908 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
    909 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm3
    910 ; X32-SSE-NEXT:    psrld $26, %xmm3
    911 ; X32-SSE-NEXT:    psrld $28, %xmm0
    912 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm3 = xmm0[0],xmm3[1]
    913 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
    914 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
    915 ; X32-SSE-NEXT:    por %xmm2, %xmm0
    916 ; X32-SSE-NEXT:    retl
    917   %shl = shl <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>
    918   %lshr = lshr <4 x i32> %a, <i32 28, i32 27, i32 26, i32 25>
    919   %or = or <4 x i32> %shl, %lshr
    920   ret <4 x i32> %or
    921 }
    922 
    923 define <8 x i16> @constant_rotate_v8i16(<8 x i16> %a) nounwind {
    924 ; SSE2-LABEL: constant_rotate_v8i16:
    925 ; SSE2:       # BB#0:
    926 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
    927 ; SSE2-NEXT:    pmullw %xmm0, %xmm2
    928 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,65535,65535,65535,65535,65535]
    929 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
    930 ; SSE2-NEXT:    pandn %xmm0, %xmm3
    931 ; SSE2-NEXT:    psrlw $8, %xmm0
    932 ; SSE2-NEXT:    pand %xmm1, %xmm0
    933 ; SSE2-NEXT:    por %xmm3, %xmm0
    934 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,65535,65535,0,0,0]
    935 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
    936 ; SSE2-NEXT:    pandn %xmm0, %xmm3
    937 ; SSE2-NEXT:    psrlw $4, %xmm0
    938 ; SSE2-NEXT:    pand %xmm1, %xmm0
    939 ; SSE2-NEXT:    por %xmm3, %xmm0
    940 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,0,0,65535,65535,0]
    941 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
    942 ; SSE2-NEXT:    pandn %xmm0, %xmm3
    943 ; SSE2-NEXT:    psrlw $2, %xmm0
    944 ; SSE2-NEXT:    pand %xmm1, %xmm0
    945 ; SSE2-NEXT:    por %xmm3, %xmm0
    946 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [65535,0,65535,0,65535,0,65535,0]
    947 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    948 ; SSE2-NEXT:    pand %xmm3, %xmm1
    949 ; SSE2-NEXT:    psrlw $1, %xmm0
    950 ; SSE2-NEXT:    pandn %xmm0, %xmm3
    951 ; SSE2-NEXT:    por %xmm2, %xmm3
    952 ; SSE2-NEXT:    por %xmm3, %xmm1
    953 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
    954 ; SSE2-NEXT:    retq
    955 ;
    956 ; SSE41-LABEL: constant_rotate_v8i16:
    957 ; SSE41:       # BB#0:
    958 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    959 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
    960 ; SSE41-NEXT:    pmullw %xmm1, %xmm2
    961 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
    962 ; SSE41-NEXT:    psrlw $8, %xmm3
    963 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [256,61680,57568,53456,49344,45232,41120,37008]
    964 ; SSE41-NEXT:    pblendvb %xmm3, %xmm1
    965 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
    966 ; SSE41-NEXT:    psrlw $4, %xmm3
    967 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [512,57824,49600,41376,33152,24928,16704,8480]
    968 ; SSE41-NEXT:    pblendvb %xmm3, %xmm1
    969 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
    970 ; SSE41-NEXT:    psrlw $2, %xmm3
    971 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [1024,50112,33664,17216,768,49856,33408,16960]
    972 ; SSE41-NEXT:    pblendvb %xmm3, %xmm1
    973 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
    974 ; SSE41-NEXT:    psrlw $1, %xmm3
    975 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [2048,34688,1792,34432,1536,34176,1280,33920]
    976 ; SSE41-NEXT:    pblendvb %xmm3, %xmm1
    977 ; SSE41-NEXT:    por %xmm2, %xmm1
    978 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    979 ; SSE41-NEXT:    retq
    980 ;
    981 ; AVX1-LABEL: constant_rotate_v8i16:
    982 ; AVX1:       # BB#0:
    983 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm1
    984 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm2
    985 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [256,61680,57568,53456,49344,45232,41120,37008]
    986 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
    987 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm2
    988 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [512,57824,49600,41376,33152,24928,16704,8480]
    989 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
    990 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm2
    991 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1024,50112,33664,17216,768,49856,33408,16960]
    992 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
    993 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm2
    994 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [2048,34688,1792,34432,1536,34176,1280,33920]
    995 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
    996 ; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
    997 ; AVX1-NEXT:    retq
    998 ;
    999 ; AVX2-LABEL: constant_rotate_v8i16:
   1000 ; AVX2:       # BB#0:
   1001 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm1
   1002 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
   1003 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
   1004 ; AVX2-NEXT:    vpsrlvd %ymm2, %ymm0, %ymm0
   1005 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero,ymm0[16,17,20,21,24,25,28,29],zero,zero,zero,zero,zero,zero,zero,zero
   1006 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
   1007 ; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
   1008 ; AVX2-NEXT:    vzeroupper
   1009 ; AVX2-NEXT:    retq
   1010 ;
   1011 ; XOP-LABEL: constant_rotate_v8i16:
   1012 ; XOP:       # BB#0:
   1013 ; XOP-NEXT:    vpshlw {{.*}}(%rip), %xmm0, %xmm1
   1014 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
   1015 ; XOP-NEXT:    vpsubw {{.*}}(%rip), %xmm2, %xmm2
   1016 ; XOP-NEXT:    vpshlw %xmm2, %xmm0, %xmm0
   1017 ; XOP-NEXT:    vpor %xmm0, %xmm1, %xmm0
   1018 ; XOP-NEXT:    retq
   1019 ;
   1020 ; X32-SSE-LABEL: constant_rotate_v8i16:
   1021 ; X32-SSE:       # BB#0:
   1022 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
   1023 ; X32-SSE-NEXT:    pmullw %xmm0, %xmm2
   1024 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,65535,65535,65535,65535,65535]
   1025 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm3
   1026 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
   1027 ; X32-SSE-NEXT:    psrlw $8, %xmm0
   1028 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
   1029 ; X32-SSE-NEXT:    por %xmm3, %xmm0
   1030 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,65535,65535,0,0,0]
   1031 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm3
   1032 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
   1033 ; X32-SSE-NEXT:    psrlw $4, %xmm0
   1034 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
   1035 ; X32-SSE-NEXT:    por %xmm3, %xmm0
   1036 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,0,0,65535,65535,0]
   1037 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm3
   1038 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
   1039 ; X32-SSE-NEXT:    psrlw $2, %xmm0
   1040 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
   1041 ; X32-SSE-NEXT:    por %xmm3, %xmm0
   1042 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm3 = [65535,0,65535,0,65535,0,65535,0]
   1043 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
   1044 ; X32-SSE-NEXT:    pand %xmm3, %xmm1
   1045 ; X32-SSE-NEXT:    psrlw $1, %xmm0
   1046 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
   1047 ; X32-SSE-NEXT:    por %xmm2, %xmm3
   1048 ; X32-SSE-NEXT:    por %xmm3, %xmm1
   1049 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
   1050 ; X32-SSE-NEXT:    retl
   1051   %shl = shl <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>
   1052   %lshr = lshr <8 x i16> %a, <i16 16, i16 15, i16 14, i16 13, i16 12, i16 11, i16 10, i16 9>
   1053   %or = or <8 x i16> %shl, %lshr
   1054   ret <8 x i16> %or
   1055 }
   1056 
   1057 define <16 x i8> @constant_rotate_v16i8(<16 x i8> %a) nounwind {
   1058 ; SSE2-LABEL: constant_rotate_v16i8:
   1059 ; SSE2:       # BB#0:
   1060 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
   1061 ; SSE2-NEXT:    psllw $5, %xmm3
   1062 ; SSE2-NEXT:    pxor %xmm2, %xmm2
   1063 ; SSE2-NEXT:    pxor %xmm1, %xmm1
   1064 ; SSE2-NEXT:    pcmpgtb %xmm3, %xmm1
   1065 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
   1066 ; SSE2-NEXT:    psllw $4, %xmm4
   1067 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm4
   1068 ; SSE2-NEXT:    pand %xmm1, %xmm4
   1069 ; SSE2-NEXT:    pandn %xmm0, %xmm1
   1070 ; SSE2-NEXT:    por %xmm4, %xmm1
   1071 ; SSE2-NEXT:    paddb %xmm3, %xmm3
   1072 ; SSE2-NEXT:    pxor %xmm4, %xmm4
   1073 ; SSE2-NEXT:    pcmpgtb %xmm3, %xmm4
   1074 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
   1075 ; SSE2-NEXT:    pandn %xmm1, %xmm5
   1076 ; SSE2-NEXT:    psllw $2, %xmm1
   1077 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
   1078 ; SSE2-NEXT:    pand %xmm4, %xmm1
   1079 ; SSE2-NEXT:    por %xmm5, %xmm1
   1080 ; SSE2-NEXT:    paddb %xmm3, %xmm3
   1081 ; SSE2-NEXT:    pxor %xmm4, %xmm4
   1082 ; SSE2-NEXT:    pcmpgtb %xmm3, %xmm4
   1083 ; SSE2-NEXT:    movdqa %xmm4, %xmm3
   1084 ; SSE2-NEXT:    pandn %xmm1, %xmm3
   1085 ; SSE2-NEXT:    paddb %xmm1, %xmm1
   1086 ; SSE2-NEXT:    pand %xmm4, %xmm1
   1087 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7]
   1088 ; SSE2-NEXT:    psllw $5, %xmm4
   1089 ; SSE2-NEXT:    pxor %xmm5, %xmm5
   1090 ; SSE2-NEXT:    pcmpgtb %xmm4, %xmm5
   1091 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
   1092 ; SSE2-NEXT:    pandn %xmm0, %xmm6
   1093 ; SSE2-NEXT:    psrlw $4, %xmm0
   1094 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
   1095 ; SSE2-NEXT:    pand %xmm5, %xmm0
   1096 ; SSE2-NEXT:    por %xmm6, %xmm0
   1097 ; SSE2-NEXT:    paddb %xmm4, %xmm4
   1098 ; SSE2-NEXT:    pxor %xmm5, %xmm5
   1099 ; SSE2-NEXT:    pcmpgtb %xmm4, %xmm5
   1100 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
   1101 ; SSE2-NEXT:    pandn %xmm0, %xmm6
   1102 ; SSE2-NEXT:    psrlw $2, %xmm0
   1103 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
   1104 ; SSE2-NEXT:    pand %xmm5, %xmm0
   1105 ; SSE2-NEXT:    por %xmm6, %xmm0
   1106 ; SSE2-NEXT:    paddb %xmm4, %xmm4
   1107 ; SSE2-NEXT:    pcmpgtb %xmm4, %xmm2
   1108 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
   1109 ; SSE2-NEXT:    pandn %xmm0, %xmm4
   1110 ; SSE2-NEXT:    psrlw $1, %xmm0
   1111 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
   1112 ; SSE2-NEXT:    pand %xmm2, %xmm0
   1113 ; SSE2-NEXT:    por %xmm4, %xmm0
   1114 ; SSE2-NEXT:    por %xmm3, %xmm0
   1115 ; SSE2-NEXT:    por %xmm1, %xmm0
   1116 ; SSE2-NEXT:    retq
   1117 ;
   1118 ; SSE41-LABEL: constant_rotate_v16i8:
   1119 ; SSE41:       # BB#0:
   1120 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
   1121 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
   1122 ; SSE41-NEXT:    psllw $5, %xmm0
   1123 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
   1124 ; SSE41-NEXT:    psllw $4, %xmm3
   1125 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
   1126 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
   1127 ; SSE41-NEXT:    pblendvb %xmm3, %xmm2
   1128 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
   1129 ; SSE41-NEXT:    psllw $2, %xmm3
   1130 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
   1131 ; SSE41-NEXT:    paddb %xmm0, %xmm0
   1132 ; SSE41-NEXT:    pblendvb %xmm3, %xmm2
   1133 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
   1134 ; SSE41-NEXT:    paddb %xmm3, %xmm3
   1135 ; SSE41-NEXT:    paddb %xmm0, %xmm0
   1136 ; SSE41-NEXT:    pblendvb %xmm3, %xmm2
   1137 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7]
   1138 ; SSE41-NEXT:    psllw $5, %xmm0
   1139 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
   1140 ; SSE41-NEXT:    psrlw $4, %xmm3
   1141 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
   1142 ; SSE41-NEXT:    pblendvb %xmm3, %xmm1
   1143 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
   1144 ; SSE41-NEXT:    psrlw $2, %xmm3
   1145 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
   1146 ; SSE41-NEXT:    paddb %xmm0, %xmm0
   1147 ; SSE41-NEXT:    pblendvb %xmm3, %xmm1
   1148 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
   1149 ; SSE41-NEXT:    psrlw $1, %xmm3
   1150 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
   1151 ; SSE41-NEXT:    paddb %xmm0, %xmm0
   1152 ; SSE41-NEXT:    pblendvb %xmm3, %xmm1
   1153 ; SSE41-NEXT:    por %xmm2, %xmm1
   1154 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
   1155 ; SSE41-NEXT:    retq
   1156 ;
   1157 ; AVX-LABEL: constant_rotate_v16i8:
   1158 ; AVX:       # BB#0:
   1159 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
   1160 ; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
   1161 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm2
   1162 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
   1163 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm2
   1164 ; AVX-NEXT:    vpsllw $2, %xmm2, %xmm3
   1165 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
   1166 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
   1167 ; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm2, %xmm2
   1168 ; AVX-NEXT:    vpaddb %xmm2, %xmm2, %xmm3
   1169 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
   1170 ; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm2, %xmm1
   1171 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7]
   1172 ; AVX-NEXT:    vpsllw $5, %xmm2, %xmm2
   1173 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm3
   1174 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
   1175 ; AVX-NEXT:    vpblendvb %xmm2, %xmm3, %xmm0, %xmm0
   1176 ; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm3
   1177 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
   1178 ; AVX-NEXT:    vpaddb %xmm2, %xmm2, %xmm2
   1179 ; AVX-NEXT:    vpblendvb %xmm2, %xmm3, %xmm0, %xmm0
   1180 ; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm3
   1181 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
   1182 ; AVX-NEXT:    vpaddb %xmm2, %xmm2, %xmm2
   1183 ; AVX-NEXT:    vpblendvb %xmm2, %xmm3, %xmm0, %xmm0
   1184 ; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
   1185 ; AVX-NEXT:    retq
   1186 ;
   1187 ; XOP-LABEL: constant_rotate_v16i8:
   1188 ; XOP:       # BB#0:
   1189 ; XOP-NEXT:    vpshlb {{.*}}(%rip), %xmm0, %xmm1
   1190 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
   1191 ; XOP-NEXT:    vpsubb {{.*}}(%rip), %xmm2, %xmm2
   1192 ; XOP-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
   1193 ; XOP-NEXT:    vpor %xmm0, %xmm1, %xmm0
   1194 ; XOP-NEXT:    retq
   1195 ;
   1196 ; X32-SSE-LABEL: constant_rotate_v16i8:
   1197 ; X32-SSE:       # BB#0:
   1198 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
   1199 ; X32-SSE-NEXT:    psllw $5, %xmm3
   1200 ; X32-SSE-NEXT:    pxor %xmm2, %xmm2
   1201 ; X32-SSE-NEXT:    pxor %xmm1, %xmm1
   1202 ; X32-SSE-NEXT:    pcmpgtb %xmm3, %xmm1
   1203 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm4
   1204 ; X32-SSE-NEXT:    psllw $4, %xmm4
   1205 ; X32-SSE-NEXT:    pand .LCPI7_1, %xmm4
   1206 ; X32-SSE-NEXT:    pand %xmm1, %xmm4
   1207 ; X32-SSE-NEXT:    pandn %xmm0, %xmm1
   1208 ; X32-SSE-NEXT:    por %xmm4, %xmm1
   1209 ; X32-SSE-NEXT:    paddb %xmm3, %xmm3
   1210 ; X32-SSE-NEXT:    pxor %xmm4, %xmm4
   1211 ; X32-SSE-NEXT:    pcmpgtb %xmm3, %xmm4
   1212 ; X32-SSE-NEXT:    movdqa %xmm4, %xmm5
   1213 ; X32-SSE-NEXT:    pandn %xmm1, %xmm5
   1214 ; X32-SSE-NEXT:    psllw $2, %xmm1
   1215 ; X32-SSE-NEXT:    pand .LCPI7_2, %xmm1
   1216 ; X32-SSE-NEXT:    pand %xmm4, %xmm1
   1217 ; X32-SSE-NEXT:    por %xmm5, %xmm1
   1218 ; X32-SSE-NEXT:    paddb %xmm3, %xmm3
   1219 ; X32-SSE-NEXT:    pxor %xmm4, %xmm4
   1220 ; X32-SSE-NEXT:    pcmpgtb %xmm3, %xmm4
   1221 ; X32-SSE-NEXT:    movdqa %xmm4, %xmm3
   1222 ; X32-SSE-NEXT:    pandn %xmm1, %xmm3
   1223 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
   1224 ; X32-SSE-NEXT:    pand %xmm4, %xmm1
   1225 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm4 = [8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7]
   1226 ; X32-SSE-NEXT:    psllw $5, %xmm4
   1227 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
   1228 ; X32-SSE-NEXT:    pcmpgtb %xmm4, %xmm5
   1229 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
   1230 ; X32-SSE-NEXT:    pandn %xmm0, %xmm6
   1231 ; X32-SSE-NEXT:    psrlw $4, %xmm0
   1232 ; X32-SSE-NEXT:    pand .LCPI7_4, %xmm0
   1233 ; X32-SSE-NEXT:    pand %xmm5, %xmm0
   1234 ; X32-SSE-NEXT:    por %xmm6, %xmm0
   1235 ; X32-SSE-NEXT:    paddb %xmm4, %xmm4
   1236 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
   1237 ; X32-SSE-NEXT:    pcmpgtb %xmm4, %xmm5
   1238 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
   1239 ; X32-SSE-NEXT:    pandn %xmm0, %xmm6
   1240 ; X32-SSE-NEXT:    psrlw $2, %xmm0
   1241 ; X32-SSE-NEXT:    pand .LCPI7_5, %xmm0
   1242 ; X32-SSE-NEXT:    pand %xmm5, %xmm0
   1243 ; X32-SSE-NEXT:    por %xmm6, %xmm0
   1244 ; X32-SSE-NEXT:    paddb %xmm4, %xmm4
   1245 ; X32-SSE-NEXT:    pcmpgtb %xmm4, %xmm2
   1246 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm4
   1247 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
   1248 ; X32-SSE-NEXT:    psrlw $1, %xmm0
   1249 ; X32-SSE-NEXT:    pand .LCPI7_6, %xmm0
   1250 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
   1251 ; X32-SSE-NEXT:    por %xmm4, %xmm0
   1252 ; X32-SSE-NEXT:    por %xmm3, %xmm0
   1253 ; X32-SSE-NEXT:    por %xmm1, %xmm0
   1254 ; X32-SSE-NEXT:    retl
   1255   %shl = shl <16 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>
   1256   %lshr = lshr <16 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>
   1257   %or = or <16 x i8> %shl, %lshr
   1258   ret <16 x i8> %or
   1259 }
   1260 
   1261 ;
   1262 ; Uniform Constant Rotates
   1263 ;
   1264 
   1265 define <2 x i64> @splatconstant_rotate_v2i64(<2 x i64> %a) nounwind {
   1266 ; SSE-LABEL: splatconstant_rotate_v2i64:
   1267 ; SSE:       # BB#0:
   1268 ; SSE-NEXT:    movdqa %xmm0, %xmm1
   1269 ; SSE-NEXT:    psllq $14, %xmm1
   1270 ; SSE-NEXT:    psrlq $50, %xmm0
   1271 ; SSE-NEXT:    por %xmm1, %xmm0
   1272 ; SSE-NEXT:    retq
   1273 ;
   1274 ; AVX-LABEL: splatconstant_rotate_v2i64:
   1275 ; AVX:       # BB#0:
   1276 ; AVX-NEXT:    vpsllq $14, %xmm0, %xmm1
   1277 ; AVX-NEXT:    vpsrlq $50, %xmm0, %xmm0
   1278 ; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
   1279 ; AVX-NEXT:    retq
   1280 ;
   1281 ; XOP-LABEL: splatconstant_rotate_v2i64:
   1282 ; XOP:       # BB#0:
   1283 ; XOP-NEXT:    vprotq $14, %xmm0, %xmm0
   1284 ; XOP-NEXT:    retq
   1285 ;
   1286 ; X32-SSE-LABEL: splatconstant_rotate_v2i64:
   1287 ; X32-SSE:       # BB#0:
   1288 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
   1289 ; X32-SSE-NEXT:    psllq $14, %xmm1
   1290 ; X32-SSE-NEXT:    psrlq $50, %xmm0
   1291 ; X32-SSE-NEXT:    por %xmm1, %xmm0
   1292 ; X32-SSE-NEXT:    retl
   1293   %shl = shl <2 x i64> %a, <i64 14, i64 14>
   1294   %lshr = lshr <2 x i64> %a, <i64 50, i64 50>
   1295   %or = or <2 x i64> %shl, %lshr
   1296   ret <2 x i64> %or
   1297 }
   1298 
   1299 define <4 x i32> @splatconstant_rotate_v4i32(<4 x i32> %a) nounwind {
   1300 ; SSE-LABEL: splatconstant_rotate_v4i32:
   1301 ; SSE:       # BB#0:
   1302 ; SSE-NEXT:    movdqa %xmm0, %xmm1
   1303 ; SSE-NEXT:    pslld $4, %xmm1
   1304 ; SSE-NEXT:    psrld $28, %xmm0
   1305 ; SSE-NEXT:    por %xmm1, %xmm0
   1306 ; SSE-NEXT:    retq
   1307 ;
   1308 ; AVX-LABEL: splatconstant_rotate_v4i32:
   1309 ; AVX:       # BB#0:
   1310 ; AVX-NEXT:    vpslld $4, %xmm0, %xmm1
   1311 ; AVX-NEXT:    vpsrld $28, %xmm0, %xmm0
   1312 ; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
   1313 ; AVX-NEXT:    retq
   1314 ;
   1315 ; XOP-LABEL: splatconstant_rotate_v4i32:
   1316 ; XOP:       # BB#0:
   1317 ; XOP-NEXT:    vprotd $4, %xmm0, %xmm0
   1318 ; XOP-NEXT:    retq
   1319 ;
   1320 ; X32-SSE-LABEL: splatconstant_rotate_v4i32:
   1321 ; X32-SSE:       # BB#0:
   1322 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
   1323 ; X32-SSE-NEXT:    pslld $4, %xmm1
   1324 ; X32-SSE-NEXT:    psrld $28, %xmm0
   1325 ; X32-SSE-NEXT:    por %xmm1, %xmm0
   1326 ; X32-SSE-NEXT:    retl
   1327   %shl = shl <4 x i32> %a, <i32 4, i32 4, i32 4, i32 4>
   1328   %lshr = lshr <4 x i32> %a, <i32 28, i32 28, i32 28, i32 28>
   1329   %or = or <4 x i32> %shl, %lshr
   1330   ret <4 x i32> %or
   1331 }
   1332 
   1333 define <8 x i16> @splatconstant_rotate_v8i16(<8 x i16> %a) nounwind {
   1334 ; SSE-LABEL: splatconstant_rotate_v8i16:
   1335 ; SSE:       # BB#0:
   1336 ; SSE-NEXT:    movdqa %xmm0, %xmm1
   1337 ; SSE-NEXT:    psllw $7, %xmm1
   1338 ; SSE-NEXT:    psrlw $9, %xmm0
   1339 ; SSE-NEXT:    por %xmm1, %xmm0
   1340 ; SSE-NEXT:    retq
   1341 ;
   1342 ; AVX-LABEL: splatconstant_rotate_v8i16:
   1343 ; AVX:       # BB#0:
   1344 ; AVX-NEXT:    vpsllw $7, %xmm0, %xmm1
   1345 ; AVX-NEXT:    vpsrlw $9, %xmm0, %xmm0
   1346 ; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
   1347 ; AVX-NEXT:    retq
   1348 ;
   1349 ; XOP-LABEL: splatconstant_rotate_v8i16:
   1350 ; XOP:       # BB#0:
   1351 ; XOP-NEXT:    vprotw $7, %xmm0, %xmm0
   1352 ; XOP-NEXT:    retq
   1353 ;
   1354 ; X32-SSE-LABEL: splatconstant_rotate_v8i16:
   1355 ; X32-SSE:       # BB#0:
   1356 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
   1357 ; X32-SSE-NEXT:    psllw $7, %xmm1
   1358 ; X32-SSE-NEXT:    psrlw $9, %xmm0
   1359 ; X32-SSE-NEXT:    por %xmm1, %xmm0
   1360 ; X32-SSE-NEXT:    retl
   1361   %shl = shl <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
   1362   %lshr = lshr <8 x i16> %a, <i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9>
   1363   %or = or <8 x i16> %shl, %lshr
   1364   ret <8 x i16> %or
   1365 }
   1366 
   1367 define <16 x i8> @splatconstant_rotate_v16i8(<16 x i8> %a) nounwind {
   1368 ; SSE-LABEL: splatconstant_rotate_v16i8:
   1369 ; SSE:       # BB#0:
   1370 ; SSE-NEXT:    movdqa %xmm0, %xmm1
   1371 ; SSE-NEXT:    psllw $4, %xmm1
   1372 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm1
   1373 ; SSE-NEXT:    psrlw $4, %xmm0
   1374 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
   1375 ; SSE-NEXT:    por %xmm1, %xmm0
   1376 ; SSE-NEXT:    retq
   1377 ;
   1378 ; AVX-LABEL: splatconstant_rotate_v16i8:
   1379 ; AVX:       # BB#0:
   1380 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm1
   1381 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
   1382 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
   1383 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
   1384 ; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
   1385 ; AVX-NEXT:    retq
   1386 ;
   1387 ; XOP-LABEL: splatconstant_rotate_v16i8:
   1388 ; XOP:       # BB#0:
   1389 ; XOP-NEXT:    vprotb $4, %xmm0, %xmm0
   1390 ; XOP-NEXT:    retq
   1391 ;
   1392 ; X32-SSE-LABEL: splatconstant_rotate_v16i8:
   1393 ; X32-SSE:       # BB#0:
   1394 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
   1395 ; X32-SSE-NEXT:    psllw $4, %xmm1
   1396 ; X32-SSE-NEXT:    pand .LCPI11_0, %xmm1
   1397 ; X32-SSE-NEXT:    psrlw $4, %xmm0
   1398 ; X32-SSE-NEXT:    pand .LCPI11_1, %xmm0
   1399 ; X32-SSE-NEXT:    por %xmm1, %xmm0
   1400 ; X32-SSE-NEXT:    retl
   1401   %shl = shl <16 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>
   1402   %lshr = lshr <16 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>
   1403   %or = or <16 x i8> %shl, %lshr
   1404   ret <16 x i8> %or
   1405 }
   1406 
   1407 ;
   1408 ; Masked Uniform Constant Rotates
   1409 ;
   1410 
   1411 define <2 x i64> @splatconstant_rotate_mask_v2i64(<2 x i64> %a) nounwind {
   1412 ; SSE-LABEL: splatconstant_rotate_mask_v2i64:
   1413 ; SSE:       # BB#0:
   1414 ; SSE-NEXT:    movdqa %xmm0, %xmm1
   1415 ; SSE-NEXT:    psllq $15, %xmm1
   1416 ; SSE-NEXT:    psrlq $49, %xmm0
   1417 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
   1418 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm1
   1419 ; SSE-NEXT:    por %xmm0, %xmm1
   1420 ; SSE-NEXT:    movdqa %xmm1, %xmm0
   1421 ; SSE-NEXT:    retq
   1422 ;
   1423 ; AVX-LABEL: splatconstant_rotate_mask_v2i64:
   1424 ; AVX:       # BB#0:
   1425 ; AVX-NEXT:    vpsllq $15, %xmm0, %xmm1
   1426 ; AVX-NEXT:    vpsrlq $49, %xmm0, %xmm0
   1427 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
   1428 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
   1429 ; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
   1430 ; AVX-NEXT:    retq
   1431 ;
   1432 ; XOP-LABEL: splatconstant_rotate_mask_v2i64:
   1433 ; XOP:       # BB#0:
   1434 ; XOP-NEXT:    vprotq $15, %xmm0, %xmm0
   1435 ; XOP-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
   1436 ; XOP-NEXT:    retq
   1437 ;
   1438 ; X32-SSE-LABEL: splatconstant_rotate_mask_v2i64:
   1439 ; X32-SSE:       # BB#0:
   1440 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
   1441 ; X32-SSE-NEXT:    psllq $15, %xmm1
   1442 ; X32-SSE-NEXT:    psrlq $49, %xmm0
   1443 ; X32-SSE-NEXT:    pand .LCPI12_0, %xmm0
   1444 ; X32-SSE-NEXT:    pand .LCPI12_1, %xmm1
   1445 ; X32-SSE-NEXT:    por %xmm0, %xmm1
   1446 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
   1447 ; X32-SSE-NEXT:    retl
   1448   %shl = shl <2 x i64> %a, <i64 15, i64 15>
   1449   %lshr = lshr <2 x i64> %a, <i64 49, i64 49>
   1450   %rmask = and <2 x i64> %lshr, <i64 255, i64 127>
   1451   %lmask = and <2 x i64> %shl, <i64 65, i64 33>
   1452   %or = or <2 x i64> %lmask, %rmask
   1453   ret <2 x i64> %or
   1454 }
   1455 
   1456 define <4 x i32> @splatconstant_rotate_mask_v4i32(<4 x i32> %a) nounwind {
   1457 ; SSE-LABEL: splatconstant_rotate_mask_v4i32:
   1458 ; SSE:       # BB#0:
   1459 ; SSE-NEXT:    movdqa %xmm0, %xmm1
   1460 ; SSE-NEXT:    pslld $4, %xmm1
   1461 ; SSE-NEXT:    psrld $28, %xmm0
   1462 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
   1463 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm1
   1464 ; SSE-NEXT:    por %xmm0, %xmm1
   1465 ; SSE-NEXT:    movdqa %xmm1, %xmm0
   1466 ; SSE-NEXT:    retq
   1467 ;
   1468 ; AVX-LABEL: splatconstant_rotate_mask_v4i32:
   1469 ; AVX:       # BB#0:
   1470 ; AVX-NEXT:    vpslld $4, %xmm0, %xmm1
   1471 ; AVX-NEXT:    vpsrld $28, %xmm0, %xmm0
   1472 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
   1473 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
   1474 ; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
   1475 ; AVX-NEXT:    retq
   1476 ;
   1477 ; XOP-LABEL: splatconstant_rotate_mask_v4i32:
   1478 ; XOP:       # BB#0:
   1479 ; XOP-NEXT:    vprotd $4, %xmm0, %xmm0
   1480 ; XOP-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
   1481 ; XOP-NEXT:    retq
   1482 ;
   1483 ; X32-SSE-LABEL: splatconstant_rotate_mask_v4i32:
   1484 ; X32-SSE:       # BB#0:
   1485 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
   1486 ; X32-SSE-NEXT:    pslld $4, %xmm1
   1487 ; X32-SSE-NEXT:    psrld $28, %xmm0
   1488 ; X32-SSE-NEXT:    pand .LCPI13_0, %xmm0
   1489 ; X32-SSE-NEXT:    pand .LCPI13_1, %xmm1
   1490 ; X32-SSE-NEXT:    por %xmm0, %xmm1
   1491 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
   1492 ; X32-SSE-NEXT:    retl
   1493   %shl = shl <4 x i32> %a, <i32 4, i32 4, i32 4, i32 4>
   1494   %lshr = lshr <4 x i32> %a, <i32 28, i32 28, i32 28, i32 28>
   1495   %rmask = and <4 x i32> %lshr, <i32 127, i32 255, i32 511, i32 1023>
   1496   %lmask = and <4 x i32> %shl, <i32 1023, i32 511, i32 255, i32 127>
   1497   %or = or <4 x i32> %lmask, %rmask
   1498   ret <4 x i32> %or
   1499 }
   1500 
   1501 define <8 x i16> @splatconstant_rotate_mask_v8i16(<8 x i16> %a) nounwind {
   1502 ; SSE-LABEL: splatconstant_rotate_mask_v8i16:
   1503 ; SSE:       # BB#0:
   1504 ; SSE-NEXT:    movdqa %xmm0, %xmm1
   1505 ; SSE-NEXT:    psllw $5, %xmm1
   1506 ; SSE-NEXT:    psrlw $11, %xmm0
   1507 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
   1508 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm1
   1509 ; SSE-NEXT:    por %xmm0, %xmm1
   1510 ; SSE-NEXT:    movdqa %xmm1, %xmm0
   1511 ; SSE-NEXT:    retq
   1512 ;
   1513 ; AVX-LABEL: splatconstant_rotate_mask_v8i16:
   1514 ; AVX:       # BB#0:
   1515 ; AVX-NEXT:    vpsllw $5, %xmm0, %xmm1
   1516 ; AVX-NEXT:    vpsrlw $11, %xmm0, %xmm0
   1517 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
   1518 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
   1519 ; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
   1520 ; AVX-NEXT:    retq
   1521 ;
   1522 ; XOP-LABEL: splatconstant_rotate_mask_v8i16:
   1523 ; XOP:       # BB#0:
   1524 ; XOP-NEXT:    vprotw $5, %xmm0, %xmm0
   1525 ; XOP-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
   1526 ; XOP-NEXT:    retq
   1527 ;
   1528 ; X32-SSE-LABEL: splatconstant_rotate_mask_v8i16:
   1529 ; X32-SSE:       # BB#0:
   1530 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
   1531 ; X32-SSE-NEXT:    psllw $5, %xmm1
   1532 ; X32-SSE-NEXT:    psrlw $11, %xmm0
   1533 ; X32-SSE-NEXT:    pand .LCPI14_0, %xmm0
   1534 ; X32-SSE-NEXT:    pand .LCPI14_1, %xmm1
   1535 ; X32-SSE-NEXT:    por %xmm0, %xmm1
   1536 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
   1537 ; X32-SSE-NEXT:    retl
   1538   %shl = shl <8 x i16> %a, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
   1539   %lshr = lshr <8 x i16> %a, <i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11>
   1540   %rmask = and <8 x i16> %lshr, <i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55, i16 55>
   1541   %lmask = and <8 x i16> %shl, <i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33, i16 33>
   1542   %or = or <8 x i16> %lmask, %rmask
   1543   ret <8 x i16> %or
   1544 }
   1545 
   1546 define <16 x i8> @splatconstant_rotate_mask_v16i8(<16 x i8> %a) nounwind {
   1547 ; SSE-LABEL: splatconstant_rotate_mask_v16i8:
   1548 ; SSE:       # BB#0:
   1549 ; SSE-NEXT:    movdqa %xmm0, %xmm1
   1550 ; SSE-NEXT:    psllw $4, %xmm1
   1551 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm1
   1552 ; SSE-NEXT:    psrlw $4, %xmm0
   1553 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
   1554 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
   1555 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm1
   1556 ; SSE-NEXT:    por %xmm0, %xmm1
   1557 ; SSE-NEXT:    movdqa %xmm1, %xmm0
   1558 ; SSE-NEXT:    retq
   1559 ;
   1560 ; AVX-LABEL: splatconstant_rotate_mask_v16i8:
   1561 ; AVX:       # BB#0:
   1562 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm1
   1563 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
   1564 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
   1565 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
   1566 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
   1567 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
   1568 ; AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
   1569 ; AVX-NEXT:    retq
   1570 ;
   1571 ; XOP-LABEL: splatconstant_rotate_mask_v16i8:
   1572 ; XOP:       # BB#0:
   1573 ; XOP-NEXT:    vprotb $4, %xmm0, %xmm0
   1574 ; XOP-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
   1575 ; XOP-NEXT:    retq
   1576 ;
   1577 ; X32-SSE-LABEL: splatconstant_rotate_mask_v16i8:
   1578 ; X32-SSE:       # BB#0:
   1579 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
   1580 ; X32-SSE-NEXT:    psllw $4, %xmm1
   1581 ; X32-SSE-NEXT:    pand .LCPI15_0, %xmm1
   1582 ; X32-SSE-NEXT:    psrlw $4, %xmm0
   1583 ; X32-SSE-NEXT:    pand .LCPI15_1, %xmm0
   1584 ; X32-SSE-NEXT:    pand .LCPI15_2, %xmm0
   1585 ; X32-SSE-NEXT:    pand .LCPI15_3, %xmm1
   1586 ; X32-SSE-NEXT:    por %xmm0, %xmm1
   1587 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
   1588 ; X32-SSE-NEXT:    retl
   1589   %shl = shl <16 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>
   1590   %lshr = lshr <16 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>
   1591   %rmask = and <16 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>
   1592   %lmask = and <16 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>
   1593   %or = or <16 x i8> %lmask, %rmask
   1594   ret <16 x i8> %or
   1595 }
   1596