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