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