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