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