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