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