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