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