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
19 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
20 ; AVX1-LABEL: var_shift_v4i64:
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
35 ; AVX2-LABEL: var_shift_v4i64:
37 ; AVX2-NEXT: vpsllvq %ymm1, %ymm0, %ymm0
40 ; XOPAVX1-LABEL: var_shift_v4i64:
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
49 ; XOPAVX2-LABEL: var_shift_v4i64:
51 ; XOPAVX2-NEXT: vpsllvq %ymm1, %ymm0, %ymm0
54 ; AVX512-LABEL: var_shift_v4i64:
56 ; AVX512-NEXT: vpsllvq %ymm1, %ymm0, %ymm0
59 ; AVX512VL-LABEL: var_shift_v4i64:
61 ; AVX512VL-NEXT: vpsllvq %ymm1, %ymm0, %ymm0
64 ; X32-AVX1-LABEL: var_shift_v4i64:
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
79 ; X32-AVX2-LABEL: var_shift_v4i64:
81 ; X32-AVX2-NEXT: vpsllvq %ymm1, %ymm0, %ymm0
83 %shift = shl <4 x i64> %a, %b
87 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
88 ; AVX1-LABEL: var_shift_v8i32:
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 %xmm2, %xmm4, %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 %xmm1, %xmm0, %xmm0
101 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
104 ; AVX2-LABEL: var_shift_v8i32:
106 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
109 ; XOPAVX1-LABEL: var_shift_v8i32:
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
118 ; XOPAVX2-LABEL: var_shift_v8i32:
120 ; XOPAVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
123 ; AVX512-LABEL: var_shift_v8i32:
125 ; AVX512-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
128 ; AVX512VL-LABEL: var_shift_v8i32:
130 ; AVX512VL-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
131 ; AVX512VL-NEXT: retq
133 ; X32-AVX1-LABEL: var_shift_v8i32:
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 %xmm2, %xmm4, %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 %xmm1, %xmm0, %xmm0
146 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
147 ; X32-AVX1-NEXT: retl
149 ; X32-AVX2-LABEL: var_shift_v8i32:
151 ; X32-AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
152 ; X32-AVX2-NEXT: retl
153 %shift = shl <8 x i32> %a, %b
157 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
158 ; AVX1-LABEL: var_shift_v16i16:
160 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
161 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
162 ; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm4 = xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
163 ; AVX1-NEXT: vpslld $23, %xmm4, %xmm4
164 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]
165 ; AVX1-NEXT: vpaddd %xmm5, %xmm4, %xmm4
166 ; AVX1-NEXT: vcvttps2dq %xmm4, %xmm4
167 ; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
168 ; AVX1-NEXT: vpslld $23, %xmm2, %xmm2
169 ; AVX1-NEXT: vpaddd %xmm5, %xmm2, %xmm2
170 ; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2
171 ; AVX1-NEXT: vpackusdw %xmm4, %xmm2, %xmm2
172 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
173 ; AVX1-NEXT: vpmullw %xmm2, %xmm4, %xmm2
174 ; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
175 ; AVX1-NEXT: vpslld $23, %xmm3, %xmm3
176 ; AVX1-NEXT: vpaddd %xmm5, %xmm3, %xmm3
177 ; AVX1-NEXT: vcvttps2dq %xmm3, %xmm3
178 ; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
179 ; AVX1-NEXT: vpslld $23, %xmm1, %xmm1
180 ; AVX1-NEXT: vpaddd %xmm5, %xmm1, %xmm1
181 ; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1
182 ; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1
183 ; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0
184 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
187 ; AVX2-LABEL: var_shift_v16i16:
189 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
190 ; 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]
191 ; 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]
192 ; AVX2-NEXT: vpsllvd %ymm3, %ymm4, %ymm3
193 ; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3
194 ; 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]
195 ; 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]
196 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
197 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
198 ; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
201 ; XOPAVX1-LABEL: var_shift_v16i16:
203 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
204 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
205 ; XOPAVX1-NEXT: vpshlw %xmm2, %xmm3, %xmm2
206 ; XOPAVX1-NEXT: vpshlw %xmm1, %xmm0, %xmm0
207 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
210 ; XOPAVX2-LABEL: var_shift_v16i16:
212 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
213 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
214 ; XOPAVX2-NEXT: vpshlw %xmm2, %xmm3, %xmm2
215 ; XOPAVX2-NEXT: vpshlw %xmm1, %xmm0, %xmm0
216 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
219 ; AVX512DQ-LABEL: var_shift_v16i16:
221 ; 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
222 ; 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
223 ; AVX512DQ-NEXT: vpsllvd %zmm1, %zmm0, %zmm0
224 ; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0
225 ; AVX512DQ-NEXT: retq
227 ; AVX512BW-LABEL: var_shift_v16i16:
229 ; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
230 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
231 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
232 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
233 ; AVX512BW-NEXT: retq
235 ; AVX512DQVL-LABEL: var_shift_v16i16:
236 ; AVX512DQVL: # %bb.0:
237 ; 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
238 ; 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
239 ; AVX512DQVL-NEXT: vpsllvd %zmm1, %zmm0, %zmm0
240 ; AVX512DQVL-NEXT: vpmovdw %zmm0, %ymm0
241 ; AVX512DQVL-NEXT: retq
243 ; AVX512BWVL-LABEL: var_shift_v16i16:
244 ; AVX512BWVL: # %bb.0:
245 ; AVX512BWVL-NEXT: vpsllvw %ymm1, %ymm0, %ymm0
246 ; AVX512BWVL-NEXT: retq
248 ; X32-AVX1-LABEL: var_shift_v16i16:
250 ; X32-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
251 ; X32-AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
252 ; X32-AVX1-NEXT: vpunpckhwd {{.*#+}} xmm4 = xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
253 ; X32-AVX1-NEXT: vpslld $23, %xmm4, %xmm4
254 ; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]
255 ; X32-AVX1-NEXT: vpaddd %xmm5, %xmm4, %xmm4
256 ; X32-AVX1-NEXT: vcvttps2dq %xmm4, %xmm4
257 ; X32-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
258 ; X32-AVX1-NEXT: vpslld $23, %xmm2, %xmm2
259 ; X32-AVX1-NEXT: vpaddd %xmm5, %xmm2, %xmm2
260 ; X32-AVX1-NEXT: vcvttps2dq %xmm2, %xmm2
261 ; X32-AVX1-NEXT: vpackusdw %xmm4, %xmm2, %xmm2
262 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
263 ; X32-AVX1-NEXT: vpmullw %xmm2, %xmm4, %xmm2
264 ; X32-AVX1-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
265 ; X32-AVX1-NEXT: vpslld $23, %xmm3, %xmm3
266 ; X32-AVX1-NEXT: vpaddd %xmm5, %xmm3, %xmm3
267 ; X32-AVX1-NEXT: vcvttps2dq %xmm3, %xmm3
268 ; X32-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
269 ; X32-AVX1-NEXT: vpslld $23, %xmm1, %xmm1
270 ; X32-AVX1-NEXT: vpaddd %xmm5, %xmm1, %xmm1
271 ; X32-AVX1-NEXT: vcvttps2dq %xmm1, %xmm1
272 ; X32-AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1
273 ; X32-AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0
274 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
275 ; X32-AVX1-NEXT: retl
277 ; X32-AVX2-LABEL: var_shift_v16i16:
279 ; X32-AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
280 ; 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]
281 ; 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]
282 ; X32-AVX2-NEXT: vpsllvd %ymm3, %ymm4, %ymm3
283 ; X32-AVX2-NEXT: vpsrld $16, %ymm3, %ymm3
284 ; 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]
285 ; 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]
286 ; X32-AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
287 ; X32-AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
288 ; X32-AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
289 ; X32-AVX2-NEXT: retl
290 %shift = shl <16 x i16> %a, %b
291 ret <16 x i16> %shift
294 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
295 ; AVX1-LABEL: var_shift_v32i8:
297 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
298 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm3
299 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
300 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
301 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
302 ; AVX1-NEXT: vpsllw $5, %xmm5, %xmm5
303 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
304 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm3
305 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
306 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
307 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
308 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
309 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm3
310 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
311 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
312 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm3
313 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
314 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
315 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
316 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm3
317 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
318 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
319 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
320 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm3
321 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
322 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
323 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
326 ; AVX2-LABEL: var_shift_v32i8:
328 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
329 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
330 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
331 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
332 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
333 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
334 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
335 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
336 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
337 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
338 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
341 ; XOPAVX1-LABEL: var_shift_v32i8:
343 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
344 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
345 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm3, %xmm2
346 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0
347 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
350 ; XOPAVX2-LABEL: var_shift_v32i8:
352 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
353 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
354 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm3, %xmm2
355 ; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0
356 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
359 ; AVX512DQ-LABEL: var_shift_v32i8:
361 ; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1
362 ; AVX512DQ-NEXT: vpsllw $4, %ymm0, %ymm2
363 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
364 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
365 ; AVX512DQ-NEXT: vpsllw $2, %ymm0, %ymm2
366 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
367 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
368 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
369 ; AVX512DQ-NEXT: vpaddb %ymm0, %ymm0, %ymm2
370 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
371 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
372 ; AVX512DQ-NEXT: retq
374 ; AVX512BW-LABEL: var_shift_v32i8:
376 ; 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
377 ; 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
378 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
379 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
380 ; AVX512BW-NEXT: retq
382 ; AVX512DQVL-LABEL: var_shift_v32i8:
383 ; AVX512DQVL: # %bb.0:
384 ; AVX512DQVL-NEXT: vpsllw $5, %ymm1, %ymm1
385 ; AVX512DQVL-NEXT: vpsllw $4, %ymm0, %ymm2
386 ; AVX512DQVL-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
387 ; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
388 ; AVX512DQVL-NEXT: vpsllw $2, %ymm0, %ymm2
389 ; AVX512DQVL-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
390 ; AVX512DQVL-NEXT: vpaddb %ymm1, %ymm1, %ymm1
391 ; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
392 ; AVX512DQVL-NEXT: vpaddb %ymm0, %ymm0, %ymm2
393 ; AVX512DQVL-NEXT: vpaddb %ymm1, %ymm1, %ymm1
394 ; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
395 ; AVX512DQVL-NEXT: retq
397 ; AVX512BWVL-LABEL: var_shift_v32i8:
398 ; AVX512BWVL: # %bb.0:
399 ; 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
400 ; 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
401 ; AVX512BWVL-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
402 ; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0
403 ; AVX512BWVL-NEXT: retq
405 ; X32-AVX1-LABEL: var_shift_v32i8:
407 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
408 ; X32-AVX1-NEXT: vpsllw $4, %xmm2, %xmm3
409 ; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
410 ; X32-AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
411 ; X32-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
412 ; X32-AVX1-NEXT: vpsllw $5, %xmm5, %xmm5
413 ; X32-AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
414 ; X32-AVX1-NEXT: vpsllw $2, %xmm2, %xmm3
415 ; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
416 ; X32-AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
417 ; X32-AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
418 ; X32-AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
419 ; X32-AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm3
420 ; X32-AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
421 ; X32-AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
422 ; X32-AVX1-NEXT: vpsllw $4, %xmm0, %xmm3
423 ; X32-AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
424 ; X32-AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
425 ; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
426 ; X32-AVX1-NEXT: vpsllw $2, %xmm0, %xmm3
427 ; X32-AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
428 ; X32-AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
429 ; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
430 ; X32-AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm3
431 ; X32-AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
432 ; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
433 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
434 ; X32-AVX1-NEXT: retl
436 ; X32-AVX2-LABEL: var_shift_v32i8:
438 ; X32-AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
439 ; X32-AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
440 ; X32-AVX2-NEXT: vpand {{\.LCPI.*}}, %ymm2, %ymm2
441 ; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
442 ; X32-AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
443 ; X32-AVX2-NEXT: vpand {{\.LCPI.*}}, %ymm2, %ymm2
444 ; X32-AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
445 ; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
446 ; X32-AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
447 ; X32-AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
448 ; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
449 ; X32-AVX2-NEXT: retl
450 %shift = shl <32 x i8> %a, %b
455 ; Uniform Variable Shifts
458 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
459 ; AVX1-LABEL: splatvar_shift_v4i64:
461 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
462 ; AVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2
463 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
464 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
467 ; AVX2-LABEL: splatvar_shift_v4i64:
469 ; AVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0
472 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
474 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
475 ; XOPAVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2
476 ; XOPAVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
477 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
480 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
482 ; XOPAVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0
485 ; AVX512-LABEL: splatvar_shift_v4i64:
487 ; AVX512-NEXT: vpsllq %xmm1, %ymm0, %ymm0
490 ; AVX512VL-LABEL: splatvar_shift_v4i64:
492 ; AVX512VL-NEXT: vpsllq %xmm1, %ymm0, %ymm0
493 ; AVX512VL-NEXT: retq
495 ; X32-AVX1-LABEL: splatvar_shift_v4i64:
497 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
498 ; X32-AVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2
499 ; X32-AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
500 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
501 ; X32-AVX1-NEXT: retl
503 ; X32-AVX2-LABEL: splatvar_shift_v4i64:
505 ; X32-AVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0
506 ; X32-AVX2-NEXT: retl
507 %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
508 %shift = shl <4 x i64> %a, %splat
512 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
513 ; AVX1-LABEL: splatvar_shift_v8i32:
515 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
516 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
517 ; AVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2
518 ; AVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0
519 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
522 ; AVX2-LABEL: splatvar_shift_v8i32:
524 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
525 ; AVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0
528 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
530 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
531 ; XOPAVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
532 ; XOPAVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2
533 ; XOPAVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0
534 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
537 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
539 ; XOPAVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
540 ; XOPAVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0
543 ; AVX512-LABEL: splatvar_shift_v8i32:
545 ; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
546 ; AVX512-NEXT: vpslld %xmm1, %ymm0, %ymm0
549 ; AVX512VL-LABEL: splatvar_shift_v8i32:
551 ; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
552 ; AVX512VL-NEXT: vpslld %xmm1, %ymm0, %ymm0
553 ; AVX512VL-NEXT: retq
555 ; X32-AVX1-LABEL: splatvar_shift_v8i32:
557 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
558 ; X32-AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
559 ; X32-AVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2
560 ; X32-AVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0
561 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
562 ; X32-AVX1-NEXT: retl
564 ; X32-AVX2-LABEL: splatvar_shift_v8i32:
566 ; X32-AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
567 ; X32-AVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0
568 ; X32-AVX2-NEXT: retl
569 %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
570 %shift = shl <8 x i32> %a, %splat
574 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
575 ; AVX1-LABEL: splatvar_shift_v16i16:
577 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
578 ; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
579 ; AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
580 ; AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
581 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
584 ; AVX2-LABEL: splatvar_shift_v16i16:
586 ; AVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
587 ; AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
590 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
592 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
593 ; XOPAVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
594 ; XOPAVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
595 ; XOPAVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
596 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
599 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
601 ; XOPAVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
602 ; XOPAVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
605 ; AVX512-LABEL: splatvar_shift_v16i16:
607 ; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
608 ; AVX512-NEXT: vpsllw %xmm1, %ymm0, %ymm0
611 ; AVX512VL-LABEL: splatvar_shift_v16i16:
613 ; AVX512VL-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
614 ; AVX512VL-NEXT: vpsllw %xmm1, %ymm0, %ymm0
615 ; AVX512VL-NEXT: retq
617 ; X32-AVX1-LABEL: splatvar_shift_v16i16:
619 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
620 ; X32-AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
621 ; X32-AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
622 ; X32-AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
623 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
624 ; X32-AVX1-NEXT: retl
626 ; X32-AVX2-LABEL: splatvar_shift_v16i16:
628 ; X32-AVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
629 ; X32-AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
630 ; X32-AVX2-NEXT: retl
631 %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
632 %shift = shl <16 x i16> %a, %splat
633 ret <16 x i16> %shift
636 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
637 ; AVX1-LABEL: splatvar_shift_v32i8:
639 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
640 ; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
641 ; AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
642 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
643 ; AVX1-NEXT: vpsllw %xmm1, %xmm3, %xmm3
644 ; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
645 ; AVX1-NEXT: vpshufb %xmm4, %xmm3, %xmm3
646 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
647 ; AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
648 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
649 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
652 ; AVX2-LABEL: splatvar_shift_v32i8:
654 ; AVX2-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
655 ; AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
656 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
657 ; AVX2-NEXT: vpsllw %xmm1, %ymm2, %ymm1
658 ; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1
659 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
662 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
664 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
665 ; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
666 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
667 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm2, %xmm2
668 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0
669 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
672 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
674 ; XOPAVX2-NEXT: vpbroadcastb %xmm1, %ymm1
675 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
676 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm3
677 ; XOPAVX2-NEXT: vpshlb %xmm3, %xmm2, %xmm2
678 ; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0
679 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
682 ; AVX512DQ-LABEL: splatvar_shift_v32i8:
684 ; AVX512DQ-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
685 ; AVX512DQ-NEXT: vpsllw %xmm1, %ymm0, %ymm0
686 ; AVX512DQ-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
687 ; AVX512DQ-NEXT: vpsllw %xmm1, %ymm2, %ymm1
688 ; AVX512DQ-NEXT: vpbroadcastb %xmm1, %ymm1
689 ; AVX512DQ-NEXT: vpand %ymm1, %ymm0, %ymm0
690 ; AVX512DQ-NEXT: retq
692 ; AVX512BW-LABEL: splatvar_shift_v32i8:
694 ; AVX512BW-NEXT: vpbroadcastb %xmm1, %ymm1
695 ; 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
696 ; 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
697 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
698 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
699 ; AVX512BW-NEXT: retq
701 ; AVX512DQVL-LABEL: splatvar_shift_v32i8:
702 ; AVX512DQVL: # %bb.0:
703 ; AVX512DQVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
704 ; AVX512DQVL-NEXT: vpsllw %xmm1, %ymm0, %ymm0
705 ; AVX512DQVL-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
706 ; AVX512DQVL-NEXT: vpsllw %xmm1, %ymm2, %ymm1
707 ; AVX512DQVL-NEXT: vpbroadcastb %xmm1, %ymm1
708 ; AVX512DQVL-NEXT: vpand %ymm1, %ymm0, %ymm0
709 ; AVX512DQVL-NEXT: retq
711 ; AVX512BWVL-LABEL: splatvar_shift_v32i8:
712 ; AVX512BWVL: # %bb.0:
713 ; AVX512BWVL-NEXT: vpbroadcastb %xmm1, %ymm1
714 ; 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
715 ; 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
716 ; AVX512BWVL-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
717 ; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0
718 ; AVX512BWVL-NEXT: retq
720 ; X32-AVX1-LABEL: splatvar_shift_v32i8:
722 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
723 ; X32-AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
724 ; X32-AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
725 ; X32-AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
726 ; X32-AVX1-NEXT: vpsllw %xmm1, %xmm3, %xmm3
727 ; X32-AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
728 ; X32-AVX1-NEXT: vpshufb %xmm4, %xmm3, %xmm3
729 ; X32-AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
730 ; X32-AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
731 ; X32-AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
732 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
733 ; X32-AVX1-NEXT: retl
735 ; X32-AVX2-LABEL: splatvar_shift_v32i8:
737 ; X32-AVX2-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
738 ; X32-AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
739 ; X32-AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
740 ; X32-AVX2-NEXT: vpsllw %xmm1, %ymm2, %ymm1
741 ; X32-AVX2-NEXT: vpbroadcastb %xmm1, %ymm1
742 ; X32-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
743 ; X32-AVX2-NEXT: retl
744 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
745 %shift = shl <32 x i8> %a, %splat
753 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
754 ; AVX1-LABEL: constant_shift_v4i64:
756 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
757 ; AVX1-NEXT: vpsllq $62, %xmm1, %xmm2
758 ; AVX1-NEXT: vpsllq $31, %xmm1, %xmm1
759 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
760 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm2
761 ; AVX1-NEXT: vpsllq $1, %xmm0, %xmm0
762 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
763 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
766 ; AVX2-LABEL: constant_shift_v4i64:
768 ; AVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
771 ; XOPAVX1-LABEL: constant_shift_v4i64:
773 ; XOPAVX1-NEXT: vpshlq {{.*}}(%rip), %xmm0, %xmm1
774 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
775 ; XOPAVX1-NEXT: vpshlq {{.*}}(%rip), %xmm0, %xmm0
776 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
779 ; XOPAVX2-LABEL: constant_shift_v4i64:
781 ; XOPAVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
784 ; AVX512-LABEL: constant_shift_v4i64:
786 ; AVX512-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
789 ; AVX512VL-LABEL: constant_shift_v4i64:
791 ; AVX512VL-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
792 ; AVX512VL-NEXT: retq
794 ; X32-AVX1-LABEL: constant_shift_v4i64:
796 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
797 ; X32-AVX1-NEXT: vpsllq $62, %xmm1, %xmm2
798 ; X32-AVX1-NEXT: vpsllq $31, %xmm1, %xmm1
799 ; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
800 ; X32-AVX1-NEXT: vpsllq $7, %xmm0, %xmm2
801 ; X32-AVX1-NEXT: vpsllq $1, %xmm0, %xmm0
802 ; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
803 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
804 ; X32-AVX1-NEXT: retl
806 ; X32-AVX2-LABEL: constant_shift_v4i64:
808 ; X32-AVX2-NEXT: vpsllvq {{\.LCPI.*}}, %ymm0, %ymm0
809 ; X32-AVX2-NEXT: retl
810 %shift = shl <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
814 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
815 ; AVX1-LABEL: constant_shift_v8i32:
817 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm1
818 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
819 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0
820 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
823 ; AVX2-LABEL: constant_shift_v8i32:
825 ; AVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
828 ; XOPAVX1-LABEL: constant_shift_v8i32:
830 ; XOPAVX1-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm1
831 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
832 ; XOPAVX1-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm0
833 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
836 ; XOPAVX2-LABEL: constant_shift_v8i32:
838 ; XOPAVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
841 ; AVX512-LABEL: constant_shift_v8i32:
843 ; AVX512-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
846 ; AVX512VL-LABEL: constant_shift_v8i32:
848 ; AVX512VL-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
849 ; AVX512VL-NEXT: retq
851 ; X32-AVX1-LABEL: constant_shift_v8i32:
853 ; X32-AVX1-NEXT: vpmulld {{\.LCPI.*}}, %xmm0, %xmm1
854 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
855 ; X32-AVX1-NEXT: vpmulld {{\.LCPI.*}}, %xmm0, %xmm0
856 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
857 ; X32-AVX1-NEXT: retl
859 ; X32-AVX2-LABEL: constant_shift_v8i32:
861 ; X32-AVX2-NEXT: vpsllvd {{\.LCPI.*}}, %ymm0, %ymm0
862 ; X32-AVX2-NEXT: retl
863 %shift = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
867 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
868 ; AVX1-LABEL: constant_shift_v16i16:
870 ; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm1
871 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
872 ; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
873 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
876 ; AVX2-LABEL: constant_shift_v16i16:
878 ; AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
881 ; XOPAVX1-LABEL: constant_shift_v16i16:
883 ; XOPAVX1-NEXT: vpshlw {{.*}}(%rip), %xmm0, %xmm1
884 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
885 ; XOPAVX1-NEXT: vpshlw {{.*}}(%rip), %xmm0, %xmm0
886 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
889 ; XOPAVX2-LABEL: constant_shift_v16i16:
891 ; XOPAVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
894 ; AVX512DQ-LABEL: constant_shift_v16i16:
896 ; AVX512DQ-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
897 ; AVX512DQ-NEXT: retq
899 ; AVX512BW-LABEL: constant_shift_v16i16:
901 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
902 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
903 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
904 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
905 ; AVX512BW-NEXT: retq
907 ; AVX512DQVL-LABEL: constant_shift_v16i16:
908 ; AVX512DQVL: # %bb.0:
909 ; AVX512DQVL-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
910 ; AVX512DQVL-NEXT: retq
912 ; AVX512BWVL-LABEL: constant_shift_v16i16:
913 ; AVX512BWVL: # %bb.0:
914 ; AVX512BWVL-NEXT: vpsllvw {{.*}}(%rip), %ymm0, %ymm0
915 ; AVX512BWVL-NEXT: retq
917 ; X32-AVX1-LABEL: constant_shift_v16i16:
919 ; X32-AVX1-NEXT: vpmullw {{\.LCPI.*}}, %xmm0, %xmm1
920 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
921 ; X32-AVX1-NEXT: vpmullw {{\.LCPI.*}}, %xmm0, %xmm0
922 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
923 ; X32-AVX1-NEXT: retl
925 ; X32-AVX2-LABEL: constant_shift_v16i16:
927 ; X32-AVX2-NEXT: vpmullw {{\.LCPI.*}}, %ymm0, %ymm0
928 ; X32-AVX2-NEXT: retl
929 %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>
930 ret <16 x i16> %shift
933 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
934 ; AVX1-LABEL: constant_shift_v32i8:
936 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
937 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
938 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [128,64,32,16,8,4,2,1]
939 ; AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm2
940 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
941 ; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2
942 ; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
943 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128]
944 ; AVX1-NEXT: vpmullw %xmm5, %xmm1, %xmm1
945 ; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1
946 ; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1
947 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
948 ; AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm2
949 ; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2
950 ; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
951 ; AVX1-NEXT: vpmullw %xmm5, %xmm0, %xmm0
952 ; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0
953 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
954 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
957 ; AVX2-LABEL: constant_shift_v32i8:
959 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm1
960 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
961 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32]
962 ; AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
963 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm1
964 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
965 ; AVX2-NEXT: vpaddb %ymm2, %ymm2, %ymm2
966 ; AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
967 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm1
968 ; AVX2-NEXT: vpaddb %ymm2, %ymm2, %ymm2
969 ; AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
972 ; XOPAVX1-LABEL: constant_shift_v32i8:
974 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
975 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
976 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm1
977 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm0
978 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
981 ; XOPAVX2-LABEL: constant_shift_v32i8:
983 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
984 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
985 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm1, %xmm1
986 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm0, %xmm0
987 ; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
990 ; AVX512DQ-LABEL: constant_shift_v32i8:
992 ; AVX512DQ-NEXT: vpsllw $4, %ymm0, %ymm1
993 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
994 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm2 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32]
995 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
996 ; AVX512DQ-NEXT: vpsllw $2, %ymm0, %ymm1
997 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
998 ; AVX512DQ-NEXT: vpaddb %ymm2, %ymm2, %ymm2
999 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1000 ; AVX512DQ-NEXT: vpaddb %ymm0, %ymm0, %ymm1
1001 ; AVX512DQ-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1002 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1003 ; AVX512DQ-NEXT: retq
1005 ; AVX512BW-LABEL: constant_shift_v32i8:
1006 ; AVX512BW: # %bb.0:
1007 ; 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
1008 ; AVX512BW-NEXT: vpsllvw {{.*}}(%rip), %zmm0, %zmm0
1009 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
1010 ; AVX512BW-NEXT: retq
1012 ; AVX512DQVL-LABEL: constant_shift_v32i8:
1013 ; AVX512DQVL: # %bb.0:
1014 ; AVX512DQVL-NEXT: vpsllw $4, %ymm0, %ymm1
1015 ; AVX512DQVL-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1016 ; AVX512DQVL-NEXT: vmovdqa {{.*#+}} ymm2 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32]
1017 ; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1018 ; AVX512DQVL-NEXT: vpsllw $2, %ymm0, %ymm1
1019 ; AVX512DQVL-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1020 ; AVX512DQVL-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1021 ; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1022 ; AVX512DQVL-NEXT: vpaddb %ymm0, %ymm0, %ymm1
1023 ; AVX512DQVL-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1024 ; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1025 ; AVX512DQVL-NEXT: retq
1027 ; AVX512BWVL-LABEL: constant_shift_v32i8:
1028 ; AVX512BWVL: # %bb.0:
1029 ; 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
1030 ; AVX512BWVL-NEXT: vpsllvw {{.*}}(%rip), %zmm0, %zmm0
1031 ; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0
1032 ; AVX512BWVL-NEXT: retq
1034 ; X32-AVX1-LABEL: constant_shift_v32i8:
1035 ; X32-AVX1: # %bb.0:
1036 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1037 ; X32-AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
1038 ; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [128,64,32,16,8,4,2,1]
1039 ; X32-AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm2
1040 ; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
1041 ; X32-AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2
1042 ; X32-AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
1043 ; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128]
1044 ; X32-AVX1-NEXT: vpmullw %xmm5, %xmm1, %xmm1
1045 ; X32-AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1
1046 ; X32-AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1
1047 ; X32-AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1048 ; X32-AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm2
1049 ; X32-AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2
1050 ; X32-AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1051 ; X32-AVX1-NEXT: vpmullw %xmm5, %xmm0, %xmm0
1052 ; X32-AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0
1053 ; X32-AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
1054 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1055 ; X32-AVX1-NEXT: retl
1057 ; X32-AVX2-LABEL: constant_shift_v32i8:
1058 ; X32-AVX2: # %bb.0:
1059 ; X32-AVX2-NEXT: vpsllw $4, %ymm0, %ymm1
1060 ; X32-AVX2-NEXT: vpand {{\.LCPI.*}}, %ymm1, %ymm1
1061 ; X32-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32]
1062 ; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1063 ; X32-AVX2-NEXT: vpsllw $2, %ymm0, %ymm1
1064 ; X32-AVX2-NEXT: vpand {{\.LCPI.*}}, %ymm1, %ymm1
1065 ; X32-AVX2-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1066 ; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1067 ; X32-AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm1
1068 ; X32-AVX2-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1069 ; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1070 ; X32-AVX2-NEXT: retl
1071 %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>
1072 ret <32 x i8> %shift
1076 ; Uniform Constant Shifts
1079 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
1080 ; AVX1-LABEL: splatconstant_shift_v4i64:
1082 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm1
1083 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1084 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm0
1085 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1088 ; AVX2-LABEL: splatconstant_shift_v4i64:
1090 ; AVX2-NEXT: vpsllq $7, %ymm0, %ymm0
1093 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
1095 ; XOPAVX1-NEXT: vpsllq $7, %xmm0, %xmm1
1096 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1097 ; XOPAVX1-NEXT: vpsllq $7, %xmm0, %xmm0
1098 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1099 ; XOPAVX1-NEXT: retq
1101 ; XOPAVX2-LABEL: splatconstant_shift_v4i64:
1103 ; XOPAVX2-NEXT: vpsllq $7, %ymm0, %ymm0
1104 ; XOPAVX2-NEXT: retq
1106 ; AVX512-LABEL: splatconstant_shift_v4i64:
1108 ; AVX512-NEXT: vpsllq $7, %ymm0, %ymm0
1111 ; AVX512VL-LABEL: splatconstant_shift_v4i64:
1112 ; AVX512VL: # %bb.0:
1113 ; AVX512VL-NEXT: vpsllq $7, %ymm0, %ymm0
1114 ; AVX512VL-NEXT: retq
1116 ; X32-AVX1-LABEL: splatconstant_shift_v4i64:
1117 ; X32-AVX1: # %bb.0:
1118 ; X32-AVX1-NEXT: vpsllq $7, %xmm0, %xmm1
1119 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1120 ; X32-AVX1-NEXT: vpsllq $7, %xmm0, %xmm0
1121 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1122 ; X32-AVX1-NEXT: retl
1124 ; X32-AVX2-LABEL: splatconstant_shift_v4i64:
1125 ; X32-AVX2: # %bb.0:
1126 ; X32-AVX2-NEXT: vpsllq $7, %ymm0, %ymm0
1127 ; X32-AVX2-NEXT: retl
1128 %shift = shl <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
1129 ret <4 x i64> %shift
1132 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
1133 ; AVX1-LABEL: splatconstant_shift_v8i32:
1135 ; AVX1-NEXT: vpslld $5, %xmm0, %xmm1
1136 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1137 ; AVX1-NEXT: vpslld $5, %xmm0, %xmm0
1138 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1141 ; AVX2-LABEL: splatconstant_shift_v8i32:
1143 ; AVX2-NEXT: vpslld $5, %ymm0, %ymm0
1146 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
1148 ; XOPAVX1-NEXT: vpslld $5, %xmm0, %xmm1
1149 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1150 ; XOPAVX1-NEXT: vpslld $5, %xmm0, %xmm0
1151 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1152 ; XOPAVX1-NEXT: retq
1154 ; XOPAVX2-LABEL: splatconstant_shift_v8i32:
1156 ; XOPAVX2-NEXT: vpslld $5, %ymm0, %ymm0
1157 ; XOPAVX2-NEXT: retq
1159 ; AVX512-LABEL: splatconstant_shift_v8i32:
1161 ; AVX512-NEXT: vpslld $5, %ymm0, %ymm0
1164 ; AVX512VL-LABEL: splatconstant_shift_v8i32:
1165 ; AVX512VL: # %bb.0:
1166 ; AVX512VL-NEXT: vpslld $5, %ymm0, %ymm0
1167 ; AVX512VL-NEXT: retq
1169 ; X32-AVX1-LABEL: splatconstant_shift_v8i32:
1170 ; X32-AVX1: # %bb.0:
1171 ; X32-AVX1-NEXT: vpslld $5, %xmm0, %xmm1
1172 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1173 ; X32-AVX1-NEXT: vpslld $5, %xmm0, %xmm0
1174 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1175 ; X32-AVX1-NEXT: retl
1177 ; X32-AVX2-LABEL: splatconstant_shift_v8i32:
1178 ; X32-AVX2: # %bb.0:
1179 ; X32-AVX2-NEXT: vpslld $5, %ymm0, %ymm0
1180 ; X32-AVX2-NEXT: retl
1181 %shift = shl <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
1182 ret <8 x i32> %shift
1185 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
1186 ; AVX1-LABEL: splatconstant_shift_v16i16:
1188 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm1
1189 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1190 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
1191 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1194 ; AVX2-LABEL: splatconstant_shift_v16i16:
1196 ; AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
1199 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
1201 ; XOPAVX1-NEXT: vpsllw $3, %xmm0, %xmm1
1202 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1203 ; XOPAVX1-NEXT: vpsllw $3, %xmm0, %xmm0
1204 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1205 ; XOPAVX1-NEXT: retq
1207 ; XOPAVX2-LABEL: splatconstant_shift_v16i16:
1209 ; XOPAVX2-NEXT: vpsllw $3, %ymm0, %ymm0
1210 ; XOPAVX2-NEXT: retq
1212 ; AVX512-LABEL: splatconstant_shift_v16i16:
1214 ; AVX512-NEXT: vpsllw $3, %ymm0, %ymm0
1217 ; AVX512VL-LABEL: splatconstant_shift_v16i16:
1218 ; AVX512VL: # %bb.0:
1219 ; AVX512VL-NEXT: vpsllw $3, %ymm0, %ymm0
1220 ; AVX512VL-NEXT: retq
1222 ; X32-AVX1-LABEL: splatconstant_shift_v16i16:
1223 ; X32-AVX1: # %bb.0:
1224 ; X32-AVX1-NEXT: vpsllw $3, %xmm0, %xmm1
1225 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1226 ; X32-AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
1227 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1228 ; X32-AVX1-NEXT: retl
1230 ; X32-AVX2-LABEL: splatconstant_shift_v16i16:
1231 ; X32-AVX2: # %bb.0:
1232 ; X32-AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
1233 ; X32-AVX2-NEXT: retl
1234 %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>
1235 ret <16 x i16> %shift
1238 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
1239 ; AVX1-LABEL: splatconstant_shift_v32i8:
1241 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1242 ; AVX1-NEXT: vpsllw $3, %xmm1, %xmm1
1243 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
1244 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
1245 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
1246 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
1247 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1250 ; AVX2-LABEL: splatconstant_shift_v32i8:
1252 ; AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
1253 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1256 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
1258 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1259 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
1260 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm1
1261 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm0
1262 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1263 ; XOPAVX1-NEXT: retq
1265 ; XOPAVX2-LABEL: splatconstant_shift_v32i8:
1267 ; XOPAVX2-NEXT: vpsllw $3, %ymm0, %ymm0
1268 ; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1269 ; XOPAVX2-NEXT: retq
1271 ; AVX512-LABEL: splatconstant_shift_v32i8:
1273 ; AVX512-NEXT: vpsllw $3, %ymm0, %ymm0
1274 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1277 ; AVX512VL-LABEL: splatconstant_shift_v32i8:
1278 ; AVX512VL: # %bb.0:
1279 ; AVX512VL-NEXT: vpsllw $3, %ymm0, %ymm0
1280 ; AVX512VL-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1281 ; AVX512VL-NEXT: retq
1283 ; X32-AVX1-LABEL: splatconstant_shift_v32i8:
1284 ; X32-AVX1: # %bb.0:
1285 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1286 ; X32-AVX1-NEXT: vpsllw $3, %xmm1, %xmm1
1287 ; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
1288 ; X32-AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
1289 ; X32-AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
1290 ; X32-AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
1291 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1292 ; X32-AVX1-NEXT: retl
1294 ; X32-AVX2-LABEL: splatconstant_shift_v32i8:
1295 ; X32-AVX2: # %bb.0:
1296 ; X32-AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
1297 ; X32-AVX2-NEXT: vpand {{\.LCPI.*}}, %ymm0, %ymm0
1298 ; X32-AVX2-NEXT: retl
1299 %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>
1300 ret <32 x i8> %shift