1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
6; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
7;
8; Variable Shifts
9;
10
11define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
12; AVX1-LABEL: var_shift_v4i64:
13; AVX1:       # BB#0:
14; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
15; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
16; AVX1-NEXT:    vpsrlq %xmm2, %xmm3, %xmm4
17; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
18; AVX1-NEXT:    vpsrlq %xmm2, %xmm3, %xmm2
19; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
20; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm3
21; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
22; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
23; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
24; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
25; AVX1-NEXT:    retq
26;
27; AVX2-LABEL: var_shift_v4i64:
28; AVX2:       # BB#0:
29; AVX2-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm0
30; AVX2-NEXT:    retq
31;
32; XOPAVX1-LABEL: var_shift_v4i64:
33; XOPAVX1:       # BB#0:
34; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
35; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
36; XOPAVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm2
37; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
38; XOPAVX1-NEXT:    vpshlq %xmm2, %xmm4, %xmm2
39; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm3, %xmm1
40; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm0
41; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
42; XOPAVX1-NEXT:    retq
43;
44; XOPAVX2-LABEL: var_shift_v4i64:
45; XOPAVX2:       # BB#0:
46; XOPAVX2-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm0
47; XOPAVX2-NEXT:    retq
48;
49; AVX512-LABEL: var_shift_v4i64:
50; AVX512:       ## BB#0:
51; AVX512-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm0
52; AVX512-NEXT:    retq
53  %shift = lshr <4 x i64> %a, %b
54  ret <4 x i64> %shift
55}
56
57define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
58; AVX1-LABEL: var_shift_v8i32:
59; AVX1:       # BB#0:
60; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
61; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
62; AVX1-NEXT:    vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
63; AVX1-NEXT:    vpsrld %xmm4, %xmm2, %xmm4
64; AVX1-NEXT:    vpsrlq $32, %xmm3, %xmm5
65; AVX1-NEXT:    vpsrld %xmm5, %xmm2, %xmm5
66; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]
67; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
68; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
69; AVX1-NEXT:    vpsrld %xmm6, %xmm2, %xmm6
70; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
71; AVX1-NEXT:    vpsrld %xmm3, %xmm2, %xmm2
72; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
73; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
74; AVX1-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
75; AVX1-NEXT:    vpsrld %xmm3, %xmm0, %xmm3
76; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm4
77; AVX1-NEXT:    vpsrld %xmm4, %xmm0, %xmm4
78; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
79; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3]
80; AVX1-NEXT:    vpsrld %xmm4, %xmm0, %xmm4
81; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
82; AVX1-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
83; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
84; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
85; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
86; AVX1-NEXT:    retq
87;
88; AVX2-LABEL: var_shift_v8i32:
89; AVX2:       # BB#0:
90; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
91; AVX2-NEXT:    retq
92;
93; XOPAVX1-LABEL: var_shift_v8i32:
94; XOPAVX1:       # BB#0:
95; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
96; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
97; XOPAVX1-NEXT:    vpsubd %xmm2, %xmm3, %xmm2
98; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
99; XOPAVX1-NEXT:    vpshld %xmm2, %xmm4, %xmm2
100; XOPAVX1-NEXT:    vpsubd %xmm1, %xmm3, %xmm1
101; XOPAVX1-NEXT:    vpshld %xmm1, %xmm0, %xmm0
102; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
103; XOPAVX1-NEXT:    retq
104;
105; XOPAVX2-LABEL: var_shift_v8i32:
106; XOPAVX2:       # BB#0:
107; XOPAVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
108; XOPAVX2-NEXT:    retq
109;
110; AVX512-LABEL: var_shift_v8i32:
111; AVX512:       ## BB#0:
112; AVX512-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
113; AVX512-NEXT:    retq
114  %shift = lshr <8 x i32> %a, %b
115  ret <8 x i32> %shift
116}
117
118define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
119; AVX1-LABEL: var_shift_v16i16:
120; AVX1:       # BB#0:
121; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
122; AVX1-NEXT:    vpsllw $12, %xmm2, %xmm3
123; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
124; AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2
125; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm3
126; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
127; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm5
128; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
129; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm4
130; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
131; AVX1-NEXT:    vpsrlw $2, %xmm2, %xmm4
132; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
133; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
134; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm4
135; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
136; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
137; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm3
138; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
139; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
140; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm3
141; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm4
142; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
143; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm1
144; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
145; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm1
146; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
147; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
148; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm1
149; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
150; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
151; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
152; AVX1-NEXT:    retq
153;
154; AVX2-LABEL: var_shift_v16i16:
155; AVX2:       # BB#0:
156; AVX2-NEXT:    vpxor %ymm2, %ymm2, %ymm2
157; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
158; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
159; AVX2-NEXT:    vpsrlvd %ymm3, %ymm4, %ymm3
160; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
161; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
162; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
163; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
164; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
165; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
166; AVX2-NEXT:    retq
167;
168; XOPAVX1-LABEL: var_shift_v16i16:
169; XOPAVX1:       # BB#0:
170; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
171; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
172; XOPAVX1-NEXT:    vpsubw %xmm2, %xmm3, %xmm2
173; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
174; XOPAVX1-NEXT:    vpshlw %xmm2, %xmm4, %xmm2
175; XOPAVX1-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
176; XOPAVX1-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
177; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
178; XOPAVX1-NEXT:    retq
179;
180; XOPAVX2-LABEL: var_shift_v16i16:
181; XOPAVX2:       # BB#0:
182; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
183; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
184; XOPAVX2-NEXT:    vpsubw %xmm2, %xmm3, %xmm2
185; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
186; XOPAVX2-NEXT:    vpshlw %xmm2, %xmm4, %xmm2
187; XOPAVX2-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
188; XOPAVX2-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
189; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
190; XOPAVX2-NEXT:    retq
191;
192; AVX512-LABEL: var_shift_v16i16:
193; AVX512:       ## BB#0:
194; AVX512-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
195; AVX512-NEXT:    retq
196  %shift = lshr <16 x i16> %a, %b
197  ret <16 x i16> %shift
198}
199
200define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
201; AVX1-LABEL: var_shift_v32i8:
202; AVX1:       # BB#0:
203; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
204; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm3
205; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
206; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
207; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
208; AVX1-NEXT:    vpsllw $5, %xmm5, %xmm5
209; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
210; AVX1-NEXT:    vpsrlw $2, %xmm2, %xmm3
211; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
212; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
213; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
214; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
215; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm3
216; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
217; AVX1-NEXT:    vpand %xmm7, %xmm3, %xmm3
218; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
219; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
220; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm3
221; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
222; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
223; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
224; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm3
225; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
226; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
227; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
228; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm3
229; AVX1-NEXT:    vpand %xmm7, %xmm3, %xmm3
230; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
231; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
232; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
233; AVX1-NEXT:    retq
234;
235; AVX2-LABEL: var_shift_v32i8:
236; AVX2:       # BB#0:
237; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
238; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm2
239; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
240; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
241; AVX2-NEXT:    vpsrlw $2, %ymm0, %ymm2
242; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
243; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
244; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
245; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm2
246; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
247; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
248; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
249; AVX2-NEXT:    retq
250;
251; XOPAVX1-LABEL: var_shift_v32i8:
252; XOPAVX1:       # BB#0:
253; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
254; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
255; XOPAVX1-NEXT:    vpsubb %xmm2, %xmm3, %xmm2
256; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
257; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm4, %xmm2
258; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
259; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
260; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
261; XOPAVX1-NEXT:    retq
262;
263; XOPAVX2-LABEL: var_shift_v32i8:
264; XOPAVX2:       # BB#0:
265; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
266; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
267; XOPAVX2-NEXT:    vpsubb %xmm2, %xmm3, %xmm2
268; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
269; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm4, %xmm2
270; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
271; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
272; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
273; XOPAVX2-NEXT:    retq
274;
275; AVX512-LABEL: var_shift_v32i8:
276; AVX512:       ## BB#0:
277; AVX512-NEXT:    vpsllw $5, %ymm1, %ymm1
278; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm2
279; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
280; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
281; AVX512-NEXT:    vpsrlw $2, %ymm0, %ymm2
282; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
283; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
284; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
285; AVX512-NEXT:    vpsrlw $1, %ymm0, %ymm2
286; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
287; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
288; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
289; AVX512-NEXT:    retq
290  %shift = lshr <32 x i8> %a, %b
291  ret <32 x i8> %shift
292}
293
294;
295; Uniform Variable Shifts
296;
297
298define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
299; AVX1-LABEL: splatvar_shift_v4i64:
300; AVX1:       # BB#0:
301; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
302; AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2
303; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
304; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
305; AVX1-NEXT:    retq
306;
307; AVX2-LABEL: splatvar_shift_v4i64:
308; AVX2:       # BB#0:
309; AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
310; AVX2-NEXT:    retq
311;
312; XOPAVX1-LABEL: splatvar_shift_v4i64:
313; XOPAVX1:       # BB#0:
314; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
315; XOPAVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2
316; XOPAVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
317; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
318; XOPAVX1-NEXT:    retq
319;
320; XOPAVX2-LABEL: splatvar_shift_v4i64:
321; XOPAVX2:       # BB#0:
322; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
323; XOPAVX2-NEXT:    retq
324;
325; AVX512-LABEL: splatvar_shift_v4i64:
326; AVX512:       ## BB#0:
327; AVX512-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
328; AVX512-NEXT:    retq
329  %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
330  %shift = lshr <4 x i64> %a, %splat
331  ret <4 x i64> %shift
332}
333
334define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
335; AVX1-LABEL: splatvar_shift_v8i32:
336; AVX1:       # BB#0:
337; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
338; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
339; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
340; AVX1-NEXT:    vpsrld %xmm1, %xmm2, %xmm2
341; AVX1-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
342; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
343; AVX1-NEXT:    retq
344;
345; AVX2-LABEL: splatvar_shift_v8i32:
346; AVX2:       # BB#0:
347; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
348; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
349; AVX2-NEXT:    vpsrld %xmm1, %ymm0, %ymm0
350; AVX2-NEXT:    retq
351;
352; XOPAVX1-LABEL: splatvar_shift_v8i32:
353; XOPAVX1:       # BB#0:
354; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
355; XOPAVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
356; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
357; XOPAVX1-NEXT:    vpsrld %xmm1, %xmm2, %xmm2
358; XOPAVX1-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
359; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
360; XOPAVX1-NEXT:    retq
361;
362; XOPAVX2-LABEL: splatvar_shift_v8i32:
363; XOPAVX2:       # BB#0:
364; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
365; XOPAVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
366; XOPAVX2-NEXT:    vpsrld %xmm1, %ymm0, %ymm0
367; XOPAVX2-NEXT:    retq
368;
369; AVX512-LABEL: splatvar_shift_v8i32:
370; AVX512:       ## BB#0:
371; AVX512-NEXT:    vxorps %xmm2, %xmm2, %xmm2
372; AVX512-NEXT:    vmovss {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3]
373; AVX512-NEXT:    vpsrld %xmm1, %ymm0, %ymm0
374; AVX512-NEXT:    retq
375  %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
376  %shift = lshr <8 x i32> %a, %splat
377  ret <8 x i32> %shift
378}
379
380define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
381; AVX1-LABEL: splatvar_shift_v16i16:
382; AVX1:       # BB#0:
383; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
384; AVX1-NEXT:    vmovd %xmm1, %eax
385; AVX1-NEXT:    movzwl %ax, %eax
386; AVX1-NEXT:    vmovd %eax, %xmm1
387; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
388; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
389; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
390; AVX1-NEXT:    retq
391;
392; AVX2-LABEL: splatvar_shift_v16i16:
393; AVX2:       # BB#0:
394; AVX2-NEXT:    vmovd %xmm1, %eax
395; AVX2-NEXT:    movzwl %ax, %eax
396; AVX2-NEXT:    vmovd %eax, %xmm1
397; AVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
398; AVX2-NEXT:    retq
399;
400; XOPAVX1-LABEL: splatvar_shift_v16i16:
401; XOPAVX1:       # BB#0:
402; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
403; XOPAVX1-NEXT:    vmovd %xmm1, %eax
404; XOPAVX1-NEXT:    movzwl %ax, %eax
405; XOPAVX1-NEXT:    vmovd %eax, %xmm1
406; XOPAVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
407; XOPAVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
408; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
409; XOPAVX1-NEXT:    retq
410;
411; XOPAVX2-LABEL: splatvar_shift_v16i16:
412; XOPAVX2:       # BB#0:
413; XOPAVX2-NEXT:    vmovd %xmm1, %eax
414; XOPAVX2-NEXT:    movzwl %ax, %eax
415; XOPAVX2-NEXT:    vmovd %eax, %xmm1
416; XOPAVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
417; XOPAVX2-NEXT:    retq
418;
419; AVX512-LABEL: splatvar_shift_v16i16:
420; AVX512:       ## BB#0:
421; AVX512-NEXT:    vmovd %xmm1, %eax
422; AVX512-NEXT:    movzwl %ax, %eax
423; AVX512-NEXT:    vmovd %eax, %xmm1
424; AVX512-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
425; AVX512-NEXT:    retq
426  %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
427  %shift = lshr <16 x i16> %a, %splat
428  ret <16 x i16> %shift
429}
430
431define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
432; AVX1-LABEL: splatvar_shift_v32i8:
433; AVX1:       # BB#0:
434; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
435; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
436; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
437; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm3
438; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
439; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm3
440; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
441; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm2, %xmm2
442; AVX1-NEXT:    vpsrlw $2, %xmm2, %xmm3
443; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
444; AVX1-NEXT:    vpand %xmm5, %xmm3, %xmm3
445; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm6
446; AVX1-NEXT:    vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
447; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm3
448; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
449; AVX1-NEXT:    vpand %xmm7, %xmm3, %xmm3
450; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm4
451; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm2, %xmm2
452; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm3
453; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm3
454; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
455; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm1
456; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
457; AVX1-NEXT:    vpblendvb %xmm6, %xmm1, %xmm0, %xmm0
458; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm1
459; AVX1-NEXT:    vpand %xmm7, %xmm1, %xmm1
460; AVX1-NEXT:    vpblendvb %xmm4, %xmm1, %xmm0, %xmm0
461; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
462; AVX1-NEXT:    retq
463;
464; AVX2-LABEL: splatvar_shift_v32i8:
465; AVX2:       # BB#0:
466; AVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
467; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm2
468; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
469; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
470; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
471; AVX2-NEXT:    vpsrlw $2, %ymm0, %ymm2
472; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
473; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
474; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
475; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm2
476; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
477; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
478; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
479; AVX2-NEXT:    retq
480;
481; XOPAVX1-LABEL: splatvar_shift_v32i8:
482; XOPAVX1:       # BB#0:
483; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
484; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
485; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
486; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
487; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm2, %xmm2
488; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
489; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
490; XOPAVX1-NEXT:    retq
491;
492; XOPAVX2-LABEL: splatvar_shift_v32i8:
493; XOPAVX2:       # BB#0:
494; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
495; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
496; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
497; XOPAVX2-NEXT:    vpsubb %xmm2, %xmm3, %xmm2
498; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
499; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm4, %xmm2
500; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
501; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
502; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
503; XOPAVX2-NEXT:    retq
504;
505; AVX512-LABEL: splatvar_shift_v32i8:
506; AVX512:       ## BB#0:
507; AVX512-NEXT:    vpbroadcastb %xmm1, %ymm1
508; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm2
509; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
510; AVX512-NEXT:    vpsllw $5, %ymm1, %ymm1
511; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
512; AVX512-NEXT:    vpsrlw $2, %ymm0, %ymm2
513; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
514; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
515; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
516; AVX512-NEXT:    vpsrlw $1, %ymm0, %ymm2
517; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
518; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
519; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
520; AVX512-NEXT:    retq
521  %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
522  %shift = lshr <32 x i8> %a, %splat
523  ret <32 x i8> %shift
524}
525
526;
527; Constant Shifts
528;
529
530define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
531; AVX1-LABEL: constant_shift_v4i64:
532; AVX1:       # BB#0:
533; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
534; AVX1-NEXT:    vpsrlq $62, %xmm1, %xmm2
535; AVX1-NEXT:    vpsrlq $31, %xmm1, %xmm1
536; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
537; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm2
538; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
539; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
540; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
541; AVX1-NEXT:    retq
542;
543; AVX2-LABEL: constant_shift_v4i64:
544; AVX2:       # BB#0:
545; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
546; AVX2-NEXT:    retq
547;
548; XOPAVX1-LABEL: constant_shift_v4i64:
549; XOPAVX1:       # BB#0:
550; XOPAVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
551; XOPAVX1-NEXT:    vpsubq {{.*}}(%rip), %xmm1, %xmm2
552; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
553; XOPAVX1-NEXT:    vpshlq %xmm2, %xmm3, %xmm2
554; XOPAVX1-NEXT:    vpsubq {{.*}}(%rip), %xmm1, %xmm1
555; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm0
556; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
557; XOPAVX1-NEXT:    retq
558;
559; XOPAVX2-LABEL: constant_shift_v4i64:
560; XOPAVX2:       # BB#0:
561; XOPAVX2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
562; XOPAVX2-NEXT:    retq
563;
564; AVX512-LABEL: constant_shift_v4i64:
565; AVX512:       ## BB#0:
566; AVX512-NEXT:    vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
567; AVX512-NEXT:    retq
568  %shift = lshr <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
569  ret <4 x i64> %shift
570}
571
572define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
573; AVX1-LABEL: constant_shift_v8i32:
574; AVX1:       # BB#0:
575; AVX1-NEXT:    vpsrld $7, %xmm0, %xmm1
576; AVX1-NEXT:    vpsrld $5, %xmm0, %xmm2
577; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
578; AVX1-NEXT:    vpsrld $6, %xmm0, %xmm2
579; AVX1-NEXT:    vpsrld $4, %xmm0, %xmm3
580; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
581; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
582; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
583; AVX1-NEXT:    vpsrld $7, %xmm0, %xmm2
584; AVX1-NEXT:    vpsrld $9, %xmm0, %xmm3
585; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
586; AVX1-NEXT:    vpsrld $8, %xmm0, %xmm0
587; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
588; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
589; AVX1-NEXT:    retq
590;
591; AVX2-LABEL: constant_shift_v8i32:
592; AVX2:       # BB#0:
593; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm0, %ymm0
594; AVX2-NEXT:    retq
595;
596; XOPAVX1-LABEL: constant_shift_v8i32:
597; XOPAVX1:       # BB#0:
598; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm1
599; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
600; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
601; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
602; XOPAVX1-NEXT:    retq
603;
604; XOPAVX2-LABEL: constant_shift_v8i32:
605; XOPAVX2:       # BB#0:
606; XOPAVX2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm0, %ymm0
607; XOPAVX2-NEXT:    retq
608;
609; AVX512-LABEL: constant_shift_v8i32:
610; AVX512:       ## BB#0:
611; AVX512-NEXT:    vpsrlvd {{.*}}(%rip), %ymm0, %ymm0
612; AVX512-NEXT:    retq
613  %shift = lshr <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
614  ret <8 x i32> %shift
615}
616
617define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
618; AVX1-LABEL: constant_shift_v16i16:
619; AVX1:       # BB#0:
620; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
621; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
622; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm2
623; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
624; AVX1-NEXT:    vpsrlw $2, %xmm1, %xmm2
625; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
626; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm2
627; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
628; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm2
629; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
630; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm2
631; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
632; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm2
633; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
634; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
635; AVX1-NEXT:    retq
636;
637; AVX2-LABEL: constant_shift_v16i16:
638; AVX2:       # BB#0:
639; AVX2-NEXT:    vpxor %ymm1, %ymm1, %ymm1
640; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
641; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm2[4],ymm1[4],ymm2[5],ymm1[5],ymm2[6],ymm1[6],ymm2[7],ymm1[7],ymm2[12],ymm1[12],ymm2[13],ymm1[13],ymm2[14],ymm1[14],ymm2[15],ymm1[15]
642; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15]
643; AVX2-NEXT:    vpsrlvd %ymm3, %ymm4, %ymm3
644; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
645; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm1[0],ymm2[1],ymm1[1],ymm2[2],ymm1[2],ymm2[3],ymm1[3],ymm2[8],ymm1[8],ymm2[9],ymm1[9],ymm2[10],ymm1[10],ymm2[11],ymm1[11]
646; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11]
647; AVX2-NEXT:    vpsrlvd %ymm2, %ymm0, %ymm0
648; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
649; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
650; AVX2-NEXT:    retq
651;
652; XOPAVX1-LABEL: constant_shift_v16i16:
653; XOPAVX1:       # BB#0:
654; XOPAVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
655; XOPAVX1-NEXT:    vpsubw {{.*}}(%rip), %xmm1, %xmm2
656; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
657; XOPAVX1-NEXT:    vpshlw %xmm2, %xmm3, %xmm2
658; XOPAVX1-NEXT:    vpsubw {{.*}}(%rip), %xmm1, %xmm1
659; XOPAVX1-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
660; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
661; XOPAVX1-NEXT:    retq
662;
663; XOPAVX2-LABEL: constant_shift_v16i16:
664; XOPAVX2:       # BB#0:
665; XOPAVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
666; XOPAVX2-NEXT:    vpsubw {{.*}}(%rip), %xmm1, %xmm2
667; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
668; XOPAVX2-NEXT:    vpshlw %xmm2, %xmm3, %xmm2
669; XOPAVX2-NEXT:    vpsubw {{.*}}(%rip), %xmm1, %xmm1
670; XOPAVX2-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
671; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
672; XOPAVX2-NEXT:    retq
673;
674; AVX512-LABEL: constant_shift_v16i16:
675; AVX512:       ## BB#0:
676; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
677; AVX512-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
678; AVX512-NEXT:    retq
679  %shift = lshr <16 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
680  ret <16 x i16> %shift
681}
682
683define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
684; AVX1-LABEL: constant_shift_v32i8:
685; AVX1:       # BB#0:
686; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
687; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm2
688; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
689; AVX1-NEXT:    vpand %xmm8, %xmm2, %xmm2
690; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
691; AVX1-NEXT:    vpsllw $5, %xmm4, %xmm4
692; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm1, %xmm1
693; AVX1-NEXT:    vpsrlw $2, %xmm1, %xmm2
694; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
695; AVX1-NEXT:    vpand %xmm5, %xmm2, %xmm2
696; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm6
697; AVX1-NEXT:    vpblendvb %xmm6, %xmm2, %xmm1, %xmm1
698; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm2
699; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
700; AVX1-NEXT:    vpand %xmm7, %xmm2, %xmm2
701; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm3
702; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
703; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm2
704; AVX1-NEXT:    vpand %xmm8, %xmm2, %xmm2
705; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
706; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm2
707; AVX1-NEXT:    vpand %xmm5, %xmm2, %xmm2
708; AVX1-NEXT:    vpblendvb %xmm6, %xmm2, %xmm0, %xmm0
709; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm2
710; AVX1-NEXT:    vpand %xmm7, %xmm2, %xmm2
711; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
712; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
713; AVX1-NEXT:    retq
714;
715; AVX2-LABEL: constant_shift_v32i8:
716; AVX2:       # BB#0:
717; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
718; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
719; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm2
720; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
721; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
722; AVX2-NEXT:    vpsrlw $2, %ymm0, %ymm2
723; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
724; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
725; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
726; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm2
727; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
728; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
729; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
730; AVX2-NEXT:    retq
731;
732; XOPAVX1-LABEL: constant_shift_v32i8:
733; XOPAVX1:       # BB#0:
734; XOPAVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
735; XOPAVX1-NEXT:    vpsubb {{.*}}(%rip), %xmm1, %xmm1
736; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
737; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm2, %xmm2
738; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
739; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
740; XOPAVX1-NEXT:    retq
741;
742; XOPAVX2-LABEL: constant_shift_v32i8:
743; XOPAVX2:       # BB#0:
744; XOPAVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
745; XOPAVX2-NEXT:    vpsubb {{.*}}(%rip), %xmm1, %xmm1
746; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
747; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm2, %xmm2
748; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
749; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
750; XOPAVX2-NEXT:    retq
751;
752; AVX512-LABEL: constant_shift_v32i8:
753; AVX512:       ## BB#0:
754; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
755; AVX512-NEXT:    vpsllw $5, %ymm1, %ymm1
756; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm2
757; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
758; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
759; AVX512-NEXT:    vpsrlw $2, %ymm0, %ymm2
760; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
761; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
762; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
763; AVX512-NEXT:    vpsrlw $1, %ymm0, %ymm2
764; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
765; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
766; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
767; AVX512-NEXT:    retq
768  %shift = lshr <32 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, 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>
769  ret <32 x i8> %shift
770}
771
772;
773; Uniform Constant Shifts
774;
775
776define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
777; AVX1-LABEL: splatconstant_shift_v4i64:
778; AVX1:       # BB#0:
779; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm1
780; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
781; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm0
782; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
783; AVX1-NEXT:    retq
784;
785; AVX2-LABEL: splatconstant_shift_v4i64:
786; AVX2:       # BB#0:
787; AVX2-NEXT:    vpsrlq $7, %ymm0, %ymm0
788; AVX2-NEXT:    retq
789;
790; XOPAVX1-LABEL: splatconstant_shift_v4i64:
791; XOPAVX1:       # BB#0:
792; XOPAVX1-NEXT:    vpsrlq $7, %xmm0, %xmm1
793; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
794; XOPAVX1-NEXT:    vpsrlq $7, %xmm0, %xmm0
795; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
796; XOPAVX1-NEXT:    retq
797;
798; XOPAVX2-LABEL: splatconstant_shift_v4i64:
799; XOPAVX2:       # BB#0:
800; XOPAVX2-NEXT:    vpsrlq $7, %ymm0, %ymm0
801; XOPAVX2-NEXT:    retq
802;
803; AVX512-LABEL: splatconstant_shift_v4i64:
804; AVX512:       ## BB#0:
805; AVX512-NEXT:    vpsrlq $7, %ymm0, %ymm0
806; AVX512-NEXT:    retq
807  %shift = lshr <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
808  ret <4 x i64> %shift
809}
810
811define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
812; AVX1-LABEL: splatconstant_shift_v8i32:
813; AVX1:       # BB#0:
814; AVX1-NEXT:    vpsrld $5, %xmm0, %xmm1
815; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
816; AVX1-NEXT:    vpsrld $5, %xmm0, %xmm0
817; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
818; AVX1-NEXT:    retq
819;
820; AVX2-LABEL: splatconstant_shift_v8i32:
821; AVX2:       # BB#0:
822; AVX2-NEXT:    vpsrld $5, %ymm0, %ymm0
823; AVX2-NEXT:    retq
824;
825; XOPAVX1-LABEL: splatconstant_shift_v8i32:
826; XOPAVX1:       # BB#0:
827; XOPAVX1-NEXT:    vpsrld $5, %xmm0, %xmm1
828; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
829; XOPAVX1-NEXT:    vpsrld $5, %xmm0, %xmm0
830; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
831; XOPAVX1-NEXT:    retq
832;
833; XOPAVX2-LABEL: splatconstant_shift_v8i32:
834; XOPAVX2:       # BB#0:
835; XOPAVX2-NEXT:    vpsrld $5, %ymm0, %ymm0
836; XOPAVX2-NEXT:    retq
837;
838; AVX512-LABEL: splatconstant_shift_v8i32:
839; AVX512:       ## BB#0:
840; AVX512-NEXT:    vpsrld $5, %ymm0, %ymm0
841; AVX512-NEXT:    retq
842  %shift = lshr <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
843  ret <8 x i32> %shift
844}
845
846define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
847; AVX1-LABEL: splatconstant_shift_v16i16:
848; AVX1:       # BB#0:
849; AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm1
850; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
851; AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm0
852; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
853; AVX1-NEXT:    retq
854;
855; AVX2-LABEL: splatconstant_shift_v16i16:
856; AVX2:       # BB#0:
857; AVX2-NEXT:    vpsrlw $3, %ymm0, %ymm0
858; AVX2-NEXT:    retq
859;
860; XOPAVX1-LABEL: splatconstant_shift_v16i16:
861; XOPAVX1:       # BB#0:
862; XOPAVX1-NEXT:    vpsrlw $3, %xmm0, %xmm1
863; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
864; XOPAVX1-NEXT:    vpsrlw $3, %xmm0, %xmm0
865; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
866; XOPAVX1-NEXT:    retq
867;
868; XOPAVX2-LABEL: splatconstant_shift_v16i16:
869; XOPAVX2:       # BB#0:
870; XOPAVX2-NEXT:    vpsrlw $3, %ymm0, %ymm0
871; XOPAVX2-NEXT:    retq
872;
873; AVX512-LABEL: splatconstant_shift_v16i16:
874; AVX512:       ## BB#0:
875; AVX512-NEXT:    vpsrlw $3, %ymm0, %ymm0
876; AVX512-NEXT:    retq
877  %shift = lshr <16 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
878  ret <16 x i16> %shift
879}
880
881define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
882; AVX1-LABEL: splatconstant_shift_v32i8:
883; AVX1:       # BB#0:
884; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
885; AVX1-NEXT:    vpsrlw $3, %xmm1, %xmm1
886; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]
887; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
888; AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm0
889; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
890; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
891; AVX1-NEXT:    retq
892;
893; AVX2-LABEL: splatconstant_shift_v32i8:
894; AVX2:       # BB#0:
895; AVX2-NEXT:    vpsrlw $3, %ymm0, %ymm0
896; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
897; AVX2-NEXT:    retq
898;
899; XOPAVX1-LABEL: splatconstant_shift_v32i8:
900; XOPAVX1:       # BB#0:
901; XOPAVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
902; XOPAVX1-NEXT:    vpsubb {{.*}}(%rip), %xmm1, %xmm1
903; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
904; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm2, %xmm2
905; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
906; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
907; XOPAVX1-NEXT:    retq
908;
909; XOPAVX2-LABEL: splatconstant_shift_v32i8:
910; XOPAVX2:       # BB#0:
911; XOPAVX2-NEXT:    vpsrlw $3, %ymm0, %ymm0
912; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
913; XOPAVX2-NEXT:    retq
914;
915; AVX512-LABEL: splatconstant_shift_v32i8:
916; AVX512:       ## BB#0:
917; AVX512-NEXT:    vpsrlw $3, %ymm0, %ymm0
918; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
919; AVX512-NEXT:    retq
920  %shift = lshr <32 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, 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>
921  ret <32 x i8> %shift
922}
923