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