1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
8 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
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 {{.*#+}} xmm2 = xmm1[2,3,0,1]
94 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
95 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4
96 ; X32-SSE-NEXT: psrlq %xmm2, %xmm4
97 ; X32-SSE-NEXT: movq {{.*#+}} xmm5 = xmm1[0],zero
98 ; X32-SSE-NEXT: psrlq %xmm5, %xmm3
99 ; X32-SSE-NEXT: movsd {{.*#+}} xmm4 = xmm3[0],xmm4[1]
100 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1
101 ; X32-SSE-NEXT: psrlq %xmm2, %xmm1
102 ; X32-SSE-NEXT: psrlq %xmm5, %xmm0
103 ; X32-SSE-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
104 ; X32-SSE-NEXT: xorpd %xmm4, %xmm1
105 ; X32-SSE-NEXT: psubq %xmm4, %xmm1
106 ; X32-SSE-NEXT: movdqa %xmm1, %xmm0
108 %shift = ashr <2 x i64> %a, %b
112 define <4 x i32> @var_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
113 ; SSE2-LABEL: var_shift_v4i32:
115 ; SSE2-NEXT: movdqa %xmm1, %xmm2
116 ; SSE2-NEXT: psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
117 ; SSE2-NEXT: movdqa %xmm0, %xmm3
118 ; SSE2-NEXT: psrad %xmm2, %xmm3
119 ; SSE2-NEXT: movdqa %xmm1, %xmm2
120 ; SSE2-NEXT: psrlq $32, %xmm2
121 ; SSE2-NEXT: movdqa %xmm0, %xmm4
122 ; SSE2-NEXT: psrad %xmm2, %xmm4
123 ; SSE2-NEXT: movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1]
124 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3]
125 ; SSE2-NEXT: pxor %xmm3, %xmm3
126 ; SSE2-NEXT: movdqa %xmm1, %xmm4
127 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
128 ; SSE2-NEXT: movdqa %xmm0, %xmm5
129 ; SSE2-NEXT: psrad %xmm4, %xmm5
130 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
131 ; SSE2-NEXT: psrad %xmm1, %xmm0
132 ; SSE2-NEXT: movsd {{.*#+}} xmm5 = xmm0[0],xmm5[1]
133 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
134 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
137 ; SSE41-LABEL: var_shift_v4i32:
139 ; SSE41-NEXT: movdqa %xmm1, %xmm2
140 ; SSE41-NEXT: psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
141 ; SSE41-NEXT: movdqa %xmm0, %xmm3
142 ; SSE41-NEXT: psrad %xmm2, %xmm3
143 ; SSE41-NEXT: movdqa %xmm1, %xmm2
144 ; SSE41-NEXT: psrlq $32, %xmm2
145 ; SSE41-NEXT: movdqa %xmm0, %xmm4
146 ; SSE41-NEXT: psrad %xmm2, %xmm4
147 ; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm3[4,5,6,7]
148 ; SSE41-NEXT: pxor %xmm2, %xmm2
149 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero
150 ; SSE41-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
151 ; SSE41-NEXT: movdqa %xmm0, %xmm2
152 ; SSE41-NEXT: psrad %xmm1, %xmm2
153 ; SSE41-NEXT: psrad %xmm3, %xmm0
154 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
155 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3],xmm0[4,5],xmm4[6,7]
158 ; AVX1-LABEL: var_shift_v4i32:
160 ; AVX1-NEXT: vpsrldq {{.*#+}} xmm2 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
161 ; AVX1-NEXT: vpsrad %xmm2, %xmm0, %xmm2
162 ; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm3
163 ; AVX1-NEXT: vpsrad %xmm3, %xmm0, %xmm3
164 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
165 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
166 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
167 ; AVX1-NEXT: vpsrad %xmm3, %xmm0, %xmm3
168 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
169 ; AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0
170 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
171 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
174 ; AVX2-LABEL: var_shift_v4i32:
176 ; AVX2-NEXT: vpsravd %xmm1, %xmm0, %xmm0
179 ; XOPAVX1-LABEL: var_shift_v4i32:
181 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
182 ; XOPAVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm1
183 ; XOPAVX1-NEXT: vpshad %xmm1, %xmm0, %xmm0
186 ; XOPAVX2-LABEL: var_shift_v4i32:
188 ; XOPAVX2-NEXT: vpsravd %xmm1, %xmm0, %xmm0
191 ; AVX512-LABEL: var_shift_v4i32:
193 ; AVX512-NEXT: vpsravd %xmm1, %xmm0, %xmm0
196 ; X32-SSE-LABEL: var_shift_v4i32:
198 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
199 ; X32-SSE-NEXT: psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
200 ; X32-SSE-NEXT: movdqa %xmm0, %xmm3
201 ; X32-SSE-NEXT: psrad %xmm2, %xmm3
202 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
203 ; X32-SSE-NEXT: psrlq $32, %xmm2
204 ; X32-SSE-NEXT: movdqa %xmm0, %xmm4
205 ; X32-SSE-NEXT: psrad %xmm2, %xmm4
206 ; X32-SSE-NEXT: movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1]
207 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3]
208 ; X32-SSE-NEXT: pxor %xmm3, %xmm3
209 ; X32-SSE-NEXT: movdqa %xmm1, %xmm4
210 ; X32-SSE-NEXT: punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
211 ; X32-SSE-NEXT: movdqa %xmm0, %xmm5
212 ; X32-SSE-NEXT: psrad %xmm4, %xmm5
213 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
214 ; X32-SSE-NEXT: psrad %xmm1, %xmm0
215 ; X32-SSE-NEXT: movsd {{.*#+}} xmm5 = xmm0[0],xmm5[1]
216 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
217 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
219 %shift = ashr <4 x i32> %a, %b
223 define <8 x i16> @var_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
224 ; SSE2-LABEL: var_shift_v8i16:
226 ; SSE2-NEXT: psllw $12, %xmm1
227 ; SSE2-NEXT: movdqa %xmm1, %xmm2
228 ; SSE2-NEXT: psraw $15, %xmm2
229 ; SSE2-NEXT: movdqa %xmm2, %xmm3
230 ; SSE2-NEXT: pandn %xmm0, %xmm3
231 ; SSE2-NEXT: psraw $8, %xmm0
232 ; SSE2-NEXT: pand %xmm2, %xmm0
233 ; SSE2-NEXT: por %xmm3, %xmm0
234 ; SSE2-NEXT: paddw %xmm1, %xmm1
235 ; SSE2-NEXT: movdqa %xmm1, %xmm2
236 ; SSE2-NEXT: psraw $15, %xmm2
237 ; SSE2-NEXT: movdqa %xmm2, %xmm3
238 ; SSE2-NEXT: pandn %xmm0, %xmm3
239 ; SSE2-NEXT: psraw $4, %xmm0
240 ; SSE2-NEXT: pand %xmm2, %xmm0
241 ; SSE2-NEXT: por %xmm3, %xmm0
242 ; SSE2-NEXT: paddw %xmm1, %xmm1
243 ; SSE2-NEXT: movdqa %xmm1, %xmm2
244 ; SSE2-NEXT: psraw $15, %xmm2
245 ; SSE2-NEXT: movdqa %xmm2, %xmm3
246 ; SSE2-NEXT: pandn %xmm0, %xmm3
247 ; SSE2-NEXT: psraw $2, %xmm0
248 ; SSE2-NEXT: pand %xmm2, %xmm0
249 ; SSE2-NEXT: por %xmm3, %xmm0
250 ; SSE2-NEXT: paddw %xmm1, %xmm1
251 ; SSE2-NEXT: psraw $15, %xmm1
252 ; SSE2-NEXT: movdqa %xmm1, %xmm2
253 ; SSE2-NEXT: pandn %xmm0, %xmm2
254 ; SSE2-NEXT: psraw $1, %xmm0
255 ; SSE2-NEXT: pand %xmm1, %xmm0
256 ; SSE2-NEXT: por %xmm2, %xmm0
259 ; SSE41-LABEL: var_shift_v8i16:
261 ; SSE41-NEXT: movdqa %xmm0, %xmm2
262 ; SSE41-NEXT: movdqa %xmm1, %xmm0
263 ; SSE41-NEXT: psllw $12, %xmm0
264 ; SSE41-NEXT: psllw $4, %xmm1
265 ; SSE41-NEXT: por %xmm0, %xmm1
266 ; SSE41-NEXT: movdqa %xmm1, %xmm3
267 ; SSE41-NEXT: paddw %xmm3, %xmm3
268 ; SSE41-NEXT: movdqa %xmm2, %xmm4
269 ; SSE41-NEXT: psraw $8, %xmm4
270 ; SSE41-NEXT: movdqa %xmm1, %xmm0
271 ; SSE41-NEXT: pblendvb %xmm4, %xmm2
272 ; SSE41-NEXT: movdqa %xmm2, %xmm1
273 ; SSE41-NEXT: psraw $4, %xmm1
274 ; SSE41-NEXT: movdqa %xmm3, %xmm0
275 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
276 ; SSE41-NEXT: movdqa %xmm2, %xmm1
277 ; SSE41-NEXT: psraw $2, %xmm1
278 ; SSE41-NEXT: paddw %xmm3, %xmm3
279 ; SSE41-NEXT: movdqa %xmm3, %xmm0
280 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
281 ; SSE41-NEXT: movdqa %xmm2, %xmm1
282 ; SSE41-NEXT: psraw $1, %xmm1
283 ; SSE41-NEXT: paddw %xmm3, %xmm3
284 ; SSE41-NEXT: movdqa %xmm3, %xmm0
285 ; SSE41-NEXT: pblendvb %xmm1, %xmm2
286 ; SSE41-NEXT: movdqa %xmm2, %xmm0
289 ; AVX1-LABEL: var_shift_v8i16:
291 ; AVX1-NEXT: vpsllw $12, %xmm1, %xmm2
292 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1
293 ; AVX1-NEXT: vpor %xmm2, %xmm1, %xmm1
294 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm2
295 ; AVX1-NEXT: vpsraw $8, %xmm0, %xmm3
296 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
297 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm1
298 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
299 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1
300 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2
301 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
302 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1
303 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2
304 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
307 ; AVX2-LABEL: var_shift_v8i16:
309 ; 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
310 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
311 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0
312 ; 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
313 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
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: vpsravw %zmm1, %zmm0, %zmm0
329 ; X32-SSE-LABEL: var_shift_v8i16:
331 ; X32-SSE-NEXT: psllw $12, %xmm1
332 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
333 ; X32-SSE-NEXT: psraw $15, %xmm2
334 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3
335 ; X32-SSE-NEXT: pandn %xmm0, %xmm3
336 ; X32-SSE-NEXT: psraw $8, %xmm0
337 ; X32-SSE-NEXT: pand %xmm2, %xmm0
338 ; X32-SSE-NEXT: por %xmm3, %xmm0
339 ; X32-SSE-NEXT: paddw %xmm1, %xmm1
340 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
341 ; X32-SSE-NEXT: psraw $15, %xmm2
342 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3
343 ; X32-SSE-NEXT: pandn %xmm0, %xmm3
344 ; X32-SSE-NEXT: psraw $4, %xmm0
345 ; X32-SSE-NEXT: pand %xmm2, %xmm0
346 ; X32-SSE-NEXT: por %xmm3, %xmm0
347 ; X32-SSE-NEXT: paddw %xmm1, %xmm1
348 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
349 ; X32-SSE-NEXT: psraw $15, %xmm2
350 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3
351 ; X32-SSE-NEXT: pandn %xmm0, %xmm3
352 ; X32-SSE-NEXT: psraw $2, %xmm0
353 ; X32-SSE-NEXT: pand %xmm2, %xmm0
354 ; X32-SSE-NEXT: por %xmm3, %xmm0
355 ; X32-SSE-NEXT: paddw %xmm1, %xmm1
356 ; X32-SSE-NEXT: psraw $15, %xmm1
357 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
358 ; X32-SSE-NEXT: pandn %xmm0, %xmm2
359 ; X32-SSE-NEXT: psraw $1, %xmm0
360 ; X32-SSE-NEXT: pand %xmm1, %xmm0
361 ; X32-SSE-NEXT: por %xmm2, %xmm0
363 %shift = ashr <8 x i16> %a, %b
367 define <16 x i8> @var_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
368 ; SSE2-LABEL: var_shift_v16i8:
370 ; 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]
371 ; SSE2-NEXT: psllw $5, %xmm1
372 ; 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]
373 ; SSE2-NEXT: pxor %xmm3, %xmm3
374 ; SSE2-NEXT: pxor %xmm5, %xmm5
375 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
376 ; SSE2-NEXT: movdqa %xmm5, %xmm6
377 ; SSE2-NEXT: pandn %xmm2, %xmm6
378 ; SSE2-NEXT: psraw $4, %xmm2
379 ; SSE2-NEXT: pand %xmm5, %xmm2
380 ; SSE2-NEXT: por %xmm6, %xmm2
381 ; SSE2-NEXT: paddw %xmm4, %xmm4
382 ; SSE2-NEXT: pxor %xmm5, %xmm5
383 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
384 ; SSE2-NEXT: movdqa %xmm5, %xmm6
385 ; SSE2-NEXT: pandn %xmm2, %xmm6
386 ; SSE2-NEXT: psraw $2, %xmm2
387 ; SSE2-NEXT: pand %xmm5, %xmm2
388 ; SSE2-NEXT: por %xmm6, %xmm2
389 ; SSE2-NEXT: paddw %xmm4, %xmm4
390 ; SSE2-NEXT: pxor %xmm5, %xmm5
391 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
392 ; SSE2-NEXT: movdqa %xmm5, %xmm4
393 ; SSE2-NEXT: pandn %xmm2, %xmm4
394 ; SSE2-NEXT: psraw $1, %xmm2
395 ; SSE2-NEXT: pand %xmm5, %xmm2
396 ; SSE2-NEXT: por %xmm4, %xmm2
397 ; SSE2-NEXT: psrlw $8, %xmm2
398 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
399 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
400 ; SSE2-NEXT: pxor %xmm4, %xmm4
401 ; SSE2-NEXT: pcmpgtw %xmm1, %xmm4
402 ; SSE2-NEXT: movdqa %xmm4, %xmm5
403 ; SSE2-NEXT: pandn %xmm0, %xmm5
404 ; SSE2-NEXT: psraw $4, %xmm0
405 ; SSE2-NEXT: pand %xmm4, %xmm0
406 ; SSE2-NEXT: por %xmm5, %xmm0
407 ; SSE2-NEXT: paddw %xmm1, %xmm1
408 ; SSE2-NEXT: pxor %xmm4, %xmm4
409 ; SSE2-NEXT: pcmpgtw %xmm1, %xmm4
410 ; SSE2-NEXT: movdqa %xmm4, %xmm5
411 ; SSE2-NEXT: pandn %xmm0, %xmm5
412 ; SSE2-NEXT: psraw $2, %xmm0
413 ; SSE2-NEXT: pand %xmm4, %xmm0
414 ; SSE2-NEXT: por %xmm5, %xmm0
415 ; SSE2-NEXT: paddw %xmm1, %xmm1
416 ; SSE2-NEXT: pcmpgtw %xmm1, %xmm3
417 ; SSE2-NEXT: movdqa %xmm3, %xmm1
418 ; SSE2-NEXT: pandn %xmm0, %xmm1
419 ; SSE2-NEXT: psraw $1, %xmm0
420 ; SSE2-NEXT: pand %xmm3, %xmm0
421 ; SSE2-NEXT: por %xmm1, %xmm0
422 ; SSE2-NEXT: psrlw $8, %xmm0
423 ; SSE2-NEXT: packuswb %xmm2, %xmm0
426 ; SSE41-LABEL: var_shift_v16i8:
428 ; SSE41-NEXT: movdqa %xmm0, %xmm2
429 ; SSE41-NEXT: psllw $5, %xmm1
430 ; 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]
431 ; 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]
432 ; SSE41-NEXT: movdqa %xmm3, %xmm4
433 ; SSE41-NEXT: psraw $4, %xmm4
434 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
435 ; SSE41-NEXT: movdqa %xmm3, %xmm4
436 ; SSE41-NEXT: psraw $2, %xmm4
437 ; SSE41-NEXT: paddw %xmm0, %xmm0
438 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
439 ; SSE41-NEXT: movdqa %xmm3, %xmm4
440 ; SSE41-NEXT: psraw $1, %xmm4
441 ; SSE41-NEXT: paddw %xmm0, %xmm0
442 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
443 ; SSE41-NEXT: psrlw $8, %xmm3
444 ; 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]
445 ; 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]
446 ; SSE41-NEXT: movdqa %xmm1, %xmm2
447 ; SSE41-NEXT: psraw $4, %xmm2
448 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
449 ; SSE41-NEXT: movdqa %xmm1, %xmm2
450 ; SSE41-NEXT: psraw $2, %xmm2
451 ; SSE41-NEXT: paddw %xmm0, %xmm0
452 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
453 ; SSE41-NEXT: movdqa %xmm1, %xmm2
454 ; SSE41-NEXT: psraw $1, %xmm2
455 ; SSE41-NEXT: paddw %xmm0, %xmm0
456 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
457 ; SSE41-NEXT: psrlw $8, %xmm1
458 ; SSE41-NEXT: packuswb %xmm3, %xmm1
459 ; SSE41-NEXT: movdqa %xmm1, %xmm0
462 ; AVX-LABEL: var_shift_v16i8:
464 ; AVX-NEXT: vpsllw $5, %xmm1, %xmm1
465 ; 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]
466 ; AVX-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
467 ; AVX-NEXT: vpsraw $4, %xmm3, %xmm4
468 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
469 ; AVX-NEXT: vpsraw $2, %xmm3, %xmm4
470 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
471 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
472 ; AVX-NEXT: vpsraw $1, %xmm3, %xmm4
473 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
474 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
475 ; AVX-NEXT: vpsrlw $8, %xmm2, %xmm2
476 ; 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]
477 ; AVX-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
478 ; AVX-NEXT: vpsraw $4, %xmm0, %xmm3
479 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
480 ; AVX-NEXT: vpsraw $2, %xmm0, %xmm3
481 ; AVX-NEXT: vpaddw %xmm1, %xmm1, %xmm1
482 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
483 ; AVX-NEXT: vpsraw $1, %xmm0, %xmm3
484 ; AVX-NEXT: vpaddw %xmm1, %xmm1, %xmm1
485 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
486 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm0
487 ; AVX-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
490 ; XOP-LABEL: var_shift_v16i8:
492 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
493 ; XOP-NEXT: vpsubb %xmm1, %xmm2, %xmm1
494 ; XOP-NEXT: vpshab %xmm1, %xmm0, %xmm0
497 ; AVX512-LABEL: var_shift_v16i8:
499 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
500 ; 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]
501 ; AVX512-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
502 ; AVX512-NEXT: vpsraw $4, %xmm3, %xmm4
503 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
504 ; AVX512-NEXT: vpsraw $2, %xmm3, %xmm4
505 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
506 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
507 ; AVX512-NEXT: vpsraw $1, %xmm3, %xmm4
508 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
509 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
510 ; AVX512-NEXT: vpsrlw $8, %xmm2, %xmm2
511 ; 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]
512 ; AVX512-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
513 ; AVX512-NEXT: vpsraw $4, %xmm0, %xmm3
514 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
515 ; AVX512-NEXT: vpsraw $2, %xmm0, %xmm3
516 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
517 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
518 ; AVX512-NEXT: vpsraw $1, %xmm0, %xmm3
519 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
520 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
521 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm0
522 ; AVX512-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
525 ; X32-SSE-LABEL: var_shift_v16i8:
527 ; 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]
528 ; X32-SSE-NEXT: psllw $5, %xmm1
529 ; 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]
530 ; X32-SSE-NEXT: pxor %xmm3, %xmm3
531 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
532 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
533 ; X32-SSE-NEXT: movdqa %xmm5, %xmm6
534 ; X32-SSE-NEXT: pandn %xmm2, %xmm6
535 ; X32-SSE-NEXT: psraw $4, %xmm2
536 ; X32-SSE-NEXT: pand %xmm5, %xmm2
537 ; X32-SSE-NEXT: por %xmm6, %xmm2
538 ; X32-SSE-NEXT: paddw %xmm4, %xmm4
539 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
540 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
541 ; X32-SSE-NEXT: movdqa %xmm5, %xmm6
542 ; X32-SSE-NEXT: pandn %xmm2, %xmm6
543 ; X32-SSE-NEXT: psraw $2, %xmm2
544 ; X32-SSE-NEXT: pand %xmm5, %xmm2
545 ; X32-SSE-NEXT: por %xmm6, %xmm2
546 ; X32-SSE-NEXT: paddw %xmm4, %xmm4
547 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
548 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
549 ; X32-SSE-NEXT: movdqa %xmm5, %xmm4
550 ; X32-SSE-NEXT: pandn %xmm2, %xmm4
551 ; X32-SSE-NEXT: psraw $1, %xmm2
552 ; X32-SSE-NEXT: pand %xmm5, %xmm2
553 ; X32-SSE-NEXT: por %xmm4, %xmm2
554 ; X32-SSE-NEXT: psrlw $8, %xmm2
555 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
556 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
557 ; X32-SSE-NEXT: pxor %xmm4, %xmm4
558 ; X32-SSE-NEXT: pcmpgtw %xmm1, %xmm4
559 ; X32-SSE-NEXT: movdqa %xmm4, %xmm5
560 ; X32-SSE-NEXT: pandn %xmm0, %xmm5
561 ; X32-SSE-NEXT: psraw $4, %xmm0
562 ; X32-SSE-NEXT: pand %xmm4, %xmm0
563 ; X32-SSE-NEXT: por %xmm5, %xmm0
564 ; X32-SSE-NEXT: paddw %xmm1, %xmm1
565 ; X32-SSE-NEXT: pxor %xmm4, %xmm4
566 ; X32-SSE-NEXT: pcmpgtw %xmm1, %xmm4
567 ; X32-SSE-NEXT: movdqa %xmm4, %xmm5
568 ; X32-SSE-NEXT: pandn %xmm0, %xmm5
569 ; X32-SSE-NEXT: psraw $2, %xmm0
570 ; X32-SSE-NEXT: pand %xmm4, %xmm0
571 ; X32-SSE-NEXT: por %xmm5, %xmm0
572 ; X32-SSE-NEXT: paddw %xmm1, %xmm1
573 ; X32-SSE-NEXT: pcmpgtw %xmm1, %xmm3
574 ; X32-SSE-NEXT: movdqa %xmm3, %xmm1
575 ; X32-SSE-NEXT: pandn %xmm0, %xmm1
576 ; X32-SSE-NEXT: psraw $1, %xmm0
577 ; X32-SSE-NEXT: pand %xmm3, %xmm0
578 ; X32-SSE-NEXT: por %xmm1, %xmm0
579 ; X32-SSE-NEXT: psrlw $8, %xmm0
580 ; X32-SSE-NEXT: packuswb %xmm2, %xmm0
582 %shift = ashr <16 x i8> %a, %b
587 ; Uniform Variable Shifts
590 define <2 x i64> @splatvar_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
591 ; SSE-LABEL: splatvar_shift_v2i64:
593 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
594 ; SSE-NEXT: psrlq %xmm1, %xmm2
595 ; SSE-NEXT: psrlq %xmm1, %xmm0
596 ; SSE-NEXT: pxor %xmm2, %xmm0
597 ; SSE-NEXT: psubq %xmm2, %xmm0
600 ; AVX-LABEL: splatvar_shift_v2i64:
602 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
603 ; AVX-NEXT: vpsrlq %xmm1, %xmm2, %xmm2
604 ; AVX-NEXT: vpsrlq %xmm1, %xmm0, %xmm0
605 ; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0
606 ; AVX-NEXT: vpsubq %xmm2, %xmm0, %xmm0
609 ; XOPAVX1-LABEL: splatvar_shift_v2i64:
611 ; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
612 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
613 ; XOPAVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1
614 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0
617 ; XOPAVX2-LABEL: splatvar_shift_v2i64:
619 ; XOPAVX2-NEXT: vpbroadcastq %xmm1, %xmm1
620 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
621 ; XOPAVX2-NEXT: vpsubq %xmm1, %xmm2, %xmm1
622 ; XOPAVX2-NEXT: vpshaq %xmm1, %xmm0, %xmm0
625 ; AVX512-LABEL: splatvar_shift_v2i64:
627 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
628 ; AVX512-NEXT: vpsrlq %xmm1, %xmm2, %xmm2
629 ; AVX512-NEXT: vpsrlq %xmm1, %xmm0, %xmm0
630 ; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0
631 ; AVX512-NEXT: vpsubq %xmm2, %xmm0, %xmm0
634 ; X32-SSE-LABEL: splatvar_shift_v2i64:
636 ; X32-SSE-NEXT: movq {{.*#+}} xmm1 = xmm1[0],zero
637 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
638 ; X32-SSE-NEXT: psrlq %xmm1, %xmm2
639 ; X32-SSE-NEXT: psrlq %xmm1, %xmm0
640 ; X32-SSE-NEXT: pxor %xmm2, %xmm0
641 ; X32-SSE-NEXT: psubq %xmm2, %xmm0
643 %splat = shufflevector <2 x i64> %b, <2 x i64> undef, <2 x i32> zeroinitializer
644 %shift = ashr <2 x i64> %a, %splat
648 define <4 x i32> @splatvar_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
649 ; SSE2-LABEL: splatvar_shift_v4i32:
651 ; SSE2-NEXT: xorps %xmm2, %xmm2
652 ; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
653 ; SSE2-NEXT: psrad %xmm2, %xmm0
656 ; SSE41-LABEL: splatvar_shift_v4i32:
658 ; SSE41-NEXT: pxor %xmm2, %xmm2
659 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3,4,5,6,7]
660 ; SSE41-NEXT: psrad %xmm2, %xmm0
663 ; AVX-LABEL: splatvar_shift_v4i32:
665 ; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2
666 ; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
667 ; AVX-NEXT: vpsrad %xmm1, %xmm0, %xmm0
670 ; XOP-LABEL: splatvar_shift_v4i32:
672 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
673 ; XOP-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
674 ; XOP-NEXT: vpsrad %xmm1, %xmm0, %xmm0
677 ; AVX512-LABEL: splatvar_shift_v4i32:
679 ; AVX512-NEXT: vxorps %xmm2, %xmm2, %xmm2
680 ; AVX512-NEXT: vmovss %xmm1, %xmm2, %xmm1
681 ; AVX512-NEXT: vpsrad %xmm1, %xmm0, %xmm0
684 ; X32-SSE-LABEL: splatvar_shift_v4i32:
686 ; X32-SSE-NEXT: xorps %xmm2, %xmm2
687 ; X32-SSE-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
688 ; X32-SSE-NEXT: psrad %xmm2, %xmm0
690 %splat = shufflevector <4 x i32> %b, <4 x i32> undef, <4 x i32> zeroinitializer
691 %shift = ashr <4 x i32> %a, %splat
695 define <8 x i16> @splatvar_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
696 ; SSE2-LABEL: splatvar_shift_v8i16:
698 ; SSE2-NEXT: movd %xmm1, %eax
699 ; SSE2-NEXT: movzwl %ax, %eax
700 ; SSE2-NEXT: movd %eax, %xmm1
701 ; SSE2-NEXT: psraw %xmm1, %xmm0
704 ; SSE41-LABEL: splatvar_shift_v8i16:
706 ; SSE41-NEXT: pxor %xmm2, %xmm2
707 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3,4,5,6,7]
708 ; SSE41-NEXT: psraw %xmm2, %xmm0
711 ; AVX-LABEL: splatvar_shift_v8i16:
713 ; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2
714 ; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
715 ; AVX-NEXT: vpsraw %xmm1, %xmm0, %xmm0
718 ; XOP-LABEL: splatvar_shift_v8i16:
720 ; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
721 ; XOP-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
722 ; XOP-NEXT: vpsraw %xmm1, %xmm0, %xmm0
725 ; AVX512-LABEL: splatvar_shift_v8i16:
727 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
728 ; AVX512-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
729 ; AVX512-NEXT: vpsraw %xmm1, %xmm0, %xmm0
732 ; X32-SSE-LABEL: splatvar_shift_v8i16:
734 ; X32-SSE-NEXT: movd %xmm1, %eax
735 ; X32-SSE-NEXT: movzwl %ax, %eax
736 ; X32-SSE-NEXT: movd %eax, %xmm1
737 ; X32-SSE-NEXT: psraw %xmm1, %xmm0
739 %splat = shufflevector <8 x i16> %b, <8 x i16> undef, <8 x i32> zeroinitializer
740 %shift = ashr <8 x i16> %a, %splat
744 define <16 x i8> @splatvar_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
745 ; SSE2-LABEL: splatvar_shift_v16i8:
747 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
748 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
749 ; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
750 ; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm1[0,1,2,3,4,4,4,4]
751 ; 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]
752 ; SSE2-NEXT: psllw $5, %xmm3
753 ; 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]
754 ; SSE2-NEXT: pxor %xmm2, %xmm2
755 ; SSE2-NEXT: pxor %xmm5, %xmm5
756 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
757 ; SSE2-NEXT: movdqa %xmm5, %xmm6
758 ; SSE2-NEXT: pandn %xmm1, %xmm6
759 ; SSE2-NEXT: psraw $4, %xmm1
760 ; SSE2-NEXT: pand %xmm5, %xmm1
761 ; SSE2-NEXT: por %xmm6, %xmm1
762 ; SSE2-NEXT: paddw %xmm4, %xmm4
763 ; SSE2-NEXT: pxor %xmm5, %xmm5
764 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
765 ; SSE2-NEXT: movdqa %xmm5, %xmm6
766 ; SSE2-NEXT: pandn %xmm1, %xmm6
767 ; SSE2-NEXT: psraw $2, %xmm1
768 ; SSE2-NEXT: pand %xmm5, %xmm1
769 ; SSE2-NEXT: por %xmm6, %xmm1
770 ; SSE2-NEXT: paddw %xmm4, %xmm4
771 ; SSE2-NEXT: pxor %xmm5, %xmm5
772 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
773 ; SSE2-NEXT: movdqa %xmm5, %xmm4
774 ; SSE2-NEXT: pandn %xmm1, %xmm4
775 ; SSE2-NEXT: psraw $1, %xmm1
776 ; SSE2-NEXT: pand %xmm5, %xmm1
777 ; SSE2-NEXT: por %xmm4, %xmm1
778 ; SSE2-NEXT: psrlw $8, %xmm1
779 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
780 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
781 ; SSE2-NEXT: pxor %xmm4, %xmm4
782 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm4
783 ; SSE2-NEXT: movdqa %xmm4, %xmm5
784 ; SSE2-NEXT: pandn %xmm0, %xmm5
785 ; SSE2-NEXT: psraw $4, %xmm0
786 ; SSE2-NEXT: pand %xmm4, %xmm0
787 ; SSE2-NEXT: por %xmm5, %xmm0
788 ; SSE2-NEXT: paddw %xmm3, %xmm3
789 ; SSE2-NEXT: pxor %xmm4, %xmm4
790 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm4
791 ; SSE2-NEXT: movdqa %xmm4, %xmm5
792 ; SSE2-NEXT: pandn %xmm0, %xmm5
793 ; SSE2-NEXT: psraw $2, %xmm0
794 ; SSE2-NEXT: pand %xmm4, %xmm0
795 ; SSE2-NEXT: por %xmm5, %xmm0
796 ; SSE2-NEXT: paddw %xmm3, %xmm3
797 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm2
798 ; SSE2-NEXT: movdqa %xmm2, %xmm3
799 ; SSE2-NEXT: pandn %xmm0, %xmm3
800 ; SSE2-NEXT: psraw $1, %xmm0
801 ; SSE2-NEXT: pand %xmm2, %xmm0
802 ; SSE2-NEXT: por %xmm3, %xmm0
803 ; SSE2-NEXT: psrlw $8, %xmm0
804 ; SSE2-NEXT: packuswb %xmm1, %xmm0
807 ; SSE41-LABEL: splatvar_shift_v16i8:
809 ; SSE41-NEXT: movdqa %xmm0, %xmm2
810 ; SSE41-NEXT: pxor %xmm0, %xmm0
811 ; SSE41-NEXT: pshufb %xmm0, %xmm1
812 ; SSE41-NEXT: psllw $5, %xmm1
813 ; 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]
814 ; 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]
815 ; SSE41-NEXT: movdqa %xmm3, %xmm4
816 ; SSE41-NEXT: psraw $4, %xmm4
817 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
818 ; SSE41-NEXT: movdqa %xmm3, %xmm4
819 ; SSE41-NEXT: psraw $2, %xmm4
820 ; SSE41-NEXT: paddw %xmm0, %xmm0
821 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
822 ; SSE41-NEXT: movdqa %xmm3, %xmm4
823 ; SSE41-NEXT: psraw $1, %xmm4
824 ; SSE41-NEXT: paddw %xmm0, %xmm0
825 ; SSE41-NEXT: pblendvb %xmm4, %xmm3
826 ; SSE41-NEXT: psrlw $8, %xmm3
827 ; 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]
828 ; 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]
829 ; SSE41-NEXT: movdqa %xmm1, %xmm2
830 ; SSE41-NEXT: psraw $4, %xmm2
831 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
832 ; SSE41-NEXT: movdqa %xmm1, %xmm2
833 ; SSE41-NEXT: psraw $2, %xmm2
834 ; SSE41-NEXT: paddw %xmm0, %xmm0
835 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
836 ; SSE41-NEXT: movdqa %xmm1, %xmm2
837 ; SSE41-NEXT: psraw $1, %xmm2
838 ; SSE41-NEXT: paddw %xmm0, %xmm0
839 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
840 ; SSE41-NEXT: psrlw $8, %xmm1
841 ; SSE41-NEXT: packuswb %xmm3, %xmm1
842 ; SSE41-NEXT: movdqa %xmm1, %xmm0
845 ; AVX1-LABEL: splatvar_shift_v16i8:
847 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
848 ; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
849 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
850 ; 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]
851 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
852 ; AVX1-NEXT: vpsraw $4, %xmm3, %xmm4
853 ; AVX1-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
854 ; AVX1-NEXT: vpsraw $2, %xmm3, %xmm4
855 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2
856 ; AVX1-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
857 ; AVX1-NEXT: vpsraw $1, %xmm3, %xmm4
858 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2
859 ; AVX1-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
860 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
861 ; 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]
862 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
863 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm3
864 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
865 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm3
866 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1
867 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
868 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm3
869 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1
870 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
871 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0
872 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
875 ; AVX2-LABEL: splatvar_shift_v16i8:
877 ; AVX2-NEXT: vpbroadcastb %xmm1, %xmm1
878 ; AVX2-NEXT: vpsllw $5, %xmm1, %xmm1
879 ; 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]
880 ; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
881 ; AVX2-NEXT: vpsraw $4, %xmm3, %xmm4
882 ; AVX2-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
883 ; AVX2-NEXT: vpsraw $2, %xmm3, %xmm4
884 ; AVX2-NEXT: vpaddw %xmm2, %xmm2, %xmm2
885 ; AVX2-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
886 ; AVX2-NEXT: vpsraw $1, %xmm3, %xmm4
887 ; AVX2-NEXT: vpaddw %xmm2, %xmm2, %xmm2
888 ; AVX2-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
889 ; AVX2-NEXT: vpsrlw $8, %xmm2, %xmm2
890 ; 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]
891 ; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
892 ; AVX2-NEXT: vpsraw $4, %xmm0, %xmm3
893 ; AVX2-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
894 ; AVX2-NEXT: vpsraw $2, %xmm0, %xmm3
895 ; AVX2-NEXT: vpaddw %xmm1, %xmm1, %xmm1
896 ; AVX2-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
897 ; AVX2-NEXT: vpsraw $1, %xmm0, %xmm3
898 ; AVX2-NEXT: vpaddw %xmm1, %xmm1, %xmm1
899 ; AVX2-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
900 ; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm0
901 ; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
904 ; XOPAVX1-LABEL: splatvar_shift_v16i8:
906 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
907 ; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
908 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1
909 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0
912 ; XOPAVX2-LABEL: splatvar_shift_v16i8:
914 ; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm1
915 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
916 ; XOPAVX2-NEXT: vpsubb %xmm1, %xmm2, %xmm1
917 ; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0
920 ; AVX512-LABEL: splatvar_shift_v16i8:
922 ; AVX512-NEXT: vpbroadcastb %xmm1, %xmm1
923 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
924 ; 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]
925 ; AVX512-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
926 ; AVX512-NEXT: vpsraw $4, %xmm3, %xmm4
927 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
928 ; AVX512-NEXT: vpsraw $2, %xmm3, %xmm4
929 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
930 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
931 ; AVX512-NEXT: vpsraw $1, %xmm3, %xmm4
932 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
933 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
934 ; AVX512-NEXT: vpsrlw $8, %xmm2, %xmm2
935 ; 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]
936 ; AVX512-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
937 ; AVX512-NEXT: vpsraw $4, %xmm0, %xmm3
938 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
939 ; AVX512-NEXT: vpsraw $2, %xmm0, %xmm3
940 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
941 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
942 ; AVX512-NEXT: vpsraw $1, %xmm0, %xmm3
943 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
944 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
945 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm0
946 ; AVX512-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
949 ; X32-SSE-LABEL: splatvar_shift_v16i8:
951 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
952 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
953 ; X32-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
954 ; X32-SSE-NEXT: pshufhw {{.*#+}} xmm3 = xmm1[0,1,2,3,4,4,4,4]
955 ; 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]
956 ; X32-SSE-NEXT: psllw $5, %xmm3
957 ; 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]
958 ; X32-SSE-NEXT: pxor %xmm2, %xmm2
959 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
960 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
961 ; X32-SSE-NEXT: movdqa %xmm5, %xmm6
962 ; X32-SSE-NEXT: pandn %xmm1, %xmm6
963 ; X32-SSE-NEXT: psraw $4, %xmm1
964 ; X32-SSE-NEXT: pand %xmm5, %xmm1
965 ; X32-SSE-NEXT: por %xmm6, %xmm1
966 ; X32-SSE-NEXT: paddw %xmm4, %xmm4
967 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
968 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
969 ; X32-SSE-NEXT: movdqa %xmm5, %xmm6
970 ; X32-SSE-NEXT: pandn %xmm1, %xmm6
971 ; X32-SSE-NEXT: psraw $2, %xmm1
972 ; X32-SSE-NEXT: pand %xmm5, %xmm1
973 ; X32-SSE-NEXT: por %xmm6, %xmm1
974 ; X32-SSE-NEXT: paddw %xmm4, %xmm4
975 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
976 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
977 ; X32-SSE-NEXT: movdqa %xmm5, %xmm4
978 ; X32-SSE-NEXT: pandn %xmm1, %xmm4
979 ; X32-SSE-NEXT: psraw $1, %xmm1
980 ; X32-SSE-NEXT: pand %xmm5, %xmm1
981 ; X32-SSE-NEXT: por %xmm4, %xmm1
982 ; X32-SSE-NEXT: psrlw $8, %xmm1
983 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
984 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
985 ; X32-SSE-NEXT: pxor %xmm4, %xmm4
986 ; X32-SSE-NEXT: pcmpgtw %xmm3, %xmm4
987 ; X32-SSE-NEXT: movdqa %xmm4, %xmm5
988 ; X32-SSE-NEXT: pandn %xmm0, %xmm5
989 ; X32-SSE-NEXT: psraw $4, %xmm0
990 ; X32-SSE-NEXT: pand %xmm4, %xmm0
991 ; X32-SSE-NEXT: por %xmm5, %xmm0
992 ; X32-SSE-NEXT: paddw %xmm3, %xmm3
993 ; X32-SSE-NEXT: pxor %xmm4, %xmm4
994 ; X32-SSE-NEXT: pcmpgtw %xmm3, %xmm4
995 ; X32-SSE-NEXT: movdqa %xmm4, %xmm5
996 ; X32-SSE-NEXT: pandn %xmm0, %xmm5
997 ; X32-SSE-NEXT: psraw $2, %xmm0
998 ; X32-SSE-NEXT: pand %xmm4, %xmm0
999 ; X32-SSE-NEXT: por %xmm5, %xmm0
1000 ; X32-SSE-NEXT: paddw %xmm3, %xmm3
1001 ; X32-SSE-NEXT: pcmpgtw %xmm3, %xmm2
1002 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3
1003 ; X32-SSE-NEXT: pandn %xmm0, %xmm3
1004 ; X32-SSE-NEXT: psraw $1, %xmm0
1005 ; X32-SSE-NEXT: pand %xmm2, %xmm0
1006 ; X32-SSE-NEXT: por %xmm3, %xmm0
1007 ; X32-SSE-NEXT: psrlw $8, %xmm0
1008 ; X32-SSE-NEXT: packuswb %xmm1, %xmm0
1009 ; X32-SSE-NEXT: retl
1010 %splat = shufflevector <16 x i8> %b, <16 x i8> undef, <16 x i32> zeroinitializer
1011 %shift = ashr <16 x i8> %a, %splat
1012 ret <16 x i8> %shift
1019 define <2 x i64> @constant_shift_v2i64(<2 x i64> %a) nounwind {
1020 ; SSE2-LABEL: constant_shift_v2i64:
1022 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1023 ; SSE2-NEXT: psrlq $7, %xmm1
1024 ; SSE2-NEXT: psrlq $1, %xmm0
1025 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1026 ; SSE2-NEXT: movapd {{.*#+}} xmm0 = [4611686018427387904,72057594037927936]
1027 ; SSE2-NEXT: xorpd %xmm0, %xmm1
1028 ; SSE2-NEXT: psubq %xmm0, %xmm1
1029 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1032 ; SSE41-LABEL: constant_shift_v2i64:
1034 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1035 ; SSE41-NEXT: psrlq $7, %xmm1
1036 ; SSE41-NEXT: psrlq $1, %xmm0
1037 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1038 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]
1039 ; SSE41-NEXT: pxor %xmm1, %xmm0
1040 ; SSE41-NEXT: psubq %xmm1, %xmm0
1043 ; AVX1-LABEL: constant_shift_v2i64:
1045 ; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm1
1046 ; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0
1047 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1048 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]
1049 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
1050 ; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm0
1053 ; AVX2-LABEL: constant_shift_v2i64:
1055 ; AVX2-NEXT: vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
1056 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]
1057 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
1058 ; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm0
1061 ; XOP-LABEL: constant_shift_v2i64:
1063 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1064 ; XOP-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm1
1065 ; XOP-NEXT: vpshaq %xmm1, %xmm0, %xmm0
1068 ; AVX512-LABEL: constant_shift_v2i64:
1070 ; AVX512-NEXT: vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
1071 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]
1072 ; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0
1073 ; AVX512-NEXT: vpsubq %xmm1, %xmm0, %xmm0
1076 ; X32-SSE-LABEL: constant_shift_v2i64:
1078 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm1 = [0,2147483648,0,2147483648]
1079 ; X32-SSE-NEXT: movdqa %xmm1, %xmm2
1080 ; X32-SSE-NEXT: psrlq $7, %xmm2
1081 ; X32-SSE-NEXT: psrlq $1, %xmm1
1082 ; X32-SSE-NEXT: movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]
1083 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1
1084 ; X32-SSE-NEXT: psrlq $7, %xmm1
1085 ; X32-SSE-NEXT: psrlq $1, %xmm0
1086 ; X32-SSE-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1087 ; X32-SSE-NEXT: xorpd %xmm2, %xmm1
1088 ; X32-SSE-NEXT: psubq %xmm2, %xmm1
1089 ; X32-SSE-NEXT: movdqa %xmm1, %xmm0
1090 ; X32-SSE-NEXT: retl
1091 %shift = ashr <2 x i64> %a, <i64 1, i64 7>
1092 ret <2 x i64> %shift
1095 define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind {
1096 ; SSE2-LABEL: constant_shift_v4i32:
1098 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1099 ; SSE2-NEXT: psrad $7, %xmm1
1100 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1101 ; SSE2-NEXT: psrad $5, %xmm2
1102 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
1103 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1104 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1105 ; SSE2-NEXT: psrad $6, %xmm2
1106 ; SSE2-NEXT: psrad $4, %xmm0
1107 ; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
1108 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1109 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1112 ; SSE41-LABEL: constant_shift_v4i32:
1114 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1115 ; SSE41-NEXT: psrad $7, %xmm1
1116 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1117 ; SSE41-NEXT: psrad $5, %xmm2
1118 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]
1119 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1120 ; SSE41-NEXT: psrad $6, %xmm1
1121 ; SSE41-NEXT: psrad $4, %xmm0
1122 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1123 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1126 ; AVX1-LABEL: constant_shift_v4i32:
1128 ; AVX1-NEXT: vpsrad $7, %xmm0, %xmm1
1129 ; AVX1-NEXT: vpsrad $5, %xmm0, %xmm2
1130 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
1131 ; AVX1-NEXT: vpsrad $6, %xmm0, %xmm2
1132 ; AVX1-NEXT: vpsrad $4, %xmm0, %xmm0
1133 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
1134 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
1137 ; AVX2-LABEL: constant_shift_v4i32:
1139 ; AVX2-NEXT: vpsravd {{.*}}(%rip), %xmm0, %xmm0
1142 ; XOPAVX1-LABEL: constant_shift_v4i32:
1144 ; XOPAVX1-NEXT: vpshad {{.*}}(%rip), %xmm0, %xmm0
1145 ; XOPAVX1-NEXT: retq
1147 ; XOPAVX2-LABEL: constant_shift_v4i32:
1149 ; XOPAVX2-NEXT: vpsravd {{.*}}(%rip), %xmm0, %xmm0
1150 ; XOPAVX2-NEXT: retq
1152 ; AVX512-LABEL: constant_shift_v4i32:
1154 ; AVX512-NEXT: vpsravd {{.*}}(%rip), %xmm0, %xmm0
1157 ; X32-SSE-LABEL: constant_shift_v4i32:
1159 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1
1160 ; X32-SSE-NEXT: psrad $7, %xmm1
1161 ; X32-SSE-NEXT: movdqa %xmm0, %xmm2
1162 ; X32-SSE-NEXT: psrad $5, %xmm2
1163 ; X32-SSE-NEXT: movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
1164 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1165 ; X32-SSE-NEXT: movdqa %xmm0, %xmm2
1166 ; X32-SSE-NEXT: psrad $6, %xmm2
1167 ; X32-SSE-NEXT: psrad $4, %xmm0
1168 ; X32-SSE-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
1169 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1170 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1171 ; X32-SSE-NEXT: retl
1172 %shift = ashr <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>
1173 ret <4 x i32> %shift
1176 define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind {
1177 ; SSE2-LABEL: constant_shift_v8i16:
1179 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1180 ; SSE2-NEXT: psraw $4, %xmm1
1181 ; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1182 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
1183 ; SSE2-NEXT: psraw $2, %xmm1
1184 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
1185 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1186 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]
1187 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1188 ; SSE2-NEXT: pand %xmm0, %xmm1
1189 ; SSE2-NEXT: psraw $1, %xmm2
1190 ; SSE2-NEXT: pandn %xmm2, %xmm0
1191 ; SSE2-NEXT: por %xmm1, %xmm0
1194 ; SSE41-LABEL: constant_shift_v8i16:
1196 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1197 ; SSE41-NEXT: movdqa %xmm1, %xmm2
1198 ; SSE41-NEXT: psraw $8, %xmm2
1199 ; SSE41-NEXT: movaps {{.*#+}} xmm0 = [0,4112,8224,12336,16448,20560,24672,28784]
1200 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
1201 ; SSE41-NEXT: movdqa %xmm1, %xmm2
1202 ; SSE41-NEXT: psraw $4, %xmm2
1203 ; SSE41-NEXT: movaps {{.*#+}} xmm0 = [0,8224,16448,24672,32896,41120,49344,57568]
1204 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
1205 ; SSE41-NEXT: movdqa %xmm1, %xmm2
1206 ; SSE41-NEXT: psraw $2, %xmm2
1207 ; SSE41-NEXT: movaps {{.*#+}} xmm0 = [0,16448,32896,49344,256,16704,33152,49600]
1208 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
1209 ; SSE41-NEXT: movdqa %xmm1, %xmm2
1210 ; SSE41-NEXT: psraw $1, %xmm2
1211 ; SSE41-NEXT: movaps {{.*#+}} xmm0 = [0,32896,256,33152,512,33408,768,33664]
1212 ; SSE41-NEXT: pblendvb %xmm2, %xmm1
1213 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1216 ; AVX1-LABEL: constant_shift_v8i16:
1218 ; AVX1-NEXT: vpsraw $8, %xmm0, %xmm1
1219 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,4112,8224,12336,16448,20560,24672,28784]
1220 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
1221 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm1
1222 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,8224,16448,24672,32896,41120,49344,57568]
1223 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
1224 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1
1225 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,16448,32896,49344,256,16704,33152,49600]
1226 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
1227 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1
1228 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,32896,256,33152,512,33408,768,33664]
1229 ; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
1232 ; AVX2-LABEL: constant_shift_v8i16:
1234 ; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
1235 ; 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
1236 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0
1237 ; 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
1238 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1239 ; AVX2-NEXT: vzeroupper
1242 ; XOP-LABEL: constant_shift_v8i16:
1244 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1245 ; XOP-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm1
1246 ; XOP-NEXT: vpshaw %xmm1, %xmm0, %xmm0
1249 ; AVX512-LABEL: constant_shift_v8i16:
1251 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]
1252 ; AVX512-NEXT: vpsravw %zmm1, %zmm0, %zmm0
1255 ; X32-SSE-LABEL: constant_shift_v8i16:
1257 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1
1258 ; X32-SSE-NEXT: psraw $4, %xmm1
1259 ; X32-SSE-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1260 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
1261 ; X32-SSE-NEXT: psraw $2, %xmm1
1262 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
1263 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1264 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]
1265 ; X32-SSE-NEXT: movdqa %xmm2, %xmm1
1266 ; X32-SSE-NEXT: pand %xmm0, %xmm1
1267 ; X32-SSE-NEXT: psraw $1, %xmm2
1268 ; X32-SSE-NEXT: pandn %xmm2, %xmm0
1269 ; X32-SSE-NEXT: por %xmm1, %xmm0
1270 ; X32-SSE-NEXT: retl
1271 %shift = ashr <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>
1272 ret <8 x i16> %shift
1275 define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind {
1276 ; SSE2-LABEL: constant_shift_v16i8:
1278 ; 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]
1279 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1280 ; SSE2-NEXT: psllw $5, %xmm3
1281 ; 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]
1282 ; SSE2-NEXT: pxor %xmm2, %xmm2
1283 ; SSE2-NEXT: pxor %xmm5, %xmm5
1284 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
1285 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1286 ; SSE2-NEXT: pandn %xmm1, %xmm6
1287 ; SSE2-NEXT: psraw $4, %xmm1
1288 ; SSE2-NEXT: pand %xmm5, %xmm1
1289 ; SSE2-NEXT: por %xmm6, %xmm1
1290 ; SSE2-NEXT: paddw %xmm4, %xmm4
1291 ; SSE2-NEXT: pxor %xmm5, %xmm5
1292 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
1293 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1294 ; SSE2-NEXT: pandn %xmm1, %xmm6
1295 ; SSE2-NEXT: psraw $2, %xmm1
1296 ; SSE2-NEXT: pand %xmm5, %xmm1
1297 ; SSE2-NEXT: por %xmm6, %xmm1
1298 ; SSE2-NEXT: paddw %xmm4, %xmm4
1299 ; SSE2-NEXT: pxor %xmm5, %xmm5
1300 ; SSE2-NEXT: pcmpgtw %xmm4, %xmm5
1301 ; SSE2-NEXT: movdqa %xmm5, %xmm4
1302 ; SSE2-NEXT: pandn %xmm1, %xmm4
1303 ; SSE2-NEXT: psraw $1, %xmm1
1304 ; SSE2-NEXT: pand %xmm5, %xmm1
1305 ; SSE2-NEXT: por %xmm4, %xmm1
1306 ; SSE2-NEXT: psrlw $8, %xmm1
1307 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1308 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1309 ; SSE2-NEXT: pxor %xmm4, %xmm4
1310 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm4
1311 ; SSE2-NEXT: movdqa %xmm4, %xmm5
1312 ; SSE2-NEXT: pandn %xmm0, %xmm5
1313 ; SSE2-NEXT: psraw $4, %xmm0
1314 ; SSE2-NEXT: pand %xmm4, %xmm0
1315 ; SSE2-NEXT: por %xmm5, %xmm0
1316 ; SSE2-NEXT: paddw %xmm3, %xmm3
1317 ; SSE2-NEXT: pxor %xmm4, %xmm4
1318 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm4
1319 ; SSE2-NEXT: movdqa %xmm4, %xmm5
1320 ; SSE2-NEXT: pandn %xmm0, %xmm5
1321 ; SSE2-NEXT: psraw $2, %xmm0
1322 ; SSE2-NEXT: pand %xmm4, %xmm0
1323 ; SSE2-NEXT: por %xmm5, %xmm0
1324 ; SSE2-NEXT: paddw %xmm3, %xmm3
1325 ; SSE2-NEXT: pcmpgtw %xmm3, %xmm2
1326 ; SSE2-NEXT: movdqa %xmm2, %xmm3
1327 ; SSE2-NEXT: pandn %xmm0, %xmm3
1328 ; SSE2-NEXT: psraw $1, %xmm0
1329 ; SSE2-NEXT: pand %xmm2, %xmm0
1330 ; SSE2-NEXT: por %xmm3, %xmm0
1331 ; SSE2-NEXT: psrlw $8, %xmm0
1332 ; SSE2-NEXT: packuswb %xmm1, %xmm0
1335 ; SSE41-LABEL: constant_shift_v16i8:
1337 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1338 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1339 ; SSE41-NEXT: psllw $5, %xmm3
1340 ; 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]
1341 ; 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]
1342 ; SSE41-NEXT: movdqa %xmm2, %xmm4
1343 ; SSE41-NEXT: psraw $4, %xmm4
1344 ; SSE41-NEXT: pblendvb %xmm4, %xmm2
1345 ; SSE41-NEXT: movdqa %xmm2, %xmm4
1346 ; SSE41-NEXT: psraw $2, %xmm4
1347 ; SSE41-NEXT: paddw %xmm0, %xmm0
1348 ; SSE41-NEXT: pblendvb %xmm4, %xmm2
1349 ; SSE41-NEXT: movdqa %xmm2, %xmm4
1350 ; SSE41-NEXT: psraw $1, %xmm4
1351 ; SSE41-NEXT: paddw %xmm0, %xmm0
1352 ; SSE41-NEXT: pblendvb %xmm4, %xmm2
1353 ; SSE41-NEXT: psrlw $8, %xmm2
1354 ; 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]
1355 ; SSE41-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1356 ; SSE41-NEXT: movdqa %xmm1, %xmm3
1357 ; SSE41-NEXT: psraw $4, %xmm3
1358 ; SSE41-NEXT: pblendvb %xmm3, %xmm1
1359 ; SSE41-NEXT: movdqa %xmm1, %xmm3
1360 ; SSE41-NEXT: psraw $2, %xmm3
1361 ; SSE41-NEXT: paddw %xmm0, %xmm0
1362 ; SSE41-NEXT: pblendvb %xmm3, %xmm1
1363 ; SSE41-NEXT: movdqa %xmm1, %xmm3
1364 ; SSE41-NEXT: psraw $1, %xmm3
1365 ; SSE41-NEXT: paddw %xmm0, %xmm0
1366 ; SSE41-NEXT: pblendvb %xmm3, %xmm1
1367 ; SSE41-NEXT: psrlw $8, %xmm1
1368 ; SSE41-NEXT: packuswb %xmm2, %xmm1
1369 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1372 ; AVX-LABEL: constant_shift_v16i8:
1374 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1375 ; AVX-NEXT: vpsllw $5, %xmm1, %xmm1
1376 ; 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]
1377 ; AVX-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1378 ; AVX-NEXT: vpsraw $4, %xmm3, %xmm4
1379 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
1380 ; AVX-NEXT: vpsraw $2, %xmm3, %xmm4
1381 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
1382 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
1383 ; AVX-NEXT: vpsraw $1, %xmm3, %xmm4
1384 ; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm2
1385 ; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
1386 ; AVX-NEXT: vpsrlw $8, %xmm2, %xmm2
1387 ; 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]
1388 ; AVX-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1389 ; AVX-NEXT: vpsraw $4, %xmm0, %xmm3
1390 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1391 ; AVX-NEXT: vpsraw $2, %xmm0, %xmm3
1392 ; AVX-NEXT: vpaddw %xmm1, %xmm1, %xmm1
1393 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1394 ; AVX-NEXT: vpsraw $1, %xmm0, %xmm3
1395 ; AVX-NEXT: vpaddw %xmm1, %xmm1, %xmm1
1396 ; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1397 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm0
1398 ; AVX-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
1401 ; XOP-LABEL: constant_shift_v16i8:
1403 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1404 ; XOP-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1
1405 ; XOP-NEXT: vpshab %xmm1, %xmm0, %xmm0
1408 ; AVX512-LABEL: constant_shift_v16i8:
1410 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1411 ; AVX512-NEXT: vpsllw $5, %xmm1, %xmm1
1412 ; 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]
1413 ; AVX512-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1414 ; AVX512-NEXT: vpsraw $4, %xmm3, %xmm4
1415 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
1416 ; AVX512-NEXT: vpsraw $2, %xmm3, %xmm4
1417 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
1418 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
1419 ; AVX512-NEXT: vpsraw $1, %xmm3, %xmm4
1420 ; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
1421 ; AVX512-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
1422 ; AVX512-NEXT: vpsrlw $8, %xmm2, %xmm2
1423 ; 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]
1424 ; AVX512-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1425 ; AVX512-NEXT: vpsraw $4, %xmm0, %xmm3
1426 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1427 ; AVX512-NEXT: vpsraw $2, %xmm0, %xmm3
1428 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
1429 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1430 ; AVX512-NEXT: vpsraw $1, %xmm0, %xmm3
1431 ; AVX512-NEXT: vpaddw %xmm1, %xmm1, %xmm1
1432 ; AVX512-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1433 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm0
1434 ; AVX512-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
1437 ; X32-SSE-LABEL: constant_shift_v16i8:
1439 ; 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]
1440 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1441 ; X32-SSE-NEXT: psllw $5, %xmm3
1442 ; 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]
1443 ; X32-SSE-NEXT: pxor %xmm2, %xmm2
1444 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
1445 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
1446 ; X32-SSE-NEXT: movdqa %xmm5, %xmm6
1447 ; X32-SSE-NEXT: pandn %xmm1, %xmm6
1448 ; X32-SSE-NEXT: psraw $4, %xmm1
1449 ; X32-SSE-NEXT: pand %xmm5, %xmm1
1450 ; X32-SSE-NEXT: por %xmm6, %xmm1
1451 ; X32-SSE-NEXT: paddw %xmm4, %xmm4
1452 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
1453 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
1454 ; X32-SSE-NEXT: movdqa %xmm5, %xmm6
1455 ; X32-SSE-NEXT: pandn %xmm1, %xmm6
1456 ; X32-SSE-NEXT: psraw $2, %xmm1
1457 ; X32-SSE-NEXT: pand %xmm5, %xmm1
1458 ; X32-SSE-NEXT: por %xmm6, %xmm1
1459 ; X32-SSE-NEXT: paddw %xmm4, %xmm4
1460 ; X32-SSE-NEXT: pxor %xmm5, %xmm5
1461 ; X32-SSE-NEXT: pcmpgtw %xmm4, %xmm5
1462 ; X32-SSE-NEXT: movdqa %xmm5, %xmm4
1463 ; X32-SSE-NEXT: pandn %xmm1, %xmm4
1464 ; X32-SSE-NEXT: psraw $1, %xmm1
1465 ; X32-SSE-NEXT: pand %xmm5, %xmm1
1466 ; X32-SSE-NEXT: por %xmm4, %xmm1
1467 ; X32-SSE-NEXT: psrlw $8, %xmm1
1468 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1469 ; X32-SSE-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1470 ; X32-SSE-NEXT: pxor %xmm4, %xmm4
1471 ; X32-SSE-NEXT: pcmpgtw %xmm3, %xmm4
1472 ; X32-SSE-NEXT: movdqa %xmm4, %xmm5
1473 ; X32-SSE-NEXT: pandn %xmm0, %xmm5
1474 ; X32-SSE-NEXT: psraw $4, %xmm0
1475 ; X32-SSE-NEXT: pand %xmm4, %xmm0
1476 ; X32-SSE-NEXT: por %xmm5, %xmm0
1477 ; X32-SSE-NEXT: paddw %xmm3, %xmm3
1478 ; X32-SSE-NEXT: pxor %xmm4, %xmm4
1479 ; X32-SSE-NEXT: pcmpgtw %xmm3, %xmm4
1480 ; X32-SSE-NEXT: movdqa %xmm4, %xmm5
1481 ; X32-SSE-NEXT: pandn %xmm0, %xmm5
1482 ; X32-SSE-NEXT: psraw $2, %xmm0
1483 ; X32-SSE-NEXT: pand %xmm4, %xmm0
1484 ; X32-SSE-NEXT: por %xmm5, %xmm0
1485 ; X32-SSE-NEXT: paddw %xmm3, %xmm3
1486 ; X32-SSE-NEXT: pcmpgtw %xmm3, %xmm2
1487 ; X32-SSE-NEXT: movdqa %xmm2, %xmm3
1488 ; X32-SSE-NEXT: pandn %xmm0, %xmm3
1489 ; X32-SSE-NEXT: psraw $1, %xmm0
1490 ; X32-SSE-NEXT: pand %xmm2, %xmm0
1491 ; X32-SSE-NEXT: por %xmm3, %xmm0
1492 ; X32-SSE-NEXT: psrlw $8, %xmm0
1493 ; X32-SSE-NEXT: packuswb %xmm1, %xmm0
1494 ; X32-SSE-NEXT: retl
1495 %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>
1496 ret <16 x i8> %shift
1500 ; Uniform Constant Shifts
1503 define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind {
1504 ; SSE2-LABEL: splatconstant_shift_v2i64:
1506 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1507 ; SSE2-NEXT: psrad $7, %xmm1
1508 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1509 ; SSE2-NEXT: psrlq $7, %xmm0
1510 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1511 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1514 ; SSE41-LABEL: splatconstant_shift_v2i64:
1516 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1517 ; SSE41-NEXT: psrad $7, %xmm1
1518 ; SSE41-NEXT: psrlq $7, %xmm0
1519 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
1522 ; AVX1-LABEL: splatconstant_shift_v2i64:
1524 ; AVX1-NEXT: vpsrad $7, %xmm0, %xmm1
1525 ; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm0
1526 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
1529 ; AVX2-LABEL: splatconstant_shift_v2i64:
1531 ; AVX2-NEXT: vpsrad $7, %xmm0, %xmm1
1532 ; AVX2-NEXT: vpsrlq $7, %xmm0, %xmm0
1533 ; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1536 ; XOP-LABEL: splatconstant_shift_v2i64:
1538 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1539 ; XOP-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm1
1540 ; XOP-NEXT: vpshaq %xmm1, %xmm0, %xmm0
1543 ; AVX512-LABEL: splatconstant_shift_v2i64:
1545 ; AVX512-NEXT: vpsrad $7, %xmm0, %xmm1
1546 ; AVX512-NEXT: vpsrlq $7, %xmm0, %xmm0
1547 ; AVX512-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1550 ; X32-SSE-LABEL: splatconstant_shift_v2i64:
1552 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1
1553 ; X32-SSE-NEXT: psrad $7, %xmm1
1554 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1555 ; X32-SSE-NEXT: psrlq $7, %xmm0
1556 ; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1557 ; X32-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1558 ; X32-SSE-NEXT: retl
1559 %shift = ashr <2 x i64> %a, <i64 7, i64 7>
1560 ret <2 x i64> %shift
1563 define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind {
1564 ; SSE-LABEL: splatconstant_shift_v4i32:
1566 ; SSE-NEXT: psrad $5, %xmm0
1569 ; AVX-LABEL: splatconstant_shift_v4i32:
1571 ; AVX-NEXT: vpsrad $5, %xmm0, %xmm0
1574 ; XOP-LABEL: splatconstant_shift_v4i32:
1576 ; XOP-NEXT: vpsrad $5, %xmm0, %xmm0
1579 ; AVX512-LABEL: splatconstant_shift_v4i32:
1581 ; AVX512-NEXT: vpsrad $5, %xmm0, %xmm0
1584 ; X32-SSE-LABEL: splatconstant_shift_v4i32:
1586 ; X32-SSE-NEXT: psrad $5, %xmm0
1587 ; X32-SSE-NEXT: retl
1588 %shift = ashr <4 x i32> %a, <i32 5, i32 5, i32 5, i32 5>
1589 ret <4 x i32> %shift
1592 define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind {
1593 ; SSE-LABEL: splatconstant_shift_v8i16:
1595 ; SSE-NEXT: psraw $3, %xmm0
1598 ; AVX-LABEL: splatconstant_shift_v8i16:
1600 ; AVX-NEXT: vpsraw $3, %xmm0, %xmm0
1603 ; XOP-LABEL: splatconstant_shift_v8i16:
1605 ; XOP-NEXT: vpsraw $3, %xmm0, %xmm0
1608 ; AVX512-LABEL: splatconstant_shift_v8i16:
1610 ; AVX512-NEXT: vpsraw $3, %xmm0, %xmm0
1613 ; X32-SSE-LABEL: splatconstant_shift_v8i16:
1615 ; X32-SSE-NEXT: psraw $3, %xmm0
1616 ; X32-SSE-NEXT: retl
1617 %shift = ashr <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
1618 ret <8 x i16> %shift
1621 define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind {
1622 ; SSE-LABEL: splatconstant_shift_v16i8:
1624 ; SSE-NEXT: psrlw $3, %xmm0
1625 ; SSE-NEXT: pand {{.*}}(%rip), %xmm0
1626 ; SSE-NEXT: movdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1627 ; SSE-NEXT: pxor %xmm1, %xmm0
1628 ; SSE-NEXT: psubb %xmm1, %xmm0
1631 ; AVX-LABEL: splatconstant_shift_v16i8:
1633 ; AVX-NEXT: vpsrlw $3, %xmm0, %xmm0
1634 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
1635 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1636 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
1637 ; AVX-NEXT: vpsubb %xmm1, %xmm0, %xmm0
1640 ; XOP-LABEL: splatconstant_shift_v16i8:
1642 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1643 ; XOP-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1
1644 ; XOP-NEXT: vpshab %xmm1, %xmm0, %xmm0
1647 ; AVX512-LABEL: splatconstant_shift_v16i8:
1649 ; AVX512-NEXT: vpsrlw $3, %xmm0, %xmm0
1650 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
1651 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1652 ; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0
1653 ; AVX512-NEXT: vpsubb %xmm1, %xmm0, %xmm0
1656 ; X32-SSE-LABEL: splatconstant_shift_v16i8:
1658 ; X32-SSE-NEXT: psrlw $3, %xmm0
1659 ; X32-SSE-NEXT: pand .LCPI15_0, %xmm0
1660 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1661 ; X32-SSE-NEXT: pxor %xmm1, %xmm0
1662 ; X32-SSE-NEXT: psubb %xmm1, %xmm0
1663 ; X32-SSE-NEXT: retl
1664 %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>
1665 ret <16 x i8> %shift