Merging r261039:
[oota-llvm.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-apple-darwin -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 {{.*#+}} 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
107 ; X32-SSE-NEXT:    retl
108   %shift = ashr <2 x i64> %a, %b
109   ret <2 x i64> %shift
110 }
111
112 define <4 x i32> @var_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
113 ; SSE2-LABEL: var_shift_v4i32:
114 ; SSE2:       # BB#0:
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]
135 ; SSE2-NEXT:    retq
136 ;
137 ; SSE41-LABEL: var_shift_v4i32:
138 ; SSE41:       # BB#0:
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]
156 ; SSE41-NEXT:    retq
157 ;
158 ; AVX1-LABEL: var_shift_v4i32:
159 ; AVX1:       # BB#0:
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]
172 ; AVX1-NEXT:    retq
173 ;
174 ; AVX2-LABEL: var_shift_v4i32:
175 ; AVX2:       # BB#0:
176 ; AVX2-NEXT:    vpsravd %xmm1, %xmm0, %xmm0
177 ; AVX2-NEXT:    retq
178 ;
179 ; XOPAVX1-LABEL: var_shift_v4i32:
180 ; XOPAVX1:       # BB#0:
181 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
182 ; XOPAVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm1
183 ; XOPAVX1-NEXT:    vpshad %xmm1, %xmm0, %xmm0
184 ; XOPAVX1-NEXT:    retq
185 ;
186 ; XOPAVX2-LABEL: var_shift_v4i32:
187 ; XOPAVX2:       # BB#0:
188 ; XOPAVX2-NEXT:    vpsravd %xmm1, %xmm0, %xmm0
189 ; XOPAVX2-NEXT:    retq
190 ;
191 ; AVX512-LABEL: var_shift_v4i32:
192 ; AVX512:       ## BB#0:
193 ; AVX512-NEXT:    vpsravd %xmm1, %xmm0, %xmm0
194 ; AVX512-NEXT:    retq
195 ;
196 ; X32-SSE-LABEL: var_shift_v4i32:
197 ; X32-SSE:       # BB#0:
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]
218 ; X32-SSE-NEXT:    retl
219   %shift = ashr <4 x i32> %a, %b
220   ret <4 x i32> %shift
221 }
222
223 define <8 x i16> @var_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
224 ; SSE2-LABEL: var_shift_v8i16:
225 ; SSE2:       # BB#0:
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
257 ; SSE2-NEXT:    retq
258 ;
259 ; SSE41-LABEL: var_shift_v8i16:
260 ; SSE41:       # BB#0:
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
287 ; SSE41-NEXT:    retq
288 ;
289 ; AVX1-LABEL: var_shift_v8i16:
290 ; AVX1:       # BB#0:
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
305 ; AVX1-NEXT:    retq
306 ;
307 ; AVX2-LABEL: var_shift_v8i16:
308 ; AVX2:       # BB#0:
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
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:    vpsravw %zmm1, %zmm0, %zmm0
327 ; AVX512-NEXT:    retq
328 ;
329 ; X32-SSE-LABEL: var_shift_v8i16:
330 ; X32-SSE:       # BB#0:
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
362 ; X32-SSE-NEXT:    retl
363   %shift = ashr <8 x i16> %a, %b
364   ret <8 x i16> %shift
365 }
366
367 define <16 x i8> @var_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
368 ; SSE2-LABEL: var_shift_v16i8:
369 ; SSE2:       # BB#0:
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
424 ; SSE2-NEXT:    retq
425 ;
426 ; SSE41-LABEL: var_shift_v16i8:
427 ; SSE41:       # BB#0:
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
460 ; SSE41-NEXT:    retq
461 ;
462 ; AVX-LABEL: var_shift_v16i8:
463 ; AVX:       # BB#0:
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
488 ; AVX-NEXT:    retq
489 ;
490 ; XOP-LABEL: var_shift_v16i8:
491 ; XOP:       # BB#0:
492 ; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2
493 ; XOP-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
494 ; XOP-NEXT:    vpshab %xmm1, %xmm0, %xmm0
495 ; XOP-NEXT:    retq
496 ;
497 ; AVX512-LABEL: var_shift_v16i8:
498 ; AVX512:       ## BB#0:
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
523 ; AVX512-NEXT:    retq
524 ;
525 ; X32-SSE-LABEL: var_shift_v16i8:
526 ; X32-SSE:       # BB#0:
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
581 ; X32-SSE-NEXT:    retl
582   %shift = ashr <16 x i8> %a, %b
583   ret <16 x i8> %shift
584 }
585
586 ;
587 ; Uniform Variable Shifts
588 ;
589
590 define <2 x i64> @splatvar_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
591 ; SSE-LABEL: splatvar_shift_v2i64:
592 ; SSE:       # BB#0:
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
598 ; SSE-NEXT:    retq
599 ;
600 ; AVX-LABEL: splatvar_shift_v2i64:
601 ; AVX:       # BB#0:
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
607 ; AVX-NEXT:    retq
608 ;
609 ; XOPAVX1-LABEL: splatvar_shift_v2i64:
610 ; XOPAVX1:       # BB#0:
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
615 ; XOPAVX1-NEXT:    retq
616 ;
617 ; XOPAVX2-LABEL: splatvar_shift_v2i64:
618 ; XOPAVX2:       # BB#0:
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
623 ; XOPAVX2-NEXT:    retq
624 ;
625 ; AVX512-LABEL: splatvar_shift_v2i64:
626 ; AVX512:       ## BB#0:
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
632 ; AVX512-NEXT:    retq
633 ;
634 ; X32-SSE-LABEL: splatvar_shift_v2i64:
635 ; X32-SSE:       # BB#0:
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
642 ; X32-SSE-NEXT:    retl
643   %splat = shufflevector <2 x i64> %b, <2 x i64> undef, <2 x i32> zeroinitializer
644   %shift = ashr <2 x i64> %a, %splat
645   ret <2 x i64> %shift
646 }
647
648 define <4 x i32> @splatvar_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
649 ; SSE2-LABEL: splatvar_shift_v4i32:
650 ; SSE2:       # BB#0:
651 ; SSE2-NEXT:    xorps %xmm2, %xmm2
652 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
653 ; SSE2-NEXT:    psrad %xmm2, %xmm0
654 ; SSE2-NEXT:    retq
655 ;
656 ; SSE41-LABEL: splatvar_shift_v4i32:
657 ; SSE41:       # BB#0:
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
661 ; SSE41-NEXT:    retq
662 ;
663 ; AVX-LABEL: splatvar_shift_v4i32:
664 ; AVX:       # BB#0:
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
668 ; AVX-NEXT:    retq
669 ;
670 ; XOP-LABEL: splatvar_shift_v4i32:
671 ; XOP:       # BB#0:
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
675 ; XOP-NEXT:    retq
676 ;
677 ; AVX512-LABEL: splatvar_shift_v4i32:
678 ; AVX512:       ## BB#0:
679 ; AVX512-NEXT:    vxorps %xmm2, %xmm2, %xmm2
680 ; AVX512-NEXT:    vmovss %xmm1, %xmm2, %xmm1
681 ; AVX512-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
682 ; AVX512-NEXT:    retq
683 ;
684 ; X32-SSE-LABEL: splatvar_shift_v4i32:
685 ; X32-SSE:       # BB#0:
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
689 ; X32-SSE-NEXT:    retl
690   %splat = shufflevector <4 x i32> %b, <4 x i32> undef, <4 x i32> zeroinitializer
691   %shift = ashr <4 x i32> %a, %splat
692   ret <4 x i32> %shift
693 }
694
695 define <8 x i16> @splatvar_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
696 ; SSE2-LABEL: splatvar_shift_v8i16:
697 ; SSE2:       # BB#0:
698 ; SSE2-NEXT:    movd %xmm1, %eax
699 ; SSE2-NEXT:    movzwl %ax, %eax
700 ; SSE2-NEXT:    movd %eax, %xmm1
701 ; SSE2-NEXT:    psraw %xmm1, %xmm0
702 ; SSE2-NEXT:    retq
703 ;
704 ; SSE41-LABEL: splatvar_shift_v8i16:
705 ; SSE41:       # BB#0:
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
709 ; SSE41-NEXT:    retq
710 ;
711 ; AVX-LABEL: splatvar_shift_v8i16:
712 ; AVX:       # BB#0:
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
716 ; AVX-NEXT:    retq
717 ;
718 ; XOP-LABEL: splatvar_shift_v8i16:
719 ; XOP:       # BB#0:
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
723 ; XOP-NEXT:    retq
724 ;
725 ; AVX512-LABEL: splatvar_shift_v8i16:
726 ; AVX512:       ## BB#0:
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
730 ; AVX512-NEXT:    retq
731 ;
732 ; X32-SSE-LABEL: splatvar_shift_v8i16:
733 ; X32-SSE:       # BB#0:
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
738 ; X32-SSE-NEXT:    retl
739   %splat = shufflevector <8 x i16> %b, <8 x i16> undef, <8 x i32> zeroinitializer
740   %shift = ashr <8 x i16> %a, %splat
741   ret <8 x i16> %shift
742 }
743
744 define <16 x i8> @splatvar_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
745 ; SSE2-LABEL: splatvar_shift_v16i8:
746 ; SSE2:       # BB#0:
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
805 ; SSE2-NEXT:    retq
806 ;
807 ; SSE41-LABEL: splatvar_shift_v16i8:
808 ; SSE41:       # BB#0:
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
843 ; SSE41-NEXT:    retq
844 ;
845 ; AVX1-LABEL: splatvar_shift_v16i8:
846 ; AVX1:       # BB#0:
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
873 ; AVX1-NEXT:    retq
874 ;
875 ; AVX2-LABEL: splatvar_shift_v16i8:
876 ; AVX2:       # BB#0:
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
902 ; AVX2-NEXT:    retq
903 ;
904 ; XOPAVX1-LABEL: splatvar_shift_v16i8:
905 ; XOPAVX1:       # BB#0:
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
910 ; XOPAVX1-NEXT:    retq
911 ;
912 ; XOPAVX2-LABEL: splatvar_shift_v16i8:
913 ; XOPAVX2:       # BB#0:
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
918 ; XOPAVX2-NEXT:    retq
919 ;
920 ; AVX512-LABEL: splatvar_shift_v16i8:
921 ; AVX512:       ## BB#0:
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
947 ; AVX512-NEXT:    retq
948 ;
949 ; X32-SSE-LABEL: splatvar_shift_v16i8:
950 ; X32-SSE:       # BB#0:
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
1013 }
1014
1015 ;
1016 ; Constant Shifts
1017 ;
1018
1019 define <2 x i64> @constant_shift_v2i64(<2 x i64> %a) nounwind {
1020 ; SSE2-LABEL: constant_shift_v2i64:
1021 ; SSE2:       # BB#0:
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
1030 ; SSE2-NEXT:    retq
1031 ;
1032 ; SSE41-LABEL: constant_shift_v2i64:
1033 ; SSE41:       # BB#0:
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
1041 ; SSE41-NEXT:    retq
1042 ;
1043 ; AVX1-LABEL: constant_shift_v2i64:
1044 ; AVX1:       # BB#0:
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
1051 ; AVX1-NEXT:    retq
1052 ;
1053 ; AVX2-LABEL: constant_shift_v2i64:
1054 ; AVX2:       # BB#0:
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
1059 ; AVX2-NEXT:    retq
1060 ;
1061 ; XOP-LABEL: constant_shift_v2i64:
1062 ; XOP:       # BB#0:
1063 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1064 ; XOP-NEXT:    vpsubq {{.*}}(%rip), %xmm1, %xmm1
1065 ; XOP-NEXT:    vpshaq %xmm1, %xmm0, %xmm0
1066 ; XOP-NEXT:    retq
1067 ;
1068 ; AVX512-LABEL: constant_shift_v2i64:
1069 ; AVX512:       ## BB#0:
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
1074 ; AVX512-NEXT:    retq
1075 ;
1076 ; X32-SSE-LABEL: constant_shift_v2i64:
1077 ; X32-SSE:       # BB#0:
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
1093 }
1094
1095 define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind {
1096 ; SSE2-LABEL: constant_shift_v4i32:
1097 ; SSE2:       # BB#0:
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]
1110 ; SSE2-NEXT:    retq
1111 ;
1112 ; SSE41-LABEL: constant_shift_v4i32:
1113 ; SSE41:       # BB#0:
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]
1124 ; SSE41-NEXT:    retq
1125 ;
1126 ; AVX1-LABEL: constant_shift_v4i32:
1127 ; AVX1:       # BB#0:
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]
1135 ; AVX1-NEXT:    retq
1136 ;
1137 ; AVX2-LABEL: constant_shift_v4i32:
1138 ; AVX2:       # BB#0:
1139 ; AVX2-NEXT:    vpsravd {{.*}}(%rip), %xmm0, %xmm0
1140 ; AVX2-NEXT:    retq
1141 ;
1142 ; XOPAVX1-LABEL: constant_shift_v4i32:
1143 ; XOPAVX1:       # BB#0:
1144 ; XOPAVX1-NEXT:    vpshad {{.*}}(%rip), %xmm0, %xmm0
1145 ; XOPAVX1-NEXT:    retq
1146 ;
1147 ; XOPAVX2-LABEL: constant_shift_v4i32:
1148 ; XOPAVX2:       # BB#0:
1149 ; XOPAVX2-NEXT:    vpsravd {{.*}}(%rip), %xmm0, %xmm0
1150 ; XOPAVX2-NEXT:    retq
1151 ;
1152 ; AVX512-LABEL: constant_shift_v4i32:
1153 ; AVX512:       ## BB#0:
1154 ; AVX512-NEXT:    vpsravd {{.*}}(%rip), %xmm0, %xmm0
1155 ; AVX512-NEXT:    retq
1156 ;
1157 ; X32-SSE-LABEL: constant_shift_v4i32:
1158 ; X32-SSE:       # BB#0:
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
1174 }
1175
1176 define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind {
1177 ; SSE2-LABEL: constant_shift_v8i16:
1178 ; SSE2:       # BB#0:
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
1192 ; SSE2-NEXT:    retq
1193 ;
1194 ; SSE41-LABEL: constant_shift_v8i16:
1195 ; SSE41:       # BB#0:
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
1214 ; SSE41-NEXT:    retq
1215 ;
1216 ; AVX1-LABEL: constant_shift_v8i16:
1217 ; AVX1:       # BB#0:
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
1230 ; AVX1-NEXT:    retq
1231 ;
1232 ; AVX2-LABEL: constant_shift_v8i16:
1233 ; AVX2:       # BB#0:
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
1240 ; AVX2-NEXT:    retq
1241 ;
1242 ; XOP-LABEL: constant_shift_v8i16:
1243 ; XOP:       # BB#0:
1244 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1245 ; XOP-NEXT:    vpsubw {{.*}}(%rip), %xmm1, %xmm1
1246 ; XOP-NEXT:    vpshaw %xmm1, %xmm0, %xmm0
1247 ; XOP-NEXT:    retq
1248 ;
1249 ; AVX512-LABEL: constant_shift_v8i16:
1250 ; AVX512:       ## BB#0:
1251 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]
1252 ; AVX512-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
1253 ; AVX512-NEXT:    retq
1254 ;
1255 ; X32-SSE-LABEL: constant_shift_v8i16:
1256 ; X32-SSE:       # BB#0:
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
1273 }
1274
1275 define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind {
1276 ; SSE2-LABEL: constant_shift_v16i8:
1277 ; SSE2:       # BB#0:
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
1333 ; SSE2-NEXT:    retq
1334 ;
1335 ; SSE41-LABEL: constant_shift_v16i8:
1336 ; SSE41:       # BB#0:
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
1370 ; SSE41-NEXT:    retq
1371 ;
1372 ; AVX-LABEL: constant_shift_v16i8:
1373 ; AVX:       # BB#0:
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
1399 ; AVX-NEXT:    retq
1400 ;
1401 ; XOP-LABEL: constant_shift_v16i8:
1402 ; XOP:       # BB#0:
1403 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1404 ; XOP-NEXT:    vpsubb {{.*}}(%rip), %xmm1, %xmm1
1405 ; XOP-NEXT:    vpshab %xmm1, %xmm0, %xmm0
1406 ; XOP-NEXT:    retq
1407 ;
1408 ; AVX512-LABEL: constant_shift_v16i8:
1409 ; AVX512:       ## BB#0:
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
1435 ; AVX512-NEXT:    retq
1436 ;
1437 ; X32-SSE-LABEL: constant_shift_v16i8:
1438 ; X32-SSE:       # BB#0:
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
1497 }
1498
1499 ;
1500 ; Uniform Constant Shifts
1501 ;
1502
1503 define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind {
1504 ; SSE2-LABEL: splatconstant_shift_v2i64:
1505 ; SSE2:       # BB#0:
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]
1512 ; SSE2-NEXT:    retq
1513 ;
1514 ; SSE41-LABEL: splatconstant_shift_v2i64:
1515 ; SSE41:       # BB#0:
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]
1520 ; SSE41-NEXT:    retq
1521 ;
1522 ; AVX1-LABEL: splatconstant_shift_v2i64:
1523 ; AVX1:       # BB#0:
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]
1527 ; AVX1-NEXT:    retq
1528 ;
1529 ; AVX2-LABEL: splatconstant_shift_v2i64:
1530 ; AVX2:       # BB#0:
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]
1534 ; AVX2-NEXT:    retq
1535 ;
1536 ; XOP-LABEL: splatconstant_shift_v2i64:
1537 ; XOP:       # BB#0:
1538 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1539 ; XOP-NEXT:    vpsubq {{.*}}(%rip), %xmm1, %xmm1
1540 ; XOP-NEXT:    vpshaq %xmm1, %xmm0, %xmm0
1541 ; XOP-NEXT:    retq
1542 ;
1543 ; AVX512-LABEL: splatconstant_shift_v2i64:
1544 ; AVX512:       ## BB#0:
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]
1548 ; AVX512-NEXT:    retq
1549 ;
1550 ; X32-SSE-LABEL: splatconstant_shift_v2i64:
1551 ; X32-SSE:       # BB#0:
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
1561 }
1562
1563 define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind {
1564 ; SSE-LABEL: splatconstant_shift_v4i32:
1565 ; SSE:       # BB#0:
1566 ; SSE-NEXT:    psrad $5, %xmm0
1567 ; SSE-NEXT:    retq
1568 ;
1569 ; AVX-LABEL: splatconstant_shift_v4i32:
1570 ; AVX:       # BB#0:
1571 ; AVX-NEXT:    vpsrad $5, %xmm0, %xmm0
1572 ; AVX-NEXT:    retq
1573 ;
1574 ; XOP-LABEL: splatconstant_shift_v4i32:
1575 ; XOP:       # BB#0:
1576 ; XOP-NEXT:    vpsrad $5, %xmm0, %xmm0
1577 ; XOP-NEXT:    retq
1578 ;
1579 ; AVX512-LABEL: splatconstant_shift_v4i32:
1580 ; AVX512:       ## BB#0:
1581 ; AVX512-NEXT:    vpsrad $5, %xmm0, %xmm0
1582 ; AVX512-NEXT:    retq
1583 ;
1584 ; X32-SSE-LABEL: splatconstant_shift_v4i32:
1585 ; X32-SSE:       # BB#0:
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
1590 }
1591
1592 define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind {
1593 ; SSE-LABEL: splatconstant_shift_v8i16:
1594 ; SSE:       # BB#0:
1595 ; SSE-NEXT:    psraw $3, %xmm0
1596 ; SSE-NEXT:    retq
1597 ;
1598 ; AVX-LABEL: splatconstant_shift_v8i16:
1599 ; AVX:       # BB#0:
1600 ; AVX-NEXT:    vpsraw $3, %xmm0, %xmm0
1601 ; AVX-NEXT:    retq
1602 ;
1603 ; XOP-LABEL: splatconstant_shift_v8i16:
1604 ; XOP:       # BB#0:
1605 ; XOP-NEXT:    vpsraw $3, %xmm0, %xmm0
1606 ; XOP-NEXT:    retq
1607 ;
1608 ; AVX512-LABEL: splatconstant_shift_v8i16:
1609 ; AVX512:       ## BB#0:
1610 ; AVX512-NEXT:    vpsraw $3, %xmm0, %xmm0
1611 ; AVX512-NEXT:    retq
1612 ;
1613 ; X32-SSE-LABEL: splatconstant_shift_v8i16:
1614 ; X32-SSE:       # BB#0:
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
1619 }
1620
1621 define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind {
1622 ; SSE-LABEL: splatconstant_shift_v16i8:
1623 ; SSE:       # BB#0:
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
1629 ; SSE-NEXT:    retq
1630 ;
1631 ; AVX-LABEL: splatconstant_shift_v16i8:
1632 ; AVX:       # BB#0:
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
1638 ; AVX-NEXT:    retq
1639 ;
1640 ; XOP-LABEL: splatconstant_shift_v16i8:
1641 ; XOP:       # BB#0:
1642 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1643 ; XOP-NEXT:    vpsubb {{.*}}(%rip), %xmm1, %xmm1
1644 ; XOP-NEXT:    vpshab %xmm1, %xmm0, %xmm0
1645 ; XOP-NEXT:    retq
1646 ;
1647 ; AVX512-LABEL: splatconstant_shift_v16i8:
1648 ; AVX512:       ## BB#0:
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
1654 ; AVX512-NEXT:    retq
1655 ;
1656 ; X32-SSE-LABEL: splatconstant_shift_v16i8:
1657 ; X32-SSE:       # BB#0:
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
1666 }