• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512DQ
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512VL --check-prefix=AVX512DQVL
9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512VL --check-prefix=AVX512BWVL
10;
11; 32-bit runs to make sure we do reasonable things for i64 shifts.
12; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx  | FileCheck %s --check-prefix=ALL --check-prefix=X32-AVX --check-prefix=X32-AVX1
13; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=X32-AVX --check-prefix=X32-AVX2
14
15;
16; Variable Shifts
17;
18
19define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
20; AVX1-LABEL: var_shift_v4i64:
21; AVX1:       # %bb.0:
22; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
23; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
24; AVX1-NEXT:    vpsrlq %xmm2, %xmm3, %xmm4
25; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm2[2,3,0,1]
26; AVX1-NEXT:    vpsrlq %xmm5, %xmm3, %xmm6
27; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm6[4,5,6,7]
28; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
29; AVX1-NEXT:    vpsrlq %xmm2, %xmm6, %xmm2
30; AVX1-NEXT:    vpsrlq %xmm5, %xmm6, %xmm5
31; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm5[4,5,6,7]
32; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
33; AVX1-NEXT:    vpsubq %xmm4, %xmm2, %xmm2
34; AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm4
35; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm1[2,3,0,1]
36; AVX1-NEXT:    vpsrlq %xmm5, %xmm3, %xmm3
37; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
38; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm1
39; AVX1-NEXT:    vpsrlq %xmm5, %xmm0, %xmm0
40; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
41; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
42; AVX1-NEXT:    vpsubq %xmm3, %xmm0, %xmm0
43; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
44; AVX1-NEXT:    retq
45;
46; AVX2-LABEL: var_shift_v4i64:
47; AVX2:       # %bb.0:
48; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
49; AVX2-NEXT:    vpsrlvq %ymm1, %ymm2, %ymm3
50; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
51; AVX2-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm0
52; AVX2-NEXT:    vpsubq %ymm3, %ymm0, %ymm0
53; AVX2-NEXT:    retq
54;
55; XOPAVX1-LABEL: var_shift_v4i64:
56; XOPAVX1:       # %bb.0:
57; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
58; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
59; XOPAVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm2
60; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
61; XOPAVX1-NEXT:    vpshaq %xmm2, %xmm4, %xmm2
62; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm3, %xmm1
63; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm0, %xmm0
64; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
65; XOPAVX1-NEXT:    retq
66;
67; XOPAVX2-LABEL: var_shift_v4i64:
68; XOPAVX2:       # %bb.0:
69; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
70; XOPAVX2-NEXT:    vpsrlvq %ymm1, %ymm2, %ymm3
71; XOPAVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
72; XOPAVX2-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm0
73; XOPAVX2-NEXT:    vpsubq %ymm3, %ymm0, %ymm0
74; XOPAVX2-NEXT:    retq
75;
76; AVX512-LABEL: var_shift_v4i64:
77; AVX512:       # %bb.0:
78; AVX512-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
79; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
80; AVX512-NEXT:    vpsravq %zmm1, %zmm0, %zmm0
81; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
82; AVX512-NEXT:    retq
83;
84; AVX512VL-LABEL: var_shift_v4i64:
85; AVX512VL:       # %bb.0:
86; AVX512VL-NEXT:    vpsravq %ymm1, %ymm0, %ymm0
87; AVX512VL-NEXT:    retq
88;
89; X32-AVX1-LABEL: var_shift_v4i64:
90; X32-AVX1:       # %bb.0:
91; X32-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
92; X32-AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
93; X32-AVX1-NEXT:    vpsrlq %xmm2, %xmm3, %xmm4
94; X32-AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm2[2,3,0,1]
95; X32-AVX1-NEXT:    vpsrlq %xmm5, %xmm3, %xmm6
96; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm6[4,5,6,7]
97; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
98; X32-AVX1-NEXT:    vpsrlq %xmm2, %xmm6, %xmm2
99; X32-AVX1-NEXT:    vpsrlq %xmm5, %xmm6, %xmm5
100; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm5[4,5,6,7]
101; X32-AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
102; X32-AVX1-NEXT:    vpsubq %xmm4, %xmm2, %xmm2
103; X32-AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm4
104; X32-AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm1[2,3,0,1]
105; X32-AVX1-NEXT:    vpsrlq %xmm5, %xmm3, %xmm3
106; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
107; X32-AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm1
108; X32-AVX1-NEXT:    vpsrlq %xmm5, %xmm0, %xmm0
109; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
110; X32-AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
111; X32-AVX1-NEXT:    vpsubq %xmm3, %xmm0, %xmm0
112; X32-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
113; X32-AVX1-NEXT:    retl
114;
115; X32-AVX2-LABEL: var_shift_v4i64:
116; X32-AVX2:       # %bb.0:
117; X32-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
118; X32-AVX2-NEXT:    vpsrlvq %ymm1, %ymm2, %ymm3
119; X32-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
120; X32-AVX2-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm0
121; X32-AVX2-NEXT:    vpsubq %ymm3, %ymm0, %ymm0
122; X32-AVX2-NEXT:    retl
123  %shift = ashr <4 x i64> %a, %b
124  ret <4 x i64> %shift
125}
126
127define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
128; AVX1-LABEL: var_shift_v8i32:
129; AVX1:       # %bb.0:
130; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
131; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
132; AVX1-NEXT:    vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
133; AVX1-NEXT:    vpsrad %xmm4, %xmm2, %xmm4
134; AVX1-NEXT:    vpsrlq $32, %xmm3, %xmm5
135; AVX1-NEXT:    vpsrad %xmm5, %xmm2, %xmm5
136; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]
137; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
138; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
139; AVX1-NEXT:    vpsrad %xmm6, %xmm2, %xmm6
140; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
141; AVX1-NEXT:    vpsrad %xmm3, %xmm2, %xmm2
142; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
143; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
144; AVX1-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
145; AVX1-NEXT:    vpsrad %xmm3, %xmm0, %xmm3
146; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm4
147; AVX1-NEXT:    vpsrad %xmm4, %xmm0, %xmm4
148; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
149; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3]
150; AVX1-NEXT:    vpsrad %xmm4, %xmm0, %xmm4
151; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
152; AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
153; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
154; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
155; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
156; AVX1-NEXT:    retq
157;
158; AVX2-LABEL: var_shift_v8i32:
159; AVX2:       # %bb.0:
160; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
161; AVX2-NEXT:    retq
162;
163; XOPAVX1-LABEL: var_shift_v8i32:
164; XOPAVX1:       # %bb.0:
165; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
166; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
167; XOPAVX1-NEXT:    vpsubd %xmm2, %xmm3, %xmm2
168; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
169; XOPAVX1-NEXT:    vpshad %xmm2, %xmm4, %xmm2
170; XOPAVX1-NEXT:    vpsubd %xmm1, %xmm3, %xmm1
171; XOPAVX1-NEXT:    vpshad %xmm1, %xmm0, %xmm0
172; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
173; XOPAVX1-NEXT:    retq
174;
175; XOPAVX2-LABEL: var_shift_v8i32:
176; XOPAVX2:       # %bb.0:
177; XOPAVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
178; XOPAVX2-NEXT:    retq
179;
180; AVX512-LABEL: var_shift_v8i32:
181; AVX512:       # %bb.0:
182; AVX512-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
183; AVX512-NEXT:    retq
184;
185; AVX512VL-LABEL: var_shift_v8i32:
186; AVX512VL:       # %bb.0:
187; AVX512VL-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
188; AVX512VL-NEXT:    retq
189;
190; X32-AVX1-LABEL: var_shift_v8i32:
191; X32-AVX1:       # %bb.0:
192; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
193; X32-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
194; X32-AVX1-NEXT:    vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
195; X32-AVX1-NEXT:    vpsrad %xmm4, %xmm2, %xmm4
196; X32-AVX1-NEXT:    vpsrlq $32, %xmm3, %xmm5
197; X32-AVX1-NEXT:    vpsrad %xmm5, %xmm2, %xmm5
198; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]
199; X32-AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
200; X32-AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
201; X32-AVX1-NEXT:    vpsrad %xmm6, %xmm2, %xmm6
202; X32-AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
203; X32-AVX1-NEXT:    vpsrad %xmm3, %xmm2, %xmm2
204; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
205; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
206; X32-AVX1-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
207; X32-AVX1-NEXT:    vpsrad %xmm3, %xmm0, %xmm3
208; X32-AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm4
209; X32-AVX1-NEXT:    vpsrad %xmm4, %xmm0, %xmm4
210; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
211; X32-AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3]
212; X32-AVX1-NEXT:    vpsrad %xmm4, %xmm0, %xmm4
213; X32-AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
214; X32-AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
215; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
216; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
217; X32-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
218; X32-AVX1-NEXT:    retl
219;
220; X32-AVX2-LABEL: var_shift_v8i32:
221; X32-AVX2:       # %bb.0:
222; X32-AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
223; X32-AVX2-NEXT:    retl
224  %shift = ashr <8 x i32> %a, %b
225  ret <8 x i32> %shift
226}
227
228define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
229; AVX1-LABEL: var_shift_v16i16:
230; AVX1:       # %bb.0:
231; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
232; AVX1-NEXT:    vpsllw $12, %xmm2, %xmm3
233; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
234; AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2
235; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm3
236; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
237; AVX1-NEXT:    vpsraw $8, %xmm4, %xmm5
238; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
239; AVX1-NEXT:    vpsraw $4, %xmm2, %xmm4
240; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
241; AVX1-NEXT:    vpsraw $2, %xmm2, %xmm4
242; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
243; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
244; AVX1-NEXT:    vpsraw $1, %xmm2, %xmm4
245; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
246; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
247; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm3
248; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
249; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
250; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm3
251; AVX1-NEXT:    vpsraw $8, %xmm0, %xmm4
252; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
253; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm1
254; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
255; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm1
256; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
257; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
258; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm1
259; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
260; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
261; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
262; AVX1-NEXT:    retq
263;
264; AVX2-LABEL: var_shift_v16i16:
265; AVX2:       # %bb.0:
266; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
267; 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]
268; 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]
269; AVX2-NEXT:    vpsravd %ymm3, %ymm4, %ymm3
270; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
271; 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]
272; 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]
273; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
274; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
275; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
276; AVX2-NEXT:    retq
277;
278; XOPAVX1-LABEL: var_shift_v16i16:
279; XOPAVX1:       # %bb.0:
280; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
281; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
282; XOPAVX1-NEXT:    vpsubw %xmm2, %xmm3, %xmm2
283; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
284; XOPAVX1-NEXT:    vpshaw %xmm2, %xmm4, %xmm2
285; XOPAVX1-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
286; XOPAVX1-NEXT:    vpshaw %xmm1, %xmm0, %xmm0
287; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
288; XOPAVX1-NEXT:    retq
289;
290; XOPAVX2-LABEL: var_shift_v16i16:
291; XOPAVX2:       # %bb.0:
292; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
293; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
294; XOPAVX2-NEXT:    vpsubw %xmm2, %xmm3, %xmm2
295; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
296; XOPAVX2-NEXT:    vpshaw %xmm2, %xmm4, %xmm2
297; XOPAVX2-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
298; XOPAVX2-NEXT:    vpshaw %xmm1, %xmm0, %xmm0
299; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
300; XOPAVX2-NEXT:    retq
301;
302; AVX512DQ-LABEL: var_shift_v16i16:
303; AVX512DQ:       # %bb.0:
304; 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
305; AVX512DQ-NEXT:    vpmovsxwd %ymm0, %zmm0
306; AVX512DQ-NEXT:    vpsravd %zmm1, %zmm0, %zmm0
307; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0
308; AVX512DQ-NEXT:    retq
309;
310; AVX512BW-LABEL: var_shift_v16i16:
311; AVX512BW:       # %bb.0:
312; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
313; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
314; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
315; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
316; AVX512BW-NEXT:    retq
317;
318; AVX512DQVL-LABEL: var_shift_v16i16:
319; AVX512DQVL:       # %bb.0:
320; 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
321; AVX512DQVL-NEXT:    vpmovsxwd %ymm0, %zmm0
322; AVX512DQVL-NEXT:    vpsravd %zmm1, %zmm0, %zmm0
323; AVX512DQVL-NEXT:    vpmovdw %zmm0, %ymm0
324; AVX512DQVL-NEXT:    retq
325;
326; AVX512BWVL-LABEL: var_shift_v16i16:
327; AVX512BWVL:       # %bb.0:
328; AVX512BWVL-NEXT:    vpsravw %ymm1, %ymm0, %ymm0
329; AVX512BWVL-NEXT:    retq
330;
331; X32-AVX1-LABEL: var_shift_v16i16:
332; X32-AVX1:       # %bb.0:
333; X32-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
334; X32-AVX1-NEXT:    vpsllw $12, %xmm2, %xmm3
335; X32-AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
336; X32-AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2
337; X32-AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm3
338; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
339; X32-AVX1-NEXT:    vpsraw $8, %xmm4, %xmm5
340; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
341; X32-AVX1-NEXT:    vpsraw $4, %xmm2, %xmm4
342; X32-AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
343; X32-AVX1-NEXT:    vpsraw $2, %xmm2, %xmm4
344; X32-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
345; X32-AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
346; X32-AVX1-NEXT:    vpsraw $1, %xmm2, %xmm4
347; X32-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
348; X32-AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
349; X32-AVX1-NEXT:    vpsllw $12, %xmm1, %xmm3
350; X32-AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
351; X32-AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
352; X32-AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm3
353; X32-AVX1-NEXT:    vpsraw $8, %xmm0, %xmm4
354; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
355; X32-AVX1-NEXT:    vpsraw $4, %xmm0, %xmm1
356; X32-AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
357; X32-AVX1-NEXT:    vpsraw $2, %xmm0, %xmm1
358; X32-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
359; X32-AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
360; X32-AVX1-NEXT:    vpsraw $1, %xmm0, %xmm1
361; X32-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
362; X32-AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
363; X32-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
364; X32-AVX1-NEXT:    retl
365;
366; X32-AVX2-LABEL: var_shift_v16i16:
367; X32-AVX2:       # %bb.0:
368; X32-AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
369; X32-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]
370; X32-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]
371; X32-AVX2-NEXT:    vpsravd %ymm3, %ymm4, %ymm3
372; X32-AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
373; X32-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]
374; X32-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]
375; X32-AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
376; X32-AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
377; X32-AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
378; X32-AVX2-NEXT:    retl
379  %shift = ashr <16 x i16> %a, %b
380  ret <16 x i16> %shift
381}
382
383define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
384; AVX1-LABEL: var_shift_v32i8:
385; AVX1:       # %bb.0:
386; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
387; AVX1-NEXT:    vpsllw $5, %xmm2, %xmm2
388; 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]
389; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
390; 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]
391; AVX1-NEXT:    vpsraw $4, %xmm5, %xmm6
392; AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm5
393; AVX1-NEXT:    vpsraw $2, %xmm5, %xmm6
394; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
395; AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm5
396; AVX1-NEXT:    vpsraw $1, %xmm5, %xmm6
397; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
398; AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm3
399; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
400; 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]
401; 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]
402; AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
403; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
404; AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5
405; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
406; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
407; AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5
408; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
409; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
410; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
411; AVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
412; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
413; 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]
414; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
415; AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
416; AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm4
417; AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5
418; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
419; AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm4
420; AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5
421; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
422; AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm3
423; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
424; 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]
425; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
426; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm4
427; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
428; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm4
429; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
430; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
431; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm4
432; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
433; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
434; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
435; AVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
436; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
437; AVX1-NEXT:    retq
438;
439; AVX2-LABEL: var_shift_v32i8:
440; AVX2:       # %bb.0:
441; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
442; 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]
443; 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]
444; AVX2-NEXT:    vpsraw $4, %ymm3, %ymm4
445; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
446; AVX2-NEXT:    vpsraw $2, %ymm3, %ymm4
447; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
448; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
449; AVX2-NEXT:    vpsraw $1, %ymm3, %ymm4
450; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
451; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
452; AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
453; 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]
454; 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]
455; AVX2-NEXT:    vpsraw $4, %ymm0, %ymm3
456; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
457; AVX2-NEXT:    vpsraw $2, %ymm0, %ymm3
458; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
459; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
460; AVX2-NEXT:    vpsraw $1, %ymm0, %ymm3
461; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
462; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
463; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
464; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
465; AVX2-NEXT:    retq
466;
467; XOPAVX1-LABEL: var_shift_v32i8:
468; XOPAVX1:       # %bb.0:
469; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
470; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
471; XOPAVX1-NEXT:    vpsubb %xmm2, %xmm3, %xmm2
472; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
473; XOPAVX1-NEXT:    vpshab %xmm2, %xmm4, %xmm2
474; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
475; XOPAVX1-NEXT:    vpshab %xmm1, %xmm0, %xmm0
476; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
477; XOPAVX1-NEXT:    retq
478;
479; XOPAVX2-LABEL: var_shift_v32i8:
480; XOPAVX2:       # %bb.0:
481; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
482; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
483; XOPAVX2-NEXT:    vpsubb %xmm2, %xmm3, %xmm2
484; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
485; XOPAVX2-NEXT:    vpshab %xmm2, %xmm4, %xmm2
486; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
487; XOPAVX2-NEXT:    vpshab %xmm1, %xmm0, %xmm0
488; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
489; XOPAVX2-NEXT:    retq
490;
491; AVX512DQ-LABEL: var_shift_v32i8:
492; AVX512DQ:       # %bb.0:
493; AVX512DQ-NEXT:    vpsllw $5, %ymm1, %ymm1
494; 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]
495; 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]
496; AVX512DQ-NEXT:    vpsraw $4, %ymm3, %ymm4
497; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
498; AVX512DQ-NEXT:    vpsraw $2, %ymm3, %ymm4
499; AVX512DQ-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
500; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
501; AVX512DQ-NEXT:    vpsraw $1, %ymm3, %ymm4
502; AVX512DQ-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
503; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
504; AVX512DQ-NEXT:    vpsrlw $8, %ymm2, %ymm2
505; 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]
506; 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]
507; AVX512DQ-NEXT:    vpsraw $4, %ymm0, %ymm3
508; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
509; AVX512DQ-NEXT:    vpsraw $2, %ymm0, %ymm3
510; AVX512DQ-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
511; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
512; AVX512DQ-NEXT:    vpsraw $1, %ymm0, %ymm3
513; AVX512DQ-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
514; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
515; AVX512DQ-NEXT:    vpsrlw $8, %ymm0, %ymm0
516; AVX512DQ-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
517; AVX512DQ-NEXT:    retq
518;
519; AVX512BW-LABEL: var_shift_v32i8:
520; AVX512BW:       # %bb.0:
521; 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
522; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
523; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
524; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
525; AVX512BW-NEXT:    retq
526;
527; AVX512DQVL-LABEL: var_shift_v32i8:
528; AVX512DQVL:       # %bb.0:
529; AVX512DQVL-NEXT:    vpsllw $5, %ymm1, %ymm1
530; 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]
531; 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]
532; AVX512DQVL-NEXT:    vpsraw $4, %ymm3, %ymm4
533; AVX512DQVL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
534; AVX512DQVL-NEXT:    vpsraw $2, %ymm3, %ymm4
535; AVX512DQVL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
536; AVX512DQVL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
537; AVX512DQVL-NEXT:    vpsraw $1, %ymm3, %ymm4
538; AVX512DQVL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
539; AVX512DQVL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
540; AVX512DQVL-NEXT:    vpsrlw $8, %ymm2, %ymm2
541; 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]
542; 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]
543; AVX512DQVL-NEXT:    vpsraw $4, %ymm0, %ymm3
544; AVX512DQVL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
545; AVX512DQVL-NEXT:    vpsraw $2, %ymm0, %ymm3
546; AVX512DQVL-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
547; AVX512DQVL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
548; AVX512DQVL-NEXT:    vpsraw $1, %ymm0, %ymm3
549; AVX512DQVL-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
550; AVX512DQVL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
551; AVX512DQVL-NEXT:    vpsrlw $8, %ymm0, %ymm0
552; AVX512DQVL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
553; AVX512DQVL-NEXT:    retq
554;
555; AVX512BWVL-LABEL: var_shift_v32i8:
556; AVX512BWVL:       # %bb.0:
557; 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
558; AVX512BWVL-NEXT:    vpmovsxbw %ymm0, %zmm0
559; AVX512BWVL-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
560; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm0
561; AVX512BWVL-NEXT:    retq
562;
563; X32-AVX1-LABEL: var_shift_v32i8:
564; X32-AVX1:       # %bb.0:
565; X32-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
566; X32-AVX1-NEXT:    vpsllw $5, %xmm2, %xmm2
567; X32-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]
568; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
569; X32-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]
570; X32-AVX1-NEXT:    vpsraw $4, %xmm5, %xmm6
571; X32-AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm5
572; X32-AVX1-NEXT:    vpsraw $2, %xmm5, %xmm6
573; X32-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
574; X32-AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm5
575; X32-AVX1-NEXT:    vpsraw $1, %xmm5, %xmm6
576; X32-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
577; X32-AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm3
578; X32-AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
579; X32-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]
580; X32-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]
581; X32-AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
582; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
583; X32-AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5
584; X32-AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
585; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
586; X32-AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5
587; X32-AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
588; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
589; X32-AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
590; X32-AVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
591; X32-AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
592; X32-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]
593; X32-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
594; X32-AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
595; X32-AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm4
596; X32-AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5
597; X32-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
598; X32-AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm4
599; X32-AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5
600; X32-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
601; X32-AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm3
602; X32-AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
603; X32-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]
604; X32-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
605; X32-AVX1-NEXT:    vpsraw $4, %xmm0, %xmm4
606; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
607; X32-AVX1-NEXT:    vpsraw $2, %xmm0, %xmm4
608; X32-AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
609; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
610; X32-AVX1-NEXT:    vpsraw $1, %xmm0, %xmm4
611; X32-AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
612; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
613; X32-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
614; X32-AVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
615; X32-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
616; X32-AVX1-NEXT:    retl
617;
618; X32-AVX2-LABEL: var_shift_v32i8:
619; X32-AVX2:       # %bb.0:
620; X32-AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
621; X32-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]
622; X32-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]
623; X32-AVX2-NEXT:    vpsraw $4, %ymm3, %ymm4
624; X32-AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
625; X32-AVX2-NEXT:    vpsraw $2, %ymm3, %ymm4
626; X32-AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
627; X32-AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
628; X32-AVX2-NEXT:    vpsraw $1, %ymm3, %ymm4
629; X32-AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
630; X32-AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
631; X32-AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
632; X32-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]
633; X32-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]
634; X32-AVX2-NEXT:    vpsraw $4, %ymm0, %ymm3
635; X32-AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
636; X32-AVX2-NEXT:    vpsraw $2, %ymm0, %ymm3
637; X32-AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
638; X32-AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
639; X32-AVX2-NEXT:    vpsraw $1, %ymm0, %ymm3
640; X32-AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
641; X32-AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
642; X32-AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
643; X32-AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
644; X32-AVX2-NEXT:    retl
645  %shift = ashr <32 x i8> %a, %b
646  ret <32 x i8> %shift
647}
648
649;
650; Uniform Variable Shifts
651;
652
653define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
654; AVX1-LABEL: splatvar_shift_v4i64:
655; AVX1:       # %bb.0:
656; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
657; AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2
658; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
659; AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm3
660; AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm3
661; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm3
662; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
663; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
664; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
665; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
666; AVX1-NEXT:    retq
667;
668; AVX2-LABEL: splatvar_shift_v4i64:
669; AVX2:       # %bb.0:
670; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
671; AVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2
672; AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
673; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
674; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
675; AVX2-NEXT:    retq
676;
677; XOPAVX1-LABEL: splatvar_shift_v4i64:
678; XOPAVX1:       # %bb.0:
679; XOPAVX1-NEXT:    vmovddup {{.*#+}} xmm1 = xmm1[0,0]
680; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
681; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm1
682; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
683; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm2, %xmm2
684; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm0, %xmm0
685; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
686; XOPAVX1-NEXT:    retq
687;
688; XOPAVX2-LABEL: splatvar_shift_v4i64:
689; XOPAVX2:       # %bb.0:
690; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
691; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2
692; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
693; XOPAVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
694; XOPAVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
695; XOPAVX2-NEXT:    retq
696;
697; AVX512-LABEL: splatvar_shift_v4i64:
698; AVX512:       # %bb.0:
699; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
700; AVX512-NEXT:    vpsraq %xmm1, %zmm0, %zmm0
701; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
702; AVX512-NEXT:    retq
703;
704; AVX512VL-LABEL: splatvar_shift_v4i64:
705; AVX512VL:       # %bb.0:
706; AVX512VL-NEXT:    vpsraq %xmm1, %ymm0, %ymm0
707; AVX512VL-NEXT:    retq
708;
709; X32-AVX1-LABEL: splatvar_shift_v4i64:
710; X32-AVX1:       # %bb.0:
711; X32-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
712; X32-AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2
713; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
714; X32-AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm3
715; X32-AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm3
716; X32-AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm3
717; X32-AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
718; X32-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
719; X32-AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
720; X32-AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
721; X32-AVX1-NEXT:    retl
722;
723; X32-AVX2-LABEL: splatvar_shift_v4i64:
724; X32-AVX2:       # %bb.0:
725; X32-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
726; X32-AVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2
727; X32-AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
728; X32-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
729; X32-AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
730; X32-AVX2-NEXT:    retl
731  %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
732  %shift = ashr <4 x i64> %a, %splat
733  ret <4 x i64> %shift
734}
735
736define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
737; AVX1-LABEL: splatvar_shift_v8i32:
738; AVX1:       # %bb.0:
739; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
740; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
741; AVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm2
742; AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
743; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
744; AVX1-NEXT:    retq
745;
746; AVX2-LABEL: splatvar_shift_v8i32:
747; AVX2:       # %bb.0:
748; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
749; AVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
750; AVX2-NEXT:    retq
751;
752; XOPAVX1-LABEL: splatvar_shift_v8i32:
753; XOPAVX1:       # %bb.0:
754; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
755; XOPAVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
756; XOPAVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm2
757; XOPAVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
758; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
759; XOPAVX1-NEXT:    retq
760;
761; XOPAVX2-LABEL: splatvar_shift_v8i32:
762; XOPAVX2:       # %bb.0:
763; XOPAVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
764; XOPAVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
765; XOPAVX2-NEXT:    retq
766;
767; AVX512-LABEL: splatvar_shift_v8i32:
768; AVX512:       # %bb.0:
769; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
770; AVX512-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
771; AVX512-NEXT:    retq
772;
773; AVX512VL-LABEL: splatvar_shift_v8i32:
774; AVX512VL:       # %bb.0:
775; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
776; AVX512VL-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
777; AVX512VL-NEXT:    retq
778;
779; X32-AVX1-LABEL: splatvar_shift_v8i32:
780; X32-AVX1:       # %bb.0:
781; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
782; X32-AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
783; X32-AVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm2
784; X32-AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
785; X32-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
786; X32-AVX1-NEXT:    retl
787;
788; X32-AVX2-LABEL: splatvar_shift_v8i32:
789; X32-AVX2:       # %bb.0:
790; X32-AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
791; X32-AVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm0
792; X32-AVX2-NEXT:    retl
793  %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
794  %shift = ashr <8 x i32> %a, %splat
795  ret <8 x i32> %shift
796}
797
798define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
799; AVX1-LABEL: splatvar_shift_v16i16:
800; AVX1:       # %bb.0:
801; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
802; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
803; AVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm2
804; AVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
805; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
806; AVX1-NEXT:    retq
807;
808; AVX2-LABEL: splatvar_shift_v16i16:
809; AVX2:       # %bb.0:
810; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
811; AVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
812; AVX2-NEXT:    retq
813;
814; XOPAVX1-LABEL: splatvar_shift_v16i16:
815; XOPAVX1:       # %bb.0:
816; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
817; XOPAVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
818; XOPAVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm2
819; XOPAVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
820; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
821; XOPAVX1-NEXT:    retq
822;
823; XOPAVX2-LABEL: splatvar_shift_v16i16:
824; XOPAVX2:       # %bb.0:
825; XOPAVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
826; XOPAVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
827; XOPAVX2-NEXT:    retq
828;
829; AVX512-LABEL: splatvar_shift_v16i16:
830; AVX512:       # %bb.0:
831; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
832; AVX512-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
833; AVX512-NEXT:    retq
834;
835; AVX512VL-LABEL: splatvar_shift_v16i16:
836; AVX512VL:       # %bb.0:
837; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
838; AVX512VL-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
839; AVX512VL-NEXT:    retq
840;
841; X32-AVX1-LABEL: splatvar_shift_v16i16:
842; X32-AVX1:       # %bb.0:
843; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
844; X32-AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
845; X32-AVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm2
846; X32-AVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
847; X32-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
848; X32-AVX1-NEXT:    retl
849;
850; X32-AVX2-LABEL: splatvar_shift_v16i16:
851; X32-AVX2:       # %bb.0:
852; X32-AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
853; X32-AVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm0
854; X32-AVX2-NEXT:    retl
855  %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
856  %shift = ashr <16 x i16> %a, %splat
857  ret <16 x i16> %shift
858}
859
860define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
861; AVX1-LABEL: splatvar_shift_v32i8:
862; AVX1:       # %bb.0:
863; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
864; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
865; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
866; 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]
867; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
868; 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]
869; AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
870; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
871; AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5
872; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm6
873; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm4, %xmm4
874; AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5
875; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm9
876; AVX1-NEXT:    vpblendvb %xmm9, %xmm5, %xmm4, %xmm4
877; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm8
878; 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]
879; 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]
880; AVX1-NEXT:    vpsraw $4, %xmm3, %xmm5
881; AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm3, %xmm3
882; AVX1-NEXT:    vpsraw $2, %xmm3, %xmm5
883; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm4
884; AVX1-NEXT:    vpblendvb %xmm4, %xmm5, %xmm3, %xmm3
885; AVX1-NEXT:    vpsraw $1, %xmm3, %xmm5
886; AVX1-NEXT:    vpaddw %xmm4, %xmm4, %xmm7
887; AVX1-NEXT:    vpblendvb %xmm7, %xmm5, %xmm3, %xmm3
888; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
889; AVX1-NEXT:    vpackuswb %xmm8, %xmm3, %xmm8
890; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
891; AVX1-NEXT:    vpsraw $4, %xmm5, %xmm3
892; AVX1-NEXT:    vpblendvb %xmm2, %xmm3, %xmm5, %xmm2
893; AVX1-NEXT:    vpsraw $2, %xmm2, %xmm3
894; AVX1-NEXT:    vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
895; AVX1-NEXT:    vpsraw $1, %xmm2, %xmm3
896; AVX1-NEXT:    vpblendvb %xmm9, %xmm3, %xmm2, %xmm2
897; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
898; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
899; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm3
900; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
901; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm1
902; AVX1-NEXT:    vpblendvb %xmm4, %xmm1, %xmm0, %xmm0
903; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm1
904; AVX1-NEXT:    vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
905; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
906; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
907; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm0, %ymm0
908; AVX1-NEXT:    retq
909;
910; AVX2-LABEL: splatvar_shift_v32i8:
911; AVX2:       # %bb.0:
912; AVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
913; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
914; 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]
915; 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]
916; AVX2-NEXT:    vpsraw $4, %ymm3, %ymm4
917; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
918; AVX2-NEXT:    vpsraw $2, %ymm3, %ymm4
919; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
920; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
921; AVX2-NEXT:    vpsraw $1, %ymm3, %ymm4
922; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
923; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
924; AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
925; 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]
926; 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]
927; AVX2-NEXT:    vpsraw $4, %ymm0, %ymm3
928; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
929; AVX2-NEXT:    vpsraw $2, %ymm0, %ymm3
930; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
931; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
932; AVX2-NEXT:    vpsraw $1, %ymm0, %ymm3
933; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
934; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
935; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
936; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
937; AVX2-NEXT:    retq
938;
939; XOPAVX1-LABEL: splatvar_shift_v32i8:
940; XOPAVX1:       # %bb.0:
941; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
942; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
943; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm1
944; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
945; XOPAVX1-NEXT:    vpshab %xmm1, %xmm2, %xmm2
946; XOPAVX1-NEXT:    vpshab %xmm1, %xmm0, %xmm0
947; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
948; XOPAVX1-NEXT:    retq
949;
950; XOPAVX2-LABEL: splatvar_shift_v32i8:
951; XOPAVX2:       # %bb.0:
952; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
953; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
954; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
955; XOPAVX2-NEXT:    vpsubb %xmm2, %xmm3, %xmm2
956; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
957; XOPAVX2-NEXT:    vpshab %xmm2, %xmm4, %xmm2
958; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
959; XOPAVX2-NEXT:    vpshab %xmm1, %xmm0, %xmm0
960; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
961; XOPAVX2-NEXT:    retq
962;
963; AVX512DQ-LABEL: splatvar_shift_v32i8:
964; AVX512DQ:       # %bb.0:
965; AVX512DQ-NEXT:    vpbroadcastb %xmm1, %ymm1
966; AVX512DQ-NEXT:    vpsllw $5, %ymm1, %ymm1
967; 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]
968; 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]
969; AVX512DQ-NEXT:    vpsraw $4, %ymm3, %ymm4
970; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
971; AVX512DQ-NEXT:    vpsraw $2, %ymm3, %ymm4
972; AVX512DQ-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
973; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
974; AVX512DQ-NEXT:    vpsraw $1, %ymm3, %ymm4
975; AVX512DQ-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
976; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
977; AVX512DQ-NEXT:    vpsrlw $8, %ymm2, %ymm2
978; 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]
979; 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]
980; AVX512DQ-NEXT:    vpsraw $4, %ymm0, %ymm3
981; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
982; AVX512DQ-NEXT:    vpsraw $2, %ymm0, %ymm3
983; AVX512DQ-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
984; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
985; AVX512DQ-NEXT:    vpsraw $1, %ymm0, %ymm3
986; AVX512DQ-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
987; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
988; AVX512DQ-NEXT:    vpsrlw $8, %ymm0, %ymm0
989; AVX512DQ-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
990; AVX512DQ-NEXT:    retq
991;
992; AVX512BW-LABEL: splatvar_shift_v32i8:
993; AVX512BW:       # %bb.0:
994; AVX512BW-NEXT:    vpbroadcastb %xmm1, %ymm1
995; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
996; 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
997; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
998; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
999; AVX512BW-NEXT:    retq
1000;
1001; AVX512DQVL-LABEL: splatvar_shift_v32i8:
1002; AVX512DQVL:       # %bb.0:
1003; AVX512DQVL-NEXT:    vpbroadcastb %xmm1, %ymm1
1004; AVX512DQVL-NEXT:    vpsllw $5, %ymm1, %ymm1
1005; 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]
1006; 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]
1007; AVX512DQVL-NEXT:    vpsraw $4, %ymm3, %ymm4
1008; AVX512DQVL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
1009; AVX512DQVL-NEXT:    vpsraw $2, %ymm3, %ymm4
1010; AVX512DQVL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
1011; AVX512DQVL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
1012; AVX512DQVL-NEXT:    vpsraw $1, %ymm3, %ymm4
1013; AVX512DQVL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
1014; AVX512DQVL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
1015; AVX512DQVL-NEXT:    vpsrlw $8, %ymm2, %ymm2
1016; 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]
1017; 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]
1018; AVX512DQVL-NEXT:    vpsraw $4, %ymm0, %ymm3
1019; AVX512DQVL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1020; AVX512DQVL-NEXT:    vpsraw $2, %ymm0, %ymm3
1021; AVX512DQVL-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
1022; AVX512DQVL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1023; AVX512DQVL-NEXT:    vpsraw $1, %ymm0, %ymm3
1024; AVX512DQVL-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
1025; AVX512DQVL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1026; AVX512DQVL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1027; AVX512DQVL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
1028; AVX512DQVL-NEXT:    retq
1029;
1030; AVX512BWVL-LABEL: splatvar_shift_v32i8:
1031; AVX512BWVL:       # %bb.0:
1032; AVX512BWVL-NEXT:    vpbroadcastb %xmm1, %ymm1
1033; AVX512BWVL-NEXT:    vpmovsxbw %ymm0, %zmm0
1034; 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
1035; AVX512BWVL-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
1036; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm0
1037; AVX512BWVL-NEXT:    retq
1038;
1039; X32-AVX1-LABEL: splatvar_shift_v32i8:
1040; X32-AVX1:       # %bb.0:
1041; X32-AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1042; X32-AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1043; X32-AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
1044; X32-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]
1045; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1046; X32-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]
1047; X32-AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
1048; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
1049; X32-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1050; X32-AVX1-NEXT:    vpsraw $4, %xmm5, %xmm6
1051; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm6, %xmm5, %xmm5
1052; X32-AVX1-NEXT:    vpsraw $2, %xmm4, %xmm6
1053; X32-AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
1054; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm6, %xmm4, %xmm4
1055; X32-AVX1-NEXT:    vpsraw $2, %xmm5, %xmm6
1056; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm6, %xmm5, %xmm5
1057; X32-AVX1-NEXT:    vpsraw $1, %xmm4, %xmm6
1058; X32-AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
1059; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm6, %xmm4, %xmm4
1060; X32-AVX1-NEXT:    vpsraw $1, %xmm5, %xmm6
1061; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm6, %xmm5, %xmm2
1062; X32-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]
1063; X32-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]
1064; X32-AVX1-NEXT:    vpsraw $4, %xmm3, %xmm5
1065; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm3, %xmm3
1066; X32-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1067; X32-AVX1-NEXT:    vpsraw $4, %xmm0, %xmm5
1068; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm0, %xmm0
1069; X32-AVX1-NEXT:    vpsraw $2, %xmm3, %xmm5
1070; X32-AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
1071; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm3, %xmm3
1072; X32-AVX1-NEXT:    vpsraw $2, %xmm0, %xmm5
1073; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm0, %xmm0
1074; X32-AVX1-NEXT:    vpsraw $1, %xmm3, %xmm5
1075; X32-AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
1076; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm3, %xmm3
1077; X32-AVX1-NEXT:    vpsraw $1, %xmm0, %xmm5
1078; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm0, %xmm0
1079; X32-AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm1
1080; X32-AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
1081; X32-AVX1-NEXT:    vpackuswb %xmm1, %xmm3, %xmm1
1082; X32-AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
1083; X32-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1084; X32-AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1085; X32-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1086; X32-AVX1-NEXT:    retl
1087;
1088; X32-AVX2-LABEL: splatvar_shift_v32i8:
1089; X32-AVX2:       # %bb.0:
1090; X32-AVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
1091; X32-AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
1092; X32-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]
1093; X32-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]
1094; X32-AVX2-NEXT:    vpsraw $4, %ymm3, %ymm4
1095; X32-AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
1096; X32-AVX2-NEXT:    vpsraw $2, %ymm3, %ymm4
1097; X32-AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
1098; X32-AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
1099; X32-AVX2-NEXT:    vpsraw $1, %ymm3, %ymm4
1100; X32-AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
1101; X32-AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
1102; X32-AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
1103; X32-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]
1104; X32-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]
1105; X32-AVX2-NEXT:    vpsraw $4, %ymm0, %ymm3
1106; X32-AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1107; X32-AVX2-NEXT:    vpsraw $2, %ymm0, %ymm3
1108; X32-AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
1109; X32-AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1110; X32-AVX2-NEXT:    vpsraw $1, %ymm0, %ymm3
1111; X32-AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
1112; X32-AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1113; X32-AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1114; X32-AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
1115; X32-AVX2-NEXT:    retl
1116  %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
1117  %shift = ashr <32 x i8> %a, %splat
1118  ret <32 x i8> %shift
1119}
1120
1121;
1122; Constant Shifts
1123;
1124
1125define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
1126; AVX1-LABEL: constant_shift_v4i64:
1127; AVX1:       # %bb.0:
1128; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1129; AVX1-NEXT:    vpsrlq $62, %xmm1, %xmm2
1130; AVX1-NEXT:    vpsrlq $31, %xmm1, %xmm1
1131; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
1132; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [4294967296,2]
1133; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
1134; AVX1-NEXT:    vpsubq %xmm2, %xmm1, %xmm1
1135; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm2
1136; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
1137; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
1138; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [4611686018427387904,72057594037927936]
1139; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1140; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
1141; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1142; AVX1-NEXT:    retq
1143;
1144; AVX2-LABEL: constant_shift_v4i64:
1145; AVX2:       # %bb.0:
1146; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
1147; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2]
1148; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1149; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
1150; AVX2-NEXT:    retq
1151;
1152; XOPAVX1-LABEL: constant_shift_v4i64:
1153; XOPAVX1:       # %bb.0:
1154; XOPAVX1-NEXT:    vpshaq {{.*}}(%rip), %xmm0, %xmm1
1155; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1156; XOPAVX1-NEXT:    vpshaq {{.*}}(%rip), %xmm0, %xmm0
1157; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1158; XOPAVX1-NEXT:    retq
1159;
1160; XOPAVX2-LABEL: constant_shift_v4i64:
1161; XOPAVX2:       # %bb.0:
1162; XOPAVX2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
1163; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2]
1164; XOPAVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1165; XOPAVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
1166; XOPAVX2-NEXT:    retq
1167;
1168; AVX512-LABEL: constant_shift_v4i64:
1169; AVX512:       # %bb.0:
1170; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1171; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,7,31,62]
1172; AVX512-NEXT:    vpsravq %zmm1, %zmm0, %zmm0
1173; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1174; AVX512-NEXT:    retq
1175;
1176; AVX512VL-LABEL: constant_shift_v4i64:
1177; AVX512VL:       # %bb.0:
1178; AVX512VL-NEXT:    vpsravq {{.*}}(%rip), %ymm0, %ymm0
1179; AVX512VL-NEXT:    retq
1180;
1181; X32-AVX1-LABEL: constant_shift_v4i64:
1182; X32-AVX1:       # %bb.0:
1183; X32-AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [31,0,62,0]
1184; X32-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
1185; X32-AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm3
1186; X32-AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
1187; X32-AVX1-NEXT:    vpsrlq %xmm4, %xmm2, %xmm5
1188; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm5[4,5,6,7]
1189; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1190; X32-AVX1-NEXT:    vpsrlq %xmm4, %xmm5, %xmm4
1191; X32-AVX1-NEXT:    vpsrlq %xmm1, %xmm5, %xmm1
1192; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm4[4,5,6,7]
1193; X32-AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
1194; X32-AVX1-NEXT:    vpsubq %xmm3, %xmm1, %xmm1
1195; X32-AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,0,7,0]
1196; X32-AVX1-NEXT:    vpsrlq %xmm3, %xmm2, %xmm4
1197; X32-AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm3[2,3,0,1]
1198; X32-AVX1-NEXT:    vpsrlq %xmm5, %xmm2, %xmm2
1199; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
1200; X32-AVX1-NEXT:    vpsrlq %xmm5, %xmm0, %xmm4
1201; X32-AVX1-NEXT:    vpsrlq %xmm3, %xmm0, %xmm0
1202; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
1203; X32-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1204; X32-AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
1205; X32-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1206; X32-AVX1-NEXT:    retl
1207;
1208; X32-AVX2-LABEL: constant_shift_v4i64:
1209; X32-AVX2:       # %bb.0:
1210; X32-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,0,7,0,31,0,62,0]
1211; X32-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
1212; X32-AVX2-NEXT:    vpsrlvq %ymm1, %ymm2, %ymm3
1213; X32-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
1214; X32-AVX2-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm0
1215; X32-AVX2-NEXT:    vpsubq %ymm3, %ymm0, %ymm0
1216; X32-AVX2-NEXT:    retl
1217  %shift = ashr <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
1218  ret <4 x i64> %shift
1219}
1220
1221define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
1222; AVX1-LABEL: constant_shift_v8i32:
1223; AVX1:       # %bb.0:
1224; AVX1-NEXT:    vpsrad $7, %xmm0, %xmm1
1225; AVX1-NEXT:    vpsrad $5, %xmm0, %xmm2
1226; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
1227; AVX1-NEXT:    vpsrad $6, %xmm0, %xmm2
1228; AVX1-NEXT:    vpsrad $4, %xmm0, %xmm3
1229; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
1230; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
1231; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1232; AVX1-NEXT:    vpsrad $7, %xmm0, %xmm2
1233; AVX1-NEXT:    vpsrad $9, %xmm0, %xmm3
1234; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
1235; AVX1-NEXT:    vpsrad $8, %xmm0, %xmm0
1236; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1237; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1238; AVX1-NEXT:    retq
1239;
1240; AVX2-LABEL: constant_shift_v8i32:
1241; AVX2:       # %bb.0:
1242; AVX2-NEXT:    vpsravd {{.*}}(%rip), %ymm0, %ymm0
1243; AVX2-NEXT:    retq
1244;
1245; XOPAVX1-LABEL: constant_shift_v8i32:
1246; XOPAVX1:       # %bb.0:
1247; XOPAVX1-NEXT:    vpshad {{.*}}(%rip), %xmm0, %xmm1
1248; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1249; XOPAVX1-NEXT:    vpshad {{.*}}(%rip), %xmm0, %xmm0
1250; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1251; XOPAVX1-NEXT:    retq
1252;
1253; XOPAVX2-LABEL: constant_shift_v8i32:
1254; XOPAVX2:       # %bb.0:
1255; XOPAVX2-NEXT:    vpsravd {{.*}}(%rip), %ymm0, %ymm0
1256; XOPAVX2-NEXT:    retq
1257;
1258; AVX512-LABEL: constant_shift_v8i32:
1259; AVX512:       # %bb.0:
1260; AVX512-NEXT:    vpsravd {{.*}}(%rip), %ymm0, %ymm0
1261; AVX512-NEXT:    retq
1262;
1263; AVX512VL-LABEL: constant_shift_v8i32:
1264; AVX512VL:       # %bb.0:
1265; AVX512VL-NEXT:    vpsravd {{.*}}(%rip), %ymm0, %ymm0
1266; AVX512VL-NEXT:    retq
1267;
1268; X32-AVX1-LABEL: constant_shift_v8i32:
1269; X32-AVX1:       # %bb.0:
1270; X32-AVX1-NEXT:    vpsrad $7, %xmm0, %xmm1
1271; X32-AVX1-NEXT:    vpsrad $5, %xmm0, %xmm2
1272; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
1273; X32-AVX1-NEXT:    vpsrad $6, %xmm0, %xmm2
1274; X32-AVX1-NEXT:    vpsrad $4, %xmm0, %xmm3
1275; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
1276; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
1277; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1278; X32-AVX1-NEXT:    vpsrad $7, %xmm0, %xmm2
1279; X32-AVX1-NEXT:    vpsrad $9, %xmm0, %xmm3
1280; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
1281; X32-AVX1-NEXT:    vpsrad $8, %xmm0, %xmm0
1282; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1283; X32-AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1284; X32-AVX1-NEXT:    retl
1285;
1286; X32-AVX2-LABEL: constant_shift_v8i32:
1287; X32-AVX2:       # %bb.0:
1288; X32-AVX2-NEXT:    vpsravd {{\.LCPI.*}}, %ymm0, %ymm0
1289; X32-AVX2-NEXT:    retl
1290  %shift = ashr <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
1291  ret <8 x i32> %shift
1292}
1293
1294define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
1295; AVX1-LABEL: constant_shift_v16i16:
1296; AVX1:       # %bb.0:
1297; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1298; AVX1-NEXT:    vpsraw $8, %xmm1, %xmm1
1299; AVX1-NEXT:    vpsraw $4, %xmm1, %xmm2
1300; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
1301; AVX1-NEXT:    vpsraw $2, %xmm1, %xmm2
1302; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
1303; AVX1-NEXT:    vpsraw $1, %xmm1, %xmm2
1304; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
1305; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm2
1306; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
1307; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm2
1308; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1309; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm2
1310; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
1311; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1312; AVX1-NEXT:    retq
1313;
1314; AVX2-LABEL: constant_shift_v16i16:
1315; AVX2:       # %bb.0:
1316; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1317; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1318; 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]
1319; 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]
1320; AVX2-NEXT:    vpsravd %ymm3, %ymm4, %ymm3
1321; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
1322; 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]
1323; 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]
1324; AVX2-NEXT:    vpsravd %ymm2, %ymm0, %ymm0
1325; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
1326; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
1327; AVX2-NEXT:    retq
1328;
1329; XOPAVX1-LABEL: constant_shift_v16i16:
1330; XOPAVX1:       # %bb.0:
1331; XOPAVX1-NEXT:    vpshaw {{.*}}(%rip), %xmm0, %xmm1
1332; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1333; XOPAVX1-NEXT:    vpshaw {{.*}}(%rip), %xmm0, %xmm0
1334; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1335; XOPAVX1-NEXT:    retq
1336;
1337; XOPAVX2-LABEL: constant_shift_v16i16:
1338; XOPAVX2:       # %bb.0:
1339; XOPAVX2-NEXT:    vpshaw {{.*}}(%rip), %xmm0, %xmm1
1340; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1341; XOPAVX2-NEXT:    vpshaw {{.*}}(%rip), %xmm0, %xmm0
1342; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1343; XOPAVX2-NEXT:    retq
1344;
1345; AVX512DQ-LABEL: constant_shift_v16i16:
1346; AVX512DQ:       # %bb.0:
1347; AVX512DQ-NEXT:    vpmovsxwd %ymm0, %zmm0
1348; AVX512DQ-NEXT:    vpsravd {{.*}}(%rip), %zmm0, %zmm0
1349; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0
1350; AVX512DQ-NEXT:    retq
1351;
1352; AVX512BW-LABEL: constant_shift_v16i16:
1353; AVX512BW:       # %bb.0:
1354; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1355; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1356; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm0
1357; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1358; AVX512BW-NEXT:    retq
1359;
1360; AVX512DQVL-LABEL: constant_shift_v16i16:
1361; AVX512DQVL:       # %bb.0:
1362; AVX512DQVL-NEXT:    vpmovsxwd %ymm0, %zmm0
1363; AVX512DQVL-NEXT:    vpsravd {{.*}}(%rip), %zmm0, %zmm0
1364; AVX512DQVL-NEXT:    vpmovdw %zmm0, %ymm0
1365; AVX512DQVL-NEXT:    retq
1366;
1367; AVX512BWVL-LABEL: constant_shift_v16i16:
1368; AVX512BWVL:       # %bb.0:
1369; AVX512BWVL-NEXT:    vpsravw {{.*}}(%rip), %ymm0, %ymm0
1370; AVX512BWVL-NEXT:    retq
1371;
1372; X32-AVX1-LABEL: constant_shift_v16i16:
1373; X32-AVX1:       # %bb.0:
1374; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1375; X32-AVX1-NEXT:    vpsraw $8, %xmm1, %xmm1
1376; X32-AVX1-NEXT:    vpsraw $4, %xmm1, %xmm2
1377; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
1378; X32-AVX1-NEXT:    vpsraw $2, %xmm1, %xmm2
1379; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
1380; X32-AVX1-NEXT:    vpsraw $1, %xmm1, %xmm2
1381; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
1382; X32-AVX1-NEXT:    vpsraw $4, %xmm0, %xmm2
1383; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
1384; X32-AVX1-NEXT:    vpsraw $2, %xmm0, %xmm2
1385; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1386; X32-AVX1-NEXT:    vpsraw $1, %xmm0, %xmm2
1387; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
1388; X32-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1389; X32-AVX1-NEXT:    retl
1390;
1391; X32-AVX2-LABEL: constant_shift_v16i16:
1392; X32-AVX2:       # %bb.0:
1393; X32-AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1394; X32-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1395; X32-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]
1396; X32-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]
1397; X32-AVX2-NEXT:    vpsravd %ymm3, %ymm4, %ymm3
1398; X32-AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
1399; X32-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]
1400; X32-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]
1401; X32-AVX2-NEXT:    vpsravd %ymm2, %ymm0, %ymm0
1402; X32-AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
1403; X32-AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
1404; X32-AVX2-NEXT:    retl
1405  %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>
1406  ret <16 x i16> %shift
1407}
1408
1409define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
1410; AVX1-LABEL: constant_shift_v32i8:
1411; AVX1:       # %bb.0:
1412; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [8192,24640,41088,57536,49376,32928,16480,32]
1413; 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]
1414; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1415; 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]
1416; AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
1417; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
1418; AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5
1419; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm6
1420; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm4, %xmm4
1421; AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5
1422; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm9
1423; AVX1-NEXT:    vpblendvb %xmm9, %xmm5, %xmm4, %xmm4
1424; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm8
1425; 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]
1426; 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]
1427; AVX1-NEXT:    vpsraw $4, %xmm3, %xmm5
1428; AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm3, %xmm3
1429; AVX1-NEXT:    vpsraw $2, %xmm3, %xmm5
1430; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm4
1431; AVX1-NEXT:    vpblendvb %xmm4, %xmm5, %xmm3, %xmm3
1432; AVX1-NEXT:    vpsraw $1, %xmm3, %xmm5
1433; AVX1-NEXT:    vpaddw %xmm4, %xmm4, %xmm7
1434; AVX1-NEXT:    vpblendvb %xmm7, %xmm5, %xmm3, %xmm3
1435; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
1436; AVX1-NEXT:    vpackuswb %xmm8, %xmm3, %xmm8
1437; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1438; AVX1-NEXT:    vpsraw $4, %xmm5, %xmm3
1439; AVX1-NEXT:    vpblendvb %xmm2, %xmm3, %xmm5, %xmm2
1440; AVX1-NEXT:    vpsraw $2, %xmm2, %xmm3
1441; AVX1-NEXT:    vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
1442; AVX1-NEXT:    vpsraw $1, %xmm2, %xmm3
1443; AVX1-NEXT:    vpblendvb %xmm9, %xmm3, %xmm2, %xmm2
1444; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
1445; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1446; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm3
1447; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
1448; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm1
1449; AVX1-NEXT:    vpblendvb %xmm4, %xmm1, %xmm0, %xmm0
1450; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm1
1451; AVX1-NEXT:    vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
1452; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1453; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1454; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm0, %ymm0
1455; AVX1-NEXT:    retq
1456;
1457; AVX2-LABEL: constant_shift_v32i8:
1458; AVX2:       # %bb.0:
1459; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32]
1460; 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]
1461; 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]
1462; AVX2-NEXT:    vpsraw $4, %ymm3, %ymm4
1463; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
1464; AVX2-NEXT:    vpsraw $2, %ymm3, %ymm4
1465; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
1466; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
1467; AVX2-NEXT:    vpsraw $1, %ymm3, %ymm4
1468; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
1469; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
1470; AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
1471; 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]
1472; 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]
1473; AVX2-NEXT:    vpsraw $4, %ymm0, %ymm3
1474; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1475; AVX2-NEXT:    vpsraw $2, %ymm0, %ymm3
1476; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
1477; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1478; AVX2-NEXT:    vpsraw $1, %ymm0, %ymm3
1479; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
1480; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1481; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1482; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
1483; AVX2-NEXT:    retq
1484;
1485; XOPAVX1-LABEL: constant_shift_v32i8:
1486; XOPAVX1:       # %bb.0:
1487; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1488; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,255,254,253,252,251,250,249,249,250,251,252,253,254,255,0]
1489; XOPAVX1-NEXT:    vpshab %xmm2, %xmm1, %xmm1
1490; XOPAVX1-NEXT:    vpshab %xmm2, %xmm0, %xmm0
1491; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1492; XOPAVX1-NEXT:    retq
1493;
1494; XOPAVX2-LABEL: constant_shift_v32i8:
1495; XOPAVX2:       # %bb.0:
1496; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1497; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,255,254,253,252,251,250,249,249,250,251,252,253,254,255,0]
1498; XOPAVX2-NEXT:    vpshab %xmm2, %xmm1, %xmm1
1499; XOPAVX2-NEXT:    vpshab %xmm2, %xmm0, %xmm0
1500; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1501; XOPAVX2-NEXT:    retq
1502;
1503; AVX512DQ-LABEL: constant_shift_v32i8:
1504; AVX512DQ:       # %bb.0:
1505; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm1 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32]
1506; 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]
1507; 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]
1508; AVX512DQ-NEXT:    vpsraw $4, %ymm3, %ymm4
1509; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
1510; AVX512DQ-NEXT:    vpsraw $2, %ymm3, %ymm4
1511; AVX512DQ-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
1512; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
1513; AVX512DQ-NEXT:    vpsraw $1, %ymm3, %ymm4
1514; AVX512DQ-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
1515; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
1516; AVX512DQ-NEXT:    vpsrlw $8, %ymm2, %ymm2
1517; 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]
1518; 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]
1519; AVX512DQ-NEXT:    vpsraw $4, %ymm0, %ymm3
1520; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1521; AVX512DQ-NEXT:    vpsraw $2, %ymm0, %ymm3
1522; AVX512DQ-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
1523; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1524; AVX512DQ-NEXT:    vpsraw $1, %ymm0, %ymm3
1525; AVX512DQ-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
1526; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1527; AVX512DQ-NEXT:    vpsrlw $8, %ymm0, %ymm0
1528; AVX512DQ-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
1529; AVX512DQ-NEXT:    retq
1530;
1531; AVX512BW-LABEL: constant_shift_v32i8:
1532; AVX512BW:       # %bb.0:
1533; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
1534; AVX512BW-NEXT:    vpsravw {{.*}}(%rip), %zmm0, %zmm0
1535; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1536; AVX512BW-NEXT:    retq
1537;
1538; AVX512DQVL-LABEL: constant_shift_v32i8:
1539; AVX512DQVL:       # %bb.0:
1540; AVX512DQVL-NEXT:    vmovdqa {{.*#+}} ymm1 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32]
1541; 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]
1542; 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]
1543; AVX512DQVL-NEXT:    vpsraw $4, %ymm3, %ymm4
1544; AVX512DQVL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
1545; AVX512DQVL-NEXT:    vpsraw $2, %ymm3, %ymm4
1546; AVX512DQVL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
1547; AVX512DQVL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
1548; AVX512DQVL-NEXT:    vpsraw $1, %ymm3, %ymm4
1549; AVX512DQVL-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
1550; AVX512DQVL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
1551; AVX512DQVL-NEXT:    vpsrlw $8, %ymm2, %ymm2
1552; 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]
1553; 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]
1554; AVX512DQVL-NEXT:    vpsraw $4, %ymm0, %ymm3
1555; AVX512DQVL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1556; AVX512DQVL-NEXT:    vpsraw $2, %ymm0, %ymm3
1557; AVX512DQVL-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
1558; AVX512DQVL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1559; AVX512DQVL-NEXT:    vpsraw $1, %ymm0, %ymm3
1560; AVX512DQVL-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
1561; AVX512DQVL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1562; AVX512DQVL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1563; AVX512DQVL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
1564; AVX512DQVL-NEXT:    retq
1565;
1566; AVX512BWVL-LABEL: constant_shift_v32i8:
1567; AVX512BWVL:       # %bb.0:
1568; AVX512BWVL-NEXT:    vpmovsxbw %ymm0, %zmm0
1569; AVX512BWVL-NEXT:    vpsravw {{.*}}(%rip), %zmm0, %zmm0
1570; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm0
1571; AVX512BWVL-NEXT:    retq
1572;
1573; X32-AVX1-LABEL: constant_shift_v32i8:
1574; X32-AVX1:       # %bb.0:
1575; X32-AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [8192,24640,41088,57536,49376,32928,16480,32]
1576; X32-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]
1577; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1578; X32-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]
1579; X32-AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5
1580; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
1581; X32-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1582; X32-AVX1-NEXT:    vpsraw $4, %xmm5, %xmm6
1583; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm6, %xmm5, %xmm5
1584; X32-AVX1-NEXT:    vpsraw $2, %xmm4, %xmm6
1585; X32-AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
1586; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm6, %xmm4, %xmm4
1587; X32-AVX1-NEXT:    vpsraw $2, %xmm5, %xmm6
1588; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm6, %xmm5, %xmm5
1589; X32-AVX1-NEXT:    vpsraw $1, %xmm4, %xmm6
1590; X32-AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
1591; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm6, %xmm4, %xmm4
1592; X32-AVX1-NEXT:    vpsraw $1, %xmm5, %xmm6
1593; X32-AVX1-NEXT:    vpblendvb %xmm2, %xmm6, %xmm5, %xmm2
1594; X32-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]
1595; X32-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]
1596; X32-AVX1-NEXT:    vpsraw $4, %xmm3, %xmm5
1597; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm3, %xmm3
1598; X32-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1599; X32-AVX1-NEXT:    vpsraw $4, %xmm0, %xmm5
1600; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm0, %xmm0
1601; X32-AVX1-NEXT:    vpsraw $2, %xmm3, %xmm5
1602; X32-AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
1603; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm3, %xmm3
1604; X32-AVX1-NEXT:    vpsraw $2, %xmm0, %xmm5
1605; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm0, %xmm0
1606; X32-AVX1-NEXT:    vpsraw $1, %xmm3, %xmm5
1607; X32-AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm1
1608; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm3, %xmm3
1609; X32-AVX1-NEXT:    vpsraw $1, %xmm0, %xmm5
1610; X32-AVX1-NEXT:    vpblendvb %xmm1, %xmm5, %xmm0, %xmm0
1611; X32-AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm1
1612; X32-AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
1613; X32-AVX1-NEXT:    vpackuswb %xmm1, %xmm3, %xmm1
1614; X32-AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
1615; X32-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1616; X32-AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1617; X32-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1618; X32-AVX1-NEXT:    retl
1619;
1620; X32-AVX2-LABEL: constant_shift_v32i8:
1621; X32-AVX2:       # %bb.0:
1622; X32-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32]
1623; X32-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]
1624; X32-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]
1625; X32-AVX2-NEXT:    vpsraw $4, %ymm3, %ymm4
1626; X32-AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
1627; X32-AVX2-NEXT:    vpsraw $2, %ymm3, %ymm4
1628; X32-AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
1629; X32-AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
1630; X32-AVX2-NEXT:    vpsraw $1, %ymm3, %ymm4
1631; X32-AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm2
1632; X32-AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
1633; X32-AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
1634; X32-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]
1635; X32-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]
1636; X32-AVX2-NEXT:    vpsraw $4, %ymm0, %ymm3
1637; X32-AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1638; X32-AVX2-NEXT:    vpsraw $2, %ymm0, %ymm3
1639; X32-AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
1640; X32-AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1641; X32-AVX2-NEXT:    vpsraw $1, %ymm0, %ymm3
1642; X32-AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm1
1643; X32-AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
1644; X32-AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1645; X32-AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
1646; X32-AVX2-NEXT:    retl
1647  %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>
1648  ret <32 x i8> %shift
1649}
1650
1651;
1652; Uniform Constant Shifts
1653;
1654
1655define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
1656; AVX1-LABEL: splatconstant_shift_v4i64:
1657; AVX1:       # %bb.0:
1658; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1659; AVX1-NEXT:    vpsrad $7, %xmm1, %xmm2
1660; AVX1-NEXT:    vpsrlq $7, %xmm1, %xmm1
1661; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
1662; AVX1-NEXT:    vpsrad $7, %xmm0, %xmm2
1663; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm0
1664; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1665; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1666; AVX1-NEXT:    retq
1667;
1668; AVX2-LABEL: splatconstant_shift_v4i64:
1669; AVX2:       # %bb.0:
1670; AVX2-NEXT:    vpsrad $7, %ymm0, %ymm1
1671; AVX2-NEXT:    vpsrlq $7, %ymm0, %ymm0
1672; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
1673; AVX2-NEXT:    retq
1674;
1675; XOPAVX1-LABEL: splatconstant_shift_v4i64:
1676; XOPAVX1:       # %bb.0:
1677; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1678; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [18446744073709551609,18446744073709551609]
1679; XOPAVX1-NEXT:    vpshaq %xmm2, %xmm1, %xmm1
1680; XOPAVX1-NEXT:    vpshaq %xmm2, %xmm0, %xmm0
1681; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1682; XOPAVX1-NEXT:    retq
1683;
1684; XOPAVX2-LABEL: splatconstant_shift_v4i64:
1685; XOPAVX2:       # %bb.0:
1686; XOPAVX2-NEXT:    vpsrad $7, %ymm0, %ymm1
1687; XOPAVX2-NEXT:    vpsrlq $7, %ymm0, %ymm0
1688; XOPAVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
1689; XOPAVX2-NEXT:    retq
1690;
1691; AVX512-LABEL: splatconstant_shift_v4i64:
1692; AVX512:       # %bb.0:
1693; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1694; AVX512-NEXT:    vpsraq $7, %zmm0, %zmm0
1695; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1696; AVX512-NEXT:    retq
1697;
1698; AVX512VL-LABEL: splatconstant_shift_v4i64:
1699; AVX512VL:       # %bb.0:
1700; AVX512VL-NEXT:    vpsraq $7, %ymm0, %ymm0
1701; AVX512VL-NEXT:    retq
1702;
1703; X32-AVX1-LABEL: splatconstant_shift_v4i64:
1704; X32-AVX1:       # %bb.0:
1705; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1706; X32-AVX1-NEXT:    vpsrad $7, %xmm1, %xmm2
1707; X32-AVX1-NEXT:    vpsrlq $7, %xmm1, %xmm1
1708; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
1709; X32-AVX1-NEXT:    vpsrad $7, %xmm0, %xmm2
1710; X32-AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm0
1711; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1712; X32-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1713; X32-AVX1-NEXT:    retl
1714;
1715; X32-AVX2-LABEL: splatconstant_shift_v4i64:
1716; X32-AVX2:       # %bb.0:
1717; X32-AVX2-NEXT:    vpsrad $7, %ymm0, %ymm1
1718; X32-AVX2-NEXT:    vpsrlq $7, %ymm0, %ymm0
1719; X32-AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
1720; X32-AVX2-NEXT:    retl
1721  %shift = ashr <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
1722  ret <4 x i64> %shift
1723}
1724
1725define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
1726; AVX1-LABEL: splatconstant_shift_v8i32:
1727; AVX1:       # %bb.0:
1728; AVX1-NEXT:    vpsrad $5, %xmm0, %xmm1
1729; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1730; AVX1-NEXT:    vpsrad $5, %xmm0, %xmm0
1731; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1732; AVX1-NEXT:    retq
1733;
1734; AVX2-LABEL: splatconstant_shift_v8i32:
1735; AVX2:       # %bb.0:
1736; AVX2-NEXT:    vpsrad $5, %ymm0, %ymm0
1737; AVX2-NEXT:    retq
1738;
1739; XOPAVX1-LABEL: splatconstant_shift_v8i32:
1740; XOPAVX1:       # %bb.0:
1741; XOPAVX1-NEXT:    vpsrad $5, %xmm0, %xmm1
1742; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1743; XOPAVX1-NEXT:    vpsrad $5, %xmm0, %xmm0
1744; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1745; XOPAVX1-NEXT:    retq
1746;
1747; XOPAVX2-LABEL: splatconstant_shift_v8i32:
1748; XOPAVX2:       # %bb.0:
1749; XOPAVX2-NEXT:    vpsrad $5, %ymm0, %ymm0
1750; XOPAVX2-NEXT:    retq
1751;
1752; AVX512-LABEL: splatconstant_shift_v8i32:
1753; AVX512:       # %bb.0:
1754; AVX512-NEXT:    vpsrad $5, %ymm0, %ymm0
1755; AVX512-NEXT:    retq
1756;
1757; AVX512VL-LABEL: splatconstant_shift_v8i32:
1758; AVX512VL:       # %bb.0:
1759; AVX512VL-NEXT:    vpsrad $5, %ymm0, %ymm0
1760; AVX512VL-NEXT:    retq
1761;
1762; X32-AVX1-LABEL: splatconstant_shift_v8i32:
1763; X32-AVX1:       # %bb.0:
1764; X32-AVX1-NEXT:    vpsrad $5, %xmm0, %xmm1
1765; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1766; X32-AVX1-NEXT:    vpsrad $5, %xmm0, %xmm0
1767; X32-AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1768; X32-AVX1-NEXT:    retl
1769;
1770; X32-AVX2-LABEL: splatconstant_shift_v8i32:
1771; X32-AVX2:       # %bb.0:
1772; X32-AVX2-NEXT:    vpsrad $5, %ymm0, %ymm0
1773; X32-AVX2-NEXT:    retl
1774  %shift = ashr <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
1775  ret <8 x i32> %shift
1776}
1777
1778define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
1779; AVX1-LABEL: splatconstant_shift_v16i16:
1780; AVX1:       # %bb.0:
1781; AVX1-NEXT:    vpsraw $3, %xmm0, %xmm1
1782; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1783; AVX1-NEXT:    vpsraw $3, %xmm0, %xmm0
1784; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1785; AVX1-NEXT:    retq
1786;
1787; AVX2-LABEL: splatconstant_shift_v16i16:
1788; AVX2:       # %bb.0:
1789; AVX2-NEXT:    vpsraw $3, %ymm0, %ymm0
1790; AVX2-NEXT:    retq
1791;
1792; XOPAVX1-LABEL: splatconstant_shift_v16i16:
1793; XOPAVX1:       # %bb.0:
1794; XOPAVX1-NEXT:    vpsraw $3, %xmm0, %xmm1
1795; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1796; XOPAVX1-NEXT:    vpsraw $3, %xmm0, %xmm0
1797; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1798; XOPAVX1-NEXT:    retq
1799;
1800; XOPAVX2-LABEL: splatconstant_shift_v16i16:
1801; XOPAVX2:       # %bb.0:
1802; XOPAVX2-NEXT:    vpsraw $3, %ymm0, %ymm0
1803; XOPAVX2-NEXT:    retq
1804;
1805; AVX512-LABEL: splatconstant_shift_v16i16:
1806; AVX512:       # %bb.0:
1807; AVX512-NEXT:    vpsraw $3, %ymm0, %ymm0
1808; AVX512-NEXT:    retq
1809;
1810; AVX512VL-LABEL: splatconstant_shift_v16i16:
1811; AVX512VL:       # %bb.0:
1812; AVX512VL-NEXT:    vpsraw $3, %ymm0, %ymm0
1813; AVX512VL-NEXT:    retq
1814;
1815; X32-AVX1-LABEL: splatconstant_shift_v16i16:
1816; X32-AVX1:       # %bb.0:
1817; X32-AVX1-NEXT:    vpsraw $3, %xmm0, %xmm1
1818; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1819; X32-AVX1-NEXT:    vpsraw $3, %xmm0, %xmm0
1820; X32-AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1821; X32-AVX1-NEXT:    retl
1822;
1823; X32-AVX2-LABEL: splatconstant_shift_v16i16:
1824; X32-AVX2:       # %bb.0:
1825; X32-AVX2-NEXT:    vpsraw $3, %ymm0, %ymm0
1826; X32-AVX2-NEXT:    retl
1827  %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>
1828  ret <16 x i16> %shift
1829}
1830
1831define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
1832; AVX1-LABEL: splatconstant_shift_v32i8:
1833; AVX1:       # %bb.0:
1834; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1835; AVX1-NEXT:    vpsrlw $3, %xmm1, %xmm1
1836; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]
1837; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
1838; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1839; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
1840; AVX1-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
1841; AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm0
1842; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
1843; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
1844; AVX1-NEXT:    vpsubb %xmm3, %xmm0, %xmm0
1845; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1846; AVX1-NEXT:    retq
1847;
1848; AVX2-LABEL: splatconstant_shift_v32i8:
1849; AVX2:       # %bb.0:
1850; AVX2-NEXT:    vpsrlw $3, %ymm0, %ymm0
1851; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1852; 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]
1853; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1854; AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
1855; AVX2-NEXT:    retq
1856;
1857; XOPAVX1-LABEL: splatconstant_shift_v32i8:
1858; XOPAVX1:       # %bb.0:
1859; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1860; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253]
1861; XOPAVX1-NEXT:    vpshab %xmm2, %xmm1, %xmm1
1862; XOPAVX1-NEXT:    vpshab %xmm2, %xmm0, %xmm0
1863; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1864; XOPAVX1-NEXT:    retq
1865;
1866; XOPAVX2-LABEL: splatconstant_shift_v32i8:
1867; XOPAVX2:       # %bb.0:
1868; XOPAVX2-NEXT:    vpsrlw $3, %ymm0, %ymm0
1869; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1870; 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]
1871; XOPAVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1872; XOPAVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
1873; XOPAVX2-NEXT:    retq
1874;
1875; AVX512-LABEL: splatconstant_shift_v32i8:
1876; AVX512:       # %bb.0:
1877; AVX512-NEXT:    vpsrlw $3, %ymm0, %ymm0
1878; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1879; 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]
1880; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1881; AVX512-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
1882; AVX512-NEXT:    retq
1883;
1884; AVX512VL-LABEL: splatconstant_shift_v32i8:
1885; AVX512VL:       # %bb.0:
1886; AVX512VL-NEXT:    vpsrlw $3, %ymm0, %ymm0
1887; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1888; 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]
1889; AVX512VL-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1890; AVX512VL-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
1891; AVX512VL-NEXT:    retq
1892;
1893; X32-AVX1-LABEL: splatconstant_shift_v32i8:
1894; X32-AVX1:       # %bb.0:
1895; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1896; X32-AVX1-NEXT:    vpsrlw $3, %xmm1, %xmm1
1897; X32-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]
1898; X32-AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
1899; X32-AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1900; X32-AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm1
1901; X32-AVX1-NEXT:    vpsubb %xmm3, %xmm1, %xmm1
1902; X32-AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm0
1903; X32-AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
1904; X32-AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
1905; X32-AVX1-NEXT:    vpsubb %xmm3, %xmm0, %xmm0
1906; X32-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1907; X32-AVX1-NEXT:    retl
1908;
1909; X32-AVX2-LABEL: splatconstant_shift_v32i8:
1910; X32-AVX2:       # %bb.0:
1911; X32-AVX2-NEXT:    vpsrlw $3, %ymm0, %ymm0
1912; X32-AVX2-NEXT:    vpand {{\.LCPI.*}}, %ymm0, %ymm0
1913; X32-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]
1914; X32-AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1915; X32-AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
1916; X32-AVX2-NEXT:    retl
1917  %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>
1918  ret <32 x i8> %shift
1919}
1920