Revert "AVX512: Implemented encoding and intrinsics for vextracti64x4 ,vextracti64x...
[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) nounwind {
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) nounwind {
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) nounwind {
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) nounwind {
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) nounwind {
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) nounwind {
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) nounwind {
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) nounwind {
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) nounwind {
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:    movdqa %xmm0, %xmm1
659 ; X32-SSE-NEXT:    psrlq $7, %xmm1
660 ; X32-SSE-NEXT:    psrlq $1, %xmm0
661 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
662 ; X32-SSE-NEXT:    movapd %xmm1, %xmm0
663 ; X32-SSE-NEXT:    retl
664   %shift = lshr <2 x i64> %a, <i64 1, i64 7>
665   ret <2 x i64> %shift
666 }
667
668 define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind {
669 ; SSE2-LABEL: constant_shift_v4i32:
670 ; SSE2:       # BB#0:
671 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
672 ; SSE2-NEXT:    psrld $7, %xmm1
673 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
674 ; SSE2-NEXT:    psrld $5, %xmm2
675 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
676 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
677 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
678 ; SSE2-NEXT:    psrld $6, %xmm2
679 ; SSE2-NEXT:    psrld $4, %xmm0
680 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
681 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
682 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
683 ; SSE2-NEXT:    retq
684 ;
685 ; SSE41-LABEL: constant_shift_v4i32:
686 ; SSE41:       # BB#0:
687 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
688 ; SSE41-NEXT:    psrld $7, %xmm1
689 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
690 ; SSE41-NEXT:    psrld $5, %xmm2
691 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]
692 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
693 ; SSE41-NEXT:    psrld $6, %xmm1
694 ; SSE41-NEXT:    psrld $4, %xmm0
695 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
696 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
697 ; SSE41-NEXT:    retq
698 ;
699 ; AVX1-LABEL: constant_shift_v4i32:
700 ; AVX1:       # BB#0:
701 ; AVX1-NEXT:    vpsrld $7, %xmm0, %xmm1
702 ; AVX1-NEXT:    vpsrld $5, %xmm0, %xmm2
703 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
704 ; AVX1-NEXT:    vpsrld $6, %xmm0, %xmm2
705 ; AVX1-NEXT:    vpsrld $4, %xmm0, %xmm0
706 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
707 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
708 ; AVX1-NEXT:    retq
709 ;
710 ; AVX2-LABEL: constant_shift_v4i32:
711 ; AVX2:       # BB#0:
712 ; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %xmm0, %xmm0
713 ; AVX2-NEXT:    retq
714 ;
715 ; X32-SSE-LABEL: constant_shift_v4i32:
716 ; X32-SSE:       # BB#0:
717 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
718 ; X32-SSE-NEXT:    psrld $7, %xmm1
719 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
720 ; X32-SSE-NEXT:    psrld $5, %xmm2
721 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
722 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
723 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
724 ; X32-SSE-NEXT:    psrld $6, %xmm2
725 ; X32-SSE-NEXT:    psrld $4, %xmm0
726 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
727 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
728 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
729 ; X32-SSE-NEXT:    retl
730   %shift = lshr <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>
731   ret <4 x i32> %shift
732 }
733
734 define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind {
735 ; SSE2-LABEL: constant_shift_v8i16:
736 ; SSE2:       # BB#0:
737 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
738 ; SSE2-NEXT:    psrlw $4, %xmm1
739 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
740 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
741 ; SSE2-NEXT:    psrlw $2, %xmm1
742 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
743 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
744 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]
745 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
746 ; SSE2-NEXT:    pand %xmm0, %xmm1
747 ; SSE2-NEXT:    psrlw $1, %xmm2
748 ; SSE2-NEXT:    pandn %xmm2, %xmm0
749 ; SSE2-NEXT:    por %xmm1, %xmm0
750 ; SSE2-NEXT:    retq
751 ;
752 ; SSE41-LABEL: constant_shift_v8i16:
753 ; SSE41:       # BB#0:
754 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
755 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
756 ; SSE41-NEXT:    psrlw $8, %xmm2
757 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,4112,8224,12336,16448,20560,24672,28784]
758 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
759 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
760 ; SSE41-NEXT:    psrlw $4, %xmm2
761 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,8224,16448,24672,32896,41120,49344,57568]
762 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
763 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
764 ; SSE41-NEXT:    psrlw $2, %xmm2
765 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,16448,32896,49344,256,16704,33152,49600]
766 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
767 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
768 ; SSE41-NEXT:    psrlw $1, %xmm2
769 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,32896,256,33152,512,33408,768,33664]
770 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
771 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
772 ; SSE41-NEXT:    retq
773 ;
774 ; AVX1-LABEL: constant_shift_v8i16:
775 ; AVX1:       # BB#0:
776 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
777 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,4112,8224,12336,16448,20560,24672,28784]
778 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
779 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm1
780 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,8224,16448,24672,32896,41120,49344,57568]
781 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
782 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm1
783 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,16448,32896,49344,256,16704,33152,49600]
784 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
785 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm1
786 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,32896,256,33152,512,33408,768,33664]
787 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
788 ; AVX1-NEXT:    retq
789 ;
790 ; AVX2-LABEL: constant_shift_v8i16:
791 ; AVX2:       # BB#0:
792 ; 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
793 ; 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
794 ; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
795 ; 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
796 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
797 ; AVX2-NEXT:    vzeroupper
798 ; AVX2-NEXT:    retq
799 ;
800 ; X32-SSE-LABEL: constant_shift_v8i16:
801 ; X32-SSE:       # BB#0:
802 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
803 ; X32-SSE-NEXT:    psrlw $4, %xmm1
804 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
805 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
806 ; X32-SSE-NEXT:    psrlw $2, %xmm1
807 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
808 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
809 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]
810 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm1
811 ; X32-SSE-NEXT:    pand %xmm0, %xmm1
812 ; X32-SSE-NEXT:    psrlw $1, %xmm2
813 ; X32-SSE-NEXT:    pandn %xmm2, %xmm0
814 ; X32-SSE-NEXT:    por %xmm1, %xmm0
815 ; X32-SSE-NEXT:    retl
816   %shift = lshr <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>
817   ret <8 x i16> %shift
818 }
819
820 define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind {
821 ; SSE2-LABEL: constant_shift_v16i8:
822 ; SSE2:       # BB#0:
823 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
824 ; SSE2-NEXT:    psllw $5, %xmm2
825 ; SSE2-NEXT:    pxor %xmm1, %xmm1
826 ; SSE2-NEXT:    pxor %xmm3, %xmm3
827 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
828 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
829 ; SSE2-NEXT:    pandn %xmm0, %xmm4
830 ; SSE2-NEXT:    psrlw $4, %xmm0
831 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
832 ; SSE2-NEXT:    pand %xmm3, %xmm0
833 ; SSE2-NEXT:    por %xmm4, %xmm0
834 ; SSE2-NEXT:    paddb %xmm2, %xmm2
835 ; SSE2-NEXT:    pxor %xmm3, %xmm3
836 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
837 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
838 ; SSE2-NEXT:    pandn %xmm0, %xmm4
839 ; SSE2-NEXT:    psrlw $2, %xmm0
840 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
841 ; SSE2-NEXT:    pand %xmm3, %xmm0
842 ; SSE2-NEXT:    por %xmm4, %xmm0
843 ; SSE2-NEXT:    paddb %xmm2, %xmm2
844 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
845 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
846 ; SSE2-NEXT:    pandn %xmm0, %xmm2
847 ; SSE2-NEXT:    psrlw $1, %xmm0
848 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
849 ; SSE2-NEXT:    pand %xmm1, %xmm0
850 ; SSE2-NEXT:    por %xmm2, %xmm0
851 ; SSE2-NEXT:    retq
852 ;
853 ; SSE41-LABEL: constant_shift_v16i8:
854 ; SSE41:       # BB#0:
855 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
856 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
857 ; SSE41-NEXT:    psllw $5, %xmm0
858 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
859 ; SSE41-NEXT:    psrlw $4, %xmm2
860 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
861 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
862 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
863 ; SSE41-NEXT:    psrlw $2, %xmm2
864 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
865 ; SSE41-NEXT:    paddb %xmm0, %xmm0
866 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
867 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
868 ; SSE41-NEXT:    psrlw $1, %xmm2
869 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
870 ; SSE41-NEXT:    paddb %xmm0, %xmm0
871 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
872 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
873 ; SSE41-NEXT:    retq
874 ;
875 ; AVX-LABEL: constant_shift_v16i8:
876 ; AVX:       # BB#0:
877 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
878 ; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
879 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm2
880 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
881 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
882 ; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm2
883 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
884 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
885 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
886 ; AVX-NEXT:    vpsrlw $1, %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:    retq
891 ;
892 ; X32-SSE-LABEL: constant_shift_v16i8:
893 ; X32-SSE:       # BB#0:
894 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
895 ; X32-SSE-NEXT:    psllw $5, %xmm2
896 ; X32-SSE-NEXT:    pxor %xmm1, %xmm1
897 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
898 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm3
899 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
900 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
901 ; X32-SSE-NEXT:    psrlw $4, %xmm0
902 ; X32-SSE-NEXT:    pand .LCPI11_1, %xmm0
903 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
904 ; X32-SSE-NEXT:    por %xmm4, %xmm0
905 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
906 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
907 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm3
908 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
909 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
910 ; X32-SSE-NEXT:    psrlw $2, %xmm0
911 ; X32-SSE-NEXT:    pand .LCPI11_2, %xmm0
912 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
913 ; X32-SSE-NEXT:    por %xmm4, %xmm0
914 ; X32-SSE-NEXT:    paddb %xmm2, %xmm2
915 ; X32-SSE-NEXT:    pcmpgtb %xmm2, %xmm1
916 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
917 ; X32-SSE-NEXT:    pandn %xmm0, %xmm2
918 ; X32-SSE-NEXT:    psrlw $1, %xmm0
919 ; X32-SSE-NEXT:    pand .LCPI11_3, %xmm0
920 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
921 ; X32-SSE-NEXT:    por %xmm2, %xmm0
922 ; X32-SSE-NEXT:    retl
923   %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>
924   ret <16 x i8> %shift
925 }
926
927 ;
928 ; Uniform Constant Shifts
929 ;
930
931 define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind {
932 ; SSE-LABEL: splatconstant_shift_v2i64:
933 ; SSE:       # BB#0:
934 ; SSE-NEXT:    psrlq $7, %xmm0
935 ; SSE-NEXT:    retq
936 ;
937 ; AVX-LABEL: splatconstant_shift_v2i64:
938 ; AVX:       # BB#0:
939 ; AVX-NEXT:    vpsrlq $7, %xmm0, %xmm0
940 ; AVX-NEXT:    retq
941 ;
942 ; X32-SSE-LABEL: splatconstant_shift_v2i64:
943 ; X32-SSE:       # BB#0:
944 ; X32-SSE-NEXT:    psrlq $7, %xmm0
945 ; X32-SSE-NEXT:    retl
946   %shift = lshr <2 x i64> %a, <i64 7, i64 7>
947   ret <2 x i64> %shift
948 }
949
950 define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind {
951 ; SSE-LABEL: splatconstant_shift_v4i32:
952 ; SSE:       # BB#0:
953 ; SSE-NEXT:    psrld $5, %xmm0
954 ; SSE-NEXT:    retq
955 ;
956 ; AVX-LABEL: splatconstant_shift_v4i32:
957 ; AVX:       # BB#0:
958 ; AVX-NEXT:    vpsrld $5, %xmm0, %xmm0
959 ; AVX-NEXT:    retq
960 ;
961 ; X32-SSE-LABEL: splatconstant_shift_v4i32:
962 ; X32-SSE:       # BB#0:
963 ; X32-SSE-NEXT:    psrld $5, %xmm0
964 ; X32-SSE-NEXT:    retl
965   %shift = lshr <4 x i32> %a, <i32 5, i32 5, i32 5, i32 5>
966   ret <4 x i32> %shift
967 }
968
969 define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind {
970 ; SSE-LABEL: splatconstant_shift_v8i16:
971 ; SSE:       # BB#0:
972 ; SSE-NEXT:    psrlw $3, %xmm0
973 ; SSE-NEXT:    retq
974 ;
975 ; AVX-LABEL: splatconstant_shift_v8i16:
976 ; AVX:       # BB#0:
977 ; AVX-NEXT:    vpsrlw $3, %xmm0, %xmm0
978 ; AVX-NEXT:    retq
979 ;
980 ; X32-SSE-LABEL: splatconstant_shift_v8i16:
981 ; X32-SSE:       # BB#0:
982 ; X32-SSE-NEXT:    psrlw $3, %xmm0
983 ; X32-SSE-NEXT:    retl
984   %shift = lshr <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
985   ret <8 x i16> %shift
986 }
987
988 define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind {
989 ; SSE-LABEL: splatconstant_shift_v16i8:
990 ; SSE:       # BB#0:
991 ; SSE-NEXT:    psrlw $3, %xmm0
992 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
993 ; SSE-NEXT:    retq
994 ;
995 ; AVX-LABEL: splatconstant_shift_v16i8:
996 ; AVX:       # BB#0:
997 ; AVX-NEXT:    vpsrlw $3, %xmm0, %xmm0
998 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
999 ; AVX-NEXT:    retq
1000 ;
1001 ; X32-SSE-LABEL: splatconstant_shift_v16i8:
1002 ; X32-SSE:       # BB#0:
1003 ; X32-SSE-NEXT:    psrlw $3, %xmm0
1004 ; X32-SSE-NEXT:    pand .LCPI15_0, %xmm0
1005 ; X32-SSE-NEXT:    retl
1006   %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>
1007   ret <16 x i8> %shift
1008 }