]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/vector-shift-ashr-128.ll
Vendor import of llvm trunk r291274:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / vector-shift-ashr-128.ll
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
9
10 ;
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
13
14 ;
15 ; Variable Shifts
16 ;
17
18 define <2 x i64> @var_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
19 ; SSE2-LABEL: var_shift_v2i64:
20 ; SSE2:       # BB#0:
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
34 ; SSE2-NEXT:    retq
35 ;
36 ; SSE41-LABEL: var_shift_v2i64:
37 ; SSE41:       # BB#0:
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
50 ; SSE41-NEXT:    retq
51 ;
52 ; AVX1-LABEL: var_shift_v2i64:
53 ; AVX1:       # BB#0:
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
64 ; AVX1-NEXT:    retq
65 ;
66 ; AVX2-LABEL: var_shift_v2i64:
67 ; AVX2:       # BB#0:
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
73 ; AVX2-NEXT:    retq
74 ;
75 ; XOP-LABEL: var_shift_v2i64:
76 ; XOP:       # BB#0:
77 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
78 ; XOP-NEXT:    vpsubq %xmm1, %xmm2, %xmm1
79 ; XOP-NEXT:    vpshaq %xmm1, %xmm0, %xmm0
80 ; XOP-NEXT:    retq
81 ;
82 ; AVX512-LABEL: var_shift_v2i64:
83 ; AVX512:       # BB#0:
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
89 ; AVX512-NEXT:    retq
90 ;
91 ; X32-SSE-LABEL: var_shift_v2i64:
92 ; X32-SSE:       # BB#0:
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
106 ; X32-SSE-NEXT:    retl
107   %shift = ashr <2 x i64> %a, %b
108   ret <2 x i64> %shift
109 }
110
111 define <4 x i32> @var_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
112 ; SSE2-LABEL: var_shift_v4i32:
113 ; SSE2:       # BB#0:
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]
134 ; SSE2-NEXT:    retq
135 ;
136 ; SSE41-LABEL: var_shift_v4i32:
137 ; SSE41:       # BB#0:
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]
155 ; SSE41-NEXT:    retq
156 ;
157 ; AVX1-LABEL: var_shift_v4i32:
158 ; AVX1:       # BB#0:
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]
171 ; AVX1-NEXT:    retq
172 ;
173 ; AVX2-LABEL: var_shift_v4i32:
174 ; AVX2:       # BB#0:
175 ; AVX2-NEXT:    vpsravd %xmm1, %xmm0, %xmm0
176 ; AVX2-NEXT:    retq
177 ;
178 ; XOPAVX1-LABEL: var_shift_v4i32:
179 ; XOPAVX1:       # BB#0:
180 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
181 ; XOPAVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm1
182 ; XOPAVX1-NEXT:    vpshad %xmm1, %xmm0, %xmm0
183 ; XOPAVX1-NEXT:    retq
184 ;
185 ; XOPAVX2-LABEL: var_shift_v4i32:
186 ; XOPAVX2:       # BB#0:
187 ; XOPAVX2-NEXT:    vpsravd %xmm1, %xmm0, %xmm0
188 ; XOPAVX2-NEXT:    retq
189 ;
190 ; AVX512-LABEL: var_shift_v4i32:
191 ; AVX512:       # BB#0:
192 ; AVX512-NEXT:    vpsravd %xmm1, %xmm0, %xmm0
193 ; AVX512-NEXT:    retq
194 ;
195 ; X32-SSE-LABEL: var_shift_v4i32:
196 ; X32-SSE:       # BB#0:
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]
217 ; X32-SSE-NEXT:    retl
218   %shift = ashr <4 x i32> %a, %b
219   ret <4 x i32> %shift
220 }
221
222 define <8 x i16> @var_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
223 ; SSE2-LABEL: var_shift_v8i16:
224 ; SSE2:       # BB#0:
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
256 ; SSE2-NEXT:    retq
257 ;
258 ; SSE41-LABEL: var_shift_v8i16:
259 ; SSE41:       # BB#0:
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
286 ; SSE41-NEXT:    retq
287 ;
288 ; AVX1-LABEL: var_shift_v8i16:
289 ; AVX1:       # BB#0:
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
304 ; AVX1-NEXT:    retq
305 ;
306 ; AVX2-LABEL: var_shift_v8i16:
307 ; AVX2:       # BB#0:
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
315 ; AVX2-NEXT:    retq
316 ;
317 ; XOP-LABEL: var_shift_v8i16:
318 ; XOP:       # BB#0:
319 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
320 ; XOP-NEXT:    vpsubw %xmm1, %xmm2, %xmm1
321 ; XOP-NEXT:    vpshaw %xmm1, %xmm0, %xmm0
322 ; XOP-NEXT:    retq
323 ;
324 ; AVX512-LABEL: var_shift_v8i16:
325 ; AVX512:       # BB#0:
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>
330 ; AVX512-NEXT:    retq
331 ;
332 ; X32-SSE-LABEL: var_shift_v8i16:
333 ; X32-SSE:       # BB#0:
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
365 ; X32-SSE-NEXT:    retl
366   %shift = ashr <8 x i16> %a, %b
367   ret <8 x i16> %shift
368 }
369
370 define <16 x i8> @var_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
371 ; SSE2-LABEL: var_shift_v16i8:
372 ; SSE2:       # BB#0:
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
427 ; SSE2-NEXT:    retq
428 ;
429 ; SSE41-LABEL: var_shift_v16i8:
430 ; SSE41:       # BB#0:
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
463 ; SSE41-NEXT:    retq
464 ;
465 ; AVX-LABEL: var_shift_v16i8:
466 ; AVX:       # BB#0:
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
491 ; AVX-NEXT:    retq
492 ;
493 ; XOP-LABEL: var_shift_v16i8:
494 ; XOP:       # BB#0:
495 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
496 ; XOP-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
497 ; XOP-NEXT:    vpshab %xmm1, %xmm0, %xmm0
498 ; XOP-NEXT:    retq
499 ;
500 ; AVX512-LABEL: var_shift_v16i8:
501 ; AVX512:       # BB#0:
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
526 ; AVX512-NEXT:    retq
527 ;
528 ; X32-SSE-LABEL: var_shift_v16i8:
529 ; X32-SSE:       # BB#0:
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
584 ; X32-SSE-NEXT:    retl
585   %shift = ashr <16 x i8> %a, %b
586   ret <16 x i8> %shift
587 }
588
589 ;
590 ; Uniform Variable Shifts
591 ;
592
593 define <2 x i64> @splatvar_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
594 ; SSE-LABEL: splatvar_shift_v2i64:
595 ; SSE:       # BB#0:
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
601 ; SSE-NEXT:    retq
602 ;
603 ; AVX-LABEL: splatvar_shift_v2i64:
604 ; AVX:       # BB#0:
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
610 ; AVX-NEXT:    retq
611 ;
612 ; XOPAVX1-LABEL: splatvar_shift_v2i64:
613 ; XOPAVX1:       # BB#0:
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
618 ; XOPAVX1-NEXT:    retq
619 ;
620 ; XOPAVX2-LABEL: splatvar_shift_v2i64:
621 ; XOPAVX2:       # BB#0:
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
626 ; XOPAVX2-NEXT:    retq
627 ;
628 ; AVX512-LABEL: splatvar_shift_v2i64:
629 ; AVX512:       # BB#0:
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
635 ; AVX512-NEXT:    retq
636 ;
637 ; X32-SSE-LABEL: splatvar_shift_v2i64:
638 ; X32-SSE:       # BB#0:
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
644 ; X32-SSE-NEXT:    retl
645   %splat = shufflevector <2 x i64> %b, <2 x i64> undef, <2 x i32> zeroinitializer
646   %shift = ashr <2 x i64> %a, %splat
647   ret <2 x i64> %shift
648 }
649
650 define <4 x i32> @splatvar_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
651 ; SSE2-LABEL: splatvar_shift_v4i32:
652 ; SSE2:       # BB#0:
653 ; SSE2-NEXT:    xorps %xmm2, %xmm2
654 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
655 ; SSE2-NEXT:    psrad %xmm2, %xmm0
656 ; SSE2-NEXT:    retq
657 ;
658 ; SSE41-LABEL: splatvar_shift_v4i32:
659 ; SSE41:       # BB#0:
660 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
661 ; SSE41-NEXT:    psrad %xmm1, %xmm0
662 ; SSE41-NEXT:    retq
663 ;
664 ; AVX-LABEL: splatvar_shift_v4i32:
665 ; AVX:       # BB#0:
666 ; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
667 ; AVX-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
668 ; AVX-NEXT:    retq
669 ;
670 ; XOP-LABEL: splatvar_shift_v4i32:
671 ; XOP:       # BB#0:
672 ; XOP-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
673 ; XOP-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
674 ; XOP-NEXT:    retq
675 ;
676 ; AVX512-LABEL: splatvar_shift_v4i32:
677 ; AVX512:       # BB#0:
678 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
679 ; AVX512-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
680 ; AVX512-NEXT:    retq
681 ;
682 ; X32-SSE-LABEL: splatvar_shift_v4i32:
683 ; X32-SSE:       # BB#0:
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
687 ; X32-SSE-NEXT:    retl
688   %splat = shufflevector <4 x i32> %b, <4 x i32> undef, <4 x i32> zeroinitializer
689   %shift = ashr <4 x i32> %a, %splat
690   ret <4 x i32> %shift
691 }
692
693 define <8 x i16> @splatvar_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
694 ; SSE2-LABEL: splatvar_shift_v8i16:
695 ; SSE2:       # BB#0:
696 ; SSE2-NEXT:    pextrw $0, %xmm1, %eax
697 ; SSE2-NEXT:    movd %eax, %xmm1
698 ; SSE2-NEXT:    psraw %xmm1, %xmm0
699 ; SSE2-NEXT:    retq
700 ;
701 ; SSE41-LABEL: splatvar_shift_v8i16:
702 ; SSE41:       # BB#0:
703 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
704 ; SSE41-NEXT:    psraw %xmm1, %xmm0
705 ; SSE41-NEXT:    retq
706 ;
707 ; AVX-LABEL: splatvar_shift_v8i16:
708 ; AVX:       # BB#0:
709 ; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
710 ; AVX-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
711 ; AVX-NEXT:    retq
712 ;
713 ; XOP-LABEL: splatvar_shift_v8i16:
714 ; XOP:       # BB#0:
715 ; XOP-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
716 ; XOP-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
717 ; XOP-NEXT:    retq
718 ;
719 ; AVX512-LABEL: splatvar_shift_v8i16:
720 ; AVX512:       # BB#0:
721 ; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
722 ; AVX512-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
723 ; AVX512-NEXT:    retq
724 ;
725 ; X32-SSE-LABEL: splatvar_shift_v8i16:
726 ; X32-SSE:       # BB#0:
727 ; X32-SSE-NEXT:    pextrw $0, %xmm1, %eax
728 ; X32-SSE-NEXT:    movd %eax, %xmm1
729 ; X32-SSE-NEXT:    psraw %xmm1, %xmm0
730 ; X32-SSE-NEXT:    retl
731   %splat = shufflevector <8 x i16> %b, <8 x i16> undef, <8 x i32> zeroinitializer
732   %shift = ashr <8 x i16> %a, %splat
733   ret <8 x i16> %shift
734 }
735
736 define <16 x i8> @splatvar_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
737 ; SSE2-LABEL: splatvar_shift_v16i8:
738 ; SSE2:       # BB#0:
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
796 ; SSE2-NEXT:    retq
797 ;
798 ; SSE41-LABEL: splatvar_shift_v16i8:
799 ; SSE41:       # BB#0:
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
834 ; SSE41-NEXT:    retq
835 ;
836 ; AVX1-LABEL: splatvar_shift_v16i8:
837 ; AVX1:       # BB#0:
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
864 ; AVX1-NEXT:    retq
865 ;
866 ; AVX2-LABEL: splatvar_shift_v16i8:
867 ; AVX2:       # BB#0:
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
893 ; AVX2-NEXT:    retq
894 ;
895 ; XOPAVX1-LABEL: splatvar_shift_v16i8:
896 ; XOPAVX1:       # BB#0:
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
901 ; XOPAVX1-NEXT:    retq
902 ;
903 ; XOPAVX2-LABEL: splatvar_shift_v16i8:
904 ; XOPAVX2:       # BB#0:
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
909 ; XOPAVX2-NEXT:    retq
910 ;
911 ; AVX512-LABEL: splatvar_shift_v16i8:
912 ; AVX512:       # BB#0:
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
938 ; AVX512-NEXT:    retq
939 ;
940 ; X32-SSE-LABEL: splatvar_shift_v16i8:
941 ; X32-SSE:       # BB#0:
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
999 ; X32-SSE-NEXT:    retl
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
1003 }
1004
1005 ;
1006 ; Constant Shifts
1007 ;
1008
1009 define <2 x i64> @constant_shift_v2i64(<2 x i64> %a) nounwind {
1010 ; SSE2-LABEL: constant_shift_v2i64:
1011 ; SSE2:       # BB#0:
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
1020 ; SSE2-NEXT:    retq
1021 ;
1022 ; SSE41-LABEL: constant_shift_v2i64:
1023 ; SSE41:       # BB#0:
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
1031 ; SSE41-NEXT:    retq
1032 ;
1033 ; AVX1-LABEL: constant_shift_v2i64:
1034 ; AVX1:       # BB#0:
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
1041 ; AVX1-NEXT:    retq
1042 ;
1043 ; AVX2-LABEL: constant_shift_v2i64:
1044 ; AVX2:       # BB#0:
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
1049 ; AVX2-NEXT:    retq
1050 ;
1051 ; XOP-LABEL: constant_shift_v2i64:
1052 ; XOP:       # BB#0:
1053 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1054 ; XOP-NEXT:    vpsubq {{.*}}(%rip), %xmm1, %xmm1
1055 ; XOP-NEXT:    vpshaq %xmm1, %xmm0, %xmm0
1056 ; XOP-NEXT:    retq
1057 ;
1058 ; AVX512-LABEL: constant_shift_v2i64:
1059 ; AVX512:       # BB#0:
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
1064 ; AVX512-NEXT:    retq
1065 ;
1066 ; X32-SSE-LABEL: constant_shift_v2i64:
1067 ; X32-SSE:       # BB#0:
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
1083 }
1084
1085 define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind {
1086 ; SSE2-LABEL: constant_shift_v4i32:
1087 ; SSE2:       # BB#0:
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]
1100 ; SSE2-NEXT:    retq
1101 ;
1102 ; SSE41-LABEL: constant_shift_v4i32:
1103 ; SSE41:       # BB#0:
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]
1114 ; SSE41-NEXT:    retq
1115 ;
1116 ; AVX1-LABEL: constant_shift_v4i32:
1117 ; AVX1:       # BB#0:
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]
1125 ; AVX1-NEXT:    retq
1126 ;
1127 ; AVX2-LABEL: constant_shift_v4i32:
1128 ; AVX2:       # BB#0:
1129 ; AVX2-NEXT:    vpsravd {{.*}}(%rip), %xmm0, %xmm0
1130 ; AVX2-NEXT:    retq
1131 ;
1132 ; XOPAVX1-LABEL: constant_shift_v4i32:
1133 ; XOPAVX1:       # BB#0:
1134 ; XOPAVX1-NEXT:    vpshad {{.*}}(%rip), %xmm0, %xmm0
1135 ; XOPAVX1-NEXT:    retq
1136 ;
1137 ; XOPAVX2-LABEL: constant_shift_v4i32:
1138 ; XOPAVX2:       # BB#0:
1139 ; XOPAVX2-NEXT:    vpsravd {{.*}}(%rip), %xmm0, %xmm0
1140 ; XOPAVX2-NEXT:    retq
1141 ;
1142 ; AVX512-LABEL: constant_shift_v4i32:
1143 ; AVX512:       # BB#0:
1144 ; AVX512-NEXT:    vpsravd {{.*}}(%rip), %xmm0, %xmm0
1145 ; AVX512-NEXT:    retq
1146 ;
1147 ; X32-SSE-LABEL: constant_shift_v4i32:
1148 ; X32-SSE:       # BB#0:
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
1164 }
1165
1166 define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind {
1167 ; SSE2-LABEL: constant_shift_v8i16:
1168 ; SSE2:       # BB#0:
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
1182 ; SSE2-NEXT:    retq
1183 ;
1184 ; SSE41-LABEL: constant_shift_v8i16:
1185 ; SSE41:       # BB#0:
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]
1195 ; SSE41-NEXT:    retq
1196 ;
1197 ; AVX1-LABEL: constant_shift_v8i16:
1198 ; AVX1:       # BB#0:
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]
1205 ; AVX1-NEXT:    retq
1206 ;
1207 ; AVX2-LABEL: constant_shift_v8i16:
1208 ; AVX2:       # BB#0:
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
1215 ; AVX2-NEXT:    retq
1216 ;
1217 ; XOP-LABEL: constant_shift_v8i16:
1218 ; XOP:       # BB#0:
1219 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1220 ; XOP-NEXT:    vpsubw {{.*}}(%rip), %xmm1, %xmm1
1221 ; XOP-NEXT:    vpshaw %xmm1, %xmm0, %xmm0
1222 ; XOP-NEXT:    retq
1223 ;
1224 ; AVX512-LABEL: constant_shift_v8i16:
1225 ; AVX512:       # BB#0:
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>
1230 ; AVX512-NEXT:    retq
1231 ;
1232 ; X32-SSE-LABEL: constant_shift_v8i16:
1233 ; X32-SSE:       # BB#0:
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
1250 }
1251
1252 define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind {
1253 ; SSE2-LABEL: constant_shift_v16i8:
1254 ; SSE2:       # BB#0:
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
1310 ; SSE2-NEXT:    retq
1311 ;
1312 ; SSE41-LABEL: constant_shift_v16i8:
1313 ; SSE41:       # BB#0:
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
1347 ; SSE41-NEXT:    retq
1348 ;
1349 ; AVX-LABEL: constant_shift_v16i8:
1350 ; AVX:       # BB#0:
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
1376 ; AVX-NEXT:    retq
1377 ;
1378 ; XOP-LABEL: constant_shift_v16i8:
1379 ; XOP:       # BB#0:
1380 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1381 ; XOP-NEXT:    vpsubb {{.*}}(%rip), %xmm1, %xmm1
1382 ; XOP-NEXT:    vpshab %xmm1, %xmm0, %xmm0
1383 ; XOP-NEXT:    retq
1384 ;
1385 ; AVX512-LABEL: constant_shift_v16i8:
1386 ; AVX512:       # BB#0:
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
1412 ; AVX512-NEXT:    retq
1413 ;
1414 ; X32-SSE-LABEL: constant_shift_v16i8:
1415 ; X32-SSE:       # BB#0:
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
1474 }
1475
1476 ;
1477 ; Uniform Constant Shifts
1478 ;
1479
1480 define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind {
1481 ; SSE2-LABEL: splatconstant_shift_v2i64:
1482 ; SSE2:       # BB#0:
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]
1489 ; SSE2-NEXT:    retq
1490 ;
1491 ; SSE41-LABEL: splatconstant_shift_v2i64:
1492 ; SSE41:       # BB#0:
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]
1497 ; SSE41-NEXT:    retq
1498 ;
1499 ; AVX1-LABEL: splatconstant_shift_v2i64:
1500 ; AVX1:       # BB#0:
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]
1504 ; AVX1-NEXT:    retq
1505 ;
1506 ; AVX2-LABEL: splatconstant_shift_v2i64:
1507 ; AVX2:       # BB#0:
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]
1511 ; AVX2-NEXT:    retq
1512 ;
1513 ; XOP-LABEL: splatconstant_shift_v2i64:
1514 ; XOP:       # BB#0:
1515 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1516 ; XOP-NEXT:    vpsubq {{.*}}(%rip), %xmm1, %xmm1
1517 ; XOP-NEXT:    vpshaq %xmm1, %xmm0, %xmm0
1518 ; XOP-NEXT:    retq
1519 ;
1520 ; AVX512-LABEL: splatconstant_shift_v2i64:
1521 ; AVX512:       # BB#0:
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]
1525 ; AVX512-NEXT:    retq
1526 ;
1527 ; X32-SSE-LABEL: splatconstant_shift_v2i64:
1528 ; X32-SSE:       # BB#0:
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
1538 }
1539
1540 define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind {
1541 ; SSE-LABEL: splatconstant_shift_v4i32:
1542 ; SSE:       # BB#0:
1543 ; SSE-NEXT:    psrad $5, %xmm0
1544 ; SSE-NEXT:    retq
1545 ;
1546 ; AVX-LABEL: splatconstant_shift_v4i32:
1547 ; AVX:       # BB#0:
1548 ; AVX-NEXT:    vpsrad $5, %xmm0, %xmm0
1549 ; AVX-NEXT:    retq
1550 ;
1551 ; XOP-LABEL: splatconstant_shift_v4i32:
1552 ; XOP:       # BB#0:
1553 ; XOP-NEXT:    vpsrad $5, %xmm0, %xmm0
1554 ; XOP-NEXT:    retq
1555 ;
1556 ; AVX512-LABEL: splatconstant_shift_v4i32:
1557 ; AVX512:       # BB#0:
1558 ; AVX512-NEXT:    vpsrad $5, %xmm0, %xmm0
1559 ; AVX512-NEXT:    retq
1560 ;
1561 ; X32-SSE-LABEL: splatconstant_shift_v4i32:
1562 ; X32-SSE:       # BB#0:
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
1567 }
1568
1569 define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind {
1570 ; SSE-LABEL: splatconstant_shift_v8i16:
1571 ; SSE:       # BB#0:
1572 ; SSE-NEXT:    psraw $3, %xmm0
1573 ; SSE-NEXT:    retq
1574 ;
1575 ; AVX-LABEL: splatconstant_shift_v8i16:
1576 ; AVX:       # BB#0:
1577 ; AVX-NEXT:    vpsraw $3, %xmm0, %xmm0
1578 ; AVX-NEXT:    retq
1579 ;
1580 ; XOP-LABEL: splatconstant_shift_v8i16:
1581 ; XOP:       # BB#0:
1582 ; XOP-NEXT:    vpsraw $3, %xmm0, %xmm0
1583 ; XOP-NEXT:    retq
1584 ;
1585 ; AVX512-LABEL: splatconstant_shift_v8i16:
1586 ; AVX512:       # BB#0:
1587 ; AVX512-NEXT:    vpsraw $3, %xmm0, %xmm0
1588 ; AVX512-NEXT:    retq
1589 ;
1590 ; X32-SSE-LABEL: splatconstant_shift_v8i16:
1591 ; X32-SSE:       # BB#0:
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
1596 }
1597
1598 define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind {
1599 ; SSE-LABEL: splatconstant_shift_v16i8:
1600 ; SSE:       # BB#0:
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
1606 ; SSE-NEXT:    retq
1607 ;
1608 ; AVX-LABEL: splatconstant_shift_v16i8:
1609 ; AVX:       # BB#0:
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
1615 ; AVX-NEXT:    retq
1616 ;
1617 ; XOP-LABEL: splatconstant_shift_v16i8:
1618 ; XOP:       # BB#0:
1619 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1620 ; XOP-NEXT:    vpsubb {{.*}}(%rip), %xmm1, %xmm1
1621 ; XOP-NEXT:    vpshab %xmm1, %xmm0, %xmm0
1622 ; XOP-NEXT:    retq
1623 ;
1624 ; AVX512-LABEL: splatconstant_shift_v16i8:
1625 ; AVX512:       # BB#0:
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
1631 ; AVX512-NEXT:    retq
1632 ;
1633 ; X32-SSE-LABEL: splatconstant_shift_v16i8:
1634 ; X32-SSE:       # BB#0:
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
1643 }