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