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: vpunpckhwd {{.*#+}} xmm3 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
162 ; AVX1-NEXT: vpslld $23, %xmm3, %xmm3
163 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]
164 ; AVX1-NEXT: vpaddd %xmm4, %xmm3, %xmm3
165 ; AVX1-NEXT: vcvttps2dq %xmm3, %xmm3
166 ; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
167 ; AVX1-NEXT: vpslld $23, %xmm2, %xmm2
168 ; AVX1-NEXT: vpaddd %xmm4, %xmm2, %xmm2
169 ; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2
170 ; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2
171 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
172 ; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm2
173 ; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
174 ; AVX1-NEXT: vpslld $23, %xmm3, %xmm3
175 ; AVX1-NEXT: vpaddd %xmm4, %xmm3, %xmm3
176 ; AVX1-NEXT: vcvttps2dq %xmm3, %xmm3
177 ; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
178 ; AVX1-NEXT: vpslld $23, %xmm1, %xmm1
179 ; AVX1-NEXT: vpaddd %xmm4, %xmm1, %xmm1
180 ; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1
181 ; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1
182 ; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0
183 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
186 ; AVX2-LABEL: var_shift_v16i16:
188 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
189 ; 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]
190 ; 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]
191 ; AVX2-NEXT: vpsllvd %ymm3, %ymm4, %ymm3
192 ; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3
193 ; 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]
194 ; 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]
195 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
196 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
197 ; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
200 ; XOPAVX1-LABEL: var_shift_v16i16:
202 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
203 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
204 ; XOPAVX1-NEXT: vpshlw %xmm2, %xmm3, %xmm2
205 ; XOPAVX1-NEXT: vpshlw %xmm1, %xmm0, %xmm0
206 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
209 ; XOPAVX2-LABEL: var_shift_v16i16:
211 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
212 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
213 ; XOPAVX2-NEXT: vpshlw %xmm2, %xmm3, %xmm2
214 ; XOPAVX2-NEXT: vpshlw %xmm1, %xmm0, %xmm0
215 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
218 ; AVX512DQ-LABEL: var_shift_v16i16:
220 ; 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
221 ; 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
222 ; AVX512DQ-NEXT: vpsllvd %zmm1, %zmm0, %zmm0
223 ; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0
224 ; AVX512DQ-NEXT: retq
226 ; AVX512BW-LABEL: var_shift_v16i16:
228 ; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
229 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
230 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
231 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
232 ; AVX512BW-NEXT: retq
234 ; AVX512DQVL-LABEL: var_shift_v16i16:
235 ; AVX512DQVL: # %bb.0:
236 ; 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
237 ; 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
238 ; AVX512DQVL-NEXT: vpsllvd %zmm1, %zmm0, %zmm0
239 ; AVX512DQVL-NEXT: vpmovdw %zmm0, %ymm0
240 ; AVX512DQVL-NEXT: retq
242 ; AVX512BWVL-LABEL: var_shift_v16i16:
243 ; AVX512BWVL: # %bb.0:
244 ; AVX512BWVL-NEXT: vpsllvw %ymm1, %ymm0, %ymm0
245 ; AVX512BWVL-NEXT: retq
247 ; X32-AVX1-LABEL: var_shift_v16i16:
249 ; X32-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
250 ; X32-AVX1-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
251 ; X32-AVX1-NEXT: vpslld $23, %xmm3, %xmm3
252 ; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]
253 ; X32-AVX1-NEXT: vpaddd %xmm4, %xmm3, %xmm3
254 ; X32-AVX1-NEXT: vcvttps2dq %xmm3, %xmm3
255 ; X32-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
256 ; X32-AVX1-NEXT: vpslld $23, %xmm2, %xmm2
257 ; X32-AVX1-NEXT: vpaddd %xmm4, %xmm2, %xmm2
258 ; X32-AVX1-NEXT: vcvttps2dq %xmm2, %xmm2
259 ; X32-AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2
260 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
261 ; X32-AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm2
262 ; X32-AVX1-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
263 ; X32-AVX1-NEXT: vpslld $23, %xmm3, %xmm3
264 ; X32-AVX1-NEXT: vpaddd %xmm4, %xmm3, %xmm3
265 ; X32-AVX1-NEXT: vcvttps2dq %xmm3, %xmm3
266 ; X32-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
267 ; X32-AVX1-NEXT: vpslld $23, %xmm1, %xmm1
268 ; X32-AVX1-NEXT: vpaddd %xmm4, %xmm1, %xmm1
269 ; X32-AVX1-NEXT: vcvttps2dq %xmm1, %xmm1
270 ; X32-AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1
271 ; X32-AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0
272 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
273 ; X32-AVX1-NEXT: retl
275 ; X32-AVX2-LABEL: var_shift_v16i16:
277 ; X32-AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
278 ; 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]
279 ; 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]
280 ; X32-AVX2-NEXT: vpsllvd %ymm3, %ymm4, %ymm3
281 ; X32-AVX2-NEXT: vpsrld $16, %ymm3, %ymm3
282 ; 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]
283 ; 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]
284 ; X32-AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
285 ; X32-AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
286 ; X32-AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
287 ; X32-AVX2-NEXT: retl
288 %shift = shl <16 x i16> %a, %b
289 ret <16 x i16> %shift
292 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
293 ; AVX1-LABEL: var_shift_v32i8:
295 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
296 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm3
297 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
298 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
299 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
300 ; AVX1-NEXT: vpsllw $5, %xmm5, %xmm5
301 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
302 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm3
303 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
304 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
305 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
306 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
307 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm3
308 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
309 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
310 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm3
311 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
312 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
313 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
314 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm3
315 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
316 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
317 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
318 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm3
319 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
320 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
321 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
324 ; AVX2-LABEL: var_shift_v32i8:
326 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
327 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
328 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
329 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
330 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
331 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
332 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
333 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
334 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
335 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
336 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
339 ; XOPAVX1-LABEL: var_shift_v32i8:
341 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
342 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
343 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm3, %xmm2
344 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0
345 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
348 ; XOPAVX2-LABEL: var_shift_v32i8:
350 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
351 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
352 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm3, %xmm2
353 ; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0
354 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
357 ; AVX512DQ-LABEL: var_shift_v32i8:
359 ; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1
360 ; AVX512DQ-NEXT: vpsllw $4, %ymm0, %ymm2
361 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
362 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
363 ; AVX512DQ-NEXT: vpsllw $2, %ymm0, %ymm2
364 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
365 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
366 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
367 ; AVX512DQ-NEXT: vpaddb %ymm0, %ymm0, %ymm2
368 ; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1
369 ; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
370 ; AVX512DQ-NEXT: retq
372 ; AVX512BW-LABEL: var_shift_v32i8:
374 ; 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
375 ; 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
376 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
377 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
378 ; AVX512BW-NEXT: retq
380 ; AVX512DQVL-LABEL: var_shift_v32i8:
381 ; AVX512DQVL: # %bb.0:
382 ; AVX512DQVL-NEXT: vpsllw $5, %ymm1, %ymm1
383 ; AVX512DQVL-NEXT: vpsllw $4, %ymm0, %ymm2
384 ; AVX512DQVL-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
385 ; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
386 ; AVX512DQVL-NEXT: vpsllw $2, %ymm0, %ymm2
387 ; AVX512DQVL-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
388 ; AVX512DQVL-NEXT: vpaddb %ymm1, %ymm1, %ymm1
389 ; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
390 ; AVX512DQVL-NEXT: vpaddb %ymm0, %ymm0, %ymm2
391 ; AVX512DQVL-NEXT: vpaddb %ymm1, %ymm1, %ymm1
392 ; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
393 ; AVX512DQVL-NEXT: retq
395 ; AVX512BWVL-LABEL: var_shift_v32i8:
396 ; AVX512BWVL: # %bb.0:
397 ; 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
398 ; 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
399 ; AVX512BWVL-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
400 ; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0
401 ; AVX512BWVL-NEXT: retq
403 ; X32-AVX1-LABEL: var_shift_v32i8:
405 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
406 ; X32-AVX1-NEXT: vpsllw $4, %xmm2, %xmm3
407 ; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
408 ; X32-AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
409 ; X32-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
410 ; X32-AVX1-NEXT: vpsllw $5, %xmm5, %xmm5
411 ; X32-AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
412 ; X32-AVX1-NEXT: vpsllw $2, %xmm2, %xmm3
413 ; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
414 ; X32-AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
415 ; X32-AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
416 ; X32-AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
417 ; X32-AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm3
418 ; X32-AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
419 ; X32-AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
420 ; X32-AVX1-NEXT: vpsllw $4, %xmm0, %xmm3
421 ; X32-AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
422 ; X32-AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
423 ; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
424 ; X32-AVX1-NEXT: vpsllw $2, %xmm0, %xmm3
425 ; X32-AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
426 ; X32-AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
427 ; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
428 ; X32-AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm3
429 ; X32-AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
430 ; X32-AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
431 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
432 ; X32-AVX1-NEXT: retl
434 ; X32-AVX2-LABEL: var_shift_v32i8:
436 ; X32-AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
437 ; X32-AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
438 ; X32-AVX2-NEXT: vpand {{\.LCPI.*}}, %ymm2, %ymm2
439 ; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
440 ; X32-AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
441 ; X32-AVX2-NEXT: vpand {{\.LCPI.*}}, %ymm2, %ymm2
442 ; X32-AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
443 ; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
444 ; X32-AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
445 ; X32-AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
446 ; X32-AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
447 ; X32-AVX2-NEXT: retl
448 %shift = shl <32 x i8> %a, %b
453 ; Uniform Variable Shifts
456 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
457 ; AVX1-LABEL: splatvar_shift_v4i64:
459 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
460 ; AVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2
461 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
462 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
465 ; AVX2-LABEL: splatvar_shift_v4i64:
467 ; AVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0
470 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
472 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
473 ; XOPAVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2
474 ; XOPAVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
475 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
478 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
480 ; XOPAVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0
483 ; AVX512-LABEL: splatvar_shift_v4i64:
485 ; AVX512-NEXT: vpsllq %xmm1, %ymm0, %ymm0
488 ; AVX512VL-LABEL: splatvar_shift_v4i64:
490 ; AVX512VL-NEXT: vpsllq %xmm1, %ymm0, %ymm0
491 ; AVX512VL-NEXT: retq
493 ; X32-AVX1-LABEL: splatvar_shift_v4i64:
495 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
496 ; X32-AVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2
497 ; X32-AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
498 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
499 ; X32-AVX1-NEXT: retl
501 ; X32-AVX2-LABEL: splatvar_shift_v4i64:
503 ; X32-AVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0
504 ; X32-AVX2-NEXT: retl
505 %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
506 %shift = shl <4 x i64> %a, %splat
510 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
511 ; AVX1-LABEL: splatvar_shift_v8i32:
513 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
514 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
515 ; AVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2
516 ; AVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0
517 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
520 ; AVX2-LABEL: splatvar_shift_v8i32:
522 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
523 ; AVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0
526 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
528 ; XOPAVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
529 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
530 ; XOPAVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2
531 ; XOPAVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0
532 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
535 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
537 ; XOPAVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
538 ; XOPAVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0
541 ; AVX512-LABEL: splatvar_shift_v8i32:
543 ; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
544 ; AVX512-NEXT: vpslld %xmm1, %ymm0, %ymm0
547 ; AVX512VL-LABEL: splatvar_shift_v8i32:
549 ; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
550 ; AVX512VL-NEXT: vpslld %xmm1, %ymm0, %ymm0
551 ; AVX512VL-NEXT: retq
553 ; X32-AVX1-LABEL: splatvar_shift_v8i32:
555 ; X32-AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
556 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
557 ; X32-AVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2
558 ; X32-AVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0
559 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
560 ; X32-AVX1-NEXT: retl
562 ; X32-AVX2-LABEL: splatvar_shift_v8i32:
564 ; X32-AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
565 ; X32-AVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0
566 ; X32-AVX2-NEXT: retl
567 %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
568 %shift = shl <8 x i32> %a, %splat
572 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
573 ; AVX1-LABEL: splatvar_shift_v16i16:
575 ; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
576 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
577 ; AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
578 ; AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
579 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
582 ; AVX2-LABEL: splatvar_shift_v16i16:
584 ; AVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
585 ; AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
588 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
590 ; XOPAVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
591 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
592 ; XOPAVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
593 ; XOPAVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
594 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
597 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
599 ; XOPAVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
600 ; XOPAVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
603 ; AVX512-LABEL: splatvar_shift_v16i16:
605 ; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
606 ; AVX512-NEXT: vpsllw %xmm1, %ymm0, %ymm0
609 ; AVX512VL-LABEL: splatvar_shift_v16i16:
611 ; AVX512VL-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
612 ; AVX512VL-NEXT: vpsllw %xmm1, %ymm0, %ymm0
613 ; AVX512VL-NEXT: retq
615 ; X32-AVX1-LABEL: splatvar_shift_v16i16:
617 ; X32-AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
618 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
619 ; X32-AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
620 ; X32-AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
621 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
622 ; X32-AVX1-NEXT: retl
624 ; X32-AVX2-LABEL: splatvar_shift_v16i16:
626 ; X32-AVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
627 ; X32-AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
628 ; X32-AVX2-NEXT: retl
629 %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
630 %shift = shl <16 x i16> %a, %splat
631 ret <16 x i16> %shift
634 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
635 ; AVX1-LABEL: splatvar_shift_v32i8:
637 ; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
638 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
639 ; AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
640 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
641 ; AVX1-NEXT: vpsllw %xmm1, %xmm3, %xmm3
642 ; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
643 ; AVX1-NEXT: vpshufb %xmm4, %xmm3, %xmm3
644 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
645 ; AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
646 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
647 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
650 ; AVX2-LABEL: splatvar_shift_v32i8:
652 ; AVX2-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
653 ; AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
654 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
655 ; AVX2-NEXT: vpsllw %xmm1, %xmm2, %xmm1
656 ; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1
657 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
660 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
662 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
663 ; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
664 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
665 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm2, %xmm2
666 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0
667 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
670 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
672 ; XOPAVX2-NEXT: vpbroadcastb %xmm1, %ymm1
673 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
674 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm3
675 ; XOPAVX2-NEXT: vpshlb %xmm3, %xmm2, %xmm2
676 ; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0
677 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
680 ; AVX512DQ-LABEL: splatvar_shift_v32i8:
682 ; AVX512DQ-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
683 ; AVX512DQ-NEXT: vpsllw %xmm1, %ymm0, %ymm0
684 ; AVX512DQ-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
685 ; AVX512DQ-NEXT: vpsllw %xmm1, %xmm2, %xmm1
686 ; AVX512DQ-NEXT: vpbroadcastb %xmm1, %ymm1
687 ; AVX512DQ-NEXT: vpand %ymm1, %ymm0, %ymm0
688 ; AVX512DQ-NEXT: retq
690 ; AVX512BW-LABEL: splatvar_shift_v32i8:
692 ; AVX512BW-NEXT: vpbroadcastb %xmm1, %ymm1
693 ; 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
694 ; 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
695 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
696 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
697 ; AVX512BW-NEXT: retq
699 ; AVX512DQVL-LABEL: splatvar_shift_v32i8:
700 ; AVX512DQVL: # %bb.0:
701 ; AVX512DQVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
702 ; AVX512DQVL-NEXT: vpsllw %xmm1, %ymm0, %ymm0
703 ; AVX512DQVL-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
704 ; AVX512DQVL-NEXT: vpsllw %xmm1, %xmm2, %xmm1
705 ; AVX512DQVL-NEXT: vpbroadcastb %xmm1, %ymm1
706 ; AVX512DQVL-NEXT: vpand %ymm1, %ymm0, %ymm0
707 ; AVX512DQVL-NEXT: retq
709 ; AVX512BWVL-LABEL: splatvar_shift_v32i8:
710 ; AVX512BWVL: # %bb.0:
711 ; AVX512BWVL-NEXT: vpbroadcastb %xmm1, %ymm1
712 ; 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
713 ; 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
714 ; AVX512BWVL-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
715 ; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0
716 ; AVX512BWVL-NEXT: retq
718 ; X32-AVX1-LABEL: splatvar_shift_v32i8:
720 ; X32-AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
721 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
722 ; X32-AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
723 ; X32-AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
724 ; X32-AVX1-NEXT: vpsllw %xmm1, %xmm3, %xmm3
725 ; X32-AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
726 ; X32-AVX1-NEXT: vpshufb %xmm4, %xmm3, %xmm3
727 ; X32-AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
728 ; X32-AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
729 ; X32-AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
730 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
731 ; X32-AVX1-NEXT: retl
733 ; X32-AVX2-LABEL: splatvar_shift_v32i8:
735 ; X32-AVX2-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
736 ; X32-AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
737 ; X32-AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
738 ; X32-AVX2-NEXT: vpsllw %xmm1, %xmm2, %xmm1
739 ; X32-AVX2-NEXT: vpbroadcastb %xmm1, %ymm1
740 ; X32-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
741 ; X32-AVX2-NEXT: retl
742 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
743 %shift = shl <32 x i8> %a, %splat
751 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
752 ; AVX1-LABEL: constant_shift_v4i64:
754 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
755 ; AVX1-NEXT: vpsllq $62, %xmm1, %xmm2
756 ; AVX1-NEXT: vpsllq $31, %xmm1, %xmm1
757 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
758 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm2
759 ; AVX1-NEXT: vpsllq $1, %xmm0, %xmm0
760 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
761 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
764 ; AVX2-LABEL: constant_shift_v4i64:
766 ; AVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
769 ; XOPAVX1-LABEL: constant_shift_v4i64:
771 ; XOPAVX1-NEXT: vpshlq {{.*}}(%rip), %xmm0, %xmm1
772 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
773 ; XOPAVX1-NEXT: vpshlq {{.*}}(%rip), %xmm0, %xmm0
774 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
777 ; XOPAVX2-LABEL: constant_shift_v4i64:
779 ; XOPAVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
782 ; AVX512-LABEL: constant_shift_v4i64:
784 ; AVX512-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
787 ; AVX512VL-LABEL: constant_shift_v4i64:
789 ; AVX512VL-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
790 ; AVX512VL-NEXT: retq
792 ; X32-AVX1-LABEL: constant_shift_v4i64:
794 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
795 ; X32-AVX1-NEXT: vpsllq $62, %xmm1, %xmm2
796 ; X32-AVX1-NEXT: vpsllq $31, %xmm1, %xmm1
797 ; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
798 ; X32-AVX1-NEXT: vpsllq $7, %xmm0, %xmm2
799 ; X32-AVX1-NEXT: vpsllq $1, %xmm0, %xmm0
800 ; X32-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
801 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
802 ; X32-AVX1-NEXT: retl
804 ; X32-AVX2-LABEL: constant_shift_v4i64:
806 ; X32-AVX2-NEXT: vpsllvq {{\.LCPI.*}}, %ymm0, %ymm0
807 ; X32-AVX2-NEXT: retl
808 %shift = shl <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
812 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
813 ; AVX1-LABEL: constant_shift_v8i32:
815 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm1
816 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
817 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0
818 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
821 ; AVX2-LABEL: constant_shift_v8i32:
823 ; AVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
826 ; XOPAVX1-LABEL: constant_shift_v8i32:
828 ; XOPAVX1-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm1
829 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
830 ; XOPAVX1-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm0
831 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
834 ; XOPAVX2-LABEL: constant_shift_v8i32:
836 ; XOPAVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
839 ; AVX512-LABEL: constant_shift_v8i32:
841 ; AVX512-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
844 ; AVX512VL-LABEL: constant_shift_v8i32:
846 ; AVX512VL-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
847 ; AVX512VL-NEXT: retq
849 ; X32-AVX1-LABEL: constant_shift_v8i32:
851 ; X32-AVX1-NEXT: vpmulld {{\.LCPI.*}}, %xmm0, %xmm1
852 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
853 ; X32-AVX1-NEXT: vpmulld {{\.LCPI.*}}, %xmm0, %xmm0
854 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
855 ; X32-AVX1-NEXT: retl
857 ; X32-AVX2-LABEL: constant_shift_v8i32:
859 ; X32-AVX2-NEXT: vpsllvd {{\.LCPI.*}}, %ymm0, %ymm0
860 ; X32-AVX2-NEXT: retl
861 %shift = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
865 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
866 ; AVX1-LABEL: constant_shift_v16i16:
868 ; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm1
869 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
870 ; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
871 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
874 ; AVX2-LABEL: constant_shift_v16i16:
876 ; AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
879 ; XOPAVX1-LABEL: constant_shift_v16i16:
881 ; XOPAVX1-NEXT: vpshlw {{.*}}(%rip), %xmm0, %xmm1
882 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
883 ; XOPAVX1-NEXT: vpshlw {{.*}}(%rip), %xmm0, %xmm0
884 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
887 ; XOPAVX2-LABEL: constant_shift_v16i16:
889 ; XOPAVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
892 ; AVX512DQ-LABEL: constant_shift_v16i16:
894 ; AVX512DQ-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
895 ; AVX512DQ-NEXT: retq
897 ; AVX512BW-LABEL: constant_shift_v16i16:
899 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
900 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
901 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
902 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
903 ; AVX512BW-NEXT: retq
905 ; AVX512DQVL-LABEL: constant_shift_v16i16:
906 ; AVX512DQVL: # %bb.0:
907 ; AVX512DQVL-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
908 ; AVX512DQVL-NEXT: retq
910 ; AVX512BWVL-LABEL: constant_shift_v16i16:
911 ; AVX512BWVL: # %bb.0:
912 ; AVX512BWVL-NEXT: vpsllvw {{.*}}(%rip), %ymm0, %ymm0
913 ; AVX512BWVL-NEXT: retq
915 ; X32-AVX1-LABEL: constant_shift_v16i16:
917 ; X32-AVX1-NEXT: vpmullw {{\.LCPI.*}}, %xmm0, %xmm1
918 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
919 ; X32-AVX1-NEXT: vpmullw {{\.LCPI.*}}, %xmm0, %xmm0
920 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
921 ; X32-AVX1-NEXT: retl
923 ; X32-AVX2-LABEL: constant_shift_v16i16:
925 ; X32-AVX2-NEXT: vpmullw {{\.LCPI.*}}, %ymm0, %ymm0
926 ; X32-AVX2-NEXT: retl
927 %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>
928 ret <16 x i16> %shift
931 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
932 ; AVX1-LABEL: constant_shift_v32i8:
934 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
935 ; 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]
936 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [128,64,32,16,8,4,2,1]
937 ; AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm2
938 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
939 ; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2
940 ; 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
941 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128]
942 ; AVX1-NEXT: vpmullw %xmm5, %xmm1, %xmm1
943 ; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1
944 ; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1
945 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
946 ; AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm2
947 ; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2
948 ; 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
949 ; AVX1-NEXT: vpmullw %xmm5, %xmm0, %xmm0
950 ; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0
951 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
952 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
955 ; AVX2-LABEL: constant_shift_v32i8:
957 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm1
958 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
959 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32]
960 ; AVX2-NEXT: # ymm2 = mem[0,1,0,1]
961 ; AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
962 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm1
963 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
964 ; AVX2-NEXT: vpaddb %ymm2, %ymm2, %ymm2
965 ; AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
966 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm1
967 ; AVX2-NEXT: vpaddb %ymm2, %ymm2, %ymm2
968 ; AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
971 ; XOPAVX1-LABEL: constant_shift_v32i8:
973 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
974 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
975 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm1
976 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm0
977 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
980 ; XOPAVX2-LABEL: constant_shift_v32i8:
982 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
983 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
984 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm1, %xmm1
985 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm0, %xmm0
986 ; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
989 ; AVX512DQ-LABEL: constant_shift_v32i8:
991 ; AVX512DQ-NEXT: vpsllw $4, %ymm0, %ymm1
992 ; AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
993 ; AVX512DQ-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32]
994 ; AVX512DQ-NEXT: # ymm2 = mem[0,1,0,1]
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: vbroadcasti128 {{.*#+}} ymm2 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32]
1017 ; AVX512DQVL-NEXT: # ymm2 = mem[0,1,0,1]
1018 ; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1019 ; AVX512DQVL-NEXT: vpsllw $2, %ymm0, %ymm1
1020 ; AVX512DQVL-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1021 ; AVX512DQVL-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1022 ; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1023 ; AVX512DQVL-NEXT: vpaddb %ymm0, %ymm0, %ymm1
1024 ; AVX512DQVL-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1025 ; AVX512DQVL-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1026 ; AVX512DQVL-NEXT: retq
1028 ; AVX512BWVL-LABEL: constant_shift_v32i8:
1029 ; AVX512BWVL: # %bb.0:
1030 ; 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
1031 ; AVX512BWVL-NEXT: vpsllvw {{.*}}(%rip), %zmm0, %zmm0
1032 ; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0
1033 ; AVX512BWVL-NEXT: retq
1035 ; X32-AVX1-LABEL: constant_shift_v32i8:
1036 ; X32-AVX1: # %bb.0:
1037 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1038 ; 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]
1039 ; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [128,64,32,16,8,4,2,1]
1040 ; X32-AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm2
1041 ; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
1042 ; X32-AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2
1043 ; 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
1044 ; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128]
1045 ; X32-AVX1-NEXT: vpmullw %xmm5, %xmm1, %xmm1
1046 ; X32-AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1
1047 ; X32-AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1
1048 ; X32-AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1049 ; X32-AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm2
1050 ; X32-AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2
1051 ; 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
1052 ; X32-AVX1-NEXT: vpmullw %xmm5, %xmm0, %xmm0
1053 ; X32-AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0
1054 ; X32-AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
1055 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1056 ; X32-AVX1-NEXT: retl
1058 ; X32-AVX2-LABEL: constant_shift_v32i8:
1059 ; X32-AVX2: # %bb.0:
1060 ; X32-AVX2-NEXT: vpsllw $4, %ymm0, %ymm1
1061 ; X32-AVX2-NEXT: vpand {{\.LCPI.*}}, %ymm1, %ymm1
1062 ; X32-AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [8192,24640,41088,57536,49376,32928,16480,32,8192,24640,41088,57536,49376,32928,16480,32]
1063 ; X32-AVX2-NEXT: # ymm2 = mem[0,1,0,1]
1064 ; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1065 ; X32-AVX2-NEXT: vpsllw $2, %ymm0, %ymm1
1066 ; X32-AVX2-NEXT: vpand {{\.LCPI.*}}, %ymm1, %ymm1
1067 ; X32-AVX2-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1068 ; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1069 ; X32-AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm1
1070 ; X32-AVX2-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1071 ; X32-AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1072 ; X32-AVX2-NEXT: retl
1073 %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>
1074 ret <32 x i8> %shift
1078 ; Uniform Constant Shifts
1081 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
1082 ; AVX1-LABEL: splatconstant_shift_v4i64:
1084 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm1
1085 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1086 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm0
1087 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1090 ; AVX2-LABEL: splatconstant_shift_v4i64:
1092 ; AVX2-NEXT: vpsllq $7, %ymm0, %ymm0
1095 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
1097 ; XOPAVX1-NEXT: vpsllq $7, %xmm0, %xmm1
1098 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1099 ; XOPAVX1-NEXT: vpsllq $7, %xmm0, %xmm0
1100 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1101 ; XOPAVX1-NEXT: retq
1103 ; XOPAVX2-LABEL: splatconstant_shift_v4i64:
1105 ; XOPAVX2-NEXT: vpsllq $7, %ymm0, %ymm0
1106 ; XOPAVX2-NEXT: retq
1108 ; AVX512-LABEL: splatconstant_shift_v4i64:
1110 ; AVX512-NEXT: vpsllq $7, %ymm0, %ymm0
1113 ; AVX512VL-LABEL: splatconstant_shift_v4i64:
1114 ; AVX512VL: # %bb.0:
1115 ; AVX512VL-NEXT: vpsllq $7, %ymm0, %ymm0
1116 ; AVX512VL-NEXT: retq
1118 ; X32-AVX1-LABEL: splatconstant_shift_v4i64:
1119 ; X32-AVX1: # %bb.0:
1120 ; X32-AVX1-NEXT: vpsllq $7, %xmm0, %xmm1
1121 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1122 ; X32-AVX1-NEXT: vpsllq $7, %xmm0, %xmm0
1123 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1124 ; X32-AVX1-NEXT: retl
1126 ; X32-AVX2-LABEL: splatconstant_shift_v4i64:
1127 ; X32-AVX2: # %bb.0:
1128 ; X32-AVX2-NEXT: vpsllq $7, %ymm0, %ymm0
1129 ; X32-AVX2-NEXT: retl
1130 %shift = shl <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
1131 ret <4 x i64> %shift
1134 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
1135 ; AVX1-LABEL: splatconstant_shift_v8i32:
1137 ; AVX1-NEXT: vpslld $5, %xmm0, %xmm1
1138 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1139 ; AVX1-NEXT: vpslld $5, %xmm0, %xmm0
1140 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1143 ; AVX2-LABEL: splatconstant_shift_v8i32:
1145 ; AVX2-NEXT: vpslld $5, %ymm0, %ymm0
1148 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
1150 ; XOPAVX1-NEXT: vpslld $5, %xmm0, %xmm1
1151 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1152 ; XOPAVX1-NEXT: vpslld $5, %xmm0, %xmm0
1153 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1154 ; XOPAVX1-NEXT: retq
1156 ; XOPAVX2-LABEL: splatconstant_shift_v8i32:
1158 ; XOPAVX2-NEXT: vpslld $5, %ymm0, %ymm0
1159 ; XOPAVX2-NEXT: retq
1161 ; AVX512-LABEL: splatconstant_shift_v8i32:
1163 ; AVX512-NEXT: vpslld $5, %ymm0, %ymm0
1166 ; AVX512VL-LABEL: splatconstant_shift_v8i32:
1167 ; AVX512VL: # %bb.0:
1168 ; AVX512VL-NEXT: vpslld $5, %ymm0, %ymm0
1169 ; AVX512VL-NEXT: retq
1171 ; X32-AVX1-LABEL: splatconstant_shift_v8i32:
1172 ; X32-AVX1: # %bb.0:
1173 ; X32-AVX1-NEXT: vpslld $5, %xmm0, %xmm1
1174 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1175 ; X32-AVX1-NEXT: vpslld $5, %xmm0, %xmm0
1176 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1177 ; X32-AVX1-NEXT: retl
1179 ; X32-AVX2-LABEL: splatconstant_shift_v8i32:
1180 ; X32-AVX2: # %bb.0:
1181 ; X32-AVX2-NEXT: vpslld $5, %ymm0, %ymm0
1182 ; X32-AVX2-NEXT: retl
1183 %shift = shl <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
1184 ret <8 x i32> %shift
1187 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
1188 ; AVX1-LABEL: splatconstant_shift_v16i16:
1190 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm1
1191 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1192 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
1193 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1196 ; AVX2-LABEL: splatconstant_shift_v16i16:
1198 ; AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
1201 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
1203 ; XOPAVX1-NEXT: vpsllw $3, %xmm0, %xmm1
1204 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1205 ; XOPAVX1-NEXT: vpsllw $3, %xmm0, %xmm0
1206 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1207 ; XOPAVX1-NEXT: retq
1209 ; XOPAVX2-LABEL: splatconstant_shift_v16i16:
1211 ; XOPAVX2-NEXT: vpsllw $3, %ymm0, %ymm0
1212 ; XOPAVX2-NEXT: retq
1214 ; AVX512-LABEL: splatconstant_shift_v16i16:
1216 ; AVX512-NEXT: vpsllw $3, %ymm0, %ymm0
1219 ; AVX512VL-LABEL: splatconstant_shift_v16i16:
1220 ; AVX512VL: # %bb.0:
1221 ; AVX512VL-NEXT: vpsllw $3, %ymm0, %ymm0
1222 ; AVX512VL-NEXT: retq
1224 ; X32-AVX1-LABEL: splatconstant_shift_v16i16:
1225 ; X32-AVX1: # %bb.0:
1226 ; X32-AVX1-NEXT: vpsllw $3, %xmm0, %xmm1
1227 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1228 ; X32-AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
1229 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1230 ; X32-AVX1-NEXT: retl
1232 ; X32-AVX2-LABEL: splatconstant_shift_v16i16:
1233 ; X32-AVX2: # %bb.0:
1234 ; X32-AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
1235 ; X32-AVX2-NEXT: retl
1236 %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>
1237 ret <16 x i16> %shift
1240 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
1241 ; AVX1-LABEL: splatconstant_shift_v32i8:
1243 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1244 ; AVX1-NEXT: vpsllw $3, %xmm1, %xmm1
1245 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
1246 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
1247 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
1248 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
1249 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1252 ; AVX2-LABEL: splatconstant_shift_v32i8:
1254 ; AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
1255 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1258 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
1260 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1261 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
1262 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm1
1263 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm0
1264 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1265 ; XOPAVX1-NEXT: retq
1267 ; XOPAVX2-LABEL: splatconstant_shift_v32i8:
1269 ; XOPAVX2-NEXT: vpsllw $3, %ymm0, %ymm0
1270 ; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1271 ; XOPAVX2-NEXT: retq
1273 ; AVX512-LABEL: splatconstant_shift_v32i8:
1275 ; AVX512-NEXT: vpsllw $3, %ymm0, %ymm0
1276 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1279 ; AVX512VL-LABEL: splatconstant_shift_v32i8:
1280 ; AVX512VL: # %bb.0:
1281 ; AVX512VL-NEXT: vpsllw $3, %ymm0, %ymm0
1282 ; AVX512VL-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1283 ; AVX512VL-NEXT: retq
1285 ; X32-AVX1-LABEL: splatconstant_shift_v32i8:
1286 ; X32-AVX1: # %bb.0:
1287 ; X32-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1288 ; X32-AVX1-NEXT: vpsllw $3, %xmm1, %xmm1
1289 ; X32-AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
1290 ; X32-AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
1291 ; X32-AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
1292 ; X32-AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
1293 ; X32-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1294 ; X32-AVX1-NEXT: retl
1296 ; X32-AVX2-LABEL: splatconstant_shift_v32i8:
1297 ; X32-AVX2: # %bb.0:
1298 ; X32-AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
1299 ; X32-AVX2-NEXT: vpand {{\.LCPI.*}}, %ymm0, %ymm0
1300 ; X32-AVX2-NEXT: retl
1301 %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>
1302 ret <32 x i8> %shift