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