Merging r261039:
[oota-llvm.git] / test / CodeGen / X86 / vector-shift-lshr-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:    psrlq %xmm3, %xmm2
23 ; SSE2-NEXT:    psrlq %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:    psrlq %xmm1, %xmm2
32 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
33 ; SSE41-NEXT:    psrlq %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:    vpsrlq %xmm1, %xmm0, %xmm2
40 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
41 ; AVX1-NEXT:    vpsrlq %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:    vpsrlvq %xmm1, %xmm0, %xmm0
48 ; AVX2-NEXT:    retq
49 ;
50 ; XOPAVX1-LABEL: var_shift_v2i64:
51 ; XOPAVX1:       # BB#0:
52 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
53 ; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm1
54 ; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm0
55 ; XOPAVX1-NEXT:    retq
56 ;
57 ; XOPAVX2-LABEL: var_shift_v2i64:
58 ; XOPAVX2:       # BB#0:
59 ; XOPAVX2-NEXT:    vpsrlvq %xmm1, %xmm0, %xmm0
60 ; XOPAVX2-NEXT:    retq
61 ;
62 ; AVX512-LABEL: var_shift_v2i64:
63 ; AVX512:       ## BB#0:
64 ; AVX512-NEXT:    vpsrlvq %xmm1, %xmm0, %xmm0
65 ; AVX512-NEXT:    retq
66 ;
67 ; X32-SSE-LABEL: var_shift_v2i64:
68 ; X32-SSE:       # BB#0:
69 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
70 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
71 ; X32-SSE-NEXT:    psrlq %xmm3, %xmm2
72 ; X32-SSE-NEXT:    movq {{.*#+}} xmm1 = xmm1[0],zero
73 ; X32-SSE-NEXT:    psrlq %xmm1, %xmm0
74 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
75 ; X32-SSE-NEXT:    movapd %xmm2, %xmm0
76 ; X32-SSE-NEXT:    retl
77   %shift = lshr <2 x i64> %a, %b
78   ret <2 x i64> %shift
79 }
80
81 define <4 x i32> @var_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
82 ; SSE2-LABEL: var_shift_v4i32:
83 ; SSE2:       # BB#0:
84 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
85 ; SSE2-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
86 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
87 ; SSE2-NEXT:    psrld %xmm2, %xmm3
88 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
89 ; SSE2-NEXT:    psrlq $32, %xmm2
90 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
91 ; SSE2-NEXT:    psrld %xmm2, %xmm4
92 ; SSE2-NEXT:    movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1]
93 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3]
94 ; SSE2-NEXT:    pxor %xmm3, %xmm3
95 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
96 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
97 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
98 ; SSE2-NEXT:    psrld %xmm4, %xmm5
99 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
100 ; SSE2-NEXT:    psrld %xmm1, %xmm0
101 ; SSE2-NEXT:    movsd {{.*#+}} xmm5 = xmm0[0],xmm5[1]
102 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
103 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
104 ; SSE2-NEXT:    retq
105 ;
106 ; SSE41-LABEL: var_shift_v4i32:
107 ; SSE41:       # BB#0:
108 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
109 ; SSE41-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
110 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
111 ; SSE41-NEXT:    psrld %xmm2, %xmm3
112 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
113 ; SSE41-NEXT:    psrlq $32, %xmm2
114 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
115 ; SSE41-NEXT:    psrld %xmm2, %xmm4
116 ; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm3[4,5,6,7]
117 ; SSE41-NEXT:    pxor %xmm2, %xmm2
118 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero
119 ; SSE41-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
120 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
121 ; SSE41-NEXT:    psrld %xmm1, %xmm2
122 ; SSE41-NEXT:    psrld %xmm3, %xmm0
123 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
124 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3],xmm0[4,5],xmm4[6,7]
125 ; SSE41-NEXT:    retq
126 ;
127 ; AVX1-LABEL: var_shift_v4i32:
128 ; AVX1:       # BB#0:
129 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm2 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
130 ; AVX1-NEXT:    vpsrld %xmm2, %xmm0, %xmm2
131 ; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm3
132 ; AVX1-NEXT:    vpsrld %xmm3, %xmm0, %xmm3
133 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
134 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
135 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
136 ; AVX1-NEXT:    vpsrld %xmm3, %xmm0, %xmm3
137 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
138 ; AVX1-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
139 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
140 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
141 ; AVX1-NEXT:    retq
142 ;
143 ; AVX2-LABEL: var_shift_v4i32:
144 ; AVX2:       # BB#0:
145 ; AVX2-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0
146 ; AVX2-NEXT:    retq
147 ;
148 ; XOPAVX1-LABEL: var_shift_v4i32:
149 ; XOPAVX1:       # BB#0:
150 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
151 ; XOPAVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm1
152 ; XOPAVX1-NEXT:    vpshld %xmm1, %xmm0, %xmm0
153 ; XOPAVX1-NEXT:    retq
154 ;
155 ; XOPAVX2-LABEL: var_shift_v4i32:
156 ; XOPAVX2:       # BB#0:
157 ; XOPAVX2-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0
158 ; XOPAVX2-NEXT:    retq
159 ;
160 ; AVX512-LABEL: var_shift_v4i32:
161 ; AVX512:       ## BB#0:
162 ; AVX512-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0
163 ; AVX512-NEXT:    retq
164 ;
165 ; X32-SSE-LABEL: var_shift_v4i32:
166 ; X32-SSE:       # BB#0:
167 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
168 ; X32-SSE-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
169 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm3
170 ; X32-SSE-NEXT:    psrld %xmm2, %xmm3
171 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
172 ; X32-SSE-NEXT:    psrlq $32, %xmm2
173 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm4
174 ; X32-SSE-NEXT:    psrld %xmm2, %xmm4
175 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1]
176 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3]
177 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
178 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm4
179 ; X32-SSE-NEXT:    punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
180 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm5
181 ; X32-SSE-NEXT:    psrld %xmm4, %xmm5
182 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
183 ; X32-SSE-NEXT:    psrld %xmm1, %xmm0
184 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm5 = xmm0[0],xmm5[1]
185 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
186 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
187 ; X32-SSE-NEXT:    retl
188   %shift = lshr <4 x i32> %a, %b
189   ret <4 x i32> %shift
190 }
191
192 define <8 x i16> @var_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
193 ; SSE2-LABEL: var_shift_v8i16:
194 ; SSE2:       # BB#0:
195 ; SSE2-NEXT:    psllw $12, %xmm1
196 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
197 ; SSE2-NEXT:    psraw $15, %xmm2
198 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
199 ; SSE2-NEXT:    pandn %xmm0, %xmm3
200 ; SSE2-NEXT:    psrlw $8, %xmm0
201 ; SSE2-NEXT:    pand %xmm2, %xmm0
202 ; SSE2-NEXT:    por %xmm3, %xmm0
203 ; SSE2-NEXT:    paddw %xmm1, %xmm1
204 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
205 ; SSE2-NEXT:    psraw $15, %xmm2
206 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
207 ; SSE2-NEXT:    pandn %xmm0, %xmm3
208 ; SSE2-NEXT:    psrlw $4, %xmm0
209 ; SSE2-NEXT:    pand %xmm2, %xmm0
210 ; SSE2-NEXT:    por %xmm3, %xmm0
211 ; SSE2-NEXT:    paddw %xmm1, %xmm1
212 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
213 ; SSE2-NEXT:    psraw $15, %xmm2
214 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
215 ; SSE2-NEXT:    pandn %xmm0, %xmm3
216 ; SSE2-NEXT:    psrlw $2, %xmm0
217 ; SSE2-NEXT:    pand %xmm2, %xmm0
218 ; SSE2-NEXT:    por %xmm3, %xmm0
219 ; SSE2-NEXT:    paddw %xmm1, %xmm1
220 ; SSE2-NEXT:    psraw $15, %xmm1
221 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
222 ; SSE2-NEXT:    pandn %xmm0, %xmm2
223 ; SSE2-NEXT:    psrlw $1, %xmm0
224 ; SSE2-NEXT:    pand %xmm1, %xmm0
225 ; SSE2-NEXT:    por %xmm2, %xmm0
226 ; SSE2-NEXT:    retq
227 ;
228 ; SSE41-LABEL: var_shift_v8i16:
229 ; SSE41:       # BB#0:
230 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
231 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
232 ; SSE41-NEXT:    psllw $12, %xmm0
233 ; SSE41-NEXT:    psllw $4, %xmm1
234 ; SSE41-NEXT:    por %xmm0, %xmm1
235 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
236 ; SSE41-NEXT:    paddw %xmm3, %xmm3
237 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
238 ; SSE41-NEXT:    psrlw $8, %xmm4
239 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
240 ; SSE41-NEXT:    pblendvb %xmm4, %xmm2
241 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
242 ; SSE41-NEXT:    psrlw $4, %xmm1
243 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
244 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
245 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
246 ; SSE41-NEXT:    psrlw $2, %xmm1
247 ; SSE41-NEXT:    paddw %xmm3, %xmm3
248 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
249 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
250 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
251 ; SSE41-NEXT:    psrlw $1, %xmm1
252 ; SSE41-NEXT:    paddw %xmm3, %xmm3
253 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
254 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
255 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
256 ; SSE41-NEXT:    retq
257 ;
258 ; AVX1-LABEL: var_shift_v8i16:
259 ; AVX1:       # BB#0:
260 ; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm2
261 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
262 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
263 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm2
264 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm3
265 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
266 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm1
267 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
268 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm1
269 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
270 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
271 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm1
272 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
273 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
274 ; AVX1-NEXT:    retq
275 ;
276 ; AVX2-LABEL: var_shift_v8i16:
277 ; AVX2:       # BB#0:
278 ; 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
279 ; 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
280 ; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
281 ; 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
282 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
283 ; AVX2-NEXT:    vzeroupper
284 ; AVX2-NEXT:    retq
285 ;
286 ; XOP-LABEL: var_shift_v8i16:
287 ; XOP:       # BB#0:
288 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
289 ; XOP-NEXT:    vpsubw %xmm1, %xmm2, %xmm1
290 ; XOP-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
291 ; XOP-NEXT:    retq
292 ;
293 ; AVX512-LABEL: var_shift_v8i16:
294 ; AVX512:       ## BB#0:
295 ; AVX512-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
296 ; AVX512-NEXT:    retq
297 ;
298 ; X32-SSE-LABEL: var_shift_v8i16:
299 ; X32-SSE:       # BB#0:
300 ; X32-SSE-NEXT:    psllw $12, %xmm1
301 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
302 ; X32-SSE-NEXT:    psraw $15, %xmm2
303 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
304 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
305 ; X32-SSE-NEXT:    psrlw $8, %xmm0
306 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
307 ; X32-SSE-NEXT:    por %xmm3, %xmm0
308 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
309 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
310 ; X32-SSE-NEXT:    psraw $15, %xmm2
311 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
312 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
313 ; X32-SSE-NEXT:    psrlw $4, %xmm0
314 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
315 ; X32-SSE-NEXT:    por %xmm3, %xmm0
316 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
317 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
318 ; X32-SSE-NEXT:    psraw $15, %xmm2
319 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
320 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
321 ; X32-SSE-NEXT:    psrlw $2, %xmm0
322 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
323 ; X32-SSE-NEXT:    por %xmm3, %xmm0
324 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
325 ; X32-SSE-NEXT:    psraw $15, %xmm1
326 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
327 ; X32-SSE-NEXT:    pandn %xmm0, %xmm2
328 ; X32-SSE-NEXT:    psrlw $1, %xmm0
329 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
330 ; X32-SSE-NEXT:    por %xmm2, %xmm0
331 ; X32-SSE-NEXT:    retl
332   %shift = lshr <8 x i16> %a, %b
333   ret <8 x i16> %shift
334 }
335
336 define <16 x i8> @var_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
337 ; SSE2-LABEL: var_shift_v16i8:
338 ; SSE2:       # BB#0:
339 ; SSE2-NEXT:    psllw $5, %xmm1
340 ; SSE2-NEXT:    pxor %xmm2, %xmm2
341 ; SSE2-NEXT:    pxor %xmm3, %xmm3
342 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
343 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
344 ; SSE2-NEXT:    pandn %xmm0, %xmm4
345 ; SSE2-NEXT:    psrlw $4, %xmm0
346 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
347 ; SSE2-NEXT:    pand %xmm3, %xmm0
348 ; SSE2-NEXT:    por %xmm4, %xmm0
349 ; SSE2-NEXT:    paddb %xmm1, %xmm1
350 ; SSE2-NEXT:    pxor %xmm3, %xmm3
351 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
352 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
353 ; SSE2-NEXT:    pandn %xmm0, %xmm4
354 ; SSE2-NEXT:    psrlw $2, %xmm0
355 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
356 ; SSE2-NEXT:    pand %xmm3, %xmm0
357 ; SSE2-NEXT:    por %xmm4, %xmm0
358 ; SSE2-NEXT:    paddb %xmm1, %xmm1
359 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
360 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
361 ; SSE2-NEXT:    pandn %xmm0, %xmm1
362 ; SSE2-NEXT:    psrlw $1, %xmm0
363 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
364 ; SSE2-NEXT:    pand %xmm2, %xmm0
365 ; SSE2-NEXT:    por %xmm1, %xmm0
366 ; SSE2-NEXT:    retq
367 ;
368 ; SSE41-LABEL: var_shift_v16i8:
369 ; SSE41:       # BB#0:
370 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
371 ; SSE41-NEXT:    psllw $5, %xmm1
372 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
373 ; SSE41-NEXT:    psrlw $4, %xmm3
374 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
375 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
376 ; SSE41-NEXT:    pblendvb %xmm3, %xmm2
377 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
378 ; SSE41-NEXT:    psrlw $2, %xmm3
379 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
380 ; SSE41-NEXT:    paddb %xmm1, %xmm1
381 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
382 ; SSE41-NEXT:    pblendvb %xmm3, %xmm2
383 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
384 ; SSE41-NEXT:    psrlw $1, %xmm3
385 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
386 ; SSE41-NEXT:    paddb %xmm1, %xmm1
387 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
388 ; SSE41-NEXT:    pblendvb %xmm3, %xmm2
389 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
390 ; SSE41-NEXT:    retq
391 ;
392 ; AVX-LABEL: var_shift_v16i8:
393 ; AVX:       # BB#0:
394 ; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
395 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm2
396 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
397 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
398 ; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm2
399 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
400 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
401 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
402 ; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm2
403 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
404 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
405 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
406 ; AVX-NEXT:    retq
407 ;
408 ; XOP-LABEL: var_shift_v16i8:
409 ; XOP:       # BB#0:
410 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
411 ; XOP-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
412 ; XOP-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
413 ; XOP-NEXT:    retq
414 ;
415 ; AVX512-LABEL: var_shift_v16i8:
416 ; AVX512:       ## BB#0:
417 ; AVX512-NEXT:    vpsllw $5, %xmm1, %xmm1
418 ; AVX512-NEXT:    vpsrlw $4, %xmm0, %xmm2
419 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
420 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
421 ; AVX512-NEXT:    vpsrlw $2, %xmm0, %xmm2
422 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
423 ; AVX512-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
424 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
425 ; AVX512-NEXT:    vpsrlw $1, %xmm0, %xmm2
426 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
427 ; AVX512-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
428 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
429 ; AVX512-NEXT:    retq
430 ;
431 ; X32-SSE-LABEL: var_shift_v16i8:
432 ; X32-SSE:       # BB#0:
433 ; X32-SSE-NEXT:    psllw $5, %xmm1
434 ; X32-SSE-NEXT:    pxor %xmm2, %xmm2
435 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
436 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm3
437 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
438 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
439 ; X32-SSE-NEXT:    psrlw $4, %xmm0
440 ; X32-SSE-NEXT:    pand .LCPI3_0, %xmm0
441 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
442 ; X32-SSE-NEXT:    por %xmm4, %xmm0
443 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
444 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
445 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm3
446 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
447 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
448 ; X32-SSE-NEXT:    psrlw $2, %xmm0
449 ; X32-SSE-NEXT:    pand .LCPI3_1, %xmm0
450 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
451 ; X32-SSE-NEXT:    por %xmm4, %xmm0
452 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
453 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm2
454 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm1
455 ; X32-SSE-NEXT:    pandn %xmm0, %xmm1
456 ; X32-SSE-NEXT:    psrlw $1, %xmm0
457 ; X32-SSE-NEXT:    pand .LCPI3_2, %xmm0
458 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
459 ; X32-SSE-NEXT:    por %xmm1, %xmm0
460 ; X32-SSE-NEXT:    retl
461   %shift = lshr <16 x i8> %a, %b
462   ret <16 x i8> %shift
463 }
464
465 ;
466 ; Uniform Variable Shifts
467 ;
468
469 define <2 x i64> @splatvar_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
470 ; SSE-LABEL: splatvar_shift_v2i64:
471 ; SSE:       # BB#0:
472 ; SSE-NEXT:    psrlq %xmm1, %xmm0
473 ; SSE-NEXT:    retq
474 ;
475 ; AVX-LABEL: splatvar_shift_v2i64:
476 ; AVX:       # BB#0:
477 ; AVX-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
478 ; AVX-NEXT:    retq
479 ;
480 ; XOP-LABEL: splatvar_shift_v2i64:
481 ; XOP:       # BB#0:
482 ; XOP-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
483 ; XOP-NEXT:    retq
484 ;
485 ; AVX512-LABEL: splatvar_shift_v2i64:
486 ; AVX512:       ## BB#0:
487 ; AVX512-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
488 ; AVX512-NEXT:    retq
489 ;
490 ; X32-SSE-LABEL: splatvar_shift_v2i64:
491 ; X32-SSE:       # BB#0:
492 ; X32-SSE-NEXT:    movq {{.*#+}} xmm1 = xmm1[0],zero
493 ; X32-SSE-NEXT:    psrlq %xmm1, %xmm0
494 ; X32-SSE-NEXT:    retl
495   %splat = shufflevector <2 x i64> %b, <2 x i64> undef, <2 x i32> zeroinitializer
496   %shift = lshr <2 x i64> %a, %splat
497   ret <2 x i64> %shift
498 }
499
500 define <4 x i32> @splatvar_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
501 ; SSE2-LABEL: splatvar_shift_v4i32:
502 ; SSE2:       # BB#0:
503 ; SSE2-NEXT:    xorps %xmm2, %xmm2
504 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
505 ; SSE2-NEXT:    psrld %xmm2, %xmm0
506 ; SSE2-NEXT:    retq
507 ;
508 ; SSE41-LABEL: splatvar_shift_v4i32:
509 ; SSE41:       # BB#0:
510 ; SSE41-NEXT:    pxor %xmm2, %xmm2
511 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3,4,5,6,7]
512 ; SSE41-NEXT:    psrld %xmm2, %xmm0
513 ; SSE41-NEXT:    retq
514 ;
515 ; AVX-LABEL: splatvar_shift_v4i32:
516 ; AVX:       # BB#0:
517 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
518 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
519 ; AVX-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
520 ; AVX-NEXT:    retq
521 ;
522 ; XOP-LABEL: splatvar_shift_v4i32:
523 ; XOP:       # BB#0:
524 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
525 ; XOP-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
526 ; XOP-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
527 ; XOP-NEXT:    retq
528 ;
529 ; AVX512-LABEL: splatvar_shift_v4i32:
530 ; AVX512:       ## BB#0:
531 ; AVX512-NEXT:    vxorps %xmm2, %xmm2, %xmm2
532 ; AVX512-NEXT:    vmovss %xmm1, %xmm2, %xmm1
533 ; AVX512-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
534 ; AVX512-NEXT:    retq
535 ;
536 ; X32-SSE-LABEL: splatvar_shift_v4i32:
537 ; X32-SSE:       # BB#0:
538 ; X32-SSE-NEXT:    xorps %xmm2, %xmm2
539 ; X32-SSE-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
540 ; X32-SSE-NEXT:    psrld %xmm2, %xmm0
541 ; X32-SSE-NEXT:    retl
542   %splat = shufflevector <4 x i32> %b, <4 x i32> undef, <4 x i32> zeroinitializer
543   %shift = lshr <4 x i32> %a, %splat
544   ret <4 x i32> %shift
545 }
546
547 define <8 x i16> @splatvar_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
548 ; SSE2-LABEL: splatvar_shift_v8i16:
549 ; SSE2:       # BB#0:
550 ; SSE2-NEXT:    movd %xmm1, %eax
551 ; SSE2-NEXT:    movzwl %ax, %eax
552 ; SSE2-NEXT:    movd %eax, %xmm1
553 ; SSE2-NEXT:    psrlw %xmm1, %xmm0
554 ; SSE2-NEXT:    retq
555 ;
556 ; SSE41-LABEL: splatvar_shift_v8i16:
557 ; SSE41:       # BB#0:
558 ; SSE41-NEXT:    pxor %xmm2, %xmm2
559 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3,4,5,6,7]
560 ; SSE41-NEXT:    psrlw %xmm2, %xmm0
561 ; SSE41-NEXT:    retq
562 ;
563 ; AVX-LABEL: splatvar_shift_v8i16:
564 ; AVX:       # BB#0:
565 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
566 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
567 ; AVX-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
568 ; AVX-NEXT:    retq
569 ;
570 ; XOP-LABEL: splatvar_shift_v8i16:
571 ; XOP:       # BB#0:
572 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
573 ; XOP-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
574 ; XOP-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
575 ; XOP-NEXT:    retq
576 ;
577 ; AVX512-LABEL: splatvar_shift_v8i16:
578 ; AVX512:       ## BB#0:
579 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
580 ; AVX512-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
581 ; AVX512-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
582 ; AVX512-NEXT:    retq
583 ;
584 ; X32-SSE-LABEL: splatvar_shift_v8i16:
585 ; X32-SSE:       # BB#0:
586 ; X32-SSE-NEXT:    movd %xmm1, %eax
587 ; X32-SSE-NEXT:    movzwl %ax, %eax
588 ; X32-SSE-NEXT:    movd %eax, %xmm1
589 ; X32-SSE-NEXT:    psrlw %xmm1, %xmm0
590 ; X32-SSE-NEXT:    retl
591   %splat = shufflevector <8 x i16> %b, <8 x i16> undef, <8 x i32> zeroinitializer
592   %shift = lshr <8 x i16> %a, %splat
593   ret <8 x i16> %shift
594 }
595
596 define <16 x i8> @splatvar_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
597 ; SSE2-LABEL: splatvar_shift_v16i8:
598 ; SSE2:       # BB#0:
599 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
600 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
601 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
602 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm1[0,1,2,3,4,4,4,4]
603 ; SSE2-NEXT:    psllw $5, %xmm2
604 ; SSE2-NEXT:    pxor %xmm1, %xmm1
605 ; SSE2-NEXT:    pxor %xmm3, %xmm3
606 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
607 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
608 ; SSE2-NEXT:    pandn %xmm0, %xmm4
609 ; SSE2-NEXT:    psrlw $4, %xmm0
610 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
611 ; SSE2-NEXT:    pand %xmm3, %xmm0
612 ; SSE2-NEXT:    por %xmm4, %xmm0
613 ; SSE2-NEXT:    paddb %xmm2, %xmm2
614 ; SSE2-NEXT:    pxor %xmm3, %xmm3
615 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
616 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
617 ; SSE2-NEXT:    pandn %xmm0, %xmm4
618 ; SSE2-NEXT:    psrlw $2, %xmm0
619 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
620 ; SSE2-NEXT:    pand %xmm3, %xmm0
621 ; SSE2-NEXT:    por %xmm4, %xmm0
622 ; SSE2-NEXT:    paddb %xmm2, %xmm2
623 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
624 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
625 ; SSE2-NEXT:    pandn %xmm0, %xmm2
626 ; SSE2-NEXT:    psrlw $1, %xmm0
627 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
628 ; SSE2-NEXT:    pand %xmm1, %xmm0
629 ; SSE2-NEXT:    por %xmm2, %xmm0
630 ; SSE2-NEXT:    retq
631 ;
632 ; SSE41-LABEL: splatvar_shift_v16i8:
633 ; SSE41:       # BB#0:
634 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
635 ; SSE41-NEXT:    pxor %xmm0, %xmm0
636 ; SSE41-NEXT:    pshufb %xmm0, %xmm1
637 ; SSE41-NEXT:    psllw $5, %xmm1
638 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
639 ; SSE41-NEXT:    paddb %xmm3, %xmm3
640 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
641 ; SSE41-NEXT:    psrlw $4, %xmm4
642 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm4
643 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
644 ; SSE41-NEXT:    pblendvb %xmm4, %xmm2
645 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
646 ; SSE41-NEXT:    psrlw $2, %xmm1
647 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
648 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
649 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
650 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
651 ; SSE41-NEXT:    psrlw $1, %xmm1
652 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
653 ; SSE41-NEXT:    paddb %xmm3, %xmm3
654 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
655 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
656 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
657 ; SSE41-NEXT:    retq
658 ;
659 ; AVX1-LABEL: splatvar_shift_v16i8:
660 ; AVX1:       # BB#0:
661 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
662 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
663 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
664 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm2
665 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm3
666 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
667 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
668 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm1
669 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
670 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
671 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm1
672 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
673 ; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm2
674 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
675 ; AVX1-NEXT:    retq
676 ;
677 ; AVX2-LABEL: splatvar_shift_v16i8:
678 ; AVX2:       # BB#0:
679 ; AVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
680 ; AVX2-NEXT:    vpsllw $5, %xmm1, %xmm1
681 ; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm2
682 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
683 ; AVX2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
684 ; AVX2-NEXT:    vpsrlw $2, %xmm0, %xmm2
685 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
686 ; AVX2-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
687 ; AVX2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
688 ; AVX2-NEXT:    vpsrlw $1, %xmm0, %xmm2
689 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
690 ; AVX2-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
691 ; AVX2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
692 ; AVX2-NEXT:    retq
693 ;
694 ; XOPAVX1-LABEL: splatvar_shift_v16i8:
695 ; XOPAVX1:       # BB#0:
696 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
697 ; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
698 ; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
699 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
700 ; XOPAVX1-NEXT:    retq
701 ;
702 ; XOPAVX2-LABEL: splatvar_shift_v16i8:
703 ; XOPAVX2:       # BB#0:
704 ; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
705 ; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
706 ; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
707 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
708 ; XOPAVX2-NEXT:    retq
709 ;
710 ; AVX512-LABEL: splatvar_shift_v16i8:
711 ; AVX512:       ## BB#0:
712 ; AVX512-NEXT:    vpbroadcastb %xmm1, %xmm1
713 ; AVX512-NEXT:    vpsllw $5, %xmm1, %xmm1
714 ; AVX512-NEXT:    vpsrlw $4, %xmm0, %xmm2
715 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
716 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
717 ; AVX512-NEXT:    vpsrlw $2, %xmm0, %xmm2
718 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
719 ; AVX512-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
720 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
721 ; AVX512-NEXT:    vpsrlw $1, %xmm0, %xmm2
722 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
723 ; AVX512-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
724 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
725 ; AVX512-NEXT:    retq
726 ;
727 ; X32-SSE-LABEL: splatvar_shift_v16i8:
728 ; X32-SSE:       # BB#0:
729 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
730 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
731 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
732 ; X32-SSE-NEXT:    pshufhw {{.*#+}} xmm2 = xmm1[0,1,2,3,4,4,4,4]
733 ; X32-SSE-NEXT:    psllw $5, %xmm2
734 ; X32-SSE-NEXT:    pxor %xmm1, %xmm1
735 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
736 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm3
737 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
738 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
739 ; X32-SSE-NEXT:    psrlw $4, %xmm0
740 ; X32-SSE-NEXT:    pand .LCPI7_0, %xmm0
741 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
742 ; X32-SSE-NEXT:    por %xmm4, %xmm0
743 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
744 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
745 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm3
746 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
747 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
748 ; X32-SSE-NEXT:    psrlw $2, %xmm0
749 ; X32-SSE-NEXT:    pand .LCPI7_1, %xmm0
750 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
751 ; X32-SSE-NEXT:    por %xmm4, %xmm0
752 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
753 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm1
754 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
755 ; X32-SSE-NEXT:    pandn %xmm0, %xmm2
756 ; X32-SSE-NEXT:    psrlw $1, %xmm0
757 ; X32-SSE-NEXT:    pand .LCPI7_2, %xmm0
758 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
759 ; X32-SSE-NEXT:    por %xmm2, %xmm0
760 ; X32-SSE-NEXT:    retl
761   %splat = shufflevector <16 x i8> %b, <16 x i8> undef, <16 x i32> zeroinitializer
762   %shift = lshr <16 x i8> %a, %splat
763   ret <16 x i8> %shift
764 }
765
766 ;
767 ; Constant Shifts
768 ;
769
770 define <2 x i64> @constant_shift_v2i64(<2 x i64> %a) nounwind {
771 ; SSE2-LABEL: constant_shift_v2i64:
772 ; SSE2:       # BB#0:
773 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
774 ; SSE2-NEXT:    psrlq $7, %xmm1
775 ; SSE2-NEXT:    psrlq $1, %xmm0
776 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
777 ; SSE2-NEXT:    movapd %xmm1, %xmm0
778 ; SSE2-NEXT:    retq
779 ;
780 ; SSE41-LABEL: constant_shift_v2i64:
781 ; SSE41:       # BB#0:
782 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
783 ; SSE41-NEXT:    psrlq $7, %xmm1
784 ; SSE41-NEXT:    psrlq $1, %xmm0
785 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
786 ; SSE41-NEXT:    retq
787 ;
788 ; AVX1-LABEL: constant_shift_v2i64:
789 ; AVX1:       # BB#0:
790 ; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm1
791 ; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
792 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
793 ; AVX1-NEXT:    retq
794 ;
795 ; AVX2-LABEL: constant_shift_v2i64:
796 ; AVX2:       # BB#0:
797 ; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
798 ; AVX2-NEXT:    retq
799 ;
800 ; XOPAVX1-LABEL: constant_shift_v2i64:
801 ; XOPAVX1:       # BB#0:
802 ; XOPAVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
803 ; XOPAVX1-NEXT:    vpsubq {{.*}}(%rip), %xmm1, %xmm1
804 ; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm0
805 ; XOPAVX1-NEXT:    retq
806 ;
807 ; XOPAVX2-LABEL: constant_shift_v2i64:
808 ; XOPAVX2:       # BB#0:
809 ; XOPAVX2-NEXT:    vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
810 ; XOPAVX2-NEXT:    retq
811 ;
812 ; AVX512-LABEL: constant_shift_v2i64:
813 ; AVX512:       ## BB#0:
814 ; AVX512-NEXT:    vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
815 ; AVX512-NEXT:    retq
816 ;
817 ; X32-SSE-LABEL: constant_shift_v2i64:
818 ; X32-SSE:       # BB#0:
819 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
820 ; X32-SSE-NEXT:    psrlq $7, %xmm1
821 ; X32-SSE-NEXT:    psrlq $1, %xmm0
822 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
823 ; X32-SSE-NEXT:    movapd %xmm1, %xmm0
824 ; X32-SSE-NEXT:    retl
825   %shift = lshr <2 x i64> %a, <i64 1, i64 7>
826   ret <2 x i64> %shift
827 }
828
829 define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind {
830 ; SSE2-LABEL: constant_shift_v4i32:
831 ; SSE2:       # BB#0:
832 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
833 ; SSE2-NEXT:    psrld $7, %xmm1
834 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
835 ; SSE2-NEXT:    psrld $5, %xmm2
836 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
837 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
838 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
839 ; SSE2-NEXT:    psrld $6, %xmm2
840 ; SSE2-NEXT:    psrld $4, %xmm0
841 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
842 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
843 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
844 ; SSE2-NEXT:    retq
845 ;
846 ; SSE41-LABEL: constant_shift_v4i32:
847 ; SSE41:       # BB#0:
848 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
849 ; SSE41-NEXT:    psrld $7, %xmm1
850 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
851 ; SSE41-NEXT:    psrld $5, %xmm2
852 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]
853 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
854 ; SSE41-NEXT:    psrld $6, %xmm1
855 ; SSE41-NEXT:    psrld $4, %xmm0
856 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
857 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
858 ; SSE41-NEXT:    retq
859 ;
860 ; AVX1-LABEL: constant_shift_v4i32:
861 ; AVX1:       # BB#0:
862 ; AVX1-NEXT:    vpsrld $7, %xmm0, %xmm1
863 ; AVX1-NEXT:    vpsrld $5, %xmm0, %xmm2
864 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
865 ; AVX1-NEXT:    vpsrld $6, %xmm0, %xmm2
866 ; AVX1-NEXT:    vpsrld $4, %xmm0, %xmm0
867 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
868 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
869 ; AVX1-NEXT:    retq
870 ;
871 ; AVX2-LABEL: constant_shift_v4i32:
872 ; AVX2:       # BB#0:
873 ; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %xmm0, %xmm0
874 ; AVX2-NEXT:    retq
875 ;
876 ; XOPAVX1-LABEL: constant_shift_v4i32:
877 ; XOPAVX1:       # BB#0:
878 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
879 ; XOPAVX1-NEXT:    retq
880 ;
881 ; XOPAVX2-LABEL: constant_shift_v4i32:
882 ; XOPAVX2:       # BB#0:
883 ; XOPAVX2-NEXT:    vpsrlvd {{.*}}(%rip), %xmm0, %xmm0
884 ; XOPAVX2-NEXT:    retq
885 ;
886 ; AVX512-LABEL: constant_shift_v4i32:
887 ; AVX512:       ## BB#0:
888 ; AVX512-NEXT:    vpsrlvd {{.*}}(%rip), %xmm0, %xmm0
889 ; AVX512-NEXT:    retq
890 ;
891 ; X32-SSE-LABEL: constant_shift_v4i32:
892 ; X32-SSE:       # BB#0:
893 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
894 ; X32-SSE-NEXT:    psrld $7, %xmm1
895 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
896 ; X32-SSE-NEXT:    psrld $5, %xmm2
897 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
898 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
899 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
900 ; X32-SSE-NEXT:    psrld $6, %xmm2
901 ; X32-SSE-NEXT:    psrld $4, %xmm0
902 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
903 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
904 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
905 ; X32-SSE-NEXT:    retl
906   %shift = lshr <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>
907   ret <4 x i32> %shift
908 }
909
910 define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind {
911 ; SSE2-LABEL: constant_shift_v8i16:
912 ; SSE2:       # BB#0:
913 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
914 ; SSE2-NEXT:    psrlw $4, %xmm1
915 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
916 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
917 ; SSE2-NEXT:    psrlw $2, %xmm1
918 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
919 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
920 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]
921 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
922 ; SSE2-NEXT:    pand %xmm0, %xmm1
923 ; SSE2-NEXT:    psrlw $1, %xmm2
924 ; SSE2-NEXT:    pandn %xmm2, %xmm0
925 ; SSE2-NEXT:    por %xmm1, %xmm0
926 ; SSE2-NEXT:    retq
927 ;
928 ; SSE41-LABEL: constant_shift_v8i16:
929 ; SSE41:       # BB#0:
930 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
931 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
932 ; SSE41-NEXT:    psrlw $8, %xmm2
933 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,4112,8224,12336,16448,20560,24672,28784]
934 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
935 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
936 ; SSE41-NEXT:    psrlw $4, %xmm2
937 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,8224,16448,24672,32896,41120,49344,57568]
938 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
939 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
940 ; SSE41-NEXT:    psrlw $2, %xmm2
941 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,16448,32896,49344,256,16704,33152,49600]
942 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
943 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
944 ; SSE41-NEXT:    psrlw $1, %xmm2
945 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,32896,256,33152,512,33408,768,33664]
946 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
947 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
948 ; SSE41-NEXT:    retq
949 ;
950 ; AVX1-LABEL: constant_shift_v8i16:
951 ; AVX1:       # BB#0:
952 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
953 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,4112,8224,12336,16448,20560,24672,28784]
954 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
955 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm1
956 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,8224,16448,24672,32896,41120,49344,57568]
957 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
958 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm1
959 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,16448,32896,49344,256,16704,33152,49600]
960 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
961 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm1
962 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,32896,256,33152,512,33408,768,33664]
963 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
964 ; AVX1-NEXT:    retq
965 ;
966 ; AVX2-LABEL: constant_shift_v8i16:
967 ; AVX2:       # BB#0:
968 ; 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
969 ; 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
970 ; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
971 ; 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
972 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
973 ; AVX2-NEXT:    vzeroupper
974 ; AVX2-NEXT:    retq
975 ;
976 ; XOP-LABEL: constant_shift_v8i16:
977 ; XOP:       # BB#0:
978 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
979 ; XOP-NEXT:    vpsubw {{.*}}(%rip), %xmm1, %xmm1
980 ; XOP-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
981 ; XOP-NEXT:    retq
982 ;
983 ; AVX512-LABEL: constant_shift_v8i16:
984 ; AVX512:       ## BB#0:
985 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]
986 ; AVX512-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
987 ; AVX512-NEXT:    retq
988 ;
989 ; X32-SSE-LABEL: constant_shift_v8i16:
990 ; X32-SSE:       # BB#0:
991 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
992 ; X32-SSE-NEXT:    psrlw $4, %xmm1
993 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
994 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
995 ; X32-SSE-NEXT:    psrlw $2, %xmm1
996 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
997 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
998 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]
999 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm1
1000 ; X32-SSE-NEXT:    pand %xmm0, %xmm1
1001 ; X32-SSE-NEXT:    psrlw $1, %xmm2
1002 ; X32-SSE-NEXT:    pandn %xmm2, %xmm0
1003 ; X32-SSE-NEXT:    por %xmm1, %xmm0
1004 ; X32-SSE-NEXT:    retl
1005   %shift = lshr <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>
1006   ret <8 x i16> %shift
1007 }
1008
1009 define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind {
1010 ; SSE2-LABEL: constant_shift_v16i8:
1011 ; SSE2:       # BB#0:
1012 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1013 ; SSE2-NEXT:    psllw $5, %xmm2
1014 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1015 ; SSE2-NEXT:    pxor %xmm3, %xmm3
1016 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
1017 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1018 ; SSE2-NEXT:    pandn %xmm0, %xmm4
1019 ; SSE2-NEXT:    psrlw $4, %xmm0
1020 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1021 ; SSE2-NEXT:    pand %xmm3, %xmm0
1022 ; SSE2-NEXT:    por %xmm4, %xmm0
1023 ; SSE2-NEXT:    paddb %xmm2, %xmm2
1024 ; SSE2-NEXT:    pxor %xmm3, %xmm3
1025 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
1026 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1027 ; SSE2-NEXT:    pandn %xmm0, %xmm4
1028 ; SSE2-NEXT:    psrlw $2, %xmm0
1029 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1030 ; SSE2-NEXT:    pand %xmm3, %xmm0
1031 ; SSE2-NEXT:    por %xmm4, %xmm0
1032 ; SSE2-NEXT:    paddb %xmm2, %xmm2
1033 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
1034 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1035 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1036 ; SSE2-NEXT:    psrlw $1, %xmm0
1037 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1038 ; SSE2-NEXT:    pand %xmm1, %xmm0
1039 ; SSE2-NEXT:    por %xmm2, %xmm0
1040 ; SSE2-NEXT:    retq
1041 ;
1042 ; SSE41-LABEL: constant_shift_v16i8:
1043 ; SSE41:       # BB#0:
1044 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1045 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1046 ; SSE41-NEXT:    psllw $5, %xmm0
1047 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
1048 ; SSE41-NEXT:    psrlw $4, %xmm2
1049 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
1050 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
1051 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
1052 ; SSE41-NEXT:    psrlw $2, %xmm2
1053 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
1054 ; SSE41-NEXT:    paddb %xmm0, %xmm0
1055 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
1056 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
1057 ; SSE41-NEXT:    psrlw $1, %xmm2
1058 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
1059 ; SSE41-NEXT:    paddb %xmm0, %xmm0
1060 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
1061 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1062 ; SSE41-NEXT:    retq
1063 ;
1064 ; AVX-LABEL: constant_shift_v16i8:
1065 ; AVX:       # BB#0:
1066 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1067 ; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
1068 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm2
1069 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
1070 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
1071 ; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm2
1072 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
1073 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
1074 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
1075 ; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm2
1076 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
1077 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
1078 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
1079 ; AVX-NEXT:    retq
1080 ;
1081 ; XOP-LABEL: constant_shift_v16i8:
1082 ; XOP:       # BB#0:
1083 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1084 ; XOP-NEXT:    vpsubb {{.*}}(%rip), %xmm1, %xmm1
1085 ; XOP-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
1086 ; XOP-NEXT:    retq
1087 ;
1088 ; AVX512-LABEL: constant_shift_v16i8:
1089 ; AVX512:       ## BB#0:
1090 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1091 ; AVX512-NEXT:    vpsllw $5, %xmm1, %xmm1
1092 ; AVX512-NEXT:    vpsrlw $4, %xmm0, %xmm2
1093 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
1094 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
1095 ; AVX512-NEXT:    vpsrlw $2, %xmm0, %xmm2
1096 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
1097 ; AVX512-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
1098 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
1099 ; AVX512-NEXT:    vpsrlw $1, %xmm0, %xmm2
1100 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
1101 ; AVX512-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
1102 ; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
1103 ; AVX512-NEXT:    retq
1104 ;
1105 ; X32-SSE-LABEL: constant_shift_v16i8:
1106 ; X32-SSE:       # BB#0:
1107 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1108 ; X32-SSE-NEXT:    psllw $5, %xmm2
1109 ; X32-SSE-NEXT:    pxor %xmm1, %xmm1
1110 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
1111 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm3
1112 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
1113 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
1114 ; X32-SSE-NEXT:    psrlw $4, %xmm0
1115 ; X32-SSE-NEXT:    pand .LCPI11_1, %xmm0
1116 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
1117 ; X32-SSE-NEXT:    por %xmm4, %xmm0
1118 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
1119 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
1120 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm3
1121 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
1122 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
1123 ; X32-SSE-NEXT:    psrlw $2, %xmm0
1124 ; X32-SSE-NEXT:    pand .LCPI11_2, %xmm0
1125 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
1126 ; X32-SSE-NEXT:    por %xmm4, %xmm0
1127 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
1128 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm1
1129 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
1130 ; X32-SSE-NEXT:    pandn %xmm0, %xmm2
1131 ; X32-SSE-NEXT:    psrlw $1, %xmm0
1132 ; X32-SSE-NEXT:    pand .LCPI11_3, %xmm0
1133 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
1134 ; X32-SSE-NEXT:    por %xmm2, %xmm0
1135 ; X32-SSE-NEXT:    retl
1136   %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>
1137   ret <16 x i8> %shift
1138 }
1139
1140 ;
1141 ; Uniform Constant Shifts
1142 ;
1143
1144 define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind {
1145 ; SSE-LABEL: splatconstant_shift_v2i64:
1146 ; SSE:       # BB#0:
1147 ; SSE-NEXT:    psrlq $7, %xmm0
1148 ; SSE-NEXT:    retq
1149 ;
1150 ; AVX-LABEL: splatconstant_shift_v2i64:
1151 ; AVX:       # BB#0:
1152 ; AVX-NEXT:    vpsrlq $7, %xmm0, %xmm0
1153 ; AVX-NEXT:    retq
1154 ;
1155 ; XOP-LABEL: splatconstant_shift_v2i64:
1156 ; XOP:       # BB#0:
1157 ; XOP-NEXT:    vpsrlq $7, %xmm0, %xmm0
1158 ; XOP-NEXT:    retq
1159 ;
1160 ; AVX512-LABEL: splatconstant_shift_v2i64:
1161 ; AVX512:       ## BB#0:
1162 ; AVX512-NEXT:    vpsrlq $7, %xmm0, %xmm0
1163 ; AVX512-NEXT:    retq
1164 ;
1165 ; X32-SSE-LABEL: splatconstant_shift_v2i64:
1166 ; X32-SSE:       # BB#0:
1167 ; X32-SSE-NEXT:    psrlq $7, %xmm0
1168 ; X32-SSE-NEXT:    retl
1169   %shift = lshr <2 x i64> %a, <i64 7, i64 7>
1170   ret <2 x i64> %shift
1171 }
1172
1173 define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind {
1174 ; SSE-LABEL: splatconstant_shift_v4i32:
1175 ; SSE:       # BB#0:
1176 ; SSE-NEXT:    psrld $5, %xmm0
1177 ; SSE-NEXT:    retq
1178 ;
1179 ; AVX-LABEL: splatconstant_shift_v4i32:
1180 ; AVX:       # BB#0:
1181 ; AVX-NEXT:    vpsrld $5, %xmm0, %xmm0
1182 ; AVX-NEXT:    retq
1183 ;
1184 ; XOP-LABEL: splatconstant_shift_v4i32:
1185 ; XOP:       # BB#0:
1186 ; XOP-NEXT:    vpsrld $5, %xmm0, %xmm0
1187 ; XOP-NEXT:    retq
1188 ;
1189 ; AVX512-LABEL: splatconstant_shift_v4i32:
1190 ; AVX512:       ## BB#0:
1191 ; AVX512-NEXT:    vpsrld $5, %xmm0, %xmm0
1192 ; AVX512-NEXT:    retq
1193 ;
1194 ; X32-SSE-LABEL: splatconstant_shift_v4i32:
1195 ; X32-SSE:       # BB#0:
1196 ; X32-SSE-NEXT:    psrld $5, %xmm0
1197 ; X32-SSE-NEXT:    retl
1198   %shift = lshr <4 x i32> %a, <i32 5, i32 5, i32 5, i32 5>
1199   ret <4 x i32> %shift
1200 }
1201
1202 define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind {
1203 ; SSE-LABEL: splatconstant_shift_v8i16:
1204 ; SSE:       # BB#0:
1205 ; SSE-NEXT:    psrlw $3, %xmm0
1206 ; SSE-NEXT:    retq
1207 ;
1208 ; AVX-LABEL: splatconstant_shift_v8i16:
1209 ; AVX:       # BB#0:
1210 ; AVX-NEXT:    vpsrlw $3, %xmm0, %xmm0
1211 ; AVX-NEXT:    retq
1212 ;
1213 ; XOP-LABEL: splatconstant_shift_v8i16:
1214 ; XOP:       # BB#0:
1215 ; XOP-NEXT:    vpsrlw $3, %xmm0, %xmm0
1216 ; XOP-NEXT:    retq
1217 ;
1218 ; AVX512-LABEL: splatconstant_shift_v8i16:
1219 ; AVX512:       ## BB#0:
1220 ; AVX512-NEXT:    vpsrlw $3, %xmm0, %xmm0
1221 ; AVX512-NEXT:    retq
1222 ;
1223 ; X32-SSE-LABEL: splatconstant_shift_v8i16:
1224 ; X32-SSE:       # BB#0:
1225 ; X32-SSE-NEXT:    psrlw $3, %xmm0
1226 ; X32-SSE-NEXT:    retl
1227   %shift = lshr <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
1228   ret <8 x i16> %shift
1229 }
1230
1231 define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind {
1232 ; SSE-LABEL: splatconstant_shift_v16i8:
1233 ; SSE:       # BB#0:
1234 ; SSE-NEXT:    psrlw $3, %xmm0
1235 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
1236 ; SSE-NEXT:    retq
1237 ;
1238 ; AVX-LABEL: splatconstant_shift_v16i8:
1239 ; AVX:       # BB#0:
1240 ; AVX-NEXT:    vpsrlw $3, %xmm0, %xmm0
1241 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1242 ; AVX-NEXT:    retq
1243 ;
1244 ; XOP-LABEL: splatconstant_shift_v16i8:
1245 ; XOP:       # BB#0:
1246 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1247 ; XOP-NEXT:    vpsubb {{.*}}(%rip), %xmm1, %xmm1
1248 ; XOP-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
1249 ; XOP-NEXT:    retq
1250 ;
1251 ; AVX512-LABEL: splatconstant_shift_v16i8:
1252 ; AVX512:       ## BB#0:
1253 ; AVX512-NEXT:    vpsrlw $3, %xmm0, %xmm0
1254 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1255 ; AVX512-NEXT:    retq
1256 ;
1257 ; X32-SSE-LABEL: splatconstant_shift_v16i8:
1258 ; X32-SSE:       # BB#0:
1259 ; X32-SSE-NEXT:    psrlw $3, %xmm0
1260 ; X32-SSE-NEXT:    pand .LCPI15_0, %xmm0
1261 ; X32-SSE-NEXT:    retl
1262   %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>
1263   ret <16 x i8> %shift
1264 }