05af2d9f5c9e5b8d936fe6740593469ca5c12629
[oota-llvm.git] / test / CodeGen / X86 / vector-shift-shl-128.ll
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
7 ;
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
10
11 ;
12 ; Variable Shifts
13 ;
14
15 define <2 x i64> @var_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
16 ; SSE2-LABEL: var_shift_v2i64:
17 ; SSE2:       # BB#0:
18 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
19 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
20 ; SSE2-NEXT:    psllq %xmm3, %xmm2
21 ; SSE2-NEXT:    psllq %xmm1, %xmm0
22 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
23 ; SSE2-NEXT:    movapd %xmm2, %xmm0
24 ; SSE2-NEXT:    retq
25 ;
26 ; SSE41-LABEL: var_shift_v2i64:
27 ; SSE41:       # BB#0:
28 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
29 ; SSE41-NEXT:    psllq %xmm1, %xmm2
30 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
31 ; SSE41-NEXT:    psllq %xmm1, %xmm0
32 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]
33 ; SSE41-NEXT:    retq
34 ;
35 ; AVX1-LABEL: var_shift_v2i64:
36 ; AVX1:       # BB#0:
37 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm2
38 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
39 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
40 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]
41 ; AVX1-NEXT:    retq
42 ;
43 ; AVX2-LABEL: var_shift_v2i64:
44 ; AVX2:       # BB#0:
45 ; AVX2-NEXT:    vpsllvq %xmm1, %xmm0, %xmm0
46 ; AVX2-NEXT:    retq
47 ;
48 ; XOPAVX1-LABEL: var_shift_v2i64:
49 ; XOPAVX1:       # BB#0:
50 ; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm0
51 ; XOPAVX1-NEXT:    retq
52 ;
53 ; XOPAVX2-LABEL: var_shift_v2i64:
54 ; XOPAVX2:       # BB#0:
55 ; XOPAVX2-NEXT:    vpsllvq %xmm1, %xmm0, %xmm0
56 ; XOPAVX2-NEXT:    retq
57 ;
58 ; X32-SSE-LABEL: var_shift_v2i64:
59 ; X32-SSE:       # BB#0:
60 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
61 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
62 ; X32-SSE-NEXT:    psllq %xmm3, %xmm2
63 ; X32-SSE-NEXT:    movq {{.*#+}} xmm1 = xmm1[0],zero
64 ; X32-SSE-NEXT:    psllq %xmm1, %xmm0
65 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
66 ; X32-SSE-NEXT:    movapd %xmm2, %xmm0
67 ; X32-SSE-NEXT:    retl
68   %shift = shl <2 x i64> %a, %b
69   ret <2 x i64> %shift
70 }
71
72 define <4 x i32> @var_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
73 ; SSE2-LABEL: var_shift_v4i32:
74 ; SSE2:       # BB#0:
75 ; SSE2-NEXT:    pslld $23, %xmm1
76 ; SSE2-NEXT:    paddd {{.*}}(%rip), %xmm1
77 ; SSE2-NEXT:    cvttps2dq %xmm1, %xmm1
78 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
79 ; SSE2-NEXT:    pmuludq %xmm0, %xmm1
80 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
81 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
82 ; SSE2-NEXT:    pmuludq %xmm2, %xmm0
83 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
84 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
85 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
86 ; SSE2-NEXT:    retq
87 ;
88 ; SSE41-LABEL: var_shift_v4i32:
89 ; SSE41:       # BB#0:
90 ; SSE41-NEXT:    pslld $23, %xmm1
91 ; SSE41-NEXT:    paddd {{.*}}(%rip), %xmm1
92 ; SSE41-NEXT:    cvttps2dq %xmm1, %xmm1
93 ; SSE41-NEXT:    pmulld %xmm1, %xmm0
94 ; SSE41-NEXT:    retq
95 ;
96 ; AVX1-LABEL: var_shift_v4i32:
97 ; AVX1:       # BB#0:
98 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
99 ; AVX1-NEXT:    vpaddd {{.*}}(%rip), %xmm1, %xmm1
100 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
101 ; AVX1-NEXT:    vpmulld %xmm0, %xmm1, %xmm0
102 ; AVX1-NEXT:    retq
103 ;
104 ; AVX2-LABEL: var_shift_v4i32:
105 ; AVX2:       # BB#0:
106 ; AVX2-NEXT:    vpsllvd %xmm1, %xmm0, %xmm0
107 ; AVX2-NEXT:    retq
108 ;
109 ; XOPAVX1-LABEL: var_shift_v4i32:
110 ; XOPAVX1:       # BB#0:
111 ; XOPAVX1-NEXT:    vpshld %xmm1, %xmm0, %xmm0
112 ; XOPAVX1-NEXT:    retq
113 ;
114 ; XOPAVX2-LABEL: var_shift_v4i32:
115 ; XOPAVX2:       # BB#0:
116 ; XOPAVX2-NEXT:    vpsllvd %xmm1, %xmm0, %xmm0
117 ; XOPAVX2-NEXT:    retq
118 ;
119 ; X32-SSE-LABEL: var_shift_v4i32:
120 ; X32-SSE:       # BB#0:
121 ; X32-SSE-NEXT:    pslld $23, %xmm1
122 ; X32-SSE-NEXT:    paddd .LCPI1_0, %xmm1
123 ; X32-SSE-NEXT:    cvttps2dq %xmm1, %xmm1
124 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
125 ; X32-SSE-NEXT:    pmuludq %xmm0, %xmm1
126 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
127 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
128 ; X32-SSE-NEXT:    pmuludq %xmm2, %xmm0
129 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
130 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
131 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
132 ; X32-SSE-NEXT:    retl
133   %shift = shl <4 x i32> %a, %b
134   ret <4 x i32> %shift
135 }
136
137 define <8 x i16> @var_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
138 ; SSE2-LABEL: var_shift_v8i16:
139 ; SSE2:       # BB#0:
140 ; SSE2-NEXT:    psllw $12, %xmm1
141 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
142 ; SSE2-NEXT:    psraw $15, %xmm2
143 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
144 ; SSE2-NEXT:    pandn %xmm0, %xmm3
145 ; SSE2-NEXT:    psllw $8, %xmm0
146 ; SSE2-NEXT:    pand %xmm2, %xmm0
147 ; SSE2-NEXT:    por %xmm3, %xmm0
148 ; SSE2-NEXT:    paddw %xmm1, %xmm1
149 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
150 ; SSE2-NEXT:    psraw $15, %xmm2
151 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
152 ; SSE2-NEXT:    pandn %xmm0, %xmm3
153 ; SSE2-NEXT:    psllw $4, %xmm0
154 ; SSE2-NEXT:    pand %xmm2, %xmm0
155 ; SSE2-NEXT:    por %xmm3, %xmm0
156 ; SSE2-NEXT:    paddw %xmm1, %xmm1
157 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
158 ; SSE2-NEXT:    psraw $15, %xmm2
159 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
160 ; SSE2-NEXT:    pandn %xmm0, %xmm3
161 ; SSE2-NEXT:    psllw $2, %xmm0
162 ; SSE2-NEXT:    pand %xmm2, %xmm0
163 ; SSE2-NEXT:    por %xmm3, %xmm0
164 ; SSE2-NEXT:    paddw %xmm1, %xmm1
165 ; SSE2-NEXT:    psraw $15, %xmm1
166 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
167 ; SSE2-NEXT:    pandn %xmm0, %xmm2
168 ; SSE2-NEXT:    psllw $1, %xmm0
169 ; SSE2-NEXT:    pand %xmm1, %xmm0
170 ; SSE2-NEXT:    por %xmm2, %xmm0
171 ; SSE2-NEXT:    retq
172 ;
173 ; SSE41-LABEL: var_shift_v8i16:
174 ; SSE41:       # BB#0:
175 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
176 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
177 ; SSE41-NEXT:    psllw $12, %xmm0
178 ; SSE41-NEXT:    psllw $4, %xmm1
179 ; SSE41-NEXT:    por %xmm0, %xmm1
180 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
181 ; SSE41-NEXT:    paddw %xmm3, %xmm3
182 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
183 ; SSE41-NEXT:    psllw $8, %xmm4
184 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
185 ; SSE41-NEXT:    pblendvb %xmm4, %xmm2
186 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
187 ; SSE41-NEXT:    psllw $4, %xmm1
188 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
189 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
190 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
191 ; SSE41-NEXT:    psllw $2, %xmm1
192 ; SSE41-NEXT:    paddw %xmm3, %xmm3
193 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
194 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
195 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
196 ; SSE41-NEXT:    psllw $1, %xmm1
197 ; SSE41-NEXT:    paddw %xmm3, %xmm3
198 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
199 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
200 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
201 ; SSE41-NEXT:    retq
202 ;
203 ; AVX1-LABEL: var_shift_v8i16:
204 ; AVX1:       # BB#0:
205 ; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm2
206 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
207 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
208 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm2
209 ; AVX1-NEXT:    vpsllw $8, %xmm0, %xmm3
210 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
211 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm1
212 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
213 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm1
214 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
215 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
216 ; AVX1-NEXT:    vpsllw $1, %xmm0, %xmm1
217 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
218 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
219 ; AVX1-NEXT:    retq
220 ;
221 ; AVX2-LABEL: var_shift_v8i16:
222 ; AVX2:       # BB#0:
223 ; 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
224 ; 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
225 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
226 ; 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
227 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
228 ; AVX2-NEXT:    vzeroupper
229 ; AVX2-NEXT:    retq
230 ;
231 ; XOP-LABEL: var_shift_v8i16:
232 ; XOP:       # BB#0:
233 ; XOP-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
234 ; XOP-NEXT:    retq
235 ;
236 ; X32-SSE-LABEL: var_shift_v8i16:
237 ; X32-SSE:       # BB#0:
238 ; X32-SSE-NEXT:    psllw $12, %xmm1
239 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
240 ; X32-SSE-NEXT:    psraw $15, %xmm2
241 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
242 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
243 ; X32-SSE-NEXT:    psllw $8, %xmm0
244 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
245 ; X32-SSE-NEXT:    por %xmm3, %xmm0
246 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
247 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
248 ; X32-SSE-NEXT:    psraw $15, %xmm2
249 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
250 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
251 ; X32-SSE-NEXT:    psllw $4, %xmm0
252 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
253 ; X32-SSE-NEXT:    por %xmm3, %xmm0
254 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
255 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
256 ; X32-SSE-NEXT:    psraw $15, %xmm2
257 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
258 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
259 ; X32-SSE-NEXT:    psllw $2, %xmm0
260 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
261 ; X32-SSE-NEXT:    por %xmm3, %xmm0
262 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
263 ; X32-SSE-NEXT:    psraw $15, %xmm1
264 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
265 ; X32-SSE-NEXT:    pandn %xmm0, %xmm2
266 ; X32-SSE-NEXT:    psllw $1, %xmm0
267 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
268 ; X32-SSE-NEXT:    por %xmm2, %xmm0
269 ; X32-SSE-NEXT:    retl
270   %shift = shl <8 x i16> %a, %b
271   ret <8 x i16> %shift
272 }
273
274 define <16 x i8> @var_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
275 ; SSE2-LABEL: var_shift_v16i8:
276 ; SSE2:       # BB#0:
277 ; SSE2-NEXT:    psllw $5, %xmm1
278 ; SSE2-NEXT:    pxor %xmm2, %xmm2
279 ; SSE2-NEXT:    pxor %xmm3, %xmm3
280 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
281 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
282 ; SSE2-NEXT:    pandn %xmm0, %xmm4
283 ; SSE2-NEXT:    psllw $4, %xmm0
284 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
285 ; SSE2-NEXT:    pand %xmm3, %xmm0
286 ; SSE2-NEXT:    por %xmm4, %xmm0
287 ; SSE2-NEXT:    paddb %xmm1, %xmm1
288 ; SSE2-NEXT:    pxor %xmm3, %xmm3
289 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
290 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
291 ; SSE2-NEXT:    pandn %xmm0, %xmm4
292 ; SSE2-NEXT:    psllw $2, %xmm0
293 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
294 ; SSE2-NEXT:    pand %xmm3, %xmm0
295 ; SSE2-NEXT:    por %xmm4, %xmm0
296 ; SSE2-NEXT:    paddb %xmm1, %xmm1
297 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
298 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
299 ; SSE2-NEXT:    pandn %xmm0, %xmm1
300 ; SSE2-NEXT:    paddb %xmm0, %xmm0
301 ; SSE2-NEXT:    pand %xmm2, %xmm0
302 ; SSE2-NEXT:    por %xmm1, %xmm0
303 ; SSE2-NEXT:    retq
304 ;
305 ; SSE41-LABEL: var_shift_v16i8:
306 ; SSE41:       # BB#0:
307 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
308 ; SSE41-NEXT:    psllw $5, %xmm1
309 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
310 ; SSE41-NEXT:    psllw $4, %xmm3
311 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
312 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
313 ; SSE41-NEXT:    pblendvb %xmm3, %xmm2
314 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
315 ; SSE41-NEXT:    psllw $2, %xmm3
316 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
317 ; SSE41-NEXT:    paddb %xmm1, %xmm1
318 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
319 ; SSE41-NEXT:    pblendvb %xmm3, %xmm2
320 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
321 ; SSE41-NEXT:    paddb %xmm3, %xmm3
322 ; SSE41-NEXT:    paddb %xmm1, %xmm1
323 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
324 ; SSE41-NEXT:    pblendvb %xmm3, %xmm2
325 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
326 ; SSE41-NEXT:    retq
327 ;
328 ; AVX-LABEL: var_shift_v16i8:
329 ; AVX:       # BB#0:
330 ; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
331 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm2
332 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
333 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
334 ; AVX-NEXT:    vpsllw $2, %xmm0, %xmm2
335 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
336 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
337 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
338 ; AVX-NEXT:    vpaddb %xmm0, %xmm0, %xmm2
339 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
340 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
341 ; AVX-NEXT:    retq
342 ;
343 ; XOP-LABEL: var_shift_v16i8:
344 ; XOP:       # BB#0:
345 ; XOP-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
346 ; XOP-NEXT:    retq
347 ;
348 ; X32-SSE-LABEL: var_shift_v16i8:
349 ; X32-SSE:       # BB#0:
350 ; X32-SSE-NEXT:    psllw $5, %xmm1
351 ; X32-SSE-NEXT:    pxor %xmm2, %xmm2
352 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
353 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm3
354 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
355 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
356 ; X32-SSE-NEXT:    psllw $4, %xmm0
357 ; X32-SSE-NEXT:    pand .LCPI3_0, %xmm0
358 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
359 ; X32-SSE-NEXT:    por %xmm4, %xmm0
360 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
361 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
362 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm3
363 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
364 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
365 ; X32-SSE-NEXT:    psllw $2, %xmm0
366 ; X32-SSE-NEXT:    pand .LCPI3_1, %xmm0
367 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
368 ; X32-SSE-NEXT:    por %xmm4, %xmm0
369 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
370 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm2
371 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm1
372 ; X32-SSE-NEXT:    pandn %xmm0, %xmm1
373 ; X32-SSE-NEXT:    paddb %xmm0, %xmm0
374 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
375 ; X32-SSE-NEXT:    por %xmm1, %xmm0
376 ; X32-SSE-NEXT:    retl
377   %shift = shl <16 x i8> %a, %b
378   ret <16 x i8> %shift
379 }
380
381 ;
382 ; Uniform Variable Shifts
383 ;
384
385 define <2 x i64> @splatvar_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
386 ; SSE-LABEL: splatvar_shift_v2i64:
387 ; SSE:       # BB#0:
388 ; SSE-NEXT:    psllq %xmm1, %xmm0
389 ; SSE-NEXT:    retq
390 ;
391 ; AVX-LABEL: splatvar_shift_v2i64:
392 ; AVX:       # BB#0:
393 ; AVX-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
394 ; AVX-NEXT:    retq
395 ;
396 ; XOP-LABEL: splatvar_shift_v2i64:
397 ; XOP:       # BB#0:
398 ; XOP-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
399 ; XOP-NEXT:    retq
400 ;
401 ; X32-SSE-LABEL: splatvar_shift_v2i64:
402 ; X32-SSE:       # BB#0:
403 ; X32-SSE-NEXT:    movq {{.*#+}} xmm1 = xmm1[0],zero
404 ; X32-SSE-NEXT:    psllq %xmm1, %xmm0
405 ; X32-SSE-NEXT:    retl
406   %splat = shufflevector <2 x i64> %b, <2 x i64> undef, <2 x i32> zeroinitializer
407   %shift = shl <2 x i64> %a, %splat
408   ret <2 x i64> %shift
409 }
410
411 define <4 x i32> @splatvar_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
412 ; SSE2-LABEL: splatvar_shift_v4i32:
413 ; SSE2:       # BB#0:
414 ; SSE2-NEXT:    xorps %xmm2, %xmm2
415 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
416 ; SSE2-NEXT:    pslld %xmm2, %xmm0
417 ; SSE2-NEXT:    retq
418 ;
419 ; SSE41-LABEL: splatvar_shift_v4i32:
420 ; SSE41:       # BB#0:
421 ; SSE41-NEXT:    pxor %xmm2, %xmm2
422 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3,4,5,6,7]
423 ; SSE41-NEXT:    pslld %xmm2, %xmm0
424 ; SSE41-NEXT:    retq
425 ;
426 ; AVX-LABEL: splatvar_shift_v4i32:
427 ; AVX:       # BB#0:
428 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
429 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
430 ; AVX-NEXT:    vpslld %xmm1, %xmm0, %xmm0
431 ; AVX-NEXT:    retq
432 ;
433 ; XOP-LABEL: splatvar_shift_v4i32:
434 ; XOP:       # BB#0:
435 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
436 ; XOP-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
437 ; XOP-NEXT:    vpslld %xmm1, %xmm0, %xmm0
438 ; XOP-NEXT:    retq
439 ;
440 ; X32-SSE-LABEL: splatvar_shift_v4i32:
441 ; X32-SSE:       # BB#0:
442 ; X32-SSE-NEXT:    xorps %xmm2, %xmm2
443 ; X32-SSE-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
444 ; X32-SSE-NEXT:    pslld %xmm2, %xmm0
445 ; X32-SSE-NEXT:    retl
446   %splat = shufflevector <4 x i32> %b, <4 x i32> undef, <4 x i32> zeroinitializer
447   %shift = shl <4 x i32> %a, %splat
448   ret <4 x i32> %shift
449 }
450
451 define <8 x i16> @splatvar_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
452 ; SSE2-LABEL: splatvar_shift_v8i16:
453 ; SSE2:       # BB#0:
454 ; SSE2-NEXT:    movd %xmm1, %eax
455 ; SSE2-NEXT:    movzwl %ax, %eax
456 ; SSE2-NEXT:    movd %eax, %xmm1
457 ; SSE2-NEXT:    psllw %xmm1, %xmm0
458 ; SSE2-NEXT:    retq
459 ;
460 ; SSE41-LABEL: splatvar_shift_v8i16:
461 ; SSE41:       # BB#0:
462 ; SSE41-NEXT:    pxor %xmm2, %xmm2
463 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3,4,5,6,7]
464 ; SSE41-NEXT:    psllw %xmm2, %xmm0
465 ; SSE41-NEXT:    retq
466 ;
467 ; AVX-LABEL: splatvar_shift_v8i16:
468 ; AVX:       # BB#0:
469 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
470 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
471 ; AVX-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
472 ; AVX-NEXT:    retq
473 ;
474 ; XOP-LABEL: splatvar_shift_v8i16:
475 ; XOP:       # BB#0:
476 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
477 ; XOP-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
478 ; XOP-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
479 ; XOP-NEXT:    retq
480 ;
481 ; X32-SSE-LABEL: splatvar_shift_v8i16:
482 ; X32-SSE:       # BB#0:
483 ; X32-SSE-NEXT:    movd %xmm1, %eax
484 ; X32-SSE-NEXT:    movzwl %ax, %eax
485 ; X32-SSE-NEXT:    movd %eax, %xmm1
486 ; X32-SSE-NEXT:    psllw %xmm1, %xmm0
487 ; X32-SSE-NEXT:    retl
488   %splat = shufflevector <8 x i16> %b, <8 x i16> undef, <8 x i32> zeroinitializer
489   %shift = shl <8 x i16> %a, %splat
490   ret <8 x i16> %shift
491 }
492
493 define <16 x i8> @splatvar_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
494 ; SSE2-LABEL: splatvar_shift_v16i8:
495 ; SSE2:       # BB#0:
496 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
497 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
498 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
499 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm1[0,1,2,3,4,4,4,4]
500 ; SSE2-NEXT:    psllw $5, %xmm2
501 ; SSE2-NEXT:    pxor %xmm1, %xmm1
502 ; SSE2-NEXT:    pxor %xmm3, %xmm3
503 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
504 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
505 ; SSE2-NEXT:    pandn %xmm0, %xmm4
506 ; SSE2-NEXT:    psllw $4, %xmm0
507 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
508 ; SSE2-NEXT:    pand %xmm3, %xmm0
509 ; SSE2-NEXT:    por %xmm4, %xmm0
510 ; SSE2-NEXT:    paddb %xmm2, %xmm2
511 ; SSE2-NEXT:    pxor %xmm3, %xmm3
512 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
513 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
514 ; SSE2-NEXT:    pandn %xmm0, %xmm4
515 ; SSE2-NEXT:    psllw $2, %xmm0
516 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
517 ; SSE2-NEXT:    pand %xmm3, %xmm0
518 ; SSE2-NEXT:    por %xmm4, %xmm0
519 ; SSE2-NEXT:    paddb %xmm2, %xmm2
520 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
521 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
522 ; SSE2-NEXT:    pandn %xmm0, %xmm2
523 ; SSE2-NEXT:    paddb %xmm0, %xmm0
524 ; SSE2-NEXT:    pand %xmm1, %xmm0
525 ; SSE2-NEXT:    por %xmm2, %xmm0
526 ; SSE2-NEXT:    retq
527 ;
528 ; SSE41-LABEL: splatvar_shift_v16i8:
529 ; SSE41:       # BB#0:
530 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
531 ; SSE41-NEXT:    pxor %xmm0, %xmm0
532 ; SSE41-NEXT:    pshufb %xmm0, %xmm1
533 ; SSE41-NEXT:    psllw $5, %xmm1
534 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
535 ; SSE41-NEXT:    paddb %xmm3, %xmm3
536 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
537 ; SSE41-NEXT:    psllw $4, %xmm4
538 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm4
539 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
540 ; SSE41-NEXT:    pblendvb %xmm4, %xmm2
541 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
542 ; SSE41-NEXT:    psllw $2, %xmm1
543 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
544 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
545 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
546 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
547 ; SSE41-NEXT:    paddb %xmm1, %xmm1
548 ; SSE41-NEXT:    paddb %xmm3, %xmm3
549 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
550 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
551 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
552 ; SSE41-NEXT:    retq
553 ;
554 ; AVX1-LABEL: splatvar_shift_v16i8:
555 ; AVX1:       # BB#0:
556 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
557 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
558 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
559 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm2
560 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm3
561 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
562 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
563 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm1
564 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
565 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
566 ; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm1
567 ; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm2
568 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
569 ; AVX1-NEXT:    retq
570 ;
571 ; AVX2-LABEL: splatvar_shift_v16i8:
572 ; AVX2:       # BB#0:
573 ; AVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
574 ; AVX2-NEXT:    vpsllw $5, %xmm1, %xmm1
575 ; AVX2-NEXT:    vpsllw $4, %xmm0, %xmm2
576 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
577 ; AVX2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
578 ; AVX2-NEXT:    vpsllw $2, %xmm0, %xmm2
579 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
580 ; AVX2-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
581 ; AVX2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
582 ; AVX2-NEXT:    vpaddb %xmm0, %xmm0, %xmm2
583 ; AVX2-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
584 ; AVX2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
585 ; AVX2-NEXT:    retq
586 ;
587 ; XOPAVX1-LABEL: splatvar_shift_v16i8:
588 ; XOPAVX1:       # BB#0:
589 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
590 ; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
591 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
592 ; XOPAVX1-NEXT:    retq
593 ;
594 ; XOPAVX2-LABEL: splatvar_shift_v16i8:
595 ; XOPAVX2:       # BB#0:
596 ; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
597 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
598 ; XOPAVX2-NEXT:    retq
599 ;
600 ; X32-SSE-LABEL: splatvar_shift_v16i8:
601 ; X32-SSE:       # BB#0:
602 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
603 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
604 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
605 ; X32-SSE-NEXT:    pshufhw {{.*#+}} xmm2 = xmm1[0,1,2,3,4,4,4,4]
606 ; X32-SSE-NEXT:    psllw $5, %xmm2
607 ; X32-SSE-NEXT:    pxor %xmm1, %xmm1
608 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
609 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm3
610 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
611 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
612 ; X32-SSE-NEXT:    psllw $4, %xmm0
613 ; X32-SSE-NEXT:    pand .LCPI7_0, %xmm0
614 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
615 ; X32-SSE-NEXT:    por %xmm4, %xmm0
616 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
617 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
618 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm3
619 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
620 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
621 ; X32-SSE-NEXT:    psllw $2, %xmm0
622 ; X32-SSE-NEXT:    pand .LCPI7_1, %xmm0
623 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
624 ; X32-SSE-NEXT:    por %xmm4, %xmm0
625 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
626 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm1
627 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
628 ; X32-SSE-NEXT:    pandn %xmm0, %xmm2
629 ; X32-SSE-NEXT:    paddb %xmm0, %xmm0
630 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
631 ; X32-SSE-NEXT:    por %xmm2, %xmm0
632 ; X32-SSE-NEXT:    retl
633   %splat = shufflevector <16 x i8> %b, <16 x i8> undef, <16 x i32> zeroinitializer
634   %shift = shl <16 x i8> %a, %splat
635   ret <16 x i8> %shift
636 }
637
638 ;
639 ; Constant Shifts
640 ;
641
642 define <2 x i64> @constant_shift_v2i64(<2 x i64> %a) nounwind {
643 ; SSE2-LABEL: constant_shift_v2i64:
644 ; SSE2:       # BB#0:
645 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
646 ; SSE2-NEXT:    psllq $7, %xmm1
647 ; SSE2-NEXT:    psllq $1, %xmm0
648 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
649 ; SSE2-NEXT:    movapd %xmm1, %xmm0
650 ; SSE2-NEXT:    retq
651 ;
652 ; SSE41-LABEL: constant_shift_v2i64:
653 ; SSE41:       # BB#0:
654 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
655 ; SSE41-NEXT:    psllq $7, %xmm1
656 ; SSE41-NEXT:    psllq $1, %xmm0
657 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
658 ; SSE41-NEXT:    retq
659 ;
660 ; AVX1-LABEL: constant_shift_v2i64:
661 ; AVX1:       # BB#0:
662 ; AVX1-NEXT:    vpsllq $7, %xmm0, %xmm1
663 ; AVX1-NEXT:    vpsllq $1, %xmm0, %xmm0
664 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
665 ; AVX1-NEXT:    retq
666 ;
667 ; AVX2-LABEL: constant_shift_v2i64:
668 ; AVX2:       # BB#0:
669 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %xmm0, %xmm0
670 ; AVX2-NEXT:    retq
671 ;
672 ; XOPAVX1-LABEL: constant_shift_v2i64:
673 ; XOPAVX1:       # BB#0:
674 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm0
675 ; XOPAVX1-NEXT:    retq
676 ;
677 ; XOPAVX2-LABEL: constant_shift_v2i64:
678 ; XOPAVX2:       # BB#0:
679 ; XOPAVX2-NEXT:    vpsllvq {{.*}}(%rip), %xmm0, %xmm0
680 ; XOPAVX2-NEXT:    retq
681 ;
682 ; X32-SSE-LABEL: constant_shift_v2i64:
683 ; X32-SSE:       # BB#0:
684 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
685 ; X32-SSE-NEXT:    psllq $7, %xmm1
686 ; X32-SSE-NEXT:    psllq $1, %xmm0
687 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
688 ; X32-SSE-NEXT:    movapd %xmm1, %xmm0
689 ; X32-SSE-NEXT:    retl
690   %shift = shl <2 x i64> %a, <i64 1, i64 7>
691   ret <2 x i64> %shift
692 }
693
694 define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind {
695 ; SSE2-LABEL: constant_shift_v4i32:
696 ; SSE2:       # BB#0:
697 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
698 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
699 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
700 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
701 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
702 ; SSE2-NEXT:    pmuludq %xmm2, %xmm1
703 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
704 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
705 ; SSE2-NEXT:    retq
706 ;
707 ; SSE41-LABEL: constant_shift_v4i32:
708 ; SSE41:       # BB#0:
709 ; SSE41-NEXT:    pmulld {{.*}}(%rip), %xmm0
710 ; SSE41-NEXT:    retq
711 ;
712 ; AVX1-LABEL: constant_shift_v4i32:
713 ; AVX1:       # BB#0:
714 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
715 ; AVX1-NEXT:    retq
716 ;
717 ; AVX2-LABEL: constant_shift_v4i32:
718 ; AVX2:       # BB#0:
719 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %xmm0, %xmm0
720 ; AVX2-NEXT:    retq
721 ;
722 ; XOPAVX1-LABEL: constant_shift_v4i32:
723 ; XOPAVX1:       # BB#0:
724 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
725 ; XOPAVX1-NEXT:    retq
726 ;
727 ; XOPAVX2-LABEL: constant_shift_v4i32:
728 ; XOPAVX2:       # BB#0:
729 ; XOPAVX2-NEXT:    vpsllvd {{.*}}(%rip), %xmm0, %xmm0
730 ; XOPAVX2-NEXT:    retq
731 ;
732 ; X32-SSE-LABEL: constant_shift_v4i32:
733 ; X32-SSE:       # BB#0:
734 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
735 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
736 ; X32-SSE-NEXT:    pmuludq %xmm1, %xmm0
737 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
738 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
739 ; X32-SSE-NEXT:    pmuludq %xmm2, %xmm1
740 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
741 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
742 ; X32-SSE-NEXT:    retl
743   %shift = shl <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>
744   ret <4 x i32> %shift
745 }
746
747 define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind {
748 ; SSE-LABEL: constant_shift_v8i16:
749 ; SSE:       # BB#0:
750 ; SSE-NEXT:    pmullw {{.*}}(%rip), %xmm0
751 ; SSE-NEXT:    retq
752 ;
753 ; AVX-LABEL: constant_shift_v8i16:
754 ; AVX:       # BB#0:
755 ; AVX-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
756 ; AVX-NEXT:    retq
757 ;
758 ; XOP-LABEL: constant_shift_v8i16:
759 ; XOP:       # BB#0:
760 ; XOP-NEXT:    vpshlw {{.*}}(%rip), %xmm0, %xmm0
761 ; XOP-NEXT:    retq
762 ;
763 ; X32-SSE-LABEL: constant_shift_v8i16:
764 ; X32-SSE:       # BB#0:
765 ; X32-SSE-NEXT:    pmullw .LCPI10_0, %xmm0
766 ; X32-SSE-NEXT:    retl
767   %shift = shl <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>
768   ret <8 x i16> %shift
769 }
770
771 define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind {
772 ; SSE2-LABEL: constant_shift_v16i8:
773 ; SSE2:       # BB#0:
774 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
775 ; SSE2-NEXT:    psllw $5, %xmm2
776 ; SSE2-NEXT:    pxor %xmm1, %xmm1
777 ; SSE2-NEXT:    pxor %xmm3, %xmm3
778 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
779 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
780 ; SSE2-NEXT:    pandn %xmm0, %xmm4
781 ; SSE2-NEXT:    psllw $4, %xmm0
782 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
783 ; SSE2-NEXT:    pand %xmm3, %xmm0
784 ; SSE2-NEXT:    por %xmm4, %xmm0
785 ; SSE2-NEXT:    paddb %xmm2, %xmm2
786 ; SSE2-NEXT:    pxor %xmm3, %xmm3
787 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
788 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
789 ; SSE2-NEXT:    pandn %xmm0, %xmm4
790 ; SSE2-NEXT:    psllw $2, %xmm0
791 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
792 ; SSE2-NEXT:    pand %xmm3, %xmm0
793 ; SSE2-NEXT:    por %xmm4, %xmm0
794 ; SSE2-NEXT:    paddb %xmm2, %xmm2
795 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
796 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
797 ; SSE2-NEXT:    pandn %xmm0, %xmm2
798 ; SSE2-NEXT:    paddb %xmm0, %xmm0
799 ; SSE2-NEXT:    pand %xmm1, %xmm0
800 ; SSE2-NEXT:    por %xmm2, %xmm0
801 ; SSE2-NEXT:    retq
802 ;
803 ; SSE41-LABEL: constant_shift_v16i8:
804 ; SSE41:       # BB#0:
805 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
806 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
807 ; SSE41-NEXT:    psllw $5, %xmm0
808 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
809 ; SSE41-NEXT:    psllw $4, %xmm2
810 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
811 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
812 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
813 ; SSE41-NEXT:    psllw $2, %xmm2
814 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
815 ; SSE41-NEXT:    paddb %xmm0, %xmm0
816 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
817 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
818 ; SSE41-NEXT:    paddb %xmm2, %xmm2
819 ; SSE41-NEXT:    paddb %xmm0, %xmm0
820 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
821 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
822 ; SSE41-NEXT:    retq
823 ;
824 ; AVX-LABEL: constant_shift_v16i8:
825 ; AVX:       # BB#0:
826 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
827 ; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
828 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm2
829 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
830 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
831 ; AVX-NEXT:    vpsllw $2, %xmm0, %xmm2
832 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
833 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
834 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
835 ; AVX-NEXT:    vpaddb %xmm0, %xmm0, %xmm2
836 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
837 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
838 ; AVX-NEXT:    retq
839 ;
840 ; XOP-LABEL: constant_shift_v16i8:
841 ; XOP:       # BB#0:
842 ; XOP-NEXT:    vpshlb {{.*}}(%rip), %xmm0, %xmm0
843 ; XOP-NEXT:    retq
844 ;
845 ; X32-SSE-LABEL: constant_shift_v16i8:
846 ; X32-SSE:       # BB#0:
847 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
848 ; X32-SSE-NEXT:    psllw $5, %xmm2
849 ; X32-SSE-NEXT:    pxor %xmm1, %xmm1
850 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
851 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm3
852 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
853 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
854 ; X32-SSE-NEXT:    psllw $4, %xmm0
855 ; X32-SSE-NEXT:    pand .LCPI11_1, %xmm0
856 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
857 ; X32-SSE-NEXT:    por %xmm4, %xmm0
858 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
859 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
860 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm3
861 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
862 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
863 ; X32-SSE-NEXT:    psllw $2, %xmm0
864 ; X32-SSE-NEXT:    pand .LCPI11_2, %xmm0
865 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
866 ; X32-SSE-NEXT:    por %xmm4, %xmm0
867 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
868 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm1
869 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
870 ; X32-SSE-NEXT:    pandn %xmm0, %xmm2
871 ; X32-SSE-NEXT:    paddb %xmm0, %xmm0
872 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
873 ; X32-SSE-NEXT:    por %xmm2, %xmm0
874 ; X32-SSE-NEXT:    retl
875   %shift = shl <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>
876   ret <16 x i8> %shift
877 }
878
879 ;
880 ; Uniform Constant Shifts
881 ;
882
883 define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind {
884 ; SSE-LABEL: splatconstant_shift_v2i64:
885 ; SSE:       # BB#0:
886 ; SSE-NEXT:    psllq $7, %xmm0
887 ; SSE-NEXT:    retq
888 ;
889 ; AVX-LABEL: splatconstant_shift_v2i64:
890 ; AVX:       # BB#0:
891 ; AVX-NEXT:    vpsllq $7, %xmm0, %xmm0
892 ; AVX-NEXT:    retq
893 ;
894 ; XOP-LABEL: splatconstant_shift_v2i64:
895 ; XOP:       # BB#0:
896 ; XOP-NEXT:    vpsllq $7, %xmm0, %xmm0
897 ; XOP-NEXT:    retq
898 ;
899 ; X32-SSE-LABEL: splatconstant_shift_v2i64:
900 ; X32-SSE:       # BB#0:
901 ; X32-SSE-NEXT:    psllq $7, %xmm0
902 ; X32-SSE-NEXT:    retl
903   %shift = shl <2 x i64> %a, <i64 7, i64 7>
904   ret <2 x i64> %shift
905 }
906
907 define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind {
908 ; SSE-LABEL: splatconstant_shift_v4i32:
909 ; SSE:       # BB#0:
910 ; SSE-NEXT:    pslld $5, %xmm0
911 ; SSE-NEXT:    retq
912 ;
913 ; AVX-LABEL: splatconstant_shift_v4i32:
914 ; AVX:       # BB#0:
915 ; AVX-NEXT:    vpslld $5, %xmm0, %xmm0
916 ; AVX-NEXT:    retq
917 ;
918 ; XOP-LABEL: splatconstant_shift_v4i32:
919 ; XOP:       # BB#0:
920 ; XOP-NEXT:    vpslld $5, %xmm0, %xmm0
921 ; XOP-NEXT:    retq
922 ;
923 ; X32-SSE-LABEL: splatconstant_shift_v4i32:
924 ; X32-SSE:       # BB#0:
925 ; X32-SSE-NEXT:    pslld $5, %xmm0
926 ; X32-SSE-NEXT:    retl
927   %shift = shl <4 x i32> %a, <i32 5, i32 5, i32 5, i32 5>
928   ret <4 x i32> %shift
929 }
930
931 define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind {
932 ; SSE-LABEL: splatconstant_shift_v8i16:
933 ; SSE:       # BB#0:
934 ; SSE-NEXT:    psllw $3, %xmm0
935 ; SSE-NEXT:    retq
936 ;
937 ; AVX-LABEL: splatconstant_shift_v8i16:
938 ; AVX:       # BB#0:
939 ; AVX-NEXT:    vpsllw $3, %xmm0, %xmm0
940 ; AVX-NEXT:    retq
941 ;
942 ; XOP-LABEL: splatconstant_shift_v8i16:
943 ; XOP:       # BB#0:
944 ; XOP-NEXT:    vpsllw $3, %xmm0, %xmm0
945 ; XOP-NEXT:    retq
946 ;
947 ; X32-SSE-LABEL: splatconstant_shift_v8i16:
948 ; X32-SSE:       # BB#0:
949 ; X32-SSE-NEXT:    psllw $3, %xmm0
950 ; X32-SSE-NEXT:    retl
951   %shift = shl <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
952   ret <8 x i16> %shift
953 }
954
955 define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind {
956 ; SSE-LABEL: splatconstant_shift_v16i8:
957 ; SSE:       # BB#0:
958 ; SSE-NEXT:    psllw $3, %xmm0
959 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
960 ; SSE-NEXT:    retq
961 ;
962 ; AVX-LABEL: splatconstant_shift_v16i8:
963 ; AVX:       # BB#0:
964 ; AVX-NEXT:    vpsllw $3, %xmm0, %xmm0
965 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
966 ; AVX-NEXT:    retq
967 ;
968 ; XOP-LABEL: splatconstant_shift_v16i8:
969 ; XOP:       # BB#0:
970 ; XOP-NEXT:    vpshlb {{.*}}(%rip), %xmm0, %xmm0
971 ; XOP-NEXT:    retq
972 ;
973 ; X32-SSE-LABEL: splatconstant_shift_v16i8:
974 ; X32-SSE:       # BB#0:
975 ; X32-SSE-NEXT:    psllw $3, %xmm0
976 ; X32-SSE-NEXT:    pand .LCPI15_0, %xmm0
977 ; X32-SSE-NEXT:    retl
978   %shift = shl <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>
979   ret <16 x i8> %shift
980 }