1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
11 ; Just one 32-bit run to make sure we do reasonable things for i64 shifts.
12 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=X32-SSE --check-prefix=X32-SSE2
18 define <2 x i64> @var_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
19 ; SSE2-LABEL: var_shift_v2i64:
21 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
22 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
23 ; SSE2-NEXT: movdqa %xmm2, %xmm4
24 ; SSE2-NEXT: psrlq %xmm3, %xmm4
25 ; SSE2-NEXT: psrlq %xmm1, %xmm2
26 ; SSE2-NEXT: movsd {{.*#+}} xmm4 = xmm2[0],xmm4[1]
27 ; SSE2-NEXT: movdqa %xmm0, %xmm2
28 ; SSE2-NEXT: psrlq %xmm3, %xmm2
29 ; SSE2-NEXT: psrlq %xmm1, %xmm0
30 ; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
31 ; SSE2-NEXT: xorpd %xmm4, %xmm2
32 ; SSE2-NEXT: psubq %xmm4, %xmm2
33 ; SSE2-NEXT: movdqa %xmm2, %xmm0
36 ; SSE41-LABEL: var_shift_v2i64:
38 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
39 ; SSE41-NEXT: movdqa %xmm2, %xmm3
40 ; SSE41-NEXT: psrlq %xmm1, %xmm3
41 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
42 ; SSE41-NEXT: psrlq %xmm4, %xmm2
43 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
44 ; SSE41-NEXT: movdqa %xmm0, %xmm3
45 ; SSE41-NEXT: psrlq %xmm1, %xmm3
46 ; SSE41-NEXT: psrlq %xmm4, %xmm0
47 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
48 ; SSE41-NEXT: pxor %xmm2, %xmm0
49 ; SSE41-NEXT: psubq %xmm2, %xmm0
52 ; AVX1-LABEL: var_shift_v2i64:
54 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
55 ; AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm3
56 ; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
57 ; AVX1-NEXT: vpsrlq %xmm4, %xmm2, %xmm2
58 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
59 ; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm1
60 ; AVX1-NEXT: vpsrlq %xmm4, %xmm0, %xmm0
61 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
62 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
63 ; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0
66 ; AVX2-LABEL: var_shift_v2i64:
68 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
69 ; AVX2-NEXT: vpsrlvq %xmm1, %xmm2, %xmm3
70 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
71 ; AVX2-NEXT: vpsrlvq %xmm1, %xmm0, %xmm0
72 ; AVX2-NEXT: vpsubq %xmm3, %xmm0, %xmm0
75 ; XOP-LABEL: var_shift_v2i64:
77 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
78 ; XOP-NEXT: vpsubq %xmm1, %xmm2, %xmm1
79 ; XOP-NEXT: vpshaq %xmm1, %xmm0, %xmm0
82 ; AVX512-LABEL: var_shift_v2i64:
84 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
85 ; AVX512-NEXT: vpsrlvq %xmm1, %xmm2, %xmm3
86 ; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0
87 ; AVX512-NEXT: vpsrlvq %xmm1, %xmm0, %xmm0
88 ; AVX512-NEXT: vpsubq %xmm3, %xmm0, %xmm0
91 ; X32-SSE-LABEL: var_shift_v2i64:
93 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
94 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
95 ; X32-SSE-NEXT: movdqa %xmm2, %xmm4
96 ; X32-SSE-NEXT: psrlq %xmm3, %xmm4
97 ; X32-SSE-NEXT: psrlq %xmm1, %xmm2
98 ; X32-SSE-NEXT: movsd {{.*#+}} xmm4 = xmm2[0],xmm4[1]
99 ; X32-SSE-NEXT: movdqa %xmm0, %xmm2
100 ; X32-SSE-NEXT: psrlq %xmm3, %xmm2
101 ; X32-SSE-NEXT: psrlq %xmm1, %xmm0
102 ; X32-SSE-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
103 ; X32-SSE-NEXT: xorpd %xmm4, %xmm2
104 ; X32-SSE-NEXT: psubq %xmm4, %xmm2
105 ; X32-SSE-NEXT: movdqa %xmm2, %xmm0
107 %shift = ashr <2 x i64> %a, %b
111 define <4 x i32> @var_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
112 ; SSE2-LABEL: var_shift_v4i32:
114 ; SSE2-NEXT: movdqa %xmm1, %xmm2
115 ; SSE2-NEXT: psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
116 ; SSE2-NEXT: movdqa %xmm0, %xmm3
117 ; SSE2-NEXT: psrad %xmm2, %xmm3
118 ; SSE2-NEXT: movdqa %xmm1, %xmm2
119 ; SSE2-NEXT: psrlq $32, %xmm2
120 ; SSE2-NEXT: movdqa %xmm0, %xmm4
121 ; SSE2-NEXT: psrad %xmm2, %xmm4
122 ; SSE2-NEXT: movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1]
123 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3]
124 ; SSE2-NEXT: pxor %xmm3, %xmm3
125 ; SSE2-NEXT: movdqa %xmm1, %xmm4
126 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
127 ; SSE2-NEXT: movdqa %xmm0, %xmm5
128 ; SSE2-NEXT: psrad %xmm4, %xmm5
129 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
130 ; SSE2-NEXT: psrad %xmm1, %xmm0
131 ; SSE2-NEXT: movsd {{.*#+}} xmm5 = xmm0[0],xmm5[1]
132 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
133 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
136 ; SSE41-LABEL: var_shift_v4i32:
138 ; SSE41-NEXT: movdqa %xmm1, %xmm2
139 ; SSE41-NEXT: psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
140 ; SSE41-NEXT: movdqa %xmm0, %xmm3
141 ; SSE41-NEXT: psrad %xmm2, %xmm3
142 ; SSE41-NEXT: movdqa %xmm1, %xmm2
143 ; SSE41-NEXT: psrlq $32, %xmm2
144 ; SSE41-NEXT: movdqa %xmm0, %xmm4
145 ; SSE41-NEXT: psrad %xmm2, %xmm4
146 ; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm3[4,5,6,7]
147 ; SSE41-NEXT: pxor %xmm2, %xmm2
148 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero
149 ; SSE41-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
150 ; SSE41-NEXT: movdqa %xmm0, %xmm2
151 ; SSE41-NEXT: psrad %xmm1, %xmm2
152 ; SSE41-NEXT: psrad %xmm3, %xmm0
153 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
154 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3],xmm0[4,5],xmm4[6,7]
157 ; AVX1-LABEL: var_shift_v4i32:
159 ; AVX1-NEXT: vpsrldq {{.*#+}} xmm2 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
160 ; AVX1-NEXT: vpsrad %xmm2, %xmm0, %xmm2
161 ; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm3
162 ; AVX1-NEXT: vpsrad %xmm3, %xmm0, %xmm3
163 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
164 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
165 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
166 ; AVX1-NEXT: vpsrad %xmm3, %xmm0, %xmm3
167 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
168 ; AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0
169 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
170 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
173 ; AVX2-LABEL: var_shift_v4i32:
175 ; AVX2-NEXT: vpsravd %xmm1, %xmm0, %xmm0
178 ; XOPAVX1-LABEL: var_shift_v4i32:
180 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
181 ; XOPAVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm1
182 ; XOPAVX1-NEXT: vpshad %xmm1, %xmm0, %xmm0
185 ; XOPAVX2-LABEL: var_shift_v4i32:
187 ; XOPAVX2-NEXT: vpsravd %xmm1, %xmm0, %xmm0
190 ; AVX512-LABEL: var_shift_v4i32:
192 ; AVX512-NEXT: vpsravd %xmm1, %xmm0, %xmm0
195 ; X32-SSE-LABEL: var_shift_v4i32:
197 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
198 ; X32-SSE-NEXT: psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
199 ; X32-SSE-NEXT: movdqa %xmm0, %xmm3
200 ; X32-SSE-NEXT: psrad %xmm2, %xmm3
201 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
202 ; X32-SSE-NEXT: psrlq $32, %xmm2
203 ; X32-SSE-NEXT: movdqa %xmm0, %xmm4
204 ; X32-SSE-NEXT: psrad %xmm2, %xmm4
205 ; X32-SSE-NEXT: movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1]
206 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3]
207 ; X32-SSE-NEXT: pxor %xmm3, %xmm3
208 ; X32-SSE-NEXT: movdqa %xmm1, %xmm4
209 ; X32-SSE-NEXT: punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
210 ; X32-SSE-NEXT: movdqa %xmm0, %xmm5
211 ; X32-SSE-NEXT: psrad %xmm4, %xmm5
212 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
213 ; X32-SSE-NEXT: psrad %xmm1, %xmm0
214 ; X32-SSE-NEXT: movsd {{.*#+}} xmm5 = xmm0[0],xmm5[1]
215 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
216 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
218 %shift = ashr <4 x i32> %a, %b
222 define <8 x i16> @var_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
223 ; SSE2-LABEL: var_shift_v8i16:
225 ; SSE2-NEXT: psllw $12, %xmm1
226 ; SSE2-NEXT: movdqa %xmm1, %xmm2
227 ; SSE2-NEXT: psraw $15, %xmm2
228 ; SSE2-NEXT: movdqa %xmm2, %xmm3
229 ; SSE2-NEXT: pandn %xmm0, %xmm3
230 ; SSE2-NEXT: psraw $8, %xmm0
231 ; SSE2-NEXT: pand %xmm2, %xmm0
232 ; SSE2-NEXT: por %xmm3, %xmm0
233 ; SSE2-NEXT: paddw %xmm1, %xmm1
234 ; SSE2-NEXT: movdqa %xmm1, %xmm2
235 ; SSE2-NEXT: psraw $15, %xmm2
236 ; SSE2-NEXT: movdqa %xmm2, %xmm3
237 ; SSE2-NEXT: pandn %xmm0, %xmm3
238 ; SSE2-NEXT: psraw $4, %xmm0
239 ; SSE2-NEXT: pand %xmm2, %xmm0
240 ; SSE2-NEXT: por %xmm3, %xmm0
241 ; SSE2-NEXT: paddw %xmm1, %xmm1
242 ; SSE2-NEXT: movdqa %xmm1, %xmm2
243 ; SSE2-NEXT: psraw $15, %xmm2
244 ; SSE2-NEXT: movdqa %xmm2, %xmm3
245 ; SSE2-NEXT: pandn %xmm0, %xmm3
246 ; SSE2-NEXT: psraw $2, %xmm0
247 ; SSE2-NEXT: pand %xmm2, %xmm0
248 ; SSE2-NEXT: por %xmm3, %xmm0
249 ; SSE2-NEXT: paddw %xmm1, %xmm1
250 ; SSE2-NEXT: psraw $15, %xmm1
251 ; SSE2-NEXT: movdqa %xmm1, %xmm2
252 ; SSE2-NEXT: pandn %xmm0, %xmm2
253 ; SSE2-NEXT: psraw $1, %xmm0
254 ; SSE2-NEXT: pand %xmm1, %xmm0
255 ; SSE2-NEXT: por %xmm2, %xmm0
258 ; SSE41-LABEL: var_shift_v8i16:
260 ; SSE41-NEXT: movdqa %xmm0, %xmm2
261 ; SSE41-NEXT: movdqa %xmm1, %xmm0
262 ; SSE41-NEXT: psllw $12, %xmm0
263 ; SSE41-NEXT: psllw $4, %xmm1
264 ; SSE41-NEXT: por %xmm0, %xmm1
265 ; SSE41-NEXT: movdqa %xmm1, %xmm3
266 ; SSE41-NEXT: paddw %xmm3, %xmm3
267 ; SSE41-NEXT: movdqa %xmm2, %xmm4
268 ; SSE41-NEXT: psraw $8, %xmm4
269 ; SSE41-NEXT: movdqa %xmm1, %xmm0
270 ; SSE41-NEXT: pblendvb %xmm4, %xmm2
271 ; SSE41-NEXT: movdqa %xmm2, %xmm1
272 ; SSE41-NEXT: psraw $4, %xmm1
273 ; SSE41-NEXT: movdqa %xmm3, %xmm0
274 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
275 ; SSE41-NEXT: movdqa %xmm2, %xmm1
276 ; SSE41-NEXT: psraw $2, %xmm1
277 ; SSE41-NEXT: paddw %xmm3, %xmm3
278 ; SSE41-NEXT: movdqa %xmm3, %xmm0
279 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
280 ; SSE41-NEXT: movdqa %xmm2, %xmm1
281 ; SSE41-NEXT: psraw $1, %xmm1
282 ; SSE41-NEXT: paddw %xmm3, %xmm3
283 ; SSE41-NEXT: movdqa %xmm3, %xmm0
284 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
285 ; SSE41-NEXT: movdqa %xmm2, %xmm0
288 ; AVX1-LABEL: var_shift_v8i16:
290 ; AVX1-NEXT: vpsllw $12, %xmm1, %xmm2
291 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1
292 ; AVX1-NEXT: vpor %xmm2, %xmm1, %xmm1
293 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm2
294 ; AVX1-NEXT: vpsraw $8, %xmm0, %xmm3
295 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
296 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm1
297 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
298 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1
299 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2
300 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
301 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1
302 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2
303 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
306 ; AVX2-LABEL: var_shift_v8i16:
308 ; 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
309 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
310 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0
311 ; 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
312 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
313 ; AVX2-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
314 ; AVX2-NEXT: vzeroupper
317 ; XOP-LABEL: var_shift_v8i16:
319 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
320 ; XOP-NEXT: vpsubw %xmm1, %xmm2, %xmm1
321 ; XOP-NEXT: vpshaw %xmm1, %xmm0, %xmm0
324 ; AVX512-LABEL: var_shift_v8i16:
326 ; AVX512-NEXT: # kill: %XMM1<def> %XMM1<kill> %ZMM1<def>
327 ; AVX512-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
328 ; AVX512-NEXT: vpsravw %zmm1, %zmm0, %zmm0
329 ; AVX512-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
332 ; X32-SSE-LABEL: var_shift_v8i16:
334 ; X32-SSE-NEXT: psllw $12, %xmm1
335 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
336 ; X32-SSE-NEXT: psraw $15, %xmm2
337 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3
338 ; X32-SSE-NEXT: pandn %xmm0, %xmm3
339 ; X32-SSE-NEXT: psraw $8, %xmm0
340 ; X32-SSE-NEXT: pand %xmm2, %xmm0
341 ; X32-SSE-NEXT: por %xmm3, %xmm0
342 ; X32-SSE-NEXT: paddw %xmm1, %xmm1
343 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
344 ; X32-SSE-NEXT: psraw $15, %xmm2
345 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3
346 ; X32-SSE-NEXT: pandn %xmm0, %xmm3
347 ; X32-SSE-NEXT: psraw $4, %xmm0
348 ; X32-SSE-NEXT: pand %xmm2, %xmm0
349 ; X32-SSE-NEXT: por %xmm3, %xmm0
350 ; X32-SSE-NEXT: paddw %xmm1, %xmm1
351 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
352 ; X32-SSE-NEXT: psraw $15, %xmm2
353 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3
354 ; X32-SSE-NEXT: pandn %xmm0, %xmm3
355 ; X32-SSE-NEXT: psraw $2, %xmm0
356 ; X32-SSE-NEXT: pand %xmm2, %xmm0
357 ; X32-SSE-NEXT: por %xmm3, %xmm0
358 ; X32-SSE-NEXT: paddw %xmm1, %xmm1
359 ; X32-SSE-NEXT: psraw $15, %xmm1
360 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
361 ; X32-SSE-NEXT: pandn %xmm0, %xmm2
362 ; X32-SSE-NEXT: psraw $1, %xmm0
363 ; X32-SSE-NEXT: pand %xmm1, %xmm0
364 ; X32-SSE-NEXT: por %xmm2, %xmm0
366 %shift = ashr <8 x i16> %a, %b
370 define <16 x i8> @var_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
371 ; SSE2-LABEL: var_shift_v16i8:
373 ; SSE2-NEXT: 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]
374 ; SSE2-NEXT: psllw $5, %xmm1
375 ; 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]
376 ; SSE2-NEXT: pxor %xmm3, %xmm3
377 ; SSE2-NEXT: pxor %xmm5, %xmm5
378 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
379 ; SSE2-NEXT: movdqa %xmm5, %xmm6
380 ; SSE2-NEXT: pandn %xmm2, %xmm6
381 ; SSE2-NEXT: psraw $4, %xmm2
382 ; SSE2-NEXT: pand %xmm5, %xmm2
383 ; SSE2-NEXT: por %xmm6, %xmm2
384 ; SSE2-NEXT: paddw %xmm4, %xmm4
385 ; SSE2-NEXT: pxor %xmm5, %xmm5
386 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
387 ; SSE2-NEXT: movdqa %xmm5, %xmm6
388 ; SSE2-NEXT: pandn %xmm2, %xmm6
389 ; SSE2-NEXT: psraw $2, %xmm2
390 ; SSE2-NEXT: pand %xmm5, %xmm2
391 ; SSE2-NEXT: por %xmm6, %xmm2
392 ; SSE2-NEXT: paddw %xmm4, %xmm4
393 ; SSE2-NEXT: pxor %xmm5, %xmm5
394 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
395 ; SSE2-NEXT: movdqa %xmm5, %xmm4
396 ; SSE2-NEXT: pandn %xmm2, %xmm4
397 ; SSE2-NEXT: psraw $1, %xmm2
398 ; SSE2-NEXT: pand %xmm5, %xmm2
399 ; SSE2-NEXT: por %xmm4, %xmm2
400 ; SSE2-NEXT: psrlw $8, %xmm2
401 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
402 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
403 ; SSE2-NEXT: pxor %xmm4, %xmm4
404 ; SSE2-NEXT: pcmpgtw %xmm1, %xmm4
405 ; SSE2-NEXT: movdqa %xmm4, %xmm5
406 ; SSE2-NEXT: pandn %xmm0, %xmm5
407 ; SSE2-NEXT: psraw $4, %xmm0
408 ; SSE2-NEXT: pand %xmm4, %xmm0
409 ; SSE2-NEXT: por %xmm5, %xmm0
410 ; SSE2-NEXT: paddw %xmm1, %xmm1
411 ; SSE2-NEXT: pxor %xmm4, %xmm4
412 ; SSE2-NEXT: pcmpgtw %xmm1, %xmm4
413 ; SSE2-NEXT: movdqa %xmm4, %xmm5
414 ; SSE2-NEXT: pandn %xmm0, %xmm5
415 ; SSE2-NEXT: psraw $2, %xmm0
416 ; SSE2-NEXT: pand %xmm4, %xmm0
417 ; SSE2-NEXT: por %xmm5, %xmm0
418 ; SSE2-NEXT: paddw %xmm1, %xmm1
419 ; SSE2-NEXT: pcmpgtw %xmm1, %xmm3
420 ; SSE2-NEXT: movdqa %xmm3, %xmm1
421 ; SSE2-NEXT: pandn %xmm0, %xmm1
422 ; SSE2-NEXT: psraw $1, %xmm0
423 ; SSE2-NEXT: pand %xmm3, %xmm0
424 ; SSE2-NEXT: por %xmm1, %xmm0
425 ; SSE2-NEXT: psrlw $8, %xmm0
426 ; SSE2-NEXT: packuswb %xmm2, %xmm0
429 ; SSE41-LABEL: var_shift_v16i8:
431 ; SSE41-NEXT: movdqa %xmm0, %xmm2
432 ; SSE41-NEXT: psllw $5, %xmm1
433 ; 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]
434 ; 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]
435 ; SSE41-NEXT: movdqa %xmm3, %xmm4
436 ; SSE41-NEXT: psraw $4, %xmm4
437 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
438 ; SSE41-NEXT: movdqa %xmm3, %xmm4
439 ; SSE41-NEXT: psraw $2, %xmm4
440 ; SSE41-NEXT: paddw %xmm0, %xmm0
441 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
442 ; SSE41-NEXT: movdqa %xmm3, %xmm4
443 ; SSE41-NEXT: psraw $1, %xmm4
444 ; SSE41-NEXT: paddw %xmm0, %xmm0
445 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
446 ; SSE41-NEXT: psrlw $8, %xmm3
447 ; 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]
448 ; 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]
449 ; SSE41-NEXT: movdqa %xmm1, %xmm2
450 ; SSE41-NEXT: psraw $4, %xmm2
451 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
452 ; SSE41-NEXT: movdqa %xmm1, %xmm2
453 ; SSE41-NEXT: psraw $2, %xmm2
454 ; SSE41-NEXT: paddw %xmm0, %xmm0
455 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
456 ; SSE41-NEXT: movdqa %xmm1, %xmm2
457 ; SSE41-NEXT: psraw $1, %xmm2
458 ; SSE41-NEXT: paddw %xmm0, %xmm0
459 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
460 ; SSE41-NEXT: psrlw $8, %xmm1
461 ; SSE41-NEXT: packuswb %xmm3, %xmm1
462 ; SSE41-NEXT: movdqa %xmm1, %xmm0
465 ; AVX-LABEL: var_shift_v16i8:
467 ; AVX-NEXT: vpsllw $5, %xmm1, %xmm1
468 ; 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]
469 ; AVX-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
470 ; AVX-NEXT: vpsraw $4, %xmm3, %xmm4
471 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
472 ; AVX-NEXT: vpsraw $2, %xmm3, %xmm4
473 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
474 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
475 ; AVX-NEXT: vpsraw $1, %xmm3, %xmm4
476 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
477 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
478 ; AVX-NEXT: vpsrlw $8, %xmm2, %xmm2
479 ; 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]
480 ; AVX-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
481 ; AVX-NEXT: vpsraw $4, %xmm0, %xmm3
482 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
483 ; AVX-NEXT: vpsraw $2, %xmm0, %xmm3
484 ; AVX-NEXT: vpaddw %xmm1, %xmm1, %xmm1
485 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
486 ; AVX-NEXT: vpsraw $1, %xmm0, %xmm3
487 ; AVX-NEXT: vpaddw %xmm1, %xmm1, %xmm1
488 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
489 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm0
490 ; AVX-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
493 ; XOP-LABEL: var_shift_v16i8:
495 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
496 ; XOP-NEXT: vpsubb %xmm1, %xmm2, %xmm1
497 ; XOP-NEXT: vpshab %xmm1, %xmm0, %xmm0
500 ; AVX512-LABEL: var_shift_v16i8:
502 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
503 ; AVX512-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]
504 ; AVX512-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
505 ; AVX512-NEXT: vpsraw $4, %xmm3, %xmm4
506 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
507 ; AVX512-NEXT: vpsraw $2, %xmm3, %xmm4
508 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
509 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
510 ; AVX512-NEXT: vpsraw $1, %xmm3, %xmm4
511 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
512 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
513 ; AVX512-NEXT: vpsrlw $8, %xmm2, %xmm2
514 ; AVX512-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]
515 ; AVX512-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
516 ; AVX512-NEXT: vpsraw $4, %xmm0, %xmm3
517 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
518 ; AVX512-NEXT: vpsraw $2, %xmm0, %xmm3
519 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
520 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
521 ; AVX512-NEXT: vpsraw $1, %xmm0, %xmm3
522 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
523 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
524 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm0
525 ; AVX512-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
528 ; X32-SSE-LABEL: var_shift_v16i8:
530 ; X32-SSE-NEXT: 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]
531 ; X32-SSE-NEXT: psllw $5, %xmm1
532 ; X32-SSE-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]
533 ; X32-SSE-NEXT: pxor %xmm3, %xmm3
534 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
535 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
536 ; X32-SSE-NEXT: movdqa %xmm5, %xmm6
537 ; X32-SSE-NEXT: pandn %xmm2, %xmm6
538 ; X32-SSE-NEXT: psraw $4, %xmm2
539 ; X32-SSE-NEXT: pand %xmm5, %xmm2
540 ; X32-SSE-NEXT: por %xmm6, %xmm2
541 ; X32-SSE-NEXT: paddw %xmm4, %xmm4
542 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
543 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
544 ; X32-SSE-NEXT: movdqa %xmm5, %xmm6
545 ; X32-SSE-NEXT: pandn %xmm2, %xmm6
546 ; X32-SSE-NEXT: psraw $2, %xmm2
547 ; X32-SSE-NEXT: pand %xmm5, %xmm2
548 ; X32-SSE-NEXT: por %xmm6, %xmm2
549 ; X32-SSE-NEXT: paddw %xmm4, %xmm4
550 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
551 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
552 ; X32-SSE-NEXT: movdqa %xmm5, %xmm4
553 ; X32-SSE-NEXT: pandn %xmm2, %xmm4
554 ; X32-SSE-NEXT: psraw $1, %xmm2
555 ; X32-SSE-NEXT: pand %xmm5, %xmm2
556 ; X32-SSE-NEXT: por %xmm4, %xmm2
557 ; X32-SSE-NEXT: psrlw $8, %xmm2
558 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
559 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
560 ; X32-SSE-NEXT: pxor %xmm4, %xmm4
561 ; X32-SSE-NEXT: pcmpgtw %xmm1, %xmm4
562 ; X32-SSE-NEXT: movdqa %xmm4, %xmm5
563 ; X32-SSE-NEXT: pandn %xmm0, %xmm5
564 ; X32-SSE-NEXT: psraw $4, %xmm0
565 ; X32-SSE-NEXT: pand %xmm4, %xmm0
566 ; X32-SSE-NEXT: por %xmm5, %xmm0
567 ; X32-SSE-NEXT: paddw %xmm1, %xmm1
568 ; X32-SSE-NEXT: pxor %xmm4, %xmm4
569 ; X32-SSE-NEXT: pcmpgtw %xmm1, %xmm4
570 ; X32-SSE-NEXT: movdqa %xmm4, %xmm5
571 ; X32-SSE-NEXT: pandn %xmm0, %xmm5
572 ; X32-SSE-NEXT: psraw $2, %xmm0
573 ; X32-SSE-NEXT: pand %xmm4, %xmm0
574 ; X32-SSE-NEXT: por %xmm5, %xmm0
575 ; X32-SSE-NEXT: paddw %xmm1, %xmm1
576 ; X32-SSE-NEXT: pcmpgtw %xmm1, %xmm3
577 ; X32-SSE-NEXT: movdqa %xmm3, %xmm1
578 ; X32-SSE-NEXT: pandn %xmm0, %xmm1
579 ; X32-SSE-NEXT: psraw $1, %xmm0
580 ; X32-SSE-NEXT: pand %xmm3, %xmm0
581 ; X32-SSE-NEXT: por %xmm1, %xmm0
582 ; X32-SSE-NEXT: psrlw $8, %xmm0
583 ; X32-SSE-NEXT: packuswb %xmm2, %xmm0
585 %shift = ashr <16 x i8> %a, %b
590 ; Uniform Variable Shifts
593 define <2 x i64> @splatvar_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
594 ; SSE-LABEL: splatvar_shift_v2i64:
596 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
597 ; SSE-NEXT: psrlq %xmm1, %xmm2
598 ; SSE-NEXT: psrlq %xmm1, %xmm0
599 ; SSE-NEXT: pxor %xmm2, %xmm0
600 ; SSE-NEXT: psubq %xmm2, %xmm0
603 ; AVX-LABEL: splatvar_shift_v2i64:
605 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
606 ; AVX-NEXT: vpsrlq %xmm1, %xmm2, %xmm2
607 ; AVX-NEXT: vpsrlq %xmm1, %xmm0, %xmm0
608 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
609 ; AVX-NEXT: vpsubq %xmm2, %xmm0, %xmm0
612 ; XOPAVX1-LABEL: splatvar_shift_v2i64:
614 ; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
615 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
616 ; XOPAVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1
617 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0
620 ; XOPAVX2-LABEL: splatvar_shift_v2i64:
622 ; XOPAVX2-NEXT: vpbroadcastq %xmm1, %xmm1
623 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
624 ; XOPAVX2-NEXT: vpsubq %xmm1, %xmm2, %xmm1
625 ; XOPAVX2-NEXT: vpshaq %xmm1, %xmm0, %xmm0
628 ; AVX512-LABEL: splatvar_shift_v2i64:
630 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
631 ; AVX512-NEXT: vpsrlq %xmm1, %xmm2, %xmm2
632 ; AVX512-NEXT: vpsrlq %xmm1, %xmm0, %xmm0
633 ; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0
634 ; AVX512-NEXT: vpsubq %xmm2, %xmm0, %xmm0
637 ; X32-SSE-LABEL: splatvar_shift_v2i64:
639 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
640 ; X32-SSE-NEXT: psrlq %xmm1, %xmm2
641 ; X32-SSE-NEXT: psrlq %xmm1, %xmm0
642 ; X32-SSE-NEXT: pxor %xmm2, %xmm0
643 ; X32-SSE-NEXT: psubq %xmm2, %xmm0
645 %splat = shufflevector <2 x i64> %b, <2 x i64> undef, <2 x i32> zeroinitializer
646 %shift = ashr <2 x i64> %a, %splat
650 define <4 x i32> @splatvar_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
651 ; SSE2-LABEL: splatvar_shift_v4i32:
653 ; SSE2-NEXT: xorps %xmm2, %xmm2
654 ; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
655 ; SSE2-NEXT: psrad %xmm2, %xmm0
658 ; SSE41-LABEL: splatvar_shift_v4i32:
660 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
661 ; SSE41-NEXT: psrad %xmm1, %xmm0
664 ; AVX-LABEL: splatvar_shift_v4i32:
666 ; AVX-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
667 ; AVX-NEXT: vpsrad %xmm1, %xmm0, %xmm0
670 ; XOP-LABEL: splatvar_shift_v4i32:
672 ; XOP-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
673 ; XOP-NEXT: vpsrad %xmm1, %xmm0, %xmm0
676 ; AVX512-LABEL: splatvar_shift_v4i32:
678 ; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
679 ; AVX512-NEXT: vpsrad %xmm1, %xmm0, %xmm0
682 ; X32-SSE-LABEL: splatvar_shift_v4i32:
684 ; X32-SSE-NEXT: xorps %xmm2, %xmm2
685 ; X32-SSE-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
686 ; X32-SSE-NEXT: psrad %xmm2, %xmm0
688 %splat = shufflevector <4 x i32> %b, <4 x i32> undef, <4 x i32> zeroinitializer
689 %shift = ashr <4 x i32> %a, %splat
693 define <8 x i16> @splatvar_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
694 ; SSE2-LABEL: splatvar_shift_v8i16:
696 ; SSE2-NEXT: pextrw $0, %xmm1, %eax
697 ; SSE2-NEXT: movd %eax, %xmm1
698 ; SSE2-NEXT: psraw %xmm1, %xmm0
701 ; SSE41-LABEL: splatvar_shift_v8i16:
703 ; SSE41-NEXT: pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
704 ; SSE41-NEXT: psraw %xmm1, %xmm0
707 ; AVX-LABEL: splatvar_shift_v8i16:
709 ; AVX-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
710 ; AVX-NEXT: vpsraw %xmm1, %xmm0, %xmm0
713 ; XOP-LABEL: splatvar_shift_v8i16:
715 ; XOP-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
716 ; XOP-NEXT: vpsraw %xmm1, %xmm0, %xmm0
719 ; AVX512-LABEL: splatvar_shift_v8i16:
721 ; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
722 ; AVX512-NEXT: vpsraw %xmm1, %xmm0, %xmm0
725 ; X32-SSE-LABEL: splatvar_shift_v8i16:
727 ; X32-SSE-NEXT: pextrw $0, %xmm1, %eax
728 ; X32-SSE-NEXT: movd %eax, %xmm1
729 ; X32-SSE-NEXT: psraw %xmm1, %xmm0
731 %splat = shufflevector <8 x i16> %b, <8 x i16> undef, <8 x i32> zeroinitializer
732 %shift = ashr <8 x i16> %a, %splat
736 define <16 x i8> @splatvar_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
737 ; SSE2-LABEL: splatvar_shift_v16i8:
739 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
740 ; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
741 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,1,1]
742 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
743 ; SSE2-NEXT: psllw $5, %xmm3
744 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm3[8],xmm4[9],xmm3[9],xmm4[10],xmm3[10],xmm4[11],xmm3[11],xmm4[12],xmm3[12],xmm4[13],xmm3[13],xmm4[14],xmm3[14],xmm4[15],xmm3[15]
745 ; SSE2-NEXT: pxor %xmm2, %xmm2
746 ; SSE2-NEXT: pxor %xmm5, %xmm5
747 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
748 ; SSE2-NEXT: movdqa %xmm5, %xmm6
749 ; SSE2-NEXT: pandn %xmm1, %xmm6
750 ; SSE2-NEXT: psraw $4, %xmm1
751 ; SSE2-NEXT: pand %xmm5, %xmm1
752 ; SSE2-NEXT: por %xmm6, %xmm1
753 ; SSE2-NEXT: paddw %xmm4, %xmm4
754 ; SSE2-NEXT: pxor %xmm5, %xmm5
755 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
756 ; SSE2-NEXT: movdqa %xmm5, %xmm6
757 ; SSE2-NEXT: pandn %xmm1, %xmm6
758 ; SSE2-NEXT: psraw $2, %xmm1
759 ; SSE2-NEXT: pand %xmm5, %xmm1
760 ; SSE2-NEXT: por %xmm6, %xmm1
761 ; SSE2-NEXT: paddw %xmm4, %xmm4
762 ; SSE2-NEXT: pxor %xmm5, %xmm5
763 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
764 ; SSE2-NEXT: movdqa %xmm5, %xmm4
765 ; SSE2-NEXT: pandn %xmm1, %xmm4
766 ; SSE2-NEXT: psraw $1, %xmm1
767 ; SSE2-NEXT: pand %xmm5, %xmm1
768 ; SSE2-NEXT: por %xmm4, %xmm1
769 ; SSE2-NEXT: psrlw $8, %xmm1
770 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
771 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
772 ; SSE2-NEXT: pxor %xmm4, %xmm4
773 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm4
774 ; SSE2-NEXT: movdqa %xmm4, %xmm5
775 ; SSE2-NEXT: pandn %xmm0, %xmm5
776 ; SSE2-NEXT: psraw $4, %xmm0
777 ; SSE2-NEXT: pand %xmm4, %xmm0
778 ; SSE2-NEXT: por %xmm5, %xmm0
779 ; SSE2-NEXT: paddw %xmm3, %xmm3
780 ; SSE2-NEXT: pxor %xmm4, %xmm4
781 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm4
782 ; SSE2-NEXT: movdqa %xmm4, %xmm5
783 ; SSE2-NEXT: pandn %xmm0, %xmm5
784 ; SSE2-NEXT: psraw $2, %xmm0
785 ; SSE2-NEXT: pand %xmm4, %xmm0
786 ; SSE2-NEXT: por %xmm5, %xmm0
787 ; SSE2-NEXT: paddw %xmm3, %xmm3
788 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm2
789 ; SSE2-NEXT: movdqa %xmm2, %xmm3
790 ; SSE2-NEXT: pandn %xmm0, %xmm3
791 ; SSE2-NEXT: psraw $1, %xmm0
792 ; SSE2-NEXT: pand %xmm2, %xmm0
793 ; SSE2-NEXT: por %xmm3, %xmm0
794 ; SSE2-NEXT: psrlw $8, %xmm0
795 ; SSE2-NEXT: packuswb %xmm1, %xmm0
798 ; SSE41-LABEL: splatvar_shift_v16i8:
800 ; SSE41-NEXT: movdqa %xmm0, %xmm2
801 ; SSE41-NEXT: pxor %xmm0, %xmm0
802 ; SSE41-NEXT: pshufb %xmm0, %xmm1
803 ; SSE41-NEXT: psllw $5, %xmm1
804 ; 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]
805 ; 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]
806 ; SSE41-NEXT: movdqa %xmm3, %xmm4
807 ; SSE41-NEXT: psraw $4, %xmm4
808 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
809 ; SSE41-NEXT: movdqa %xmm3, %xmm4
810 ; SSE41-NEXT: psraw $2, %xmm4
811 ; SSE41-NEXT: paddw %xmm0, %xmm0
812 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
813 ; SSE41-NEXT: movdqa %xmm3, %xmm4
814 ; SSE41-NEXT: psraw $1, %xmm4
815 ; SSE41-NEXT: paddw %xmm0, %xmm0
816 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
817 ; SSE41-NEXT: psrlw $8, %xmm3
818 ; 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]
819 ; 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]
820 ; SSE41-NEXT: movdqa %xmm1, %xmm2
821 ; SSE41-NEXT: psraw $4, %xmm2
822 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
823 ; SSE41-NEXT: movdqa %xmm1, %xmm2
824 ; SSE41-NEXT: psraw $2, %xmm2
825 ; SSE41-NEXT: paddw %xmm0, %xmm0
826 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
827 ; SSE41-NEXT: movdqa %xmm1, %xmm2
828 ; SSE41-NEXT: psraw $1, %xmm2
829 ; SSE41-NEXT: paddw %xmm0, %xmm0
830 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
831 ; SSE41-NEXT: psrlw $8, %xmm1
832 ; SSE41-NEXT: packuswb %xmm3, %xmm1
833 ; SSE41-NEXT: movdqa %xmm1, %xmm0
836 ; AVX1-LABEL: splatvar_shift_v16i8:
838 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
839 ; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
840 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
841 ; AVX1-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]
842 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
843 ; AVX1-NEXT: vpsraw $4, %xmm3, %xmm4
844 ; AVX1-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
845 ; AVX1-NEXT: vpsraw $2, %xmm3, %xmm4
846 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2
847 ; AVX1-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
848 ; AVX1-NEXT: vpsraw $1, %xmm3, %xmm4
849 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2
850 ; AVX1-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
851 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
852 ; AVX1-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]
853 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
854 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm3
855 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
856 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm3
857 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1
858 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
859 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm3
860 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1
861 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
862 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0
863 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
866 ; AVX2-LABEL: splatvar_shift_v16i8:
868 ; AVX2-NEXT: vpbroadcastb %xmm1, %xmm1
869 ; AVX2-NEXT: vpsllw $5, %xmm1, %xmm1
870 ; AVX2-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]
871 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
872 ; AVX2-NEXT: vpsraw $4, %xmm3, %xmm4
873 ; AVX2-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
874 ; AVX2-NEXT: vpsraw $2, %xmm3, %xmm4
875 ; AVX2-NEXT: vpaddw %xmm2, %xmm2, %xmm2
876 ; AVX2-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
877 ; AVX2-NEXT: vpsraw $1, %xmm3, %xmm4
878 ; AVX2-NEXT: vpaddw %xmm2, %xmm2, %xmm2
879 ; AVX2-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
880 ; AVX2-NEXT: vpsrlw $8, %xmm2, %xmm2
881 ; AVX2-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]
882 ; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
883 ; AVX2-NEXT: vpsraw $4, %xmm0, %xmm3
884 ; AVX2-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
885 ; AVX2-NEXT: vpsraw $2, %xmm0, %xmm3
886 ; AVX2-NEXT: vpaddw %xmm1, %xmm1, %xmm1
887 ; AVX2-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
888 ; AVX2-NEXT: vpsraw $1, %xmm0, %xmm3
889 ; AVX2-NEXT: vpaddw %xmm1, %xmm1, %xmm1
890 ; AVX2-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
891 ; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm0
892 ; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
895 ; XOPAVX1-LABEL: splatvar_shift_v16i8:
897 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
898 ; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
899 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1
900 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0
903 ; XOPAVX2-LABEL: splatvar_shift_v16i8:
905 ; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm1
906 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
907 ; XOPAVX2-NEXT: vpsubb %xmm1, %xmm2, %xmm1
908 ; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0
911 ; AVX512-LABEL: splatvar_shift_v16i8:
913 ; AVX512-NEXT: vpbroadcastb %xmm1, %xmm1
914 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
915 ; AVX512-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]
916 ; AVX512-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
917 ; AVX512-NEXT: vpsraw $4, %xmm3, %xmm4
918 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
919 ; AVX512-NEXT: vpsraw $2, %xmm3, %xmm4
920 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
921 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
922 ; AVX512-NEXT: vpsraw $1, %xmm3, %xmm4
923 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
924 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
925 ; AVX512-NEXT: vpsrlw $8, %xmm2, %xmm2
926 ; AVX512-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]
927 ; AVX512-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
928 ; AVX512-NEXT: vpsraw $4, %xmm0, %xmm3
929 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
930 ; AVX512-NEXT: vpsraw $2, %xmm0, %xmm3
931 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
932 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
933 ; AVX512-NEXT: vpsraw $1, %xmm0, %xmm3
934 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
935 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
936 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm0
937 ; AVX512-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
940 ; X32-SSE-LABEL: splatvar_shift_v16i8:
942 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
943 ; X32-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
944 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,1,1]
945 ; X32-SSE-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
946 ; X32-SSE-NEXT: psllw $5, %xmm3
947 ; X32-SSE-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm3[8],xmm4[9],xmm3[9],xmm4[10],xmm3[10],xmm4[11],xmm3[11],xmm4[12],xmm3[12],xmm4[13],xmm3[13],xmm4[14],xmm3[14],xmm4[15],xmm3[15]
948 ; X32-SSE-NEXT: pxor %xmm2, %xmm2
949 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
950 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
951 ; X32-SSE-NEXT: movdqa %xmm5, %xmm6
952 ; X32-SSE-NEXT: pandn %xmm1, %xmm6
953 ; X32-SSE-NEXT: psraw $4, %xmm1
954 ; X32-SSE-NEXT: pand %xmm5, %xmm1
955 ; X32-SSE-NEXT: por %xmm6, %xmm1
956 ; X32-SSE-NEXT: paddw %xmm4, %xmm4
957 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
958 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
959 ; X32-SSE-NEXT: movdqa %xmm5, %xmm6
960 ; X32-SSE-NEXT: pandn %xmm1, %xmm6
961 ; X32-SSE-NEXT: psraw $2, %xmm1
962 ; X32-SSE-NEXT: pand %xmm5, %xmm1
963 ; X32-SSE-NEXT: por %xmm6, %xmm1
964 ; X32-SSE-NEXT: paddw %xmm4, %xmm4
965 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
966 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
967 ; X32-SSE-NEXT: movdqa %xmm5, %xmm4
968 ; X32-SSE-NEXT: pandn %xmm1, %xmm4
969 ; X32-SSE-NEXT: psraw $1, %xmm1
970 ; X32-SSE-NEXT: pand %xmm5, %xmm1
971 ; X32-SSE-NEXT: por %xmm4, %xmm1
972 ; X32-SSE-NEXT: psrlw $8, %xmm1
973 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
974 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
975 ; X32-SSE-NEXT: pxor %xmm4, %xmm4
976 ; X32-SSE-NEXT: pcmpgtw %xmm3, %xmm4
977 ; X32-SSE-NEXT: movdqa %xmm4, %xmm5
978 ; X32-SSE-NEXT: pandn %xmm0, %xmm5
979 ; X32-SSE-NEXT: psraw $4, %xmm0
980 ; X32-SSE-NEXT: pand %xmm4, %xmm0
981 ; X32-SSE-NEXT: por %xmm5, %xmm0
982 ; X32-SSE-NEXT: paddw %xmm3, %xmm3
983 ; X32-SSE-NEXT: pxor %xmm4, %xmm4
984 ; X32-SSE-NEXT: pcmpgtw %xmm3, %xmm4
985 ; X32-SSE-NEXT: movdqa %xmm4, %xmm5
986 ; X32-SSE-NEXT: pandn %xmm0, %xmm5
987 ; X32-SSE-NEXT: psraw $2, %xmm0
988 ; X32-SSE-NEXT: pand %xmm4, %xmm0
989 ; X32-SSE-NEXT: por %xmm5, %xmm0
990 ; X32-SSE-NEXT: paddw %xmm3, %xmm3
991 ; X32-SSE-NEXT: pcmpgtw %xmm3, %xmm2
992 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3
993 ; X32-SSE-NEXT: pandn %xmm0, %xmm3
994 ; X32-SSE-NEXT: psraw $1, %xmm0
995 ; X32-SSE-NEXT: pand %xmm2, %xmm0
996 ; X32-SSE-NEXT: por %xmm3, %xmm0
997 ; X32-SSE-NEXT: psrlw $8, %xmm0
998 ; X32-SSE-NEXT: packuswb %xmm1, %xmm0
1000 %splat = shufflevector <16 x i8> %b, <16 x i8> undef, <16 x i32> zeroinitializer
1001 %shift = ashr <16 x i8> %a, %splat
1002 ret <16 x i8> %shift
1009 define <2 x i64> @constant_shift_v2i64(<2 x i64> %a) nounwind {
1010 ; SSE2-LABEL: constant_shift_v2i64:
1012 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1013 ; SSE2-NEXT: psrlq $7, %xmm1
1014 ; SSE2-NEXT: psrlq $1, %xmm0
1015 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1016 ; SSE2-NEXT: movapd {{.*#+}} xmm0 = [4611686018427387904,72057594037927936]
1017 ; SSE2-NEXT: xorpd %xmm0, %xmm1
1018 ; SSE2-NEXT: psubq %xmm0, %xmm1
1019 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1022 ; SSE41-LABEL: constant_shift_v2i64:
1024 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1025 ; SSE41-NEXT: psrlq $7, %xmm1
1026 ; SSE41-NEXT: psrlq $1, %xmm0
1027 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1028 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]
1029 ; SSE41-NEXT: pxor %xmm1, %xmm0
1030 ; SSE41-NEXT: psubq %xmm1, %xmm0
1033 ; AVX1-LABEL: constant_shift_v2i64:
1035 ; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm1
1036 ; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0
1037 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1038 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]
1039 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
1040 ; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm0
1043 ; AVX2-LABEL: constant_shift_v2i64:
1045 ; AVX2-NEXT: vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
1046 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]
1047 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
1048 ; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm0
1051 ; XOP-LABEL: constant_shift_v2i64:
1053 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1054 ; XOP-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm1
1055 ; XOP-NEXT: vpshaq %xmm1, %xmm0, %xmm0
1058 ; AVX512-LABEL: constant_shift_v2i64:
1060 ; AVX512-NEXT: vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
1061 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]
1062 ; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0
1063 ; AVX512-NEXT: vpsubq %xmm1, %xmm0, %xmm0
1066 ; X32-SSE-LABEL: constant_shift_v2i64:
1068 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm1 = [0,2147483648,0,2147483648]
1069 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
1070 ; X32-SSE-NEXT: psrlq $7, %xmm2
1071 ; X32-SSE-NEXT: psrlq $1, %xmm1
1072 ; X32-SSE-NEXT: movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]
1073 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1
1074 ; X32-SSE-NEXT: psrlq $7, %xmm1
1075 ; X32-SSE-NEXT: psrlq $1, %xmm0
1076 ; X32-SSE-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1077 ; X32-SSE-NEXT: xorpd %xmm2, %xmm1
1078 ; X32-SSE-NEXT: psubq %xmm2, %xmm1
1079 ; X32-SSE-NEXT: movdqa %xmm1, %xmm0
1080 ; X32-SSE-NEXT: retl
1081 %shift = ashr <2 x i64> %a, <i64 1, i64 7>
1082 ret <2 x i64> %shift
1085 define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind {
1086 ; SSE2-LABEL: constant_shift_v4i32:
1088 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1089 ; SSE2-NEXT: psrad $7, %xmm1
1090 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1091 ; SSE2-NEXT: psrad $5, %xmm2
1092 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
1093 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1094 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1095 ; SSE2-NEXT: psrad $6, %xmm2
1096 ; SSE2-NEXT: psrad $4, %xmm0
1097 ; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
1098 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1099 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1102 ; SSE41-LABEL: constant_shift_v4i32:
1104 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1105 ; SSE41-NEXT: psrad $7, %xmm1
1106 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1107 ; SSE41-NEXT: psrad $5, %xmm2
1108 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]
1109 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1110 ; SSE41-NEXT: psrad $6, %xmm1
1111 ; SSE41-NEXT: psrad $4, %xmm0
1112 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1113 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1116 ; AVX1-LABEL: constant_shift_v4i32:
1118 ; AVX1-NEXT: vpsrad $7, %xmm0, %xmm1
1119 ; AVX1-NEXT: vpsrad $5, %xmm0, %xmm2
1120 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
1121 ; AVX1-NEXT: vpsrad $6, %xmm0, %xmm2
1122 ; AVX1-NEXT: vpsrad $4, %xmm0, %xmm0
1123 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
1124 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
1127 ; AVX2-LABEL: constant_shift_v4i32:
1129 ; AVX2-NEXT: vpsravd {{.*}}(%rip), %xmm0, %xmm0
1132 ; XOPAVX1-LABEL: constant_shift_v4i32:
1134 ; XOPAVX1-NEXT: vpshad {{.*}}(%rip), %xmm0, %xmm0
1135 ; XOPAVX1-NEXT: retq
1137 ; XOPAVX2-LABEL: constant_shift_v4i32:
1139 ; XOPAVX2-NEXT: vpsravd {{.*}}(%rip), %xmm0, %xmm0
1140 ; XOPAVX2-NEXT: retq
1142 ; AVX512-LABEL: constant_shift_v4i32:
1144 ; AVX512-NEXT: vpsravd {{.*}}(%rip), %xmm0, %xmm0
1147 ; X32-SSE-LABEL: constant_shift_v4i32:
1149 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1
1150 ; X32-SSE-NEXT: psrad $7, %xmm1
1151 ; X32-SSE-NEXT: movdqa %xmm0, %xmm2
1152 ; X32-SSE-NEXT: psrad $5, %xmm2
1153 ; X32-SSE-NEXT: movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
1154 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1155 ; X32-SSE-NEXT: movdqa %xmm0, %xmm2
1156 ; X32-SSE-NEXT: psrad $6, %xmm2
1157 ; X32-SSE-NEXT: psrad $4, %xmm0
1158 ; X32-SSE-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
1159 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1160 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1161 ; X32-SSE-NEXT: retl
1162 %shift = ashr <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>
1163 ret <4 x i32> %shift
1166 define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind {
1167 ; SSE2-LABEL: constant_shift_v8i16:
1169 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1170 ; SSE2-NEXT: psraw $4, %xmm1
1171 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1172 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
1173 ; SSE2-NEXT: psraw $2, %xmm1
1174 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
1175 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1176 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]
1177 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1178 ; SSE2-NEXT: pand %xmm0, %xmm1
1179 ; SSE2-NEXT: psraw $1, %xmm2
1180 ; SSE2-NEXT: pandn %xmm2, %xmm0
1181 ; SSE2-NEXT: por %xmm1, %xmm0
1184 ; SSE41-LABEL: constant_shift_v8i16:
1186 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1187 ; SSE41-NEXT: psraw $4, %xmm1
1188 ; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1189 ; SSE41-NEXT: movdqa %xmm1, %xmm2
1190 ; SSE41-NEXT: psraw $2, %xmm2
1191 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
1192 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1193 ; SSE41-NEXT: psraw $1, %xmm0
1194 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3],xmm2[4],xmm0[5],xmm2[6],xmm0[7]
1197 ; AVX1-LABEL: constant_shift_v8i16:
1199 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm1
1200 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1201 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1
1202 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
1203 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1
1204 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
1207 ; AVX2-LABEL: constant_shift_v8i16:
1209 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
1210 ; AVX2-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0
1211 ; 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
1212 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1213 ; AVX2-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1214 ; AVX2-NEXT: vzeroupper
1217 ; XOP-LABEL: constant_shift_v8i16:
1219 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1220 ; XOP-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm1
1221 ; XOP-NEXT: vpshaw %xmm1, %xmm0, %xmm0
1224 ; AVX512-LABEL: constant_shift_v8i16:
1226 ; AVX512-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def>
1227 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]
1228 ; AVX512-NEXT: vpsravw %zmm1, %zmm0, %zmm0
1229 ; AVX512-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
1232 ; X32-SSE-LABEL: constant_shift_v8i16:
1234 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1
1235 ; X32-SSE-NEXT: psraw $4, %xmm1
1236 ; X32-SSE-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1237 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
1238 ; X32-SSE-NEXT: psraw $2, %xmm1
1239 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
1240 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1241 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]
1242 ; X32-SSE-NEXT: movdqa %xmm2, %xmm1
1243 ; X32-SSE-NEXT: pand %xmm0, %xmm1
1244 ; X32-SSE-NEXT: psraw $1, %xmm2
1245 ; X32-SSE-NEXT: pandn %xmm2, %xmm0
1246 ; X32-SSE-NEXT: por %xmm1, %xmm0
1247 ; X32-SSE-NEXT: retl
1248 %shift = ashr <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>
1249 ret <8 x i16> %shift
1252 define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind {
1253 ; SSE2-LABEL: constant_shift_v16i8:
1255 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
1256 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1257 ; SSE2-NEXT: psllw $5, %xmm3
1258 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm3[8],xmm4[9],xmm3[9],xmm4[10],xmm3[10],xmm4[11],xmm3[11],xmm4[12],xmm3[12],xmm4[13],xmm3[13],xmm4[14],xmm3[14],xmm4[15],xmm3[15]
1259 ; SSE2-NEXT: pxor %xmm2, %xmm2
1260 ; SSE2-NEXT: pxor %xmm5, %xmm5
1261 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
1262 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1263 ; SSE2-NEXT: pandn %xmm1, %xmm6
1264 ; SSE2-NEXT: psraw $4, %xmm1
1265 ; SSE2-NEXT: pand %xmm5, %xmm1
1266 ; SSE2-NEXT: por %xmm6, %xmm1
1267 ; SSE2-NEXT: paddw %xmm4, %xmm4
1268 ; SSE2-NEXT: pxor %xmm5, %xmm5
1269 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
1270 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1271 ; SSE2-NEXT: pandn %xmm1, %xmm6
1272 ; SSE2-NEXT: psraw $2, %xmm1
1273 ; SSE2-NEXT: pand %xmm5, %xmm1
1274 ; SSE2-NEXT: por %xmm6, %xmm1
1275 ; SSE2-NEXT: paddw %xmm4, %xmm4
1276 ; SSE2-NEXT: pxor %xmm5, %xmm5
1277 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
1278 ; SSE2-NEXT: movdqa %xmm5, %xmm4
1279 ; SSE2-NEXT: pandn %xmm1, %xmm4
1280 ; SSE2-NEXT: psraw $1, %xmm1
1281 ; SSE2-NEXT: pand %xmm5, %xmm1
1282 ; SSE2-NEXT: por %xmm4, %xmm1
1283 ; SSE2-NEXT: psrlw $8, %xmm1
1284 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1285 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1286 ; SSE2-NEXT: pxor %xmm4, %xmm4
1287 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm4
1288 ; SSE2-NEXT: movdqa %xmm4, %xmm5
1289 ; SSE2-NEXT: pandn %xmm0, %xmm5
1290 ; SSE2-NEXT: psraw $4, %xmm0
1291 ; SSE2-NEXT: pand %xmm4, %xmm0
1292 ; SSE2-NEXT: por %xmm5, %xmm0
1293 ; SSE2-NEXT: paddw %xmm3, %xmm3
1294 ; SSE2-NEXT: pxor %xmm4, %xmm4
1295 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm4
1296 ; SSE2-NEXT: movdqa %xmm4, %xmm5
1297 ; SSE2-NEXT: pandn %xmm0, %xmm5
1298 ; SSE2-NEXT: psraw $2, %xmm0
1299 ; SSE2-NEXT: pand %xmm4, %xmm0
1300 ; SSE2-NEXT: por %xmm5, %xmm0
1301 ; SSE2-NEXT: paddw %xmm3, %xmm3
1302 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm2
1303 ; SSE2-NEXT: movdqa %xmm2, %xmm3
1304 ; SSE2-NEXT: pandn %xmm0, %xmm3
1305 ; SSE2-NEXT: psraw $1, %xmm0
1306 ; SSE2-NEXT: pand %xmm2, %xmm0
1307 ; SSE2-NEXT: por %xmm3, %xmm0
1308 ; SSE2-NEXT: psrlw $8, %xmm0
1309 ; SSE2-NEXT: packuswb %xmm1, %xmm0
1312 ; SSE41-LABEL: constant_shift_v16i8:
1314 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1315 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1316 ; SSE41-NEXT: psllw $5, %xmm3
1317 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm3[8],xmm0[9],xmm3[9],xmm0[10],xmm3[10],xmm0[11],xmm3[11],xmm0[12],xmm3[12],xmm0[13],xmm3[13],xmm0[14],xmm3[14],xmm0[15],xmm3[15]
1318 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
1319 ; SSE41-NEXT: movdqa %xmm2, %xmm4
1320 ; SSE41-NEXT: psraw $4, %xmm4
1321 ; SSE41-NEXT: pblendvb %xmm4, %xmm2
1322 ; SSE41-NEXT: movdqa %xmm2, %xmm4
1323 ; SSE41-NEXT: psraw $2, %xmm4
1324 ; SSE41-NEXT: paddw %xmm0, %xmm0
1325 ; SSE41-NEXT: pblendvb %xmm4, %xmm2
1326 ; SSE41-NEXT: movdqa %xmm2, %xmm4
1327 ; SSE41-NEXT: psraw $1, %xmm4
1328 ; SSE41-NEXT: paddw %xmm0, %xmm0
1329 ; SSE41-NEXT: pblendvb %xmm4, %xmm2
1330 ; SSE41-NEXT: psrlw $8, %xmm2
1331 ; SSE41-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
1332 ; SSE41-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1333 ; SSE41-NEXT: movdqa %xmm1, %xmm3
1334 ; SSE41-NEXT: psraw $4, %xmm3
1335 ; SSE41-NEXT: pblendvb %xmm3, %xmm1
1336 ; SSE41-NEXT: movdqa %xmm1, %xmm3
1337 ; SSE41-NEXT: psraw $2, %xmm3
1338 ; SSE41-NEXT: paddw %xmm0, %xmm0
1339 ; SSE41-NEXT: pblendvb %xmm3, %xmm1
1340 ; SSE41-NEXT: movdqa %xmm1, %xmm3
1341 ; SSE41-NEXT: psraw $1, %xmm3
1342 ; SSE41-NEXT: paddw %xmm0, %xmm0
1343 ; SSE41-NEXT: pblendvb %xmm3, %xmm1
1344 ; SSE41-NEXT: psrlw $8, %xmm1
1345 ; SSE41-NEXT: packuswb %xmm2, %xmm1
1346 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1349 ; AVX-LABEL: constant_shift_v16i8:
1351 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1352 ; AVX-NEXT: vpsllw $5, %xmm1, %xmm1
1353 ; 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]
1354 ; AVX-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1355 ; AVX-NEXT: vpsraw $4, %xmm3, %xmm4
1356 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
1357 ; AVX-NEXT: vpsraw $2, %xmm3, %xmm4
1358 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
1359 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
1360 ; AVX-NEXT: vpsraw $1, %xmm3, %xmm4
1361 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
1362 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
1363 ; AVX-NEXT: vpsrlw $8, %xmm2, %xmm2
1364 ; 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]
1365 ; AVX-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1366 ; AVX-NEXT: vpsraw $4, %xmm0, %xmm3
1367 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1368 ; AVX-NEXT: vpsraw $2, %xmm0, %xmm3
1369 ; AVX-NEXT: vpaddw %xmm1, %xmm1, %xmm1
1370 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1371 ; AVX-NEXT: vpsraw $1, %xmm0, %xmm3
1372 ; AVX-NEXT: vpaddw %xmm1, %xmm1, %xmm1
1373 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1374 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm0
1375 ; AVX-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
1378 ; XOP-LABEL: constant_shift_v16i8:
1380 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1381 ; XOP-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1
1382 ; XOP-NEXT: vpshab %xmm1, %xmm0, %xmm0
1385 ; AVX512-LABEL: constant_shift_v16i8:
1387 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1388 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
1389 ; AVX512-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]
1390 ; AVX512-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1391 ; AVX512-NEXT: vpsraw $4, %xmm3, %xmm4
1392 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
1393 ; AVX512-NEXT: vpsraw $2, %xmm3, %xmm4
1394 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
1395 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
1396 ; AVX512-NEXT: vpsraw $1, %xmm3, %xmm4
1397 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
1398 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
1399 ; AVX512-NEXT: vpsrlw $8, %xmm2, %xmm2
1400 ; AVX512-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]
1401 ; AVX512-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1402 ; AVX512-NEXT: vpsraw $4, %xmm0, %xmm3
1403 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1404 ; AVX512-NEXT: vpsraw $2, %xmm0, %xmm3
1405 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
1406 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1407 ; AVX512-NEXT: vpsraw $1, %xmm0, %xmm3
1408 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
1409 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1410 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm0
1411 ; AVX512-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
1414 ; X32-SSE-LABEL: constant_shift_v16i8:
1416 ; X32-SSE-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
1417 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1418 ; X32-SSE-NEXT: psllw $5, %xmm3
1419 ; X32-SSE-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm3[8],xmm4[9],xmm3[9],xmm4[10],xmm3[10],xmm4[11],xmm3[11],xmm4[12],xmm3[12],xmm4[13],xmm3[13],xmm4[14],xmm3[14],xmm4[15],xmm3[15]
1420 ; X32-SSE-NEXT: pxor %xmm2, %xmm2
1421 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
1422 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
1423 ; X32-SSE-NEXT: movdqa %xmm5, %xmm6
1424 ; X32-SSE-NEXT: pandn %xmm1, %xmm6
1425 ; X32-SSE-NEXT: psraw $4, %xmm1
1426 ; X32-SSE-NEXT: pand %xmm5, %xmm1
1427 ; X32-SSE-NEXT: por %xmm6, %xmm1
1428 ; X32-SSE-NEXT: paddw %xmm4, %xmm4
1429 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
1430 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
1431 ; X32-SSE-NEXT: movdqa %xmm5, %xmm6
1432 ; X32-SSE-NEXT: pandn %xmm1, %xmm6
1433 ; X32-SSE-NEXT: psraw $2, %xmm1
1434 ; X32-SSE-NEXT: pand %xmm5, %xmm1
1435 ; X32-SSE-NEXT: por %xmm6, %xmm1
1436 ; X32-SSE-NEXT: paddw %xmm4, %xmm4
1437 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
1438 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
1439 ; X32-SSE-NEXT: movdqa %xmm5, %xmm4
1440 ; X32-SSE-NEXT: pandn %xmm1, %xmm4
1441 ; X32-SSE-NEXT: psraw $1, %xmm1
1442 ; X32-SSE-NEXT: pand %xmm5, %xmm1
1443 ; X32-SSE-NEXT: por %xmm4, %xmm1
1444 ; X32-SSE-NEXT: psrlw $8, %xmm1
1445 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1446 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1447 ; X32-SSE-NEXT: pxor %xmm4, %xmm4
1448 ; X32-SSE-NEXT: pcmpgtw %xmm3, %xmm4
1449 ; X32-SSE-NEXT: movdqa %xmm4, %xmm5
1450 ; X32-SSE-NEXT: pandn %xmm0, %xmm5
1451 ; X32-SSE-NEXT: psraw $4, %xmm0
1452 ; X32-SSE-NEXT: pand %xmm4, %xmm0
1453 ; X32-SSE-NEXT: por %xmm5, %xmm0
1454 ; X32-SSE-NEXT: paddw %xmm3, %xmm3
1455 ; X32-SSE-NEXT: pxor %xmm4, %xmm4
1456 ; X32-SSE-NEXT: pcmpgtw %xmm3, %xmm4
1457 ; X32-SSE-NEXT: movdqa %xmm4, %xmm5
1458 ; X32-SSE-NEXT: pandn %xmm0, %xmm5
1459 ; X32-SSE-NEXT: psraw $2, %xmm0
1460 ; X32-SSE-NEXT: pand %xmm4, %xmm0
1461 ; X32-SSE-NEXT: por %xmm5, %xmm0
1462 ; X32-SSE-NEXT: paddw %xmm3, %xmm3
1463 ; X32-SSE-NEXT: pcmpgtw %xmm3, %xmm2
1464 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3
1465 ; X32-SSE-NEXT: pandn %xmm0, %xmm3
1466 ; X32-SSE-NEXT: psraw $1, %xmm0
1467 ; X32-SSE-NEXT: pand %xmm2, %xmm0
1468 ; X32-SSE-NEXT: por %xmm3, %xmm0
1469 ; X32-SSE-NEXT: psrlw $8, %xmm0
1470 ; X32-SSE-NEXT: packuswb %xmm1, %xmm0
1471 ; X32-SSE-NEXT: retl
1472 %shift = ashr <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>
1473 ret <16 x i8> %shift
1477 ; Uniform Constant Shifts
1480 define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind {
1481 ; SSE2-LABEL: splatconstant_shift_v2i64:
1483 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1484 ; SSE2-NEXT: psrad $7, %xmm1
1485 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1486 ; SSE2-NEXT: psrlq $7, %xmm0
1487 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1488 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1491 ; SSE41-LABEL: splatconstant_shift_v2i64:
1493 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1494 ; SSE41-NEXT: psrad $7, %xmm1
1495 ; SSE41-NEXT: psrlq $7, %xmm0
1496 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
1499 ; AVX1-LABEL: splatconstant_shift_v2i64:
1501 ; AVX1-NEXT: vpsrad $7, %xmm0, %xmm1
1502 ; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm0
1503 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
1506 ; AVX2-LABEL: splatconstant_shift_v2i64:
1508 ; AVX2-NEXT: vpsrad $7, %xmm0, %xmm1
1509 ; AVX2-NEXT: vpsrlq $7, %xmm0, %xmm0
1510 ; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1513 ; XOP-LABEL: splatconstant_shift_v2i64:
1515 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1516 ; XOP-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm1
1517 ; XOP-NEXT: vpshaq %xmm1, %xmm0, %xmm0
1520 ; AVX512-LABEL: splatconstant_shift_v2i64:
1522 ; AVX512-NEXT: vpsrad $7, %xmm0, %xmm1
1523 ; AVX512-NEXT: vpsrlq $7, %xmm0, %xmm0
1524 ; AVX512-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1527 ; X32-SSE-LABEL: splatconstant_shift_v2i64:
1529 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1
1530 ; X32-SSE-NEXT: psrad $7, %xmm1
1531 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1532 ; X32-SSE-NEXT: psrlq $7, %xmm0
1533 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1534 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1535 ; X32-SSE-NEXT: retl
1536 %shift = ashr <2 x i64> %a, <i64 7, i64 7>
1537 ret <2 x i64> %shift
1540 define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind {
1541 ; SSE-LABEL: splatconstant_shift_v4i32:
1543 ; SSE-NEXT: psrad $5, %xmm0
1546 ; AVX-LABEL: splatconstant_shift_v4i32:
1548 ; AVX-NEXT: vpsrad $5, %xmm0, %xmm0
1551 ; XOP-LABEL: splatconstant_shift_v4i32:
1553 ; XOP-NEXT: vpsrad $5, %xmm0, %xmm0
1556 ; AVX512-LABEL: splatconstant_shift_v4i32:
1558 ; AVX512-NEXT: vpsrad $5, %xmm0, %xmm0
1561 ; X32-SSE-LABEL: splatconstant_shift_v4i32:
1563 ; X32-SSE-NEXT: psrad $5, %xmm0
1564 ; X32-SSE-NEXT: retl
1565 %shift = ashr <4 x i32> %a, <i32 5, i32 5, i32 5, i32 5>
1566 ret <4 x i32> %shift
1569 define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind {
1570 ; SSE-LABEL: splatconstant_shift_v8i16:
1572 ; SSE-NEXT: psraw $3, %xmm0
1575 ; AVX-LABEL: splatconstant_shift_v8i16:
1577 ; AVX-NEXT: vpsraw $3, %xmm0, %xmm0
1580 ; XOP-LABEL: splatconstant_shift_v8i16:
1582 ; XOP-NEXT: vpsraw $3, %xmm0, %xmm0
1585 ; AVX512-LABEL: splatconstant_shift_v8i16:
1587 ; AVX512-NEXT: vpsraw $3, %xmm0, %xmm0
1590 ; X32-SSE-LABEL: splatconstant_shift_v8i16:
1592 ; X32-SSE-NEXT: psraw $3, %xmm0
1593 ; X32-SSE-NEXT: retl
1594 %shift = ashr <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
1595 ret <8 x i16> %shift
1598 define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind {
1599 ; SSE-LABEL: splatconstant_shift_v16i8:
1601 ; SSE-NEXT: psrlw $3, %xmm0
1602 ; SSE-NEXT: pand {{.*}}(%rip), %xmm0
1603 ; SSE-NEXT: movdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1604 ; SSE-NEXT: pxor %xmm1, %xmm0
1605 ; SSE-NEXT: psubb %xmm1, %xmm0
1608 ; AVX-LABEL: splatconstant_shift_v16i8:
1610 ; AVX-NEXT: vpsrlw $3, %xmm0, %xmm0
1611 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
1612 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1613 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
1614 ; AVX-NEXT: vpsubb %xmm1, %xmm0, %xmm0
1617 ; XOP-LABEL: splatconstant_shift_v16i8:
1619 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1620 ; XOP-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1
1621 ; XOP-NEXT: vpshab %xmm1, %xmm0, %xmm0
1624 ; AVX512-LABEL: splatconstant_shift_v16i8:
1626 ; AVX512-NEXT: vpsrlw $3, %xmm0, %xmm0
1627 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
1628 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1629 ; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0
1630 ; AVX512-NEXT: vpsubb %xmm1, %xmm0, %xmm0
1633 ; X32-SSE-LABEL: splatconstant_shift_v16i8:
1635 ; X32-SSE-NEXT: psrlw $3, %xmm0
1636 ; X32-SSE-NEXT: pand {{\.LCPI.*}}, %xmm0
1637 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1638 ; X32-SSE-NEXT: pxor %xmm1, %xmm0
1639 ; X32-SSE-NEXT: psubb %xmm1, %xmm0
1640 ; X32-SSE-NEXT: retl
1641 %shift = ashr <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>
1642 ret <16 x i8> %shift