1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE41
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX
6 ; Vectorized integer shifts
9 define <2 x i64> @shl_8i16(<8 x i16> %r, <8 x i16> %a) nounwind readnone ssp {
13 ; SSE2: psllw $12, %xmm1
14 ; SSE2-NEXT: movdqa %xmm1, %xmm2
15 ; SSE2-NEXT: psraw $15, %xmm2
16 ; SSE2-NEXT: movdqa %xmm2, %xmm3
17 ; SSE2-NEXT: pandn %xmm0, %xmm3
18 ; SSE2-NEXT: psllw $8, %xmm0
19 ; SSE2-NEXT: pand %xmm2, %xmm0
20 ; SSE2-NEXT: por %xmm3, %xmm0
21 ; SSE2-NEXT: paddw %xmm1, %xmm1
22 ; SSE2-NEXT: movdqa %xmm1, %xmm2
23 ; SSE2-NEXT: psraw $15, %xmm2
24 ; SSE2-NEXT: movdqa %xmm2, %xmm3
25 ; SSE2-NEXT: pandn %xmm0, %xmm3
26 ; SSE2-NEXT: psllw $4, %xmm0
27 ; SSE2-NEXT: pand %xmm2, %xmm0
28 ; SSE2-NEXT: por %xmm3, %xmm0
29 ; SSE2-NEXT: paddw %xmm1, %xmm1
30 ; SSE2-NEXT: movdqa %xmm1, %xmm2
31 ; SSE2-NEXT: psraw $15, %xmm2
32 ; SSE2-NEXT: movdqa %xmm2, %xmm3
33 ; SSE2-NEXT: pandn %xmm0, %xmm3
34 ; SSE2-NEXT: psllw $2, %xmm0
35 ; SSE2-NEXT: pand %xmm2, %xmm0
36 ; SSE2-NEXT: por %xmm3, %xmm0
37 ; SSE2-NEXT: paddw %xmm1, %xmm1
38 ; SSE2-NEXT: psraw $15, %xmm1
39 ; SSE2-NEXT: movdqa %xmm1, %xmm2
40 ; SSE2-NEXT: pandn %xmm0, %xmm2
41 ; SSE2-NEXT: psllw $1, %xmm0
42 ; SSE2-NEXT: pand %xmm1, %xmm0
43 ; SSE2-NEXT: por %xmm2, %xmm0
46 ; SSE41: movdqa %xmm0, %xmm2
47 ; SSE41-NEXT: movdqa %xmm1, %xmm0
48 ; SSE41-NEXT: psllw $12, %xmm0
49 ; SSE41-NEXT: psllw $4, %xmm1
50 ; SSE41-NEXT: por %xmm0, %xmm1
51 ; SSE41-NEXT: movdqa %xmm1, %xmm3
52 ; SSE41-NEXT: paddw %xmm3, %xmm3
53 ; SSE41-NEXT: movdqa %xmm2, %xmm4
54 ; SSE41-NEXT: psllw $8, %xmm4
55 ; SSE41-NEXT: movdqa %xmm1, %xmm0
56 ; SSE41-NEXT: pblendvb %xmm4, %xmm2
57 ; SSE41-NEXT: movdqa %xmm2, %xmm1
58 ; SSE41-NEXT: psllw $4, %xmm1
59 ; SSE41-NEXT: movdqa %xmm3, %xmm0
60 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
61 ; SSE41-NEXT: movdqa %xmm2, %xmm1
62 ; SSE41-NEXT: psllw $2, %xmm1
63 ; SSE41-NEXT: paddw %xmm3, %xmm3
64 ; SSE41-NEXT: movdqa %xmm3, %xmm0
65 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
66 ; SSE41-NEXT: movdqa %xmm2, %xmm1
67 ; SSE41-NEXT: psllw $1, %xmm1
68 ; SSE41-NEXT: paddw %xmm3, %xmm3
69 ; SSE41-NEXT: movdqa %xmm3, %xmm0
70 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
71 ; SSE41-NEXT: movdqa %xmm2, %xmm0
74 ; AVX: vpsllw $12, %xmm1, %xmm2
75 ; AVX-NEXT: vpsllw $4, %xmm1, %xmm1
76 ; AVX-NEXT: vpor %xmm2, %xmm1, %xmm1
77 ; AVX-NEXT: vpaddw %xmm1, %xmm1, %xmm2
78 ; AVX-NEXT: vpsllw $8, %xmm0, %xmm3
79 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
80 ; AVX-NEXT: vpsllw $4, %xmm0, %xmm1
81 ; AVX-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
82 ; AVX-NEXT: vpsllw $2, %xmm0, %xmm1
83 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
84 ; AVX-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
85 ; AVX-NEXT: vpsllw $1, %xmm0, %xmm1
86 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
87 ; AVX-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
89 %shl = shl <8 x i16> %r, %a
90 %tmp2 = bitcast <8 x i16> %shl to <2 x i64>
94 define <2 x i64> @shl_16i8(<16 x i8> %r, <16 x i8> %a) nounwind readnone ssp {
96 ; SSE2: psllw $5, %xmm1
97 ; SSE2-NEXT: pxor %xmm2, %xmm2
98 ; SSE2-NEXT: pxor %xmm3, %xmm3
99 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm3
100 ; SSE2-NEXT: movdqa %xmm3, %xmm4
101 ; SSE2-NEXT: pandn %xmm0, %xmm4
102 ; SSE2-NEXT: psllw $4, %xmm0
103 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
104 ; SSE2-NEXT: pand %xmm3, %xmm0
105 ; SSE2-NEXT: por %xmm4, %xmm0
106 ; SSE2-NEXT: paddb %xmm1, %xmm1
107 ; SSE2-NEXT: pxor %xmm3, %xmm3
108 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm3
109 ; SSE2-NEXT: movdqa %xmm3, %xmm4
110 ; SSE2-NEXT: pandn %xmm0, %xmm4
111 ; SSE2-NEXT: psllw $2, %xmm0
112 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
113 ; SSE2-NEXT: pand %xmm3, %xmm0
114 ; SSE2-NEXT: por %xmm4, %xmm0
115 ; SSE2-NEXT: paddb %xmm1, %xmm1
116 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2
117 ; SSE2-NEXT: movdqa %xmm2, %xmm1
118 ; SSE2-NEXT: pandn %xmm0, %xmm1
119 ; SSE2-NEXT: paddb %xmm0, %xmm0
120 ; SSE2-NEXT: pand %xmm2, %xmm0
121 ; SSE2-NEXT: por %xmm1, %xmm0
124 ; SSE41: movdqa %xmm0, %xmm2
125 ; SSE41-NEXT: psllw $5, %xmm1
126 ; SSE41-NEXT: movdqa %xmm2, %xmm3
127 ; SSE41-NEXT: psllw $4, %xmm3
128 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm3
129 ; SSE41-NEXT: movdqa %xmm1, %xmm0
130 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
131 ; SSE41-NEXT: movdqa %xmm2, %xmm3
132 ; SSE41-NEXT: psllw $2, %xmm3
133 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm3
134 ; SSE41-NEXT: paddb %xmm1, %xmm1
135 ; SSE41-NEXT: movdqa %xmm1, %xmm0
136 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
137 ; SSE41-NEXT: movdqa %xmm2, %xmm3
138 ; SSE41-NEXT: paddb %xmm3, %xmm3
139 ; SSE41-NEXT: paddb %xmm1, %xmm1
140 ; SSE41-NEXT: movdqa %xmm1, %xmm0
141 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
142 ; SSE41-NEXT: movdqa %xmm2, %xmm0
145 ; AVX: vpsllw $5, %xmm1, %xmm1
146 ; AVX-NEXT: vpsllw $4, %xmm0, %xmm2
147 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
148 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
149 ; AVX-NEXT: vpsllw $2, %xmm0, %xmm2
150 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
151 ; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1
152 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
153 ; AVX-NEXT: vpaddb %xmm0, %xmm0, %xmm2
154 ; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1
155 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
157 %shl = shl <16 x i8> %r, %a
158 %tmp2 = bitcast <16 x i8> %shl to <2 x i64>
162 define <2 x i64> @ashr_8i16(<8 x i16> %r, <8 x i16> %a) nounwind readnone ssp {
166 ; SSE2: psllw $12, %xmm1
167 ; SSE2-NEXT: movdqa %xmm1, %xmm2
168 ; SSE2-NEXT: psraw $15, %xmm2
169 ; SSE2-NEXT: movdqa %xmm2, %xmm3
170 ; SSE2-NEXT: pandn %xmm0, %xmm3
171 ; SSE2-NEXT: psraw $8, %xmm0
172 ; SSE2-NEXT: pand %xmm2, %xmm0
173 ; SSE2-NEXT: por %xmm3, %xmm0
174 ; SSE2-NEXT: paddw %xmm1, %xmm1
175 ; SSE2-NEXT: movdqa %xmm1, %xmm2
176 ; SSE2-NEXT: psraw $15, %xmm2
177 ; SSE2-NEXT: movdqa %xmm2, %xmm3
178 ; SSE2-NEXT: pandn %xmm0, %xmm3
179 ; SSE2-NEXT: psraw $4, %xmm0
180 ; SSE2-NEXT: pand %xmm2, %xmm0
181 ; SSE2-NEXT: por %xmm3, %xmm0
182 ; SSE2-NEXT: paddw %xmm1, %xmm1
183 ; SSE2-NEXT: movdqa %xmm1, %xmm2
184 ; SSE2-NEXT: psraw $15, %xmm2
185 ; SSE2-NEXT: movdqa %xmm2, %xmm3
186 ; SSE2-NEXT: pandn %xmm0, %xmm3
187 ; SSE2-NEXT: psraw $2, %xmm0
188 ; SSE2-NEXT: pand %xmm2, %xmm0
189 ; SSE2-NEXT: por %xmm3, %xmm0
190 ; SSE2-NEXT: paddw %xmm1, %xmm1
191 ; SSE2-NEXT: psraw $15, %xmm1
192 ; SSE2-NEXT: movdqa %xmm1, %xmm2
193 ; SSE2-NEXT: pandn %xmm0, %xmm2
194 ; SSE2-NEXT: psraw $1, %xmm0
195 ; SSE2-NEXT: pand %xmm1, %xmm0
196 ; SSE2-NEXT: por %xmm2, %xmm0
199 ; SSE41: movdqa %xmm0, %xmm2
200 ; SSE41-NEXT: movdqa %xmm1, %xmm0
201 ; SSE41-NEXT: psllw $12, %xmm0
202 ; SSE41-NEXT: psllw $4, %xmm1
203 ; SSE41-NEXT: por %xmm0, %xmm1
204 ; SSE41-NEXT: movdqa %xmm1, %xmm3
205 ; SSE41-NEXT: paddw %xmm3, %xmm3
206 ; SSE41-NEXT: movdqa %xmm2, %xmm4
207 ; SSE41-NEXT: psraw $8, %xmm4
208 ; SSE41-NEXT: movdqa %xmm1, %xmm0
209 ; SSE41-NEXT: pblendvb %xmm4, %xmm2
210 ; SSE41-NEXT: movdqa %xmm2, %xmm1
211 ; SSE41-NEXT: psraw $4, %xmm1
212 ; SSE41-NEXT: movdqa %xmm3, %xmm0
213 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
214 ; SSE41-NEXT: movdqa %xmm2, %xmm1
215 ; SSE41-NEXT: psraw $2, %xmm1
216 ; SSE41-NEXT: paddw %xmm3, %xmm3
217 ; SSE41-NEXT: movdqa %xmm3, %xmm0
218 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
219 ; SSE41-NEXT: movdqa %xmm2, %xmm1
220 ; SSE41-NEXT: psraw $1, %xmm1
221 ; SSE41-NEXT: paddw %xmm3, %xmm3
222 ; SSE41-NEXT: movdqa %xmm3, %xmm0
223 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
224 ; SSE41-NEXT: movdqa %xmm2, %xmm0
227 ; AVX: vpsllw $12, %xmm1, %xmm2
228 ; AVX-NEXT: vpsllw $4, %xmm1, %xmm1
229 ; AVX-NEXT: vpor %xmm2, %xmm1, %xmm1
230 ; AVX-NEXT: vpaddw %xmm1, %xmm1, %xmm2
231 ; AVX-NEXT: vpsraw $8, %xmm0, %xmm3
232 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
233 ; AVX-NEXT: vpsraw $4, %xmm0, %xmm1
234 ; AVX-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
235 ; AVX-NEXT: vpsraw $2, %xmm0, %xmm1
236 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
237 ; AVX-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
238 ; AVX-NEXT: vpsraw $1, %xmm0, %xmm1
239 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
240 ; AVX-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
242 %ashr = ashr <8 x i16> %r, %a
243 %tmp2 = bitcast <8 x i16> %ashr to <2 x i64>
247 define <2 x i64> @ashr_16i8(<16 x i8> %r, <16 x i8> %a) nounwind readnone ssp {
251 ; SSE2: punpckhbw {{.*#}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
252 ; SSE2-NEXT: psllw $5, %xmm1
253 ; SSE2-NEXT: punpckhbw {{.*#}} xmm4 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]
254 ; SSE2-NEXT: pxor %xmm3, %xmm3
255 ; SSE2-NEXT: pxor %xmm5, %xmm5
256 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
257 ; SSE2-NEXT: movdqa %xmm5, %xmm6
258 ; SSE2-NEXT: pandn %xmm2, %xmm6
259 ; SSE2-NEXT: psraw $4, %xmm2
260 ; SSE2-NEXT: pand %xmm5, %xmm2
261 ; SSE2-NEXT: por %xmm6, %xmm2
262 ; SSE2-NEXT: paddw %xmm4, %xmm4
263 ; SSE2-NEXT: pxor %xmm5, %xmm5
264 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
265 ; SSE2-NEXT: movdqa %xmm5, %xmm6
266 ; SSE2-NEXT: pandn %xmm2, %xmm6
267 ; SSE2-NEXT: psraw $2, %xmm2
268 ; SSE2-NEXT: pand %xmm5, %xmm2
269 ; SSE2-NEXT: por %xmm6, %xmm2
270 ; SSE2-NEXT: paddw %xmm4, %xmm4
271 ; SSE2-NEXT: pxor %xmm5, %xmm5
272 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
273 ; SSE2-NEXT: movdqa %xmm5, %xmm4
274 ; SSE2-NEXT: pandn %xmm2, %xmm4
275 ; SSE2-NEXT: psraw $1, %xmm2
276 ; SSE2-NEXT: pand %xmm5, %xmm2
277 ; SSE2-NEXT: por %xmm4, %xmm2
278 ; SSE2-NEXT: psrlw $8, %xmm2
279 ; SSE2-NEXT: punpcklbw {{.*#}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
280 ; SSE2-NEXT: punpcklbw {{.*#}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
281 ; SSE2-NEXT: pxor %xmm4, %xmm4
282 ; SSE2-NEXT: pcmpgtw %xmm1, %xmm4
283 ; SSE2-NEXT: movdqa %xmm4, %xmm5
284 ; SSE2-NEXT: pandn %xmm0, %xmm5
285 ; SSE2-NEXT: psraw $4, %xmm0
286 ; SSE2-NEXT: pand %xmm4, %xmm0
287 ; SSE2-NEXT: por %xmm5, %xmm0
288 ; SSE2-NEXT: paddw %xmm1, %xmm1
289 ; SSE2-NEXT: pxor %xmm4, %xmm4
290 ; SSE2-NEXT: pcmpgtw %xmm1, %xmm4
291 ; SSE2-NEXT: movdqa %xmm4, %xmm5
292 ; SSE2-NEXT: pandn %xmm0, %xmm5
293 ; SSE2-NEXT: psraw $2, %xmm0
294 ; SSE2-NEXT: pand %xmm4, %xmm0
295 ; SSE2-NEXT: por %xmm5, %xmm0
296 ; SSE2-NEXT: paddw %xmm1, %xmm1
297 ; SSE2-NEXT: pcmpgtw %xmm1, %xmm3
298 ; SSE2-NEXT: movdqa %xmm3, %xmm1
299 ; SSE2-NEXT: pandn %xmm0, %xmm1
300 ; SSE2-NEXT: psraw $1, %xmm0
301 ; SSE2-NEXT: pand %xmm3, %xmm0
302 ; SSE2-NEXT: por %xmm1, %xmm0
303 ; SSE2-NEXT: psrlw $8, %xmm0
304 ; SSE2-NEXT: packuswb %xmm2, %xmm0
307 ; SSE41: movdqa %xmm0, %xmm2
308 ; SSE41-NEXT: psllw $5, %xmm1
309 ; SSE41-NEXT: punpckhbw {{.*#}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
310 ; SSE41-NEXT: punpckhbw {{.*#}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]
311 ; SSE41-NEXT: movdqa %xmm3, %xmm4
312 ; SSE41-NEXT: psraw $4, %xmm4
313 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
314 ; SSE41-NEXT: movdqa %xmm3, %xmm4
315 ; SSE41-NEXT: psraw $2, %xmm4
316 ; SSE41-NEXT: paddw %xmm0, %xmm0
317 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
318 ; SSE41-NEXT: movdqa %xmm3, %xmm4
319 ; SSE41-NEXT: psraw $1, %xmm4
320 ; SSE41-NEXT: paddw %xmm0, %xmm0
321 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
322 ; SSE41-NEXT: psrlw $8, %xmm3
323 ; SSE41-NEXT: punpcklbw {{.*#}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
324 ; SSE41-NEXT: punpcklbw {{.*#}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
325 ; SSE41-NEXT: movdqa %xmm1, %xmm2
326 ; SSE41-NEXT: psraw $4, %xmm2
327 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
328 ; SSE41-NEXT: movdqa %xmm1, %xmm2
329 ; SSE41-NEXT: psraw $2, %xmm2
330 ; SSE41-NEXT: paddw %xmm0, %xmm0
331 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
332 ; SSE41-NEXT: movdqa %xmm1, %xmm2
333 ; SSE41-NEXT: psraw $1, %xmm2
334 ; SSE41-NEXT: paddw %xmm0, %xmm0
335 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
336 ; SSE41-NEXT: psrlw $8, %xmm1
337 ; SSE41-NEXT: packuswb %xmm3, %xmm1
338 ; SSE41-NEXT: movdqa %xmm1, %xmm0
341 ; AVX: vpsllw $5, %xmm1, %xmm1
342 ; AVX-NEXT: vpunpckhbw {{.*#}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
343 ; AVX-NEXT: vpunpckhbw {{.*#}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
344 ; AVX-NEXT: vpsraw $4, %xmm3, %xmm4
345 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
346 ; AVX-NEXT: vpsraw $2, %xmm3, %xmm4
347 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
348 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
349 ; AVX-NEXT: vpsraw $1, %xmm3, %xmm4
350 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
351 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
352 ; AVX-NEXT: vpsrlw $8, %xmm2, %xmm2
353 ; AVX-NEXT: vpunpcklbw {{.*#}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
354 ; AVX-NEXT: vpunpcklbw {{.*#}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
355 ; AVX-NEXT: vpsraw $4, %xmm0, %xmm3
356 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
357 ; AVX-NEXT: vpsraw $2, %xmm0, %xmm3
358 ; AVX-NEXT: vpaddw %xmm1, %xmm1, %xmm1
359 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
360 ; AVX-NEXT: vpsraw $1, %xmm0, %xmm3
361 ; AVX-NEXT: vpaddw %xmm1, %xmm1, %xmm1
362 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
363 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm0
364 ; AVX-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
366 %ashr = ashr <16 x i8> %r, %a
367 %tmp2 = bitcast <16 x i8> %ashr to <2 x i64>
371 define <2 x i64> @lshr_8i16(<8 x i16> %r, <8 x i16> %a) nounwind readnone ssp {
375 ; SSE2: psllw $12, %xmm1
376 ; SSE2-NEXT: movdqa %xmm1, %xmm2
377 ; SSE2-NEXT: psraw $15, %xmm2
378 ; SSE2-NEXT: movdqa %xmm2, %xmm3
379 ; SSE2-NEXT: pandn %xmm0, %xmm3
380 ; SSE2-NEXT: psrlw $8, %xmm0
381 ; SSE2-NEXT: pand %xmm2, %xmm0
382 ; SSE2-NEXT: por %xmm3, %xmm0
383 ; SSE2-NEXT: paddw %xmm1, %xmm1
384 ; SSE2-NEXT: movdqa %xmm1, %xmm2
385 ; SSE2-NEXT: psraw $15, %xmm2
386 ; SSE2-NEXT: movdqa %xmm2, %xmm3
387 ; SSE2-NEXT: pandn %xmm0, %xmm3
388 ; SSE2-NEXT: psrlw $4, %xmm0
389 ; SSE2-NEXT: pand %xmm2, %xmm0
390 ; SSE2-NEXT: por %xmm3, %xmm0
391 ; SSE2-NEXT: paddw %xmm1, %xmm1
392 ; SSE2-NEXT: movdqa %xmm1, %xmm2
393 ; SSE2-NEXT: psraw $15, %xmm2
394 ; SSE2-NEXT: movdqa %xmm2, %xmm3
395 ; SSE2-NEXT: pandn %xmm0, %xmm3
396 ; SSE2-NEXT: psrlw $2, %xmm0
397 ; SSE2-NEXT: pand %xmm2, %xmm0
398 ; SSE2-NEXT: por %xmm3, %xmm0
399 ; SSE2-NEXT: paddw %xmm1, %xmm1
400 ; SSE2-NEXT: psraw $15, %xmm1
401 ; SSE2-NEXT: movdqa %xmm1, %xmm2
402 ; SSE2-NEXT: pandn %xmm0, %xmm2
403 ; SSE2-NEXT: psrlw $1, %xmm0
404 ; SSE2-NEXT: pand %xmm1, %xmm0
405 ; SSE2-NEXT: por %xmm2, %xmm0
408 ; SSE41: movdqa %xmm0, %xmm2
409 ; SSE41-NEXT: movdqa %xmm1, %xmm0
410 ; SSE41-NEXT: psllw $12, %xmm0
411 ; SSE41-NEXT: psllw $4, %xmm1
412 ; SSE41-NEXT: por %xmm0, %xmm1
413 ; SSE41-NEXT: movdqa %xmm1, %xmm3
414 ; SSE41-NEXT: paddw %xmm3, %xmm3
415 ; SSE41-NEXT: movdqa %xmm2, %xmm4
416 ; SSE41-NEXT: psrlw $8, %xmm4
417 ; SSE41-NEXT: movdqa %xmm1, %xmm0
418 ; SSE41-NEXT: pblendvb %xmm4, %xmm2
419 ; SSE41-NEXT: movdqa %xmm2, %xmm1
420 ; SSE41-NEXT: psrlw $4, %xmm1
421 ; SSE41-NEXT: movdqa %xmm3, %xmm0
422 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
423 ; SSE41-NEXT: movdqa %xmm2, %xmm1
424 ; SSE41-NEXT: psrlw $2, %xmm1
425 ; SSE41-NEXT: paddw %xmm3, %xmm3
426 ; SSE41-NEXT: movdqa %xmm3, %xmm0
427 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
428 ; SSE41-NEXT: movdqa %xmm2, %xmm1
429 ; SSE41-NEXT: psrlw $1, %xmm1
430 ; SSE41-NEXT: paddw %xmm3, %xmm3
431 ; SSE41-NEXT: movdqa %xmm3, %xmm0
432 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
433 ; SSE41-NEXT: movdqa %xmm2, %xmm0
436 ; AVX: vpsllw $12, %xmm1, %xmm2
437 ; AVX-NEXT: vpsllw $4, %xmm1, %xmm1
438 ; AVX-NEXT: vpor %xmm2, %xmm1, %xmm1
439 ; AVX-NEXT: vpaddw %xmm1, %xmm1, %xmm2
440 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm3
441 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
442 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm1
443 ; AVX-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
444 ; AVX-NEXT: vpsrlw $2, %xmm0, %xmm1
445 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
446 ; AVX-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
447 ; AVX-NEXT: vpsrlw $1, %xmm0, %xmm1
448 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
449 ; AVX-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
451 %lshr = lshr <8 x i16> %r, %a
452 %tmp2 = bitcast <8 x i16> %lshr to <2 x i64>
456 define <2 x i64> @lshr_16i8(<16 x i8> %r, <16 x i8> %a) nounwind readnone ssp {
460 ; SSE2: psllw $5, %xmm1
461 ; SSE2-NEXT: pxor %xmm2, %xmm2
462 ; SSE2-NEXT: pxor %xmm3, %xmm3
463 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm3
464 ; SSE2-NEXT: movdqa %xmm3, %xmm4
465 ; SSE2-NEXT: pandn %xmm0, %xmm4
466 ; SSE2-NEXT: psrlw $4, %xmm0
467 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
468 ; SSE2-NEXT: pand %xmm3, %xmm0
469 ; SSE2-NEXT: por %xmm4, %xmm0
470 ; SSE2-NEXT: paddb %xmm1, %xmm1
471 ; SSE2-NEXT: pxor %xmm3, %xmm3
472 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm3
473 ; SSE2-NEXT: movdqa %xmm3, %xmm4
474 ; SSE2-NEXT: pandn %xmm0, %xmm4
475 ; SSE2-NEXT: psrlw $2, %xmm0
476 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
477 ; SSE2-NEXT: pand %xmm3, %xmm0
478 ; SSE2-NEXT: por %xmm4, %xmm0
479 ; SSE2-NEXT: paddb %xmm1, %xmm1
480 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2
481 ; SSE2-NEXT: movdqa %xmm2, %xmm1
482 ; SSE2-NEXT: pandn %xmm0, %xmm1
483 ; SSE2-NEXT: psrlw $1, %xmm0
484 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
485 ; SSE2-NEXT: pand %xmm2, %xmm0
486 ; SSE2-NEXT: por %xmm1, %xmm0
489 ; SSE41: movdqa %xmm0, %xmm2
490 ; SSE41-NEXT: psllw $5, %xmm1
491 ; SSE41-NEXT: movdqa %xmm2, %xmm3
492 ; SSE41-NEXT: psrlw $4, %xmm3
493 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm3
494 ; SSE41-NEXT: movdqa %xmm1, %xmm0
495 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
496 ; SSE41-NEXT: movdqa %xmm2, %xmm3
497 ; SSE41-NEXT: psrlw $2, %xmm3
498 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm3
499 ; SSE41-NEXT: paddb %xmm1, %xmm1
500 ; SSE41-NEXT: movdqa %xmm1, %xmm0
501 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
502 ; SSE41-NEXT: movdqa %xmm2, %xmm3
503 ; SSE41-NEXT: psrlw $1, %xmm3
504 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm3
505 ; SSE41-NEXT: paddb %xmm1, %xmm1
506 ; SSE41-NEXT: movdqa %xmm1, %xmm0
507 ; SSE41-NEXT: pblendvb %xmm3, %xmm2
508 ; SSE41-NEXT: movdqa %xmm2, %xmm0
511 ; AVX: vpsllw $5, %xmm1, %xmm1
512 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm2
513 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
514 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
515 ; AVX-NEXT: vpsrlw $2, %xmm0, %xmm2
516 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
517 ; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1
518 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
519 ; AVX-NEXT: vpsrlw $1, %xmm0, %xmm2
520 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2
521 ; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1
522 ; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
524 %lshr = lshr <16 x i8> %r, %a
525 %tmp2 = bitcast <16 x i8> %lshr to <2 x i64>