1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
8 ; Just one 32-bit run to make sure we do reasonable things for i64 shifts.
9 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=X32-SSE --check-prefix=X32-SSE2
15 define <2 x i64> @var_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
16 ; SSE2-LABEL: var_shift_v2i64:
18 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
19 ; SSE2-NEXT: movdqa %xmm0, %xmm2
20 ; SSE2-NEXT: psrlq %xmm3, %xmm2
21 ; SSE2-NEXT: psrlq %xmm1, %xmm0
22 ; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
23 ; SSE2-NEXT: movapd %xmm2, %xmm0
26 ; SSE41-LABEL: var_shift_v2i64:
28 ; SSE41-NEXT: movdqa %xmm0, %xmm2
29 ; SSE41-NEXT: psrlq %xmm1, %xmm2
30 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
31 ; SSE41-NEXT: psrlq %xmm1, %xmm0
32 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]
35 ; AVX1-LABEL: var_shift_v2i64:
37 ; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm2
38 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
39 ; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0
40 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]
43 ; AVX2-LABEL: var_shift_v2i64:
45 ; AVX2-NEXT: vpsrlvq %xmm1, %xmm0, %xmm0
48 ; XOPAVX1-LABEL: var_shift_v2i64:
50 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
51 ; XOPAVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1
52 ; XOPAVX1-NEXT: vpshlq %xmm1, %xmm0, %xmm0
55 ; XOPAVX2-LABEL: var_shift_v2i64:
57 ; XOPAVX2-NEXT: vpsrlvq %xmm1, %xmm0, %xmm0
60 ; X32-SSE-LABEL: var_shift_v2i64:
62 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
63 ; X32-SSE-NEXT: movdqa %xmm0, %xmm2
64 ; X32-SSE-NEXT: psrlq %xmm3, %xmm2
65 ; X32-SSE-NEXT: movq {{.*#+}} xmm1 = xmm1[0],zero
66 ; X32-SSE-NEXT: psrlq %xmm1, %xmm0
67 ; X32-SSE-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
68 ; X32-SSE-NEXT: movapd %xmm2, %xmm0
70 %shift = lshr <2 x i64> %a, %b
74 define <4 x i32> @var_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
75 ; SSE2-LABEL: var_shift_v4i32:
77 ; SSE2-NEXT: movdqa %xmm1, %xmm2
78 ; SSE2-NEXT: psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
79 ; SSE2-NEXT: movdqa %xmm0, %xmm3
80 ; SSE2-NEXT: psrld %xmm2, %xmm3
81 ; SSE2-NEXT: movdqa %xmm1, %xmm2
82 ; SSE2-NEXT: psrlq $32, %xmm2
83 ; SSE2-NEXT: movdqa %xmm0, %xmm4
84 ; SSE2-NEXT: psrld %xmm2, %xmm4
85 ; SSE2-NEXT: movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1]
86 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3]
87 ; SSE2-NEXT: pxor %xmm3, %xmm3
88 ; SSE2-NEXT: movdqa %xmm1, %xmm4
89 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
90 ; SSE2-NEXT: movdqa %xmm0, %xmm5
91 ; SSE2-NEXT: psrld %xmm4, %xmm5
92 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
93 ; SSE2-NEXT: psrld %xmm1, %xmm0
94 ; SSE2-NEXT: movsd {{.*#+}} xmm5 = xmm0[0],xmm5[1]
95 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
96 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
99 ; SSE41-LABEL: var_shift_v4i32:
101 ; SSE41-NEXT: movdqa %xmm1, %xmm2
102 ; SSE41-NEXT: psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
103 ; SSE41-NEXT: movdqa %xmm0, %xmm3
104 ; SSE41-NEXT: psrld %xmm2, %xmm3
105 ; SSE41-NEXT: movdqa %xmm1, %xmm2
106 ; SSE41-NEXT: psrlq $32, %xmm2
107 ; SSE41-NEXT: movdqa %xmm0, %xmm4
108 ; SSE41-NEXT: psrld %xmm2, %xmm4
109 ; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm3[4,5,6,7]
110 ; SSE41-NEXT: pxor %xmm2, %xmm2
111 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero
112 ; SSE41-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
113 ; SSE41-NEXT: movdqa %xmm0, %xmm2
114 ; SSE41-NEXT: psrld %xmm1, %xmm2
115 ; SSE41-NEXT: psrld %xmm3, %xmm0
116 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
117 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3],xmm0[4,5],xmm4[6,7]
120 ; AVX1-LABEL: var_shift_v4i32:
122 ; AVX1-NEXT: vpsrldq {{.*#+}} xmm2 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
123 ; AVX1-NEXT: vpsrld %xmm2, %xmm0, %xmm2
124 ; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm3
125 ; AVX1-NEXT: vpsrld %xmm3, %xmm0, %xmm3
126 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
127 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
128 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
129 ; AVX1-NEXT: vpsrld %xmm3, %xmm0, %xmm3
130 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
131 ; AVX1-NEXT: vpsrld %xmm1, %xmm0, %xmm0
132 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
133 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
136 ; AVX2-LABEL: var_shift_v4i32:
138 ; AVX2-NEXT: vpsrlvd %xmm1, %xmm0, %xmm0
141 ; XOPAVX1-LABEL: var_shift_v4i32:
143 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
144 ; XOPAVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm1
145 ; XOPAVX1-NEXT: vpshld %xmm1, %xmm0, %xmm0
148 ; XOPAVX2-LABEL: var_shift_v4i32:
150 ; XOPAVX2-NEXT: vpsrlvd %xmm1, %xmm0, %xmm0
153 ; X32-SSE-LABEL: var_shift_v4i32:
155 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
156 ; X32-SSE-NEXT: psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
157 ; X32-SSE-NEXT: movdqa %xmm0, %xmm3
158 ; X32-SSE-NEXT: psrld %xmm2, %xmm3
159 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
160 ; X32-SSE-NEXT: psrlq $32, %xmm2
161 ; X32-SSE-NEXT: movdqa %xmm0, %xmm4
162 ; X32-SSE-NEXT: psrld %xmm2, %xmm4
163 ; X32-SSE-NEXT: movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1]
164 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3]
165 ; X32-SSE-NEXT: pxor %xmm3, %xmm3
166 ; X32-SSE-NEXT: movdqa %xmm1, %xmm4
167 ; X32-SSE-NEXT: punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
168 ; X32-SSE-NEXT: movdqa %xmm0, %xmm5
169 ; X32-SSE-NEXT: psrld %xmm4, %xmm5
170 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
171 ; X32-SSE-NEXT: psrld %xmm1, %xmm0
172 ; X32-SSE-NEXT: movsd {{.*#+}} xmm5 = xmm0[0],xmm5[1]
173 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
174 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
176 %shift = lshr <4 x i32> %a, %b
180 define <8 x i16> @var_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
181 ; SSE2-LABEL: var_shift_v8i16:
183 ; SSE2-NEXT: psllw $12, %xmm1
184 ; SSE2-NEXT: movdqa %xmm1, %xmm2
185 ; SSE2-NEXT: psraw $15, %xmm2
186 ; SSE2-NEXT: movdqa %xmm2, %xmm3
187 ; SSE2-NEXT: pandn %xmm0, %xmm3
188 ; SSE2-NEXT: psrlw $8, %xmm0
189 ; SSE2-NEXT: pand %xmm2, %xmm0
190 ; SSE2-NEXT: por %xmm3, %xmm0
191 ; SSE2-NEXT: paddw %xmm1, %xmm1
192 ; SSE2-NEXT: movdqa %xmm1, %xmm2
193 ; SSE2-NEXT: psraw $15, %xmm2
194 ; SSE2-NEXT: movdqa %xmm2, %xmm3
195 ; SSE2-NEXT: pandn %xmm0, %xmm3
196 ; SSE2-NEXT: psrlw $4, %xmm0
197 ; SSE2-NEXT: pand %xmm2, %xmm0
198 ; SSE2-NEXT: por %xmm3, %xmm0
199 ; SSE2-NEXT: paddw %xmm1, %xmm1
200 ; SSE2-NEXT: movdqa %xmm1, %xmm2
201 ; SSE2-NEXT: psraw $15, %xmm2
202 ; SSE2-NEXT: movdqa %xmm2, %xmm3
203 ; SSE2-NEXT: pandn %xmm0, %xmm3
204 ; SSE2-NEXT: psrlw $2, %xmm0
205 ; SSE2-NEXT: pand %xmm2, %xmm0
206 ; SSE2-NEXT: por %xmm3, %xmm0
207 ; SSE2-NEXT: paddw %xmm1, %xmm1
208 ; SSE2-NEXT: psraw $15, %xmm1
209 ; SSE2-NEXT: movdqa %xmm1, %xmm2
210 ; SSE2-NEXT: pandn %xmm0, %xmm2
211 ; SSE2-NEXT: psrlw $1, %xmm0
212 ; SSE2-NEXT: pand %xmm1, %xmm0
213 ; SSE2-NEXT: por %xmm2, %xmm0
216 ; SSE41-LABEL: var_shift_v8i16:
218 ; SSE41-NEXT: movdqa %xmm0, %xmm2
219 ; SSE41-NEXT: movdqa %xmm1, %xmm0
220 ; SSE41-NEXT: psllw $12, %xmm0
221 ; SSE41-NEXT: psllw $4, %xmm1
222 ; SSE41-NEXT: por %xmm0, %xmm1
223 ; SSE41-NEXT: movdqa %xmm1, %xmm3
224 ; SSE41-NEXT: paddw %xmm3, %xmm3
225 ; SSE41-NEXT: movdqa %xmm2, %xmm4
226 ; SSE41-NEXT: psrlw $8, %xmm4
227 ; SSE41-NEXT: movdqa %xmm1, %xmm0
228 ; SSE41-NEXT: pblendvb %xmm4, %xmm2
229 ; SSE41-NEXT: movdqa %xmm2, %xmm1
230 ; SSE41-NEXT: psrlw $4, %xmm1
231 ; SSE41-NEXT: movdqa %xmm3, %xmm0
232 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
233 ; SSE41-NEXT: movdqa %xmm2, %xmm1
234 ; SSE41-NEXT: psrlw $2, %xmm1
235 ; SSE41-NEXT: paddw %xmm3, %xmm3
236 ; SSE41-NEXT: movdqa %xmm3, %xmm0
237 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
238 ; SSE41-NEXT: movdqa %xmm2, %xmm1
239 ; SSE41-NEXT: psrlw $1, %xmm1
240 ; SSE41-NEXT: paddw %xmm3, %xmm3
241 ; SSE41-NEXT: movdqa %xmm3, %xmm0
242 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
243 ; SSE41-NEXT: movdqa %xmm2, %xmm0
246 ; AVX1-LABEL: var_shift_v8i16:
248 ; AVX1-NEXT: vpsllw $12, %xmm1, %xmm2
249 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1
250 ; AVX1-NEXT: vpor %xmm2, %xmm1, %xmm1
251 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm2
252 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm3
253 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
254 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm1
255 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
256 ; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm1
257 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2
258 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
259 ; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm1
260 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2
261 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
264 ; AVX2-LABEL: var_shift_v8i16:
266 ; 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
267 ; 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
268 ; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0
269 ; 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
270 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
271 ; AVX2-NEXT: vzeroupper
274 ; XOP-LABEL: var_shift_v8i16:
276 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
277 ; XOP-NEXT: vpsubw %xmm1, %xmm2, %xmm1
278 ; XOP-NEXT: vpshlw %xmm1, %xmm0, %xmm0
281 ; X32-SSE-LABEL: var_shift_v8i16:
283 ; X32-SSE-NEXT: psllw $12, %xmm1
284 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
285 ; X32-SSE-NEXT: psraw $15, %xmm2
286 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3
287 ; X32-SSE-NEXT: pandn %xmm0, %xmm3
288 ; X32-SSE-NEXT: psrlw $8, %xmm0
289 ; X32-SSE-NEXT: pand %xmm2, %xmm0
290 ; X32-SSE-NEXT: por %xmm3, %xmm0
291 ; X32-SSE-NEXT: paddw %xmm1, %xmm1
292 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
293 ; X32-SSE-NEXT: psraw $15, %xmm2
294 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3
295 ; X32-SSE-NEXT: pandn %xmm0, %xmm3
296 ; X32-SSE-NEXT: psrlw $4, %xmm0
297 ; X32-SSE-NEXT: pand %xmm2, %xmm0
298 ; X32-SSE-NEXT: por %xmm3, %xmm0
299 ; X32-SSE-NEXT: paddw %xmm1, %xmm1
300 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
301 ; X32-SSE-NEXT: psraw $15, %xmm2
302 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3
303 ; X32-SSE-NEXT: pandn %xmm0, %xmm3
304 ; X32-SSE-NEXT: psrlw $2, %xmm0
305 ; X32-SSE-NEXT: pand %xmm2, %xmm0
306 ; X32-SSE-NEXT: por %xmm3, %xmm0
307 ; X32-SSE-NEXT: paddw %xmm1, %xmm1
308 ; X32-SSE-NEXT: psraw $15, %xmm1
309 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
310 ; X32-SSE-NEXT: pandn %xmm0, %xmm2
311 ; X32-SSE-NEXT: psrlw $1, %xmm0
312 ; X32-SSE-NEXT: pand %xmm1, %xmm0
313 ; X32-SSE-NEXT: por %xmm2, %xmm0
315 %shift = lshr <8 x i16> %a, %b
319 define <16 x i8> @var_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
320 ; SSE2-LABEL: var_shift_v16i8:
322 ; SSE2-NEXT: psllw $5, %xmm1
323 ; SSE2-NEXT: pxor %xmm2, %xmm2
324 ; SSE2-NEXT: pxor %xmm3, %xmm3
325 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm3
326 ; SSE2-NEXT: movdqa %xmm3, %xmm4
327 ; SSE2-NEXT: pandn %xmm0, %xmm4
328 ; SSE2-NEXT: psrlw $4, %xmm0
329 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
330 ; SSE2-NEXT: pand %xmm3, %xmm0
331 ; SSE2-NEXT: por %xmm4, %xmm0
332 ; SSE2-NEXT: paddb %xmm1, %xmm1
333 ; SSE2-NEXT: pxor %xmm3, %xmm3
334 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm3
335 ; SSE2-NEXT: movdqa %xmm3, %xmm4
336 ; SSE2-NEXT: pandn %xmm0, %xmm4
337 ; SSE2-NEXT: psrlw $2, %xmm0
338 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
339 ; SSE2-NEXT: pand %xmm3, %xmm0
340 ; SSE2-NEXT: por %xmm4, %xmm0
341 ; SSE2-NEXT: paddb %xmm1, %xmm1
342 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2
343 ; SSE2-NEXT: movdqa %xmm2, %xmm1
344 ; SSE2-NEXT: pandn %xmm0, %xmm1
345 ; SSE2-NEXT: psrlw $1, %xmm0
346 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
347 ; SSE2-NEXT: pand %xmm2, %xmm0
348 ; SSE2-NEXT: por %xmm1, %xmm0
351 ; SSE41-LABEL: var_shift_v16i8:
353 ; SSE41-NEXT: movdqa %xmm0, %xmm2
354 ; SSE41-NEXT: psllw $5, %xmm1
355 ; SSE41-NEXT: movdqa %xmm2, %xmm3
356 ; SSE41-NEXT: psrlw $4, %xmm3
357 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm3
358 ; SSE41-NEXT: movdqa %xmm1, %xmm0
359 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
360 ; SSE41-NEXT: movdqa %xmm2, %xmm3
361 ; SSE41-NEXT: psrlw $2, %xmm3
362 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm3
363 ; SSE41-NEXT: paddb %xmm1, %xmm1
364 ; SSE41-NEXT: movdqa %xmm1, %xmm0
365 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
366 ; SSE41-NEXT: movdqa %xmm2, %xmm3
367 ; SSE41-NEXT: psrlw $1, %xmm3
368 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm3
369 ; SSE41-NEXT: paddb %xmm1, %xmm1
370 ; SSE41-NEXT: movdqa %xmm1, %xmm0
371 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
372 ; SSE41-NEXT: movdqa %xmm2, %xmm0
375 ; AVX-LABEL: var_shift_v16i8:
377 ; AVX-NEXT: vpsllw $5, %xmm1, %xmm1
378 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm2
379 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
380 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
381 ; AVX-NEXT: vpsrlw $2, %xmm0, %xmm2
382 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
383 ; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1
384 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
385 ; AVX-NEXT: vpsrlw $1, %xmm0, %xmm2
386 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
387 ; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1
388 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
391 ; XOP-LABEL: var_shift_v16i8:
393 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
394 ; XOP-NEXT: vpsubb %xmm1, %xmm2, %xmm1
395 ; XOP-NEXT: vpshlb %xmm1, %xmm0, %xmm0
398 ; X32-SSE-LABEL: var_shift_v16i8:
400 ; X32-SSE-NEXT: psllw $5, %xmm1
401 ; X32-SSE-NEXT: pxor %xmm2, %xmm2
402 ; X32-SSE-NEXT: pxor %xmm3, %xmm3
403 ; X32-SSE-NEXT: pcmpgtb %xmm1, %xmm3
404 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4
405 ; X32-SSE-NEXT: pandn %xmm0, %xmm4
406 ; X32-SSE-NEXT: psrlw $4, %xmm0
407 ; X32-SSE-NEXT: pand .LCPI3_0, %xmm0
408 ; X32-SSE-NEXT: pand %xmm3, %xmm0
409 ; X32-SSE-NEXT: por %xmm4, %xmm0
410 ; X32-SSE-NEXT: paddb %xmm1, %xmm1
411 ; X32-SSE-NEXT: pxor %xmm3, %xmm3
412 ; X32-SSE-NEXT: pcmpgtb %xmm1, %xmm3
413 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4
414 ; X32-SSE-NEXT: pandn %xmm0, %xmm4
415 ; X32-SSE-NEXT: psrlw $2, %xmm0
416 ; X32-SSE-NEXT: pand .LCPI3_1, %xmm0
417 ; X32-SSE-NEXT: pand %xmm3, %xmm0
418 ; X32-SSE-NEXT: por %xmm4, %xmm0
419 ; X32-SSE-NEXT: paddb %xmm1, %xmm1
420 ; X32-SSE-NEXT: pcmpgtb %xmm1, %xmm2
421 ; X32-SSE-NEXT: movdqa %xmm2, %xmm1
422 ; X32-SSE-NEXT: pandn %xmm0, %xmm1
423 ; X32-SSE-NEXT: psrlw $1, %xmm0
424 ; X32-SSE-NEXT: pand .LCPI3_2, %xmm0
425 ; X32-SSE-NEXT: pand %xmm2, %xmm0
426 ; X32-SSE-NEXT: por %xmm1, %xmm0
428 %shift = lshr <16 x i8> %a, %b
433 ; Uniform Variable Shifts
436 define <2 x i64> @splatvar_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
437 ; SSE-LABEL: splatvar_shift_v2i64:
439 ; SSE-NEXT: psrlq %xmm1, %xmm0
442 ; AVX-LABEL: splatvar_shift_v2i64:
444 ; AVX-NEXT: vpsrlq %xmm1, %xmm0, %xmm0
447 ; XOP-LABEL: splatvar_shift_v2i64:
449 ; XOP-NEXT: vpsrlq %xmm1, %xmm0, %xmm0
452 ; X32-SSE-LABEL: splatvar_shift_v2i64:
454 ; X32-SSE-NEXT: movq {{.*#+}} xmm1 = xmm1[0],zero
455 ; X32-SSE-NEXT: psrlq %xmm1, %xmm0
457 %splat = shufflevector <2 x i64> %b, <2 x i64> undef, <2 x i32> zeroinitializer
458 %shift = lshr <2 x i64> %a, %splat
462 define <4 x i32> @splatvar_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
463 ; SSE2-LABEL: splatvar_shift_v4i32:
465 ; SSE2-NEXT: xorps %xmm2, %xmm2
466 ; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
467 ; SSE2-NEXT: psrld %xmm2, %xmm0
470 ; SSE41-LABEL: splatvar_shift_v4i32:
472 ; SSE41-NEXT: pxor %xmm2, %xmm2
473 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3,4,5,6,7]
474 ; SSE41-NEXT: psrld %xmm2, %xmm0
477 ; AVX-LABEL: splatvar_shift_v4i32:
479 ; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2
480 ; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
481 ; AVX-NEXT: vpsrld %xmm1, %xmm0, %xmm0
484 ; XOP-LABEL: splatvar_shift_v4i32:
486 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
487 ; XOP-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
488 ; XOP-NEXT: vpsrld %xmm1, %xmm0, %xmm0
491 ; X32-SSE-LABEL: splatvar_shift_v4i32:
493 ; X32-SSE-NEXT: xorps %xmm2, %xmm2
494 ; X32-SSE-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
495 ; X32-SSE-NEXT: psrld %xmm2, %xmm0
497 %splat = shufflevector <4 x i32> %b, <4 x i32> undef, <4 x i32> zeroinitializer
498 %shift = lshr <4 x i32> %a, %splat
502 define <8 x i16> @splatvar_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
503 ; SSE2-LABEL: splatvar_shift_v8i16:
505 ; SSE2-NEXT: movd %xmm1, %eax
506 ; SSE2-NEXT: movzwl %ax, %eax
507 ; SSE2-NEXT: movd %eax, %xmm1
508 ; SSE2-NEXT: psrlw %xmm1, %xmm0
511 ; SSE41-LABEL: splatvar_shift_v8i16:
513 ; SSE41-NEXT: pxor %xmm2, %xmm2
514 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3,4,5,6,7]
515 ; SSE41-NEXT: psrlw %xmm2, %xmm0
518 ; AVX-LABEL: splatvar_shift_v8i16:
520 ; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2
521 ; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
522 ; AVX-NEXT: vpsrlw %xmm1, %xmm0, %xmm0
525 ; XOP-LABEL: splatvar_shift_v8i16:
527 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
528 ; XOP-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
529 ; XOP-NEXT: vpsrlw %xmm1, %xmm0, %xmm0
532 ; X32-SSE-LABEL: splatvar_shift_v8i16:
534 ; X32-SSE-NEXT: movd %xmm1, %eax
535 ; X32-SSE-NEXT: movzwl %ax, %eax
536 ; X32-SSE-NEXT: movd %eax, %xmm1
537 ; X32-SSE-NEXT: psrlw %xmm1, %xmm0
539 %splat = shufflevector <8 x i16> %b, <8 x i16> undef, <8 x i32> zeroinitializer
540 %shift = lshr <8 x i16> %a, %splat
544 define <16 x i8> @splatvar_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
545 ; SSE2-LABEL: splatvar_shift_v16i8:
547 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
548 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
549 ; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
550 ; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm1[0,1,2,3,4,4,4,4]
551 ; SSE2-NEXT: psllw $5, %xmm2
552 ; SSE2-NEXT: pxor %xmm1, %xmm1
553 ; SSE2-NEXT: pxor %xmm3, %xmm3
554 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm3
555 ; SSE2-NEXT: movdqa %xmm3, %xmm4
556 ; SSE2-NEXT: pandn %xmm0, %xmm4
557 ; SSE2-NEXT: psrlw $4, %xmm0
558 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
559 ; SSE2-NEXT: pand %xmm3, %xmm0
560 ; SSE2-NEXT: por %xmm4, %xmm0
561 ; SSE2-NEXT: paddb %xmm2, %xmm2
562 ; SSE2-NEXT: pxor %xmm3, %xmm3
563 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm3
564 ; SSE2-NEXT: movdqa %xmm3, %xmm4
565 ; SSE2-NEXT: pandn %xmm0, %xmm4
566 ; SSE2-NEXT: psrlw $2, %xmm0
567 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
568 ; SSE2-NEXT: pand %xmm3, %xmm0
569 ; SSE2-NEXT: por %xmm4, %xmm0
570 ; SSE2-NEXT: paddb %xmm2, %xmm2
571 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm1
572 ; SSE2-NEXT: movdqa %xmm1, %xmm2
573 ; SSE2-NEXT: pandn %xmm0, %xmm2
574 ; SSE2-NEXT: psrlw $1, %xmm0
575 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
576 ; SSE2-NEXT: pand %xmm1, %xmm0
577 ; SSE2-NEXT: por %xmm2, %xmm0
580 ; SSE41-LABEL: splatvar_shift_v16i8:
582 ; SSE41-NEXT: movdqa %xmm0, %xmm2
583 ; SSE41-NEXT: pxor %xmm0, %xmm0
584 ; SSE41-NEXT: pshufb %xmm0, %xmm1
585 ; SSE41-NEXT: psllw $5, %xmm1
586 ; SSE41-NEXT: movdqa %xmm1, %xmm3
587 ; SSE41-NEXT: paddb %xmm3, %xmm3
588 ; SSE41-NEXT: movdqa %xmm2, %xmm4
589 ; SSE41-NEXT: psrlw $4, %xmm4
590 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm4
591 ; SSE41-NEXT: movdqa %xmm1, %xmm0
592 ; SSE41-NEXT: pblendvb %xmm4, %xmm2
593 ; SSE41-NEXT: movdqa %xmm2, %xmm1
594 ; SSE41-NEXT: psrlw $2, %xmm1
595 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm1
596 ; SSE41-NEXT: movdqa %xmm3, %xmm0
597 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
598 ; SSE41-NEXT: movdqa %xmm2, %xmm1
599 ; SSE41-NEXT: psrlw $1, %xmm1
600 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm1
601 ; SSE41-NEXT: paddb %xmm3, %xmm3
602 ; SSE41-NEXT: movdqa %xmm3, %xmm0
603 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
604 ; SSE41-NEXT: movdqa %xmm2, %xmm0
607 ; AVX1-LABEL: splatvar_shift_v16i8:
609 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
610 ; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
611 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
612 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm2
613 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm3
614 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm3, %xmm3
615 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
616 ; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm1
617 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
618 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
619 ; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm1
620 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
621 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm2
622 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
625 ; AVX2-LABEL: splatvar_shift_v16i8:
627 ; AVX2-NEXT: vpbroadcastb %xmm1, %xmm1
628 ; AVX2-NEXT: vpsllw $5, %xmm1, %xmm1
629 ; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm2
630 ; AVX2-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
631 ; AVX2-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
632 ; AVX2-NEXT: vpsrlw $2, %xmm0, %xmm2
633 ; AVX2-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
634 ; AVX2-NEXT: vpaddb %xmm1, %xmm1, %xmm1
635 ; AVX2-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
636 ; AVX2-NEXT: vpsrlw $1, %xmm0, %xmm2
637 ; AVX2-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
638 ; AVX2-NEXT: vpaddb %xmm1, %xmm1, %xmm1
639 ; AVX2-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
642 ; XOPAVX1-LABEL: splatvar_shift_v16i8:
644 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
645 ; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
646 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1
647 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0
650 ; XOPAVX2-LABEL: splatvar_shift_v16i8:
652 ; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm1
653 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
654 ; XOPAVX2-NEXT: vpsubb %xmm1, %xmm2, %xmm1
655 ; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0
658 ; X32-SSE-LABEL: splatvar_shift_v16i8:
660 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
661 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
662 ; X32-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
663 ; X32-SSE-NEXT: pshufhw {{.*#+}} xmm2 = xmm1[0,1,2,3,4,4,4,4]
664 ; X32-SSE-NEXT: psllw $5, %xmm2
665 ; X32-SSE-NEXT: pxor %xmm1, %xmm1
666 ; X32-SSE-NEXT: pxor %xmm3, %xmm3
667 ; X32-SSE-NEXT: pcmpgtb %xmm2, %xmm3
668 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4
669 ; X32-SSE-NEXT: pandn %xmm0, %xmm4
670 ; X32-SSE-NEXT: psrlw $4, %xmm0
671 ; X32-SSE-NEXT: pand .LCPI7_0, %xmm0
672 ; X32-SSE-NEXT: pand %xmm3, %xmm0
673 ; X32-SSE-NEXT: por %xmm4, %xmm0
674 ; X32-SSE-NEXT: paddb %xmm2, %xmm2
675 ; X32-SSE-NEXT: pxor %xmm3, %xmm3
676 ; X32-SSE-NEXT: pcmpgtb %xmm2, %xmm3
677 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4
678 ; X32-SSE-NEXT: pandn %xmm0, %xmm4
679 ; X32-SSE-NEXT: psrlw $2, %xmm0
680 ; X32-SSE-NEXT: pand .LCPI7_1, %xmm0
681 ; X32-SSE-NEXT: pand %xmm3, %xmm0
682 ; X32-SSE-NEXT: por %xmm4, %xmm0
683 ; X32-SSE-NEXT: paddb %xmm2, %xmm2
684 ; X32-SSE-NEXT: pcmpgtb %xmm2, %xmm1
685 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
686 ; X32-SSE-NEXT: pandn %xmm0, %xmm2
687 ; X32-SSE-NEXT: psrlw $1, %xmm0
688 ; X32-SSE-NEXT: pand .LCPI7_2, %xmm0
689 ; X32-SSE-NEXT: pand %xmm1, %xmm0
690 ; X32-SSE-NEXT: por %xmm2, %xmm0
692 %splat = shufflevector <16 x i8> %b, <16 x i8> undef, <16 x i32> zeroinitializer
693 %shift = lshr <16 x i8> %a, %splat
701 define <2 x i64> @constant_shift_v2i64(<2 x i64> %a) nounwind {
702 ; SSE2-LABEL: constant_shift_v2i64:
704 ; SSE2-NEXT: movdqa %xmm0, %xmm1
705 ; SSE2-NEXT: psrlq $7, %xmm1
706 ; SSE2-NEXT: psrlq $1, %xmm0
707 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
708 ; SSE2-NEXT: movapd %xmm1, %xmm0
711 ; SSE41-LABEL: constant_shift_v2i64:
713 ; SSE41-NEXT: movdqa %xmm0, %xmm1
714 ; SSE41-NEXT: psrlq $7, %xmm1
715 ; SSE41-NEXT: psrlq $1, %xmm0
716 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
719 ; AVX1-LABEL: constant_shift_v2i64:
721 ; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm1
722 ; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0
723 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
726 ; AVX2-LABEL: constant_shift_v2i64:
728 ; AVX2-NEXT: vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
731 ; XOPAVX1-LABEL: constant_shift_v2i64:
733 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
734 ; XOPAVX1-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm1
735 ; XOPAVX1-NEXT: vpshlq %xmm1, %xmm0, %xmm0
738 ; XOPAVX2-LABEL: constant_shift_v2i64:
740 ; XOPAVX2-NEXT: vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
743 ; X32-SSE-LABEL: constant_shift_v2i64:
745 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1
746 ; X32-SSE-NEXT: psrlq $7, %xmm1
747 ; X32-SSE-NEXT: psrlq $1, %xmm0
748 ; X32-SSE-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
749 ; X32-SSE-NEXT: movapd %xmm1, %xmm0
751 %shift = lshr <2 x i64> %a, <i64 1, i64 7>
755 define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind {
756 ; SSE2-LABEL: constant_shift_v4i32:
758 ; SSE2-NEXT: movdqa %xmm0, %xmm1
759 ; SSE2-NEXT: psrld $7, %xmm1
760 ; SSE2-NEXT: movdqa %xmm0, %xmm2
761 ; SSE2-NEXT: psrld $5, %xmm2
762 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
763 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
764 ; SSE2-NEXT: movdqa %xmm0, %xmm2
765 ; SSE2-NEXT: psrld $6, %xmm2
766 ; SSE2-NEXT: psrld $4, %xmm0
767 ; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
768 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
769 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
772 ; SSE41-LABEL: constant_shift_v4i32:
774 ; SSE41-NEXT: movdqa %xmm0, %xmm1
775 ; SSE41-NEXT: psrld $7, %xmm1
776 ; SSE41-NEXT: movdqa %xmm0, %xmm2
777 ; SSE41-NEXT: psrld $5, %xmm2
778 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]
779 ; SSE41-NEXT: movdqa %xmm0, %xmm1
780 ; SSE41-NEXT: psrld $6, %xmm1
781 ; SSE41-NEXT: psrld $4, %xmm0
782 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
783 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
786 ; AVX1-LABEL: constant_shift_v4i32:
788 ; AVX1-NEXT: vpsrld $7, %xmm0, %xmm1
789 ; AVX1-NEXT: vpsrld $5, %xmm0, %xmm2
790 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
791 ; AVX1-NEXT: vpsrld $6, %xmm0, %xmm2
792 ; AVX1-NEXT: vpsrld $4, %xmm0, %xmm0
793 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
794 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
797 ; AVX2-LABEL: constant_shift_v4i32:
799 ; AVX2-NEXT: vpsrlvd {{.*}}(%rip), %xmm0, %xmm0
802 ; XOPAVX1-LABEL: constant_shift_v4i32:
804 ; XOPAVX1-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm0
807 ; XOPAVX2-LABEL: constant_shift_v4i32:
809 ; XOPAVX2-NEXT: vpsrlvd {{.*}}(%rip), %xmm0, %xmm0
812 ; X32-SSE-LABEL: constant_shift_v4i32:
814 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1
815 ; X32-SSE-NEXT: psrld $7, %xmm1
816 ; X32-SSE-NEXT: movdqa %xmm0, %xmm2
817 ; X32-SSE-NEXT: psrld $5, %xmm2
818 ; X32-SSE-NEXT: movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
819 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
820 ; X32-SSE-NEXT: movdqa %xmm0, %xmm2
821 ; X32-SSE-NEXT: psrld $6, %xmm2
822 ; X32-SSE-NEXT: psrld $4, %xmm0
823 ; X32-SSE-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
824 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
825 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
827 %shift = lshr <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>
831 define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind {
832 ; SSE2-LABEL: constant_shift_v8i16:
834 ; SSE2-NEXT: movdqa %xmm0, %xmm1
835 ; SSE2-NEXT: psrlw $4, %xmm1
836 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
837 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
838 ; SSE2-NEXT: psrlw $2, %xmm1
839 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
840 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
841 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]
842 ; SSE2-NEXT: movdqa %xmm2, %xmm1
843 ; SSE2-NEXT: pand %xmm0, %xmm1
844 ; SSE2-NEXT: psrlw $1, %xmm2
845 ; SSE2-NEXT: pandn %xmm2, %xmm0
846 ; SSE2-NEXT: por %xmm1, %xmm0
849 ; SSE41-LABEL: constant_shift_v8i16:
851 ; SSE41-NEXT: movdqa %xmm0, %xmm1
852 ; SSE41-NEXT: movdqa %xmm1, %xmm2
853 ; SSE41-NEXT: psrlw $8, %xmm2
854 ; SSE41-NEXT: movaps {{.*#+}} xmm0 = [0,4112,8224,12336,16448,20560,24672,28784]
855 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
856 ; SSE41-NEXT: movdqa %xmm1, %xmm2
857 ; SSE41-NEXT: psrlw $4, %xmm2
858 ; SSE41-NEXT: movaps {{.*#+}} xmm0 = [0,8224,16448,24672,32896,41120,49344,57568]
859 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
860 ; SSE41-NEXT: movdqa %xmm1, %xmm2
861 ; SSE41-NEXT: psrlw $2, %xmm2
862 ; SSE41-NEXT: movaps {{.*#+}} xmm0 = [0,16448,32896,49344,256,16704,33152,49600]
863 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
864 ; SSE41-NEXT: movdqa %xmm1, %xmm2
865 ; SSE41-NEXT: psrlw $1, %xmm2
866 ; SSE41-NEXT: movaps {{.*#+}} xmm0 = [0,32896,256,33152,512,33408,768,33664]
867 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
868 ; SSE41-NEXT: movdqa %xmm1, %xmm0
871 ; AVX1-LABEL: constant_shift_v8i16:
873 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
874 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,4112,8224,12336,16448,20560,24672,28784]
875 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
876 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm1
877 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,8224,16448,24672,32896,41120,49344,57568]
878 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
879 ; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm1
880 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,16448,32896,49344,256,16704,33152,49600]
881 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
882 ; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm1
883 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,32896,256,33152,512,33408,768,33664]
884 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
887 ; AVX2-LABEL: constant_shift_v8i16:
889 ; 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
890 ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
891 ; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0
892 ; 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
893 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
894 ; AVX2-NEXT: vzeroupper
897 ; XOP-LABEL: constant_shift_v8i16:
899 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
900 ; XOP-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm1
901 ; XOP-NEXT: vpshlw %xmm1, %xmm0, %xmm0
904 ; X32-SSE-LABEL: constant_shift_v8i16:
906 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1
907 ; X32-SSE-NEXT: psrlw $4, %xmm1
908 ; X32-SSE-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
909 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
910 ; X32-SSE-NEXT: psrlw $2, %xmm1
911 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
912 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
913 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]
914 ; X32-SSE-NEXT: movdqa %xmm2, %xmm1
915 ; X32-SSE-NEXT: pand %xmm0, %xmm1
916 ; X32-SSE-NEXT: psrlw $1, %xmm2
917 ; X32-SSE-NEXT: pandn %xmm2, %xmm0
918 ; X32-SSE-NEXT: por %xmm1, %xmm0
920 %shift = lshr <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>
924 define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind {
925 ; SSE2-LABEL: constant_shift_v16i8:
927 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
928 ; SSE2-NEXT: psllw $5, %xmm2
929 ; SSE2-NEXT: pxor %xmm1, %xmm1
930 ; SSE2-NEXT: pxor %xmm3, %xmm3
931 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm3
932 ; SSE2-NEXT: movdqa %xmm3, %xmm4
933 ; SSE2-NEXT: pandn %xmm0, %xmm4
934 ; SSE2-NEXT: psrlw $4, %xmm0
935 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
936 ; SSE2-NEXT: pand %xmm3, %xmm0
937 ; SSE2-NEXT: por %xmm4, %xmm0
938 ; SSE2-NEXT: paddb %xmm2, %xmm2
939 ; SSE2-NEXT: pxor %xmm3, %xmm3
940 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm3
941 ; SSE2-NEXT: movdqa %xmm3, %xmm4
942 ; SSE2-NEXT: pandn %xmm0, %xmm4
943 ; SSE2-NEXT: psrlw $2, %xmm0
944 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
945 ; SSE2-NEXT: pand %xmm3, %xmm0
946 ; SSE2-NEXT: por %xmm4, %xmm0
947 ; SSE2-NEXT: paddb %xmm2, %xmm2
948 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm1
949 ; SSE2-NEXT: movdqa %xmm1, %xmm2
950 ; SSE2-NEXT: pandn %xmm0, %xmm2
951 ; SSE2-NEXT: psrlw $1, %xmm0
952 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
953 ; SSE2-NEXT: pand %xmm1, %xmm0
954 ; SSE2-NEXT: por %xmm2, %xmm0
957 ; SSE41-LABEL: constant_shift_v16i8:
959 ; SSE41-NEXT: movdqa %xmm0, %xmm1
960 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
961 ; SSE41-NEXT: psllw $5, %xmm0
962 ; SSE41-NEXT: movdqa %xmm1, %xmm2
963 ; SSE41-NEXT: psrlw $4, %xmm2
964 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm2
965 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
966 ; SSE41-NEXT: movdqa %xmm1, %xmm2
967 ; SSE41-NEXT: psrlw $2, %xmm2
968 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm2
969 ; SSE41-NEXT: paddb %xmm0, %xmm0
970 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
971 ; SSE41-NEXT: movdqa %xmm1, %xmm2
972 ; SSE41-NEXT: psrlw $1, %xmm2
973 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm2
974 ; SSE41-NEXT: paddb %xmm0, %xmm0
975 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
976 ; SSE41-NEXT: movdqa %xmm1, %xmm0
979 ; AVX-LABEL: constant_shift_v16i8:
981 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
982 ; AVX-NEXT: vpsllw $5, %xmm1, %xmm1
983 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm2
984 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
985 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
986 ; AVX-NEXT: vpsrlw $2, %xmm0, %xmm2
987 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
988 ; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1
989 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
990 ; AVX-NEXT: vpsrlw $1, %xmm0, %xmm2
991 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
992 ; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1
993 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
996 ; XOP-LABEL: constant_shift_v16i8:
998 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
999 ; XOP-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1
1000 ; XOP-NEXT: vpshlb %xmm1, %xmm0, %xmm0
1003 ; X32-SSE-LABEL: constant_shift_v16i8:
1005 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1006 ; X32-SSE-NEXT: psllw $5, %xmm2
1007 ; X32-SSE-NEXT: pxor %xmm1, %xmm1
1008 ; X32-SSE-NEXT: pxor %xmm3, %xmm3
1009 ; X32-SSE-NEXT: pcmpgtb %xmm2, %xmm3
1010 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4
1011 ; X32-SSE-NEXT: pandn %xmm0, %xmm4
1012 ; X32-SSE-NEXT: psrlw $4, %xmm0
1013 ; X32-SSE-NEXT: pand .LCPI11_1, %xmm0
1014 ; X32-SSE-NEXT: pand %xmm3, %xmm0
1015 ; X32-SSE-NEXT: por %xmm4, %xmm0
1016 ; X32-SSE-NEXT: paddb %xmm2, %xmm2
1017 ; X32-SSE-NEXT: pxor %xmm3, %xmm3
1018 ; X32-SSE-NEXT: pcmpgtb %xmm2, %xmm3
1019 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4
1020 ; X32-SSE-NEXT: pandn %xmm0, %xmm4
1021 ; X32-SSE-NEXT: psrlw $2, %xmm0
1022 ; X32-SSE-NEXT: pand .LCPI11_2, %xmm0
1023 ; X32-SSE-NEXT: pand %xmm3, %xmm0
1024 ; X32-SSE-NEXT: por %xmm4, %xmm0
1025 ; X32-SSE-NEXT: paddb %xmm2, %xmm2
1026 ; X32-SSE-NEXT: pcmpgtb %xmm2, %xmm1
1027 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
1028 ; X32-SSE-NEXT: pandn %xmm0, %xmm2
1029 ; X32-SSE-NEXT: psrlw $1, %xmm0
1030 ; X32-SSE-NEXT: pand .LCPI11_3, %xmm0
1031 ; X32-SSE-NEXT: pand %xmm1, %xmm0
1032 ; X32-SSE-NEXT: por %xmm2, %xmm0
1033 ; X32-SSE-NEXT: retl
1034 %shift = lshr <16 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>
1035 ret <16 x i8> %shift
1039 ; Uniform Constant Shifts
1042 define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind {
1043 ; SSE-LABEL: splatconstant_shift_v2i64:
1045 ; SSE-NEXT: psrlq $7, %xmm0
1048 ; AVX-LABEL: splatconstant_shift_v2i64:
1050 ; AVX-NEXT: vpsrlq $7, %xmm0, %xmm0
1053 ; XOP-LABEL: splatconstant_shift_v2i64:
1055 ; XOP-NEXT: vpsrlq $7, %xmm0, %xmm0
1058 ; X32-SSE-LABEL: splatconstant_shift_v2i64:
1060 ; X32-SSE-NEXT: psrlq $7, %xmm0
1061 ; X32-SSE-NEXT: retl
1062 %shift = lshr <2 x i64> %a, <i64 7, i64 7>
1063 ret <2 x i64> %shift
1066 define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind {
1067 ; SSE-LABEL: splatconstant_shift_v4i32:
1069 ; SSE-NEXT: psrld $5, %xmm0
1072 ; AVX-LABEL: splatconstant_shift_v4i32:
1074 ; AVX-NEXT: vpsrld $5, %xmm0, %xmm0
1077 ; XOP-LABEL: splatconstant_shift_v4i32:
1079 ; XOP-NEXT: vpsrld $5, %xmm0, %xmm0
1082 ; X32-SSE-LABEL: splatconstant_shift_v4i32:
1084 ; X32-SSE-NEXT: psrld $5, %xmm0
1085 ; X32-SSE-NEXT: retl
1086 %shift = lshr <4 x i32> %a, <i32 5, i32 5, i32 5, i32 5>
1087 ret <4 x i32> %shift
1090 define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind {
1091 ; SSE-LABEL: splatconstant_shift_v8i16:
1093 ; SSE-NEXT: psrlw $3, %xmm0
1096 ; AVX-LABEL: splatconstant_shift_v8i16:
1098 ; AVX-NEXT: vpsrlw $3, %xmm0, %xmm0
1101 ; XOP-LABEL: splatconstant_shift_v8i16:
1103 ; XOP-NEXT: vpsrlw $3, %xmm0, %xmm0
1106 ; X32-SSE-LABEL: splatconstant_shift_v8i16:
1108 ; X32-SSE-NEXT: psrlw $3, %xmm0
1109 ; X32-SSE-NEXT: retl
1110 %shift = lshr <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
1111 ret <8 x i16> %shift
1114 define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind {
1115 ; SSE-LABEL: splatconstant_shift_v16i8:
1117 ; SSE-NEXT: psrlw $3, %xmm0
1118 ; SSE-NEXT: pand {{.*}}(%rip), %xmm0
1121 ; AVX-LABEL: splatconstant_shift_v16i8:
1123 ; AVX-NEXT: vpsrlw $3, %xmm0, %xmm0
1124 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
1127 ; XOP-LABEL: splatconstant_shift_v16i8:
1129 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1130 ; XOP-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1
1131 ; XOP-NEXT: vpshlb %xmm1, %xmm0, %xmm0
1134 ; X32-SSE-LABEL: splatconstant_shift_v16i8:
1136 ; X32-SSE-NEXT: psrlw $3, %xmm0
1137 ; X32-SSE-NEXT: pand .LCPI15_0, %xmm0
1138 ; X32-SSE-NEXT: retl
1139 %shift = lshr <16 x i8> %a, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
1140 ret <16 x i8> %shift