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