DI: Remove DW_TAG_arg_variable and DW_TAG_auto_variable
[oota-llvm.git] / test / CodeGen / X86 / vector-shift-ashr-128.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
5 ;
6 ; Just one 32-bit run to make sure we do reasonable things for i64 shifts.
7 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mcpu=x86-64 | FileCheck %s --check-prefix=ALL --check-prefix=X32-SSE --check-prefix=X32-SSE2
8
9 ;
10 ; Variable Shifts
11 ;
12
13 define <2 x i64> @var_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
14 ; SSE2-LABEL: var_shift_v2i64:
15 ; SSE2:       # BB#0:
16 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
17 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
18 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
19 ; SSE2-NEXT:    psrlq %xmm3, %xmm4
20 ; SSE2-NEXT:    psrlq %xmm1, %xmm2
21 ; SSE2-NEXT:    movsd {{.*#+}} xmm4 = xmm2[0],xmm4[1]
22 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
23 ; SSE2-NEXT:    psrlq %xmm3, %xmm2
24 ; SSE2-NEXT:    psrlq %xmm1, %xmm0
25 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
26 ; SSE2-NEXT:    xorpd %xmm4, %xmm2
27 ; SSE2-NEXT:    psubq %xmm4, %xmm2
28 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
29 ; SSE2-NEXT:    retq
30 ;
31 ; SSE41-LABEL: var_shift_v2i64:
32 ; SSE41:       # BB#0:
33 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
34 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
35 ; SSE41-NEXT:    psrlq %xmm1, %xmm3
36 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
37 ; SSE41-NEXT:    psrlq %xmm4, %xmm2
38 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
39 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
40 ; SSE41-NEXT:    psrlq %xmm1, %xmm3
41 ; SSE41-NEXT:    psrlq %xmm4, %xmm0
42 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
43 ; SSE41-NEXT:    pxor %xmm2, %xmm0
44 ; SSE41-NEXT:    psubq %xmm2, %xmm0
45 ; SSE41-NEXT:    retq
46 ;
47 ; AVX1-LABEL: var_shift_v2i64:
48 ; AVX1:       # BB#0:
49 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
50 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm3
51 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
52 ; AVX1-NEXT:    vpsrlq %xmm4, %xmm2, %xmm2
53 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
54 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm1
55 ; AVX1-NEXT:    vpsrlq %xmm4, %xmm0, %xmm0
56 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
57 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
58 ; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
59 ; AVX1-NEXT:    retq
60 ;
61 ; AVX2-LABEL: var_shift_v2i64:
62 ; AVX2:       # BB#0:
63 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
64 ; AVX2-NEXT:    vpsrlvq %xmm1, %xmm2, %xmm3
65 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
66 ; AVX2-NEXT:    vpsrlvq %xmm1, %xmm0, %xmm0
67 ; AVX2-NEXT:    vpsubq %xmm3, %xmm0, %xmm0
68 ; AVX2-NEXT:    retq
69 ;
70 ; X32-SSE-LABEL: var_shift_v2i64:
71 ; X32-SSE:       # BB#0:
72 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
73 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
74 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
75 ; X32-SSE-NEXT:    psrlq %xmm2, %xmm4
76 ; X32-SSE-NEXT:    movq {{.*#+}} xmm5 = xmm1[0],zero
77 ; X32-SSE-NEXT:    psrlq %xmm5, %xmm3
78 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm4 = xmm3[0],xmm4[1]
79 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
80 ; X32-SSE-NEXT:    psrlq %xmm2, %xmm1
81 ; X32-SSE-NEXT:    psrlq %xmm5, %xmm0
82 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
83 ; X32-SSE-NEXT:    xorpd %xmm4, %xmm1
84 ; X32-SSE-NEXT:    psubq %xmm4, %xmm1
85 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
86 ; X32-SSE-NEXT:    retl
87   %shift = ashr <2 x i64> %a, %b
88   ret <2 x i64> %shift
89 }
90
91 define <4 x i32> @var_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
92 ; SSE2-LABEL: var_shift_v4i32:
93 ; SSE2:       # BB#0:
94 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
95 ; SSE2-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
96 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
97 ; SSE2-NEXT:    psrad %xmm2, %xmm3
98 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
99 ; SSE2-NEXT:    psrlq $32, %xmm2
100 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
101 ; SSE2-NEXT:    psrad %xmm2, %xmm4
102 ; SSE2-NEXT:    movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1]
103 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3]
104 ; SSE2-NEXT:    pxor %xmm3, %xmm3
105 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
106 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
107 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
108 ; SSE2-NEXT:    psrad %xmm4, %xmm5
109 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
110 ; SSE2-NEXT:    psrad %xmm1, %xmm0
111 ; SSE2-NEXT:    movsd {{.*#+}} xmm5 = xmm0[0],xmm5[1]
112 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
113 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
114 ; SSE2-NEXT:    retq
115 ;
116 ; SSE41-LABEL: var_shift_v4i32:
117 ; SSE41:       # BB#0:
118 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
119 ; SSE41-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
120 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
121 ; SSE41-NEXT:    psrad %xmm2, %xmm3
122 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
123 ; SSE41-NEXT:    psrlq $32, %xmm2
124 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
125 ; SSE41-NEXT:    psrad %xmm2, %xmm4
126 ; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm3[4,5,6,7]
127 ; SSE41-NEXT:    pxor %xmm2, %xmm2
128 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero
129 ; SSE41-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
130 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
131 ; SSE41-NEXT:    psrad %xmm1, %xmm2
132 ; SSE41-NEXT:    psrad %xmm3, %xmm0
133 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
134 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3],xmm0[4,5],xmm4[6,7]
135 ; SSE41-NEXT:    retq
136 ;
137 ; AVX1-LABEL: var_shift_v4i32:
138 ; AVX1:       # BB#0:
139 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm2 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
140 ; AVX1-NEXT:    vpsrad %xmm2, %xmm0, %xmm2
141 ; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm3
142 ; AVX1-NEXT:    vpsrad %xmm3, %xmm0, %xmm3
143 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
144 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
145 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
146 ; AVX1-NEXT:    vpsrad %xmm3, %xmm0, %xmm3
147 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
148 ; AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
149 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
150 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
151 ; AVX1-NEXT:    retq
152 ;
153 ; AVX2-LABEL: var_shift_v4i32:
154 ; AVX2:       # BB#0:
155 ; AVX2-NEXT:    vpsravd %xmm1, %xmm0, %xmm0
156 ; AVX2-NEXT:    retq
157 ;
158 ; X32-SSE-LABEL: var_shift_v4i32:
159 ; X32-SSE:       # BB#0:
160 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
161 ; X32-SSE-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
162 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm3
163 ; X32-SSE-NEXT:    psrad %xmm2, %xmm3
164 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
165 ; X32-SSE-NEXT:    psrlq $32, %xmm2
166 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm4
167 ; X32-SSE-NEXT:    psrad %xmm2, %xmm4
168 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm3 = xmm4[0],xmm3[1]
169 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3]
170 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
171 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm4
172 ; X32-SSE-NEXT:    punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
173 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm5
174 ; X32-SSE-NEXT:    psrad %xmm4, %xmm5
175 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
176 ; X32-SSE-NEXT:    psrad %xmm1, %xmm0
177 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm5 = xmm0[0],xmm5[1]
178 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
179 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
180 ; X32-SSE-NEXT:    retl
181   %shift = ashr <4 x i32> %a, %b
182   ret <4 x i32> %shift
183 }
184
185 define <8 x i16> @var_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
186 ; SSE2-LABEL: var_shift_v8i16:
187 ; SSE2:       # BB#0:
188 ; SSE2-NEXT:    psllw $12, %xmm1
189 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
190 ; SSE2-NEXT:    psraw $15, %xmm2
191 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
192 ; SSE2-NEXT:    pandn %xmm0, %xmm3
193 ; SSE2-NEXT:    psraw $8, %xmm0
194 ; SSE2-NEXT:    pand %xmm2, %xmm0
195 ; SSE2-NEXT:    por %xmm3, %xmm0
196 ; SSE2-NEXT:    paddw %xmm1, %xmm1
197 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
198 ; SSE2-NEXT:    psraw $15, %xmm2
199 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
200 ; SSE2-NEXT:    pandn %xmm0, %xmm3
201 ; SSE2-NEXT:    psraw $4, %xmm0
202 ; SSE2-NEXT:    pand %xmm2, %xmm0
203 ; SSE2-NEXT:    por %xmm3, %xmm0
204 ; SSE2-NEXT:    paddw %xmm1, %xmm1
205 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
206 ; SSE2-NEXT:    psraw $15, %xmm2
207 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
208 ; SSE2-NEXT:    pandn %xmm0, %xmm3
209 ; SSE2-NEXT:    psraw $2, %xmm0
210 ; SSE2-NEXT:    pand %xmm2, %xmm0
211 ; SSE2-NEXT:    por %xmm3, %xmm0
212 ; SSE2-NEXT:    paddw %xmm1, %xmm1
213 ; SSE2-NEXT:    psraw $15, %xmm1
214 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
215 ; SSE2-NEXT:    pandn %xmm0, %xmm2
216 ; SSE2-NEXT:    psraw $1, %xmm0
217 ; SSE2-NEXT:    pand %xmm1, %xmm0
218 ; SSE2-NEXT:    por %xmm2, %xmm0
219 ; SSE2-NEXT:    retq
220 ;
221 ; SSE41-LABEL: var_shift_v8i16:
222 ; SSE41:       # BB#0:
223 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
224 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
225 ; SSE41-NEXT:    psllw $12, %xmm0
226 ; SSE41-NEXT:    psllw $4, %xmm1
227 ; SSE41-NEXT:    por %xmm0, %xmm1
228 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
229 ; SSE41-NEXT:    paddw %xmm3, %xmm3
230 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
231 ; SSE41-NEXT:    psraw $8, %xmm4
232 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
233 ; SSE41-NEXT:    pblendvb %xmm4, %xmm2
234 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
235 ; SSE41-NEXT:    psraw $4, %xmm1
236 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
237 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
238 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
239 ; SSE41-NEXT:    psraw $2, %xmm1
240 ; SSE41-NEXT:    paddw %xmm3, %xmm3
241 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
242 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
243 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
244 ; SSE41-NEXT:    psraw $1, %xmm1
245 ; SSE41-NEXT:    paddw %xmm3, %xmm3
246 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
247 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
248 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
249 ; SSE41-NEXT:    retq
250 ;
251 ; AVX1-LABEL: var_shift_v8i16:
252 ; AVX1:       # BB#0:
253 ; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm2
254 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
255 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
256 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm2
257 ; AVX1-NEXT:    vpsraw $8, %xmm0, %xmm3
258 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
259 ; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm1
260 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
261 ; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm1
262 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
263 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
264 ; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm1
265 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
266 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
267 ; AVX1-NEXT:    retq
268 ;
269 ; AVX2-LABEL: var_shift_v8i16:
270 ; AVX2:       # BB#0:
271 ; 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
272 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
273 ; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
274 ; 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
275 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
276 ; AVX2-NEXT:    vzeroupper
277 ; AVX2-NEXT:    retq
278 ;
279 ; X32-SSE-LABEL: var_shift_v8i16:
280 ; X32-SSE:       # BB#0:
281 ; X32-SSE-NEXT:    psllw $12, %xmm1
282 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
283 ; X32-SSE-NEXT:    psraw $15, %xmm2
284 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
285 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
286 ; X32-SSE-NEXT:    psraw $8, %xmm0
287 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
288 ; X32-SSE-NEXT:    por %xmm3, %xmm0
289 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
290 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
291 ; X32-SSE-NEXT:    psraw $15, %xmm2
292 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
293 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
294 ; X32-SSE-NEXT:    psraw $4, %xmm0
295 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
296 ; X32-SSE-NEXT:    por %xmm3, %xmm0
297 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
298 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
299 ; X32-SSE-NEXT:    psraw $15, %xmm2
300 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
301 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
302 ; X32-SSE-NEXT:    psraw $2, %xmm0
303 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
304 ; X32-SSE-NEXT:    por %xmm3, %xmm0
305 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
306 ; X32-SSE-NEXT:    psraw $15, %xmm1
307 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
308 ; X32-SSE-NEXT:    pandn %xmm0, %xmm2
309 ; X32-SSE-NEXT:    psraw $1, %xmm0
310 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
311 ; X32-SSE-NEXT:    por %xmm2, %xmm0
312 ; X32-SSE-NEXT:    retl
313   %shift = ashr <8 x i16> %a, %b
314   ret <8 x i16> %shift
315 }
316
317 define <16 x i8> @var_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
318 ; SSE2-LABEL: var_shift_v16i8:
319 ; SSE2:       # BB#0:
320 ; 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]
321 ; SSE2-NEXT:    psllw $5, %xmm1
322 ; 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]
323 ; SSE2-NEXT:    pxor %xmm3, %xmm3
324 ; SSE2-NEXT:    pxor %xmm5, %xmm5
325 ; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5
326 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
327 ; SSE2-NEXT:    pandn %xmm2, %xmm6
328 ; SSE2-NEXT:    psraw $4, %xmm2
329 ; SSE2-NEXT:    pand %xmm5, %xmm2
330 ; SSE2-NEXT:    por %xmm6, %xmm2
331 ; SSE2-NEXT:    paddw %xmm4, %xmm4
332 ; SSE2-NEXT:    pxor %xmm5, %xmm5
333 ; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5
334 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
335 ; SSE2-NEXT:    pandn %xmm2, %xmm6
336 ; SSE2-NEXT:    psraw $2, %xmm2
337 ; SSE2-NEXT:    pand %xmm5, %xmm2
338 ; SSE2-NEXT:    por %xmm6, %xmm2
339 ; SSE2-NEXT:    paddw %xmm4, %xmm4
340 ; SSE2-NEXT:    pxor %xmm5, %xmm5
341 ; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5
342 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
343 ; SSE2-NEXT:    pandn %xmm2, %xmm4
344 ; SSE2-NEXT:    psraw $1, %xmm2
345 ; SSE2-NEXT:    pand %xmm5, %xmm2
346 ; SSE2-NEXT:    por %xmm4, %xmm2
347 ; SSE2-NEXT:    psrlw $8, %xmm2
348 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
349 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
350 ; SSE2-NEXT:    pxor %xmm4, %xmm4
351 ; SSE2-NEXT:    pcmpgtw %xmm1, %xmm4
352 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
353 ; SSE2-NEXT:    pandn %xmm0, %xmm5
354 ; SSE2-NEXT:    psraw $4, %xmm0
355 ; SSE2-NEXT:    pand %xmm4, %xmm0
356 ; SSE2-NEXT:    por %xmm5, %xmm0
357 ; SSE2-NEXT:    paddw %xmm1, %xmm1
358 ; SSE2-NEXT:    pxor %xmm4, %xmm4
359 ; SSE2-NEXT:    pcmpgtw %xmm1, %xmm4
360 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
361 ; SSE2-NEXT:    pandn %xmm0, %xmm5
362 ; SSE2-NEXT:    psraw $2, %xmm0
363 ; SSE2-NEXT:    pand %xmm4, %xmm0
364 ; SSE2-NEXT:    por %xmm5, %xmm0
365 ; SSE2-NEXT:    paddw %xmm1, %xmm1
366 ; SSE2-NEXT:    pcmpgtw %xmm1, %xmm3
367 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
368 ; SSE2-NEXT:    pandn %xmm0, %xmm1
369 ; SSE2-NEXT:    psraw $1, %xmm0
370 ; SSE2-NEXT:    pand %xmm3, %xmm0
371 ; SSE2-NEXT:    por %xmm1, %xmm0
372 ; SSE2-NEXT:    psrlw $8, %xmm0
373 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
374 ; SSE2-NEXT:    retq
375 ;
376 ; SSE41-LABEL: var_shift_v16i8:
377 ; SSE41:       # BB#0:
378 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
379 ; SSE41-NEXT:    psllw $5, %xmm1
380 ; 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]
381 ; 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]
382 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
383 ; SSE41-NEXT:    psraw $4, %xmm4
384 ; SSE41-NEXT:    pblendvb %xmm4, %xmm3
385 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
386 ; SSE41-NEXT:    psraw $2, %xmm4
387 ; SSE41-NEXT:    paddw %xmm0, %xmm0
388 ; SSE41-NEXT:    pblendvb %xmm4, %xmm3
389 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
390 ; SSE41-NEXT:    psraw $1, %xmm4
391 ; SSE41-NEXT:    paddw %xmm0, %xmm0
392 ; SSE41-NEXT:    pblendvb %xmm4, %xmm3
393 ; SSE41-NEXT:    psrlw $8, %xmm3
394 ; 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]
395 ; 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]
396 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
397 ; SSE41-NEXT:    psraw $4, %xmm2
398 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
399 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
400 ; SSE41-NEXT:    psraw $2, %xmm2
401 ; SSE41-NEXT:    paddw %xmm0, %xmm0
402 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
403 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
404 ; SSE41-NEXT:    psraw $1, %xmm2
405 ; SSE41-NEXT:    paddw %xmm0, %xmm0
406 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
407 ; SSE41-NEXT:    psrlw $8, %xmm1
408 ; SSE41-NEXT:    packuswb %xmm3, %xmm1
409 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
410 ; SSE41-NEXT:    retq
411 ;
412 ; AVX-LABEL: var_shift_v16i8:
413 ; AVX:       # BB#0:
414 ; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
415 ; 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]
416 ; AVX-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
417 ; AVX-NEXT:    vpsraw $4, %xmm3, %xmm4
418 ; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
419 ; AVX-NEXT:    vpsraw $2, %xmm3, %xmm4
420 ; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
421 ; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
422 ; AVX-NEXT:    vpsraw $1, %xmm3, %xmm4
423 ; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
424 ; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
425 ; AVX-NEXT:    vpsrlw $8, %xmm2, %xmm2
426 ; 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]
427 ; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
428 ; AVX-NEXT:    vpsraw $4, %xmm0, %xmm3
429 ; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
430 ; AVX-NEXT:    vpsraw $2, %xmm0, %xmm3
431 ; AVX-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
432 ; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
433 ; AVX-NEXT:    vpsraw $1, %xmm0, %xmm3
434 ; AVX-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
435 ; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
436 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm0
437 ; AVX-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
438 ; AVX-NEXT:    retq
439 ;
440 ; X32-SSE-LABEL: var_shift_v16i8:
441 ; X32-SSE:       # BB#0:
442 ; 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]
443 ; X32-SSE-NEXT:    psllw $5, %xmm1
444 ; 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]
445 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
446 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
447 ; X32-SSE-NEXT:    pcmpgtw %xmm4, %xmm5
448 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
449 ; X32-SSE-NEXT:    pandn %xmm2, %xmm6
450 ; X32-SSE-NEXT:    psraw $4, %xmm2
451 ; X32-SSE-NEXT:    pand %xmm5, %xmm2
452 ; X32-SSE-NEXT:    por %xmm6, %xmm2
453 ; X32-SSE-NEXT:    paddw %xmm4, %xmm4
454 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
455 ; X32-SSE-NEXT:    pcmpgtw %xmm4, %xmm5
456 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
457 ; X32-SSE-NEXT:    pandn %xmm2, %xmm6
458 ; X32-SSE-NEXT:    psraw $2, %xmm2
459 ; X32-SSE-NEXT:    pand %xmm5, %xmm2
460 ; X32-SSE-NEXT:    por %xmm6, %xmm2
461 ; X32-SSE-NEXT:    paddw %xmm4, %xmm4
462 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
463 ; X32-SSE-NEXT:    pcmpgtw %xmm4, %xmm5
464 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm4
465 ; X32-SSE-NEXT:    pandn %xmm2, %xmm4
466 ; X32-SSE-NEXT:    psraw $1, %xmm2
467 ; X32-SSE-NEXT:    pand %xmm5, %xmm2
468 ; X32-SSE-NEXT:    por %xmm4, %xmm2
469 ; X32-SSE-NEXT:    psrlw $8, %xmm2
470 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
471 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
472 ; X32-SSE-NEXT:    pxor %xmm4, %xmm4
473 ; X32-SSE-NEXT:    pcmpgtw %xmm1, %xmm4
474 ; X32-SSE-NEXT:    movdqa %xmm4, %xmm5
475 ; X32-SSE-NEXT:    pandn %xmm0, %xmm5
476 ; X32-SSE-NEXT:    psraw $4, %xmm0
477 ; X32-SSE-NEXT:    pand %xmm4, %xmm0
478 ; X32-SSE-NEXT:    por %xmm5, %xmm0
479 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
480 ; X32-SSE-NEXT:    pxor %xmm4, %xmm4
481 ; X32-SSE-NEXT:    pcmpgtw %xmm1, %xmm4
482 ; X32-SSE-NEXT:    movdqa %xmm4, %xmm5
483 ; X32-SSE-NEXT:    pandn %xmm0, %xmm5
484 ; X32-SSE-NEXT:    psraw $2, %xmm0
485 ; X32-SSE-NEXT:    pand %xmm4, %xmm0
486 ; X32-SSE-NEXT:    por %xmm5, %xmm0
487 ; X32-SSE-NEXT:    paddw %xmm1, %xmm1
488 ; X32-SSE-NEXT:    pcmpgtw %xmm1, %xmm3
489 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm1
490 ; X32-SSE-NEXT:    pandn %xmm0, %xmm1
491 ; X32-SSE-NEXT:    psraw $1, %xmm0
492 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
493 ; X32-SSE-NEXT:    por %xmm1, %xmm0
494 ; X32-SSE-NEXT:    psrlw $8, %xmm0
495 ; X32-SSE-NEXT:    packuswb %xmm2, %xmm0
496 ; X32-SSE-NEXT:    retl
497   %shift = ashr <16 x i8> %a, %b
498   ret <16 x i8> %shift
499 }
500
501 ;
502 ; Uniform Variable Shifts
503 ;
504
505 define <2 x i64> @splatvar_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
506 ; SSE-LABEL: splatvar_shift_v2i64:
507 ; SSE:       # BB#0:
508 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
509 ; SSE-NEXT:    psrlq %xmm1, %xmm2
510 ; SSE-NEXT:    psrlq %xmm1, %xmm0
511 ; SSE-NEXT:    pxor %xmm2, %xmm0
512 ; SSE-NEXT:    psubq %xmm2, %xmm0
513 ; SSE-NEXT:    retq
514 ;
515 ; AVX-LABEL: splatvar_shift_v2i64:
516 ; AVX:       # BB#0:
517 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
518 ; AVX-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2
519 ; AVX-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
520 ; AVX-NEXT:    vpxor %xmm2, %xmm0, %xmm0
521 ; AVX-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
522 ; AVX-NEXT:    retq
523 ;
524 ; X32-SSE-LABEL: splatvar_shift_v2i64:
525 ; X32-SSE:       # BB#0:
526 ; X32-SSE-NEXT:    movq {{.*#+}} xmm1 = xmm1[0],zero
527 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
528 ; X32-SSE-NEXT:    psrlq %xmm1, %xmm2
529 ; X32-SSE-NEXT:    psrlq %xmm1, %xmm0
530 ; X32-SSE-NEXT:    pxor %xmm2, %xmm0
531 ; X32-SSE-NEXT:    psubq %xmm2, %xmm0
532 ; X32-SSE-NEXT:    retl
533   %splat = shufflevector <2 x i64> %b, <2 x i64> undef, <2 x i32> zeroinitializer
534   %shift = ashr <2 x i64> %a, %splat
535   ret <2 x i64> %shift
536 }
537
538 define <4 x i32> @splatvar_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
539 ; SSE2-LABEL: splatvar_shift_v4i32:
540 ; SSE2:       # BB#0:
541 ; SSE2-NEXT:    xorps %xmm2, %xmm2
542 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
543 ; SSE2-NEXT:    psrad %xmm2, %xmm0
544 ; SSE2-NEXT:    retq
545 ;
546 ; SSE41-LABEL: splatvar_shift_v4i32:
547 ; SSE41:       # BB#0:
548 ; SSE41-NEXT:    pxor %xmm2, %xmm2
549 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3,4,5,6,7]
550 ; SSE41-NEXT:    psrad %xmm2, %xmm0
551 ; SSE41-NEXT:    retq
552 ;
553 ; AVX-LABEL: splatvar_shift_v4i32:
554 ; AVX:       # BB#0:
555 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
556 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
557 ; AVX-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
558 ; AVX-NEXT:    retq
559 ;
560 ; X32-SSE-LABEL: splatvar_shift_v4i32:
561 ; X32-SSE:       # BB#0:
562 ; X32-SSE-NEXT:    xorps %xmm2, %xmm2
563 ; X32-SSE-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
564 ; X32-SSE-NEXT:    psrad %xmm2, %xmm0
565 ; X32-SSE-NEXT:    retl
566   %splat = shufflevector <4 x i32> %b, <4 x i32> undef, <4 x i32> zeroinitializer
567   %shift = ashr <4 x i32> %a, %splat
568   ret <4 x i32> %shift
569 }
570
571 define <8 x i16> @splatvar_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
572 ; SSE2-LABEL: splatvar_shift_v8i16:
573 ; SSE2:       # BB#0:
574 ; SSE2-NEXT:    movd %xmm1, %eax
575 ; SSE2-NEXT:    movzwl %ax, %eax
576 ; SSE2-NEXT:    movd %eax, %xmm1
577 ; SSE2-NEXT:    psraw %xmm1, %xmm0
578 ; SSE2-NEXT:    retq
579 ;
580 ; SSE41-LABEL: splatvar_shift_v8i16:
581 ; SSE41:       # BB#0:
582 ; SSE41-NEXT:    pxor %xmm2, %xmm2
583 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3,4,5,6,7]
584 ; SSE41-NEXT:    psraw %xmm2, %xmm0
585 ; SSE41-NEXT:    retq
586 ;
587 ; AVX-LABEL: splatvar_shift_v8i16:
588 ; AVX:       # BB#0:
589 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
590 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
591 ; AVX-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
592 ; AVX-NEXT:    retq
593 ;
594 ; X32-SSE-LABEL: splatvar_shift_v8i16:
595 ; X32-SSE:       # BB#0:
596 ; X32-SSE-NEXT:    movd %xmm1, %eax
597 ; X32-SSE-NEXT:    movzwl %ax, %eax
598 ; X32-SSE-NEXT:    movd %eax, %xmm1
599 ; X32-SSE-NEXT:    psraw %xmm1, %xmm0
600 ; X32-SSE-NEXT:    retl
601   %splat = shufflevector <8 x i16> %b, <8 x i16> undef, <8 x i32> zeroinitializer
602   %shift = ashr <8 x i16> %a, %splat
603   ret <8 x i16> %shift
604 }
605
606 define <16 x i8> @splatvar_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
607 ; SSE2-LABEL: splatvar_shift_v16i8:
608 ; SSE2:       # BB#0:
609 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
610 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
611 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
612 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm1[0,1,2,3,4,4,4,4]
613 ; 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]
614 ; SSE2-NEXT:    psllw $5, %xmm3
615 ; 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]
616 ; SSE2-NEXT:    pxor %xmm2, %xmm2
617 ; SSE2-NEXT:    pxor %xmm5, %xmm5
618 ; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5
619 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
620 ; SSE2-NEXT:    pandn %xmm1, %xmm6
621 ; SSE2-NEXT:    psraw $4, %xmm1
622 ; SSE2-NEXT:    pand %xmm5, %xmm1
623 ; SSE2-NEXT:    por %xmm6, %xmm1
624 ; SSE2-NEXT:    paddw %xmm4, %xmm4
625 ; SSE2-NEXT:    pxor %xmm5, %xmm5
626 ; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5
627 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
628 ; SSE2-NEXT:    pandn %xmm1, %xmm6
629 ; SSE2-NEXT:    psraw $2, %xmm1
630 ; SSE2-NEXT:    pand %xmm5, %xmm1
631 ; SSE2-NEXT:    por %xmm6, %xmm1
632 ; SSE2-NEXT:    paddw %xmm4, %xmm4
633 ; SSE2-NEXT:    pxor %xmm5, %xmm5
634 ; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5
635 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
636 ; SSE2-NEXT:    pandn %xmm1, %xmm4
637 ; SSE2-NEXT:    psraw $1, %xmm1
638 ; SSE2-NEXT:    pand %xmm5, %xmm1
639 ; SSE2-NEXT:    por %xmm4, %xmm1
640 ; SSE2-NEXT:    psrlw $8, %xmm1
641 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
642 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
643 ; SSE2-NEXT:    pxor %xmm4, %xmm4
644 ; SSE2-NEXT:    pcmpgtw %xmm3, %xmm4
645 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
646 ; SSE2-NEXT:    pandn %xmm0, %xmm5
647 ; SSE2-NEXT:    psraw $4, %xmm0
648 ; SSE2-NEXT:    pand %xmm4, %xmm0
649 ; SSE2-NEXT:    por %xmm5, %xmm0
650 ; SSE2-NEXT:    paddw %xmm3, %xmm3
651 ; SSE2-NEXT:    pxor %xmm4, %xmm4
652 ; SSE2-NEXT:    pcmpgtw %xmm3, %xmm4
653 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
654 ; SSE2-NEXT:    pandn %xmm0, %xmm5
655 ; SSE2-NEXT:    psraw $2, %xmm0
656 ; SSE2-NEXT:    pand %xmm4, %xmm0
657 ; SSE2-NEXT:    por %xmm5, %xmm0
658 ; SSE2-NEXT:    paddw %xmm3, %xmm3
659 ; SSE2-NEXT:    pcmpgtw %xmm3, %xmm2
660 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
661 ; SSE2-NEXT:    pandn %xmm0, %xmm3
662 ; SSE2-NEXT:    psraw $1, %xmm0
663 ; SSE2-NEXT:    pand %xmm2, %xmm0
664 ; SSE2-NEXT:    por %xmm3, %xmm0
665 ; SSE2-NEXT:    psrlw $8, %xmm0
666 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
667 ; SSE2-NEXT:    retq
668 ;
669 ; SSE41-LABEL: splatvar_shift_v16i8:
670 ; SSE41:       # BB#0:
671 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
672 ; SSE41-NEXT:    pxor %xmm0, %xmm0
673 ; SSE41-NEXT:    pshufb %xmm0, %xmm1
674 ; SSE41-NEXT:    psllw $5, %xmm1
675 ; 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]
676 ; 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]
677 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
678 ; SSE41-NEXT:    psraw $4, %xmm4
679 ; SSE41-NEXT:    pblendvb %xmm4, %xmm3
680 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
681 ; SSE41-NEXT:    psraw $2, %xmm4
682 ; SSE41-NEXT:    paddw %xmm0, %xmm0
683 ; SSE41-NEXT:    pblendvb %xmm4, %xmm3
684 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
685 ; SSE41-NEXT:    psraw $1, %xmm4
686 ; SSE41-NEXT:    paddw %xmm0, %xmm0
687 ; SSE41-NEXT:    pblendvb %xmm4, %xmm3
688 ; SSE41-NEXT:    psrlw $8, %xmm3
689 ; 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]
690 ; 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]
691 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
692 ; SSE41-NEXT:    psraw $4, %xmm2
693 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
694 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
695 ; SSE41-NEXT:    psraw $2, %xmm2
696 ; SSE41-NEXT:    paddw %xmm0, %xmm0
697 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
698 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
699 ; SSE41-NEXT:    psraw $1, %xmm2
700 ; SSE41-NEXT:    paddw %xmm0, %xmm0
701 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
702 ; SSE41-NEXT:    psrlw $8, %xmm1
703 ; SSE41-NEXT:    packuswb %xmm3, %xmm1
704 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
705 ; SSE41-NEXT:    retq
706 ;
707 ; AVX1-LABEL: splatvar_shift_v16i8:
708 ; AVX1:       # BB#0:
709 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
710 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
711 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
712 ; 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]
713 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
714 ; AVX1-NEXT:    vpsraw $4, %xmm3, %xmm4
715 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
716 ; AVX1-NEXT:    vpsraw $2, %xmm3, %xmm4
717 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
718 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
719 ; AVX1-NEXT:    vpsraw $1, %xmm3, %xmm4
720 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
721 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
722 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
723 ; 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]
724 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
725 ; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm3
726 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
727 ; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm3
728 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
729 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
730 ; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm3
731 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
732 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
733 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
734 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
735 ; AVX1-NEXT:    retq
736 ;
737 ; AVX2-LABEL: splatvar_shift_v16i8:
738 ; AVX2:       # BB#0:
739 ; AVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
740 ; AVX2-NEXT:    vpsllw $5, %xmm1, %xmm1
741 ; 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]
742 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
743 ; AVX2-NEXT:    vpsraw $4, %xmm3, %xmm4
744 ; AVX2-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
745 ; AVX2-NEXT:    vpsraw $2, %xmm3, %xmm4
746 ; AVX2-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
747 ; AVX2-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
748 ; AVX2-NEXT:    vpsraw $1, %xmm3, %xmm4
749 ; AVX2-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
750 ; AVX2-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
751 ; AVX2-NEXT:    vpsrlw $8, %xmm2, %xmm2
752 ; 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]
753 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
754 ; AVX2-NEXT:    vpsraw $4, %xmm0, %xmm3
755 ; AVX2-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
756 ; AVX2-NEXT:    vpsraw $2, %xmm0, %xmm3
757 ; AVX2-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
758 ; AVX2-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
759 ; AVX2-NEXT:    vpsraw $1, %xmm0, %xmm3
760 ; AVX2-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
761 ; AVX2-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
762 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm0
763 ; AVX2-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
764 ; AVX2-NEXT:    retq
765 ;
766 ; X32-SSE-LABEL: splatvar_shift_v16i8:
767 ; X32-SSE:       # BB#0:
768 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
769 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
770 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
771 ; X32-SSE-NEXT:    pshufhw {{.*#+}} xmm3 = xmm1[0,1,2,3,4,4,4,4]
772 ; 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]
773 ; X32-SSE-NEXT:    psllw $5, %xmm3
774 ; 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]
775 ; X32-SSE-NEXT:    pxor %xmm2, %xmm2
776 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
777 ; X32-SSE-NEXT:    pcmpgtw %xmm4, %xmm5
778 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
779 ; X32-SSE-NEXT:    pandn %xmm1, %xmm6
780 ; X32-SSE-NEXT:    psraw $4, %xmm1
781 ; X32-SSE-NEXT:    pand %xmm5, %xmm1
782 ; X32-SSE-NEXT:    por %xmm6, %xmm1
783 ; X32-SSE-NEXT:    paddw %xmm4, %xmm4
784 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
785 ; X32-SSE-NEXT:    pcmpgtw %xmm4, %xmm5
786 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
787 ; X32-SSE-NEXT:    pandn %xmm1, %xmm6
788 ; X32-SSE-NEXT:    psraw $2, %xmm1
789 ; X32-SSE-NEXT:    pand %xmm5, %xmm1
790 ; X32-SSE-NEXT:    por %xmm6, %xmm1
791 ; X32-SSE-NEXT:    paddw %xmm4, %xmm4
792 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
793 ; X32-SSE-NEXT:    pcmpgtw %xmm4, %xmm5
794 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm4
795 ; X32-SSE-NEXT:    pandn %xmm1, %xmm4
796 ; X32-SSE-NEXT:    psraw $1, %xmm1
797 ; X32-SSE-NEXT:    pand %xmm5, %xmm1
798 ; X32-SSE-NEXT:    por %xmm4, %xmm1
799 ; X32-SSE-NEXT:    psrlw $8, %xmm1
800 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
801 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
802 ; X32-SSE-NEXT:    pxor %xmm4, %xmm4
803 ; X32-SSE-NEXT:    pcmpgtw %xmm3, %xmm4
804 ; X32-SSE-NEXT:    movdqa %xmm4, %xmm5
805 ; X32-SSE-NEXT:    pandn %xmm0, %xmm5
806 ; X32-SSE-NEXT:    psraw $4, %xmm0
807 ; X32-SSE-NEXT:    pand %xmm4, %xmm0
808 ; X32-SSE-NEXT:    por %xmm5, %xmm0
809 ; X32-SSE-NEXT:    paddw %xmm3, %xmm3
810 ; X32-SSE-NEXT:    pxor %xmm4, %xmm4
811 ; X32-SSE-NEXT:    pcmpgtw %xmm3, %xmm4
812 ; X32-SSE-NEXT:    movdqa %xmm4, %xmm5
813 ; X32-SSE-NEXT:    pandn %xmm0, %xmm5
814 ; X32-SSE-NEXT:    psraw $2, %xmm0
815 ; X32-SSE-NEXT:    pand %xmm4, %xmm0
816 ; X32-SSE-NEXT:    por %xmm5, %xmm0
817 ; X32-SSE-NEXT:    paddw %xmm3, %xmm3
818 ; X32-SSE-NEXT:    pcmpgtw %xmm3, %xmm2
819 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
820 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
821 ; X32-SSE-NEXT:    psraw $1, %xmm0
822 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
823 ; X32-SSE-NEXT:    por %xmm3, %xmm0
824 ; X32-SSE-NEXT:    psrlw $8, %xmm0
825 ; X32-SSE-NEXT:    packuswb %xmm1, %xmm0
826 ; X32-SSE-NEXT:    retl
827   %splat = shufflevector <16 x i8> %b, <16 x i8> undef, <16 x i32> zeroinitializer
828   %shift = ashr <16 x i8> %a, %splat
829   ret <16 x i8> %shift
830 }
831
832 ;
833 ; Constant Shifts
834 ;
835
836 define <2 x i64> @constant_shift_v2i64(<2 x i64> %a) nounwind {
837 ; SSE2-LABEL: constant_shift_v2i64:
838 ; SSE2:       # BB#0:
839 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
840 ; SSE2-NEXT:    psrlq $7, %xmm1
841 ; SSE2-NEXT:    psrlq $1, %xmm0
842 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
843 ; SSE2-NEXT:    movapd {{.*#+}} xmm0 = [4611686018427387904,72057594037927936]
844 ; SSE2-NEXT:    xorpd %xmm0, %xmm1
845 ; SSE2-NEXT:    psubq %xmm0, %xmm1
846 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
847 ; SSE2-NEXT:    retq
848 ;
849 ; SSE41-LABEL: constant_shift_v2i64:
850 ; SSE41:       # BB#0:
851 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
852 ; SSE41-NEXT:    psrlq $7, %xmm1
853 ; SSE41-NEXT:    psrlq $1, %xmm0
854 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
855 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]
856 ; SSE41-NEXT:    pxor %xmm1, %xmm0
857 ; SSE41-NEXT:    psubq %xmm1, %xmm0
858 ; SSE41-NEXT:    retq
859 ;
860 ; AVX1-LABEL: constant_shift_v2i64:
861 ; AVX1:       # BB#0:
862 ; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm1
863 ; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
864 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
865 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]
866 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
867 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
868 ; AVX1-NEXT:    retq
869 ;
870 ; AVX2-LABEL: constant_shift_v2i64:
871 ; AVX2:       # BB#0:
872 ; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %xmm0, %xmm0
873 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]
874 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
875 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
876 ; AVX2-NEXT:    retq
877 ;
878 ; X32-SSE-LABEL: constant_shift_v2i64:
879 ; X32-SSE:       # BB#0:
880 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [0,2147483648,0,2147483648]
881 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
882 ; X32-SSE-NEXT:    psrlq $7, %xmm2
883 ; X32-SSE-NEXT:    psrlq $1, %xmm1
884 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]
885 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
886 ; X32-SSE-NEXT:    psrlq $7, %xmm1
887 ; X32-SSE-NEXT:    psrlq $1, %xmm0
888 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
889 ; X32-SSE-NEXT:    xorpd %xmm2, %xmm1
890 ; X32-SSE-NEXT:    psubq %xmm2, %xmm1
891 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
892 ; X32-SSE-NEXT:    retl
893   %shift = ashr <2 x i64> %a, <i64 1, i64 7>
894   ret <2 x i64> %shift
895 }
896
897 define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind {
898 ; SSE2-LABEL: constant_shift_v4i32:
899 ; SSE2:       # BB#0:
900 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
901 ; SSE2-NEXT:    psrad $7, %xmm1
902 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
903 ; SSE2-NEXT:    psrad $5, %xmm2
904 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
905 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
906 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
907 ; SSE2-NEXT:    psrad $6, %xmm2
908 ; SSE2-NEXT:    psrad $4, %xmm0
909 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
910 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
911 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
912 ; SSE2-NEXT:    retq
913 ;
914 ; SSE41-LABEL: constant_shift_v4i32:
915 ; SSE41:       # BB#0:
916 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
917 ; SSE41-NEXT:    psrad $7, %xmm1
918 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
919 ; SSE41-NEXT:    psrad $5, %xmm2
920 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]
921 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
922 ; SSE41-NEXT:    psrad $6, %xmm1
923 ; SSE41-NEXT:    psrad $4, %xmm0
924 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
925 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
926 ; SSE41-NEXT:    retq
927 ;
928 ; AVX1-LABEL: constant_shift_v4i32:
929 ; AVX1:       # BB#0:
930 ; AVX1-NEXT:    vpsrad $7, %xmm0, %xmm1
931 ; AVX1-NEXT:    vpsrad $5, %xmm0, %xmm2
932 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
933 ; AVX1-NEXT:    vpsrad $6, %xmm0, %xmm2
934 ; AVX1-NEXT:    vpsrad $4, %xmm0, %xmm0
935 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
936 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
937 ; AVX1-NEXT:    retq
938 ;
939 ; AVX2-LABEL: constant_shift_v4i32:
940 ; AVX2:       # BB#0:
941 ; AVX2-NEXT:    vpsravd {{.*}}(%rip), %xmm0, %xmm0
942 ; AVX2-NEXT:    retq
943 ;
944 ; X32-SSE-LABEL: constant_shift_v4i32:
945 ; X32-SSE:       # BB#0:
946 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
947 ; X32-SSE-NEXT:    psrad $7, %xmm1
948 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
949 ; X32-SSE-NEXT:    psrad $5, %xmm2
950 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
951 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
952 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
953 ; X32-SSE-NEXT:    psrad $6, %xmm2
954 ; X32-SSE-NEXT:    psrad $4, %xmm0
955 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
956 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
957 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
958 ; X32-SSE-NEXT:    retl
959   %shift = ashr <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>
960   ret <4 x i32> %shift
961 }
962
963 define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind {
964 ; SSE2-LABEL: constant_shift_v8i16:
965 ; SSE2:       # BB#0:
966 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
967 ; SSE2-NEXT:    psraw $4, %xmm1
968 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
969 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
970 ; SSE2-NEXT:    psraw $2, %xmm1
971 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
972 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
973 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]
974 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
975 ; SSE2-NEXT:    pand %xmm0, %xmm1
976 ; SSE2-NEXT:    psraw $1, %xmm2
977 ; SSE2-NEXT:    pandn %xmm2, %xmm0
978 ; SSE2-NEXT:    por %xmm1, %xmm0
979 ; SSE2-NEXT:    retq
980 ;
981 ; SSE41-LABEL: constant_shift_v8i16:
982 ; SSE41:       # BB#0:
983 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
984 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
985 ; SSE41-NEXT:    psraw $8, %xmm2
986 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,4112,8224,12336,16448,20560,24672,28784]
987 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
988 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
989 ; SSE41-NEXT:    psraw $4, %xmm2
990 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,8224,16448,24672,32896,41120,49344,57568]
991 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
992 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
993 ; SSE41-NEXT:    psraw $2, %xmm2
994 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,16448,32896,49344,256,16704,33152,49600]
995 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
996 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
997 ; SSE41-NEXT:    psraw $1, %xmm2
998 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,32896,256,33152,512,33408,768,33664]
999 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
1000 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1001 ; SSE41-NEXT:    retq
1002 ;
1003 ; AVX1-LABEL: constant_shift_v8i16:
1004 ; AVX1:       # BB#0:
1005 ; AVX1-NEXT:    vpsraw $8, %xmm0, %xmm1
1006 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,4112,8224,12336,16448,20560,24672,28784]
1007 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
1008 ; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm1
1009 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,8224,16448,24672,32896,41120,49344,57568]
1010 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
1011 ; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm1
1012 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,16448,32896,49344,256,16704,33152,49600]
1013 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
1014 ; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm1
1015 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,32896,256,33152,512,33408,768,33664]
1016 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
1017 ; AVX1-NEXT:    retq
1018 ;
1019 ; AVX2-LABEL: constant_shift_v8i16:
1020 ; AVX2:       # BB#0:
1021 ; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
1022 ; 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
1023 ; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
1024 ; 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
1025 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1026 ; AVX2-NEXT:    vzeroupper
1027 ; AVX2-NEXT:    retq
1028 ;
1029 ; X32-SSE-LABEL: constant_shift_v8i16:
1030 ; X32-SSE:       # BB#0:
1031 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1032 ; X32-SSE-NEXT:    psraw $4, %xmm1
1033 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1034 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
1035 ; X32-SSE-NEXT:    psraw $2, %xmm1
1036 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
1037 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1038 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]
1039 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm1
1040 ; X32-SSE-NEXT:    pand %xmm0, %xmm1
1041 ; X32-SSE-NEXT:    psraw $1, %xmm2
1042 ; X32-SSE-NEXT:    pandn %xmm2, %xmm0
1043 ; X32-SSE-NEXT:    por %xmm1, %xmm0
1044 ; X32-SSE-NEXT:    retl
1045   %shift = ashr <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>
1046   ret <8 x i16> %shift
1047 }
1048
1049 define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind {
1050 ; SSE2-LABEL: constant_shift_v16i8:
1051 ; SSE2:       # BB#0:
1052 ; 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]
1053 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1054 ; SSE2-NEXT:    psllw $5, %xmm3
1055 ; 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]
1056 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1057 ; SSE2-NEXT:    pxor %xmm5, %xmm5
1058 ; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5
1059 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
1060 ; SSE2-NEXT:    pandn %xmm1, %xmm6
1061 ; SSE2-NEXT:    psraw $4, %xmm1
1062 ; SSE2-NEXT:    pand %xmm5, %xmm1
1063 ; SSE2-NEXT:    por %xmm6, %xmm1
1064 ; SSE2-NEXT:    paddw %xmm4, %xmm4
1065 ; SSE2-NEXT:    pxor %xmm5, %xmm5
1066 ; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5
1067 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
1068 ; SSE2-NEXT:    pandn %xmm1, %xmm6
1069 ; SSE2-NEXT:    psraw $2, %xmm1
1070 ; SSE2-NEXT:    pand %xmm5, %xmm1
1071 ; SSE2-NEXT:    por %xmm6, %xmm1
1072 ; SSE2-NEXT:    paddw %xmm4, %xmm4
1073 ; SSE2-NEXT:    pxor %xmm5, %xmm5
1074 ; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5
1075 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
1076 ; SSE2-NEXT:    pandn %xmm1, %xmm4
1077 ; SSE2-NEXT:    psraw $1, %xmm1
1078 ; SSE2-NEXT:    pand %xmm5, %xmm1
1079 ; SSE2-NEXT:    por %xmm4, %xmm1
1080 ; SSE2-NEXT:    psrlw $8, %xmm1
1081 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1082 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1083 ; SSE2-NEXT:    pxor %xmm4, %xmm4
1084 ; SSE2-NEXT:    pcmpgtw %xmm3, %xmm4
1085 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
1086 ; SSE2-NEXT:    pandn %xmm0, %xmm5
1087 ; SSE2-NEXT:    psraw $4, %xmm0
1088 ; SSE2-NEXT:    pand %xmm4, %xmm0
1089 ; SSE2-NEXT:    por %xmm5, %xmm0
1090 ; SSE2-NEXT:    paddw %xmm3, %xmm3
1091 ; SSE2-NEXT:    pxor %xmm4, %xmm4
1092 ; SSE2-NEXT:    pcmpgtw %xmm3, %xmm4
1093 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
1094 ; SSE2-NEXT:    pandn %xmm0, %xmm5
1095 ; SSE2-NEXT:    psraw $2, %xmm0
1096 ; SSE2-NEXT:    pand %xmm4, %xmm0
1097 ; SSE2-NEXT:    por %xmm5, %xmm0
1098 ; SSE2-NEXT:    paddw %xmm3, %xmm3
1099 ; SSE2-NEXT:    pcmpgtw %xmm3, %xmm2
1100 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
1101 ; SSE2-NEXT:    pandn %xmm0, %xmm3
1102 ; SSE2-NEXT:    psraw $1, %xmm0
1103 ; SSE2-NEXT:    pand %xmm2, %xmm0
1104 ; SSE2-NEXT:    por %xmm3, %xmm0
1105 ; SSE2-NEXT:    psrlw $8, %xmm0
1106 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
1107 ; SSE2-NEXT:    retq
1108 ;
1109 ; SSE41-LABEL: constant_shift_v16i8:
1110 ; SSE41:       # BB#0:
1111 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1112 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1113 ; SSE41-NEXT:    psllw $5, %xmm3
1114 ; 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]
1115 ; 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]
1116 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
1117 ; SSE41-NEXT:    psraw $4, %xmm4
1118 ; SSE41-NEXT:    pblendvb %xmm4, %xmm2
1119 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
1120 ; SSE41-NEXT:    psraw $2, %xmm4
1121 ; SSE41-NEXT:    paddw %xmm0, %xmm0
1122 ; SSE41-NEXT:    pblendvb %xmm4, %xmm2
1123 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
1124 ; SSE41-NEXT:    psraw $1, %xmm4
1125 ; SSE41-NEXT:    paddw %xmm0, %xmm0
1126 ; SSE41-NEXT:    pblendvb %xmm4, %xmm2
1127 ; SSE41-NEXT:    psrlw $8, %xmm2
1128 ; 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]
1129 ; SSE41-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1130 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
1131 ; SSE41-NEXT:    psraw $4, %xmm3
1132 ; SSE41-NEXT:    pblendvb %xmm3, %xmm1
1133 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
1134 ; SSE41-NEXT:    psraw $2, %xmm3
1135 ; SSE41-NEXT:    paddw %xmm0, %xmm0
1136 ; SSE41-NEXT:    pblendvb %xmm3, %xmm1
1137 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
1138 ; SSE41-NEXT:    psraw $1, %xmm3
1139 ; SSE41-NEXT:    paddw %xmm0, %xmm0
1140 ; SSE41-NEXT:    pblendvb %xmm3, %xmm1
1141 ; SSE41-NEXT:    psrlw $8, %xmm1
1142 ; SSE41-NEXT:    packuswb %xmm2, %xmm1
1143 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1144 ; SSE41-NEXT:    retq
1145 ;
1146 ; AVX-LABEL: constant_shift_v16i8:
1147 ; AVX:       # BB#0:
1148 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1149 ; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
1150 ; 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]
1151 ; AVX-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1152 ; AVX-NEXT:    vpsraw $4, %xmm3, %xmm4
1153 ; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
1154 ; AVX-NEXT:    vpsraw $2, %xmm3, %xmm4
1155 ; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
1156 ; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm3
1157 ; AVX-NEXT:    vpsraw $1, %xmm3, %xmm4
1158 ; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
1159 ; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm2
1160 ; AVX-NEXT:    vpsrlw $8, %xmm2, %xmm2
1161 ; 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]
1162 ; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1163 ; AVX-NEXT:    vpsraw $4, %xmm0, %xmm3
1164 ; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1165 ; AVX-NEXT:    vpsraw $2, %xmm0, %xmm3
1166 ; AVX-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
1167 ; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1168 ; AVX-NEXT:    vpsraw $1, %xmm0, %xmm3
1169 ; AVX-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
1170 ; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1171 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm0
1172 ; AVX-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1173 ; AVX-NEXT:    retq
1174 ;
1175 ; X32-SSE-LABEL: constant_shift_v16i8:
1176 ; X32-SSE:       # BB#0:
1177 ; 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]
1178 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
1179 ; X32-SSE-NEXT:    psllw $5, %xmm3
1180 ; 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]
1181 ; X32-SSE-NEXT:    pxor %xmm2, %xmm2
1182 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
1183 ; X32-SSE-NEXT:    pcmpgtw %xmm4, %xmm5
1184 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
1185 ; X32-SSE-NEXT:    pandn %xmm1, %xmm6
1186 ; X32-SSE-NEXT:    psraw $4, %xmm1
1187 ; X32-SSE-NEXT:    pand %xmm5, %xmm1
1188 ; X32-SSE-NEXT:    por %xmm6, %xmm1
1189 ; X32-SSE-NEXT:    paddw %xmm4, %xmm4
1190 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
1191 ; X32-SSE-NEXT:    pcmpgtw %xmm4, %xmm5
1192 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm6
1193 ; X32-SSE-NEXT:    pandn %xmm1, %xmm6
1194 ; X32-SSE-NEXT:    psraw $2, %xmm1
1195 ; X32-SSE-NEXT:    pand %xmm5, %xmm1
1196 ; X32-SSE-NEXT:    por %xmm6, %xmm1
1197 ; X32-SSE-NEXT:    paddw %xmm4, %xmm4
1198 ; X32-SSE-NEXT:    pxor %xmm5, %xmm5
1199 ; X32-SSE-NEXT:    pcmpgtw %xmm4, %xmm5
1200 ; X32-SSE-NEXT:    movdqa %xmm5, %xmm4
1201 ; X32-SSE-NEXT:    pandn %xmm1, %xmm4
1202 ; X32-SSE-NEXT:    psraw $1, %xmm1
1203 ; X32-SSE-NEXT:    pand %xmm5, %xmm1
1204 ; X32-SSE-NEXT:    por %xmm4, %xmm1
1205 ; X32-SSE-NEXT:    psrlw $8, %xmm1
1206 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1207 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1208 ; X32-SSE-NEXT:    pxor %xmm4, %xmm4
1209 ; X32-SSE-NEXT:    pcmpgtw %xmm3, %xmm4
1210 ; X32-SSE-NEXT:    movdqa %xmm4, %xmm5
1211 ; X32-SSE-NEXT:    pandn %xmm0, %xmm5
1212 ; X32-SSE-NEXT:    psraw $4, %xmm0
1213 ; X32-SSE-NEXT:    pand %xmm4, %xmm0
1214 ; X32-SSE-NEXT:    por %xmm5, %xmm0
1215 ; X32-SSE-NEXT:    paddw %xmm3, %xmm3
1216 ; X32-SSE-NEXT:    pxor %xmm4, %xmm4
1217 ; X32-SSE-NEXT:    pcmpgtw %xmm3, %xmm4
1218 ; X32-SSE-NEXT:    movdqa %xmm4, %xmm5
1219 ; X32-SSE-NEXT:    pandn %xmm0, %xmm5
1220 ; X32-SSE-NEXT:    psraw $2, %xmm0
1221 ; X32-SSE-NEXT:    pand %xmm4, %xmm0
1222 ; X32-SSE-NEXT:    por %xmm5, %xmm0
1223 ; X32-SSE-NEXT:    paddw %xmm3, %xmm3
1224 ; X32-SSE-NEXT:    pcmpgtw %xmm3, %xmm2
1225 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
1226 ; X32-SSE-NEXT:    pandn %xmm0, %xmm3
1227 ; X32-SSE-NEXT:    psraw $1, %xmm0
1228 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
1229 ; X32-SSE-NEXT:    por %xmm3, %xmm0
1230 ; X32-SSE-NEXT:    psrlw $8, %xmm0
1231 ; X32-SSE-NEXT:    packuswb %xmm1, %xmm0
1232 ; X32-SSE-NEXT:    retl
1233   %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>
1234   ret <16 x i8> %shift
1235 }
1236
1237 ;
1238 ; Uniform Constant Shifts
1239 ;
1240
1241 define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind {
1242 ; SSE2-LABEL: splatconstant_shift_v2i64:
1243 ; SSE2:       # BB#0:
1244 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1245 ; SSE2-NEXT:    psrad $7, %xmm1
1246 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1247 ; SSE2-NEXT:    psrlq $7, %xmm0
1248 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1249 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1250 ; SSE2-NEXT:    retq
1251 ;
1252 ; SSE41-LABEL: splatconstant_shift_v2i64:
1253 ; SSE41:       # BB#0:
1254 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1255 ; SSE41-NEXT:    psrad $7, %xmm1
1256 ; SSE41-NEXT:    psrlq $7, %xmm0
1257 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
1258 ; SSE41-NEXT:    retq
1259 ;
1260 ; AVX1-LABEL: splatconstant_shift_v2i64:
1261 ; AVX1:       # BB#0:
1262 ; AVX1-NEXT:    vpsrad $7, %xmm0, %xmm1
1263 ; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm0
1264 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
1265 ; AVX1-NEXT:    retq
1266 ;
1267 ; AVX2-LABEL: splatconstant_shift_v2i64:
1268 ; AVX2:       # BB#0:
1269 ; AVX2-NEXT:    vpsrad $7, %xmm0, %xmm1
1270 ; AVX2-NEXT:    vpsrlq $7, %xmm0, %xmm0
1271 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1272 ; AVX2-NEXT:    retq
1273 ;
1274 ; X32-SSE-LABEL: splatconstant_shift_v2i64:
1275 ; X32-SSE:       # BB#0:
1276 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1277 ; X32-SSE-NEXT:    psrad $7, %xmm1
1278 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1279 ; X32-SSE-NEXT:    psrlq $7, %xmm0
1280 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1281 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1282 ; X32-SSE-NEXT:    retl
1283   %shift = ashr <2 x i64> %a, <i64 7, i64 7>
1284   ret <2 x i64> %shift
1285 }
1286
1287 define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind {
1288 ; SSE-LABEL: splatconstant_shift_v4i32:
1289 ; SSE:       # BB#0:
1290 ; SSE-NEXT:    psrad $5, %xmm0
1291 ; SSE-NEXT:    retq
1292 ;
1293 ; AVX-LABEL: splatconstant_shift_v4i32:
1294 ; AVX:       # BB#0:
1295 ; AVX-NEXT:    vpsrad $5, %xmm0, %xmm0
1296 ; AVX-NEXT:    retq
1297 ;
1298 ; X32-SSE-LABEL: splatconstant_shift_v4i32:
1299 ; X32-SSE:       # BB#0:
1300 ; X32-SSE-NEXT:    psrad $5, %xmm0
1301 ; X32-SSE-NEXT:    retl
1302   %shift = ashr <4 x i32> %a, <i32 5, i32 5, i32 5, i32 5>
1303   ret <4 x i32> %shift
1304 }
1305
1306 define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind {
1307 ; SSE-LABEL: splatconstant_shift_v8i16:
1308 ; SSE:       # BB#0:
1309 ; SSE-NEXT:    psraw $3, %xmm0
1310 ; SSE-NEXT:    retq
1311 ;
1312 ; AVX-LABEL: splatconstant_shift_v8i16:
1313 ; AVX:       # BB#0:
1314 ; AVX-NEXT:    vpsraw $3, %xmm0, %xmm0
1315 ; AVX-NEXT:    retq
1316 ;
1317 ; X32-SSE-LABEL: splatconstant_shift_v8i16:
1318 ; X32-SSE:       # BB#0:
1319 ; X32-SSE-NEXT:    psraw $3, %xmm0
1320 ; X32-SSE-NEXT:    retl
1321   %shift = ashr <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
1322   ret <8 x i16> %shift
1323 }
1324
1325 define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind {
1326 ; SSE-LABEL: splatconstant_shift_v16i8:
1327 ; SSE:       # BB#0:
1328 ; SSE-NEXT:    psrlw $3, %xmm0
1329 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
1330 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1331 ; SSE-NEXT:    pxor %xmm1, %xmm0
1332 ; SSE-NEXT:    psubb %xmm1, %xmm0
1333 ; SSE-NEXT:    retq
1334 ;
1335 ; AVX-LABEL: splatconstant_shift_v16i8:
1336 ; AVX:       # BB#0:
1337 ; AVX-NEXT:    vpsrlw $3, %xmm0, %xmm0
1338 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1339 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1340 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1341 ; AVX-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
1342 ; AVX-NEXT:    retq
1343 ;
1344 ; X32-SSE-LABEL: splatconstant_shift_v16i8:
1345 ; X32-SSE:       # BB#0:
1346 ; X32-SSE-NEXT:    psrlw $3, %xmm0
1347 ; X32-SSE-NEXT:    pand .LCPI15_0, %xmm0
1348 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1349 ; X32-SSE-NEXT:    pxor %xmm1, %xmm0
1350 ; X32-SSE-NEXT:    psubb %xmm1, %xmm0
1351 ; X32-SSE-NEXT:    retl
1352   %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>
1353   ret <16 x i8> %shift
1354 }