[DAGCombiner] Eliminate dead stores to stack.
[llvm-complete.git] / test / CodeGen / X86 / vector-shift-shl-128.ll
blob6088c965c52ff6a87e0b5d4a61ff89c18c409e72
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512DQ
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512VL --check-prefix=AVX512DQVL
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512VL --check-prefix=AVX512BWVL
13 ; Just one 32-bit run to make sure we do reasonable things for i64 shifts.
14 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=X32-SSE --check-prefix=X32-SSE2
17 ; Variable Shifts
20 define <2 x i64> @var_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
21 ; SSE2-LABEL: var_shift_v2i64:
22 ; SSE2:       # %bb.0:
23 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
24 ; SSE2-NEXT:    psllq %xmm1, %xmm2
25 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
26 ; SSE2-NEXT:    psllq %xmm1, %xmm0
27 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
28 ; SSE2-NEXT:    retq
30 ; SSE41-LABEL: var_shift_v2i64:
31 ; SSE41:       # %bb.0:
32 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
33 ; SSE41-NEXT:    psllq %xmm1, %xmm2
34 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
35 ; SSE41-NEXT:    psllq %xmm1, %xmm0
36 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]
37 ; SSE41-NEXT:    retq
39 ; AVX1-LABEL: var_shift_v2i64:
40 ; AVX1:       # %bb.0:
41 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm2
42 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
43 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
44 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]
45 ; AVX1-NEXT:    retq
47 ; AVX2-LABEL: var_shift_v2i64:
48 ; AVX2:       # %bb.0:
49 ; AVX2-NEXT:    vpsllvq %xmm1, %xmm0, %xmm0
50 ; AVX2-NEXT:    retq
52 ; XOPAVX1-LABEL: var_shift_v2i64:
53 ; XOPAVX1:       # %bb.0:
54 ; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm0
55 ; XOPAVX1-NEXT:    retq
57 ; XOPAVX2-LABEL: var_shift_v2i64:
58 ; XOPAVX2:       # %bb.0:
59 ; XOPAVX2-NEXT:    vpsllvq %xmm1, %xmm0, %xmm0
60 ; XOPAVX2-NEXT:    retq
62 ; AVX512-LABEL: var_shift_v2i64:
63 ; AVX512:       # %bb.0:
64 ; AVX512-NEXT:    vpsllvq %xmm1, %xmm0, %xmm0
65 ; AVX512-NEXT:    retq
67 ; AVX512VL-LABEL: var_shift_v2i64:
68 ; AVX512VL:       # %bb.0:
69 ; AVX512VL-NEXT:    vpsllvq %xmm1, %xmm0, %xmm0
70 ; AVX512VL-NEXT:    retq
72 ; X32-SSE-LABEL: var_shift_v2i64:
73 ; X32-SSE:       # %bb.0:
74 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
75 ; X32-SSE-NEXT:    psllq %xmm1, %xmm2
76 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
77 ; X32-SSE-NEXT:    psllq %xmm1, %xmm0
78 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
79 ; X32-SSE-NEXT:    retl
80   %shift = shl <2 x i64> %a, %b
81   ret <2 x i64> %shift
84 define <4 x i32> @var_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
85 ; SSE2-LABEL: var_shift_v4i32:
86 ; SSE2:       # %bb.0:
87 ; SSE2-NEXT:    pslld $23, %xmm1
88 ; SSE2-NEXT:    paddd {{.*}}(%rip), %xmm1
89 ; SSE2-NEXT:    cvttps2dq %xmm1, %xmm1
90 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
91 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
92 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
93 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
94 ; SSE2-NEXT:    pmuludq %xmm2, %xmm1
95 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
96 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
97 ; SSE2-NEXT:    retq
99 ; SSE41-LABEL: var_shift_v4i32:
100 ; SSE41:       # %bb.0:
101 ; SSE41-NEXT:    pslld $23, %xmm1
102 ; SSE41-NEXT:    paddd {{.*}}(%rip), %xmm1
103 ; SSE41-NEXT:    cvttps2dq %xmm1, %xmm1
104 ; SSE41-NEXT:    pmulld %xmm1, %xmm0
105 ; SSE41-NEXT:    retq
107 ; AVX1-LABEL: var_shift_v4i32:
108 ; AVX1:       # %bb.0:
109 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
110 ; AVX1-NEXT:    vpaddd {{.*}}(%rip), %xmm1, %xmm1
111 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
112 ; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
113 ; AVX1-NEXT:    retq
115 ; AVX2-LABEL: var_shift_v4i32:
116 ; AVX2:       # %bb.0:
117 ; AVX2-NEXT:    vpsllvd %xmm1, %xmm0, %xmm0
118 ; AVX2-NEXT:    retq
120 ; XOPAVX1-LABEL: var_shift_v4i32:
121 ; XOPAVX1:       # %bb.0:
122 ; XOPAVX1-NEXT:    vpshld %xmm1, %xmm0, %xmm0
123 ; XOPAVX1-NEXT:    retq
125 ; XOPAVX2-LABEL: var_shift_v4i32:
126 ; XOPAVX2:       # %bb.0:
127 ; XOPAVX2-NEXT:    vpsllvd %xmm1, %xmm0, %xmm0
128 ; XOPAVX2-NEXT:    retq
130 ; AVX512-LABEL: var_shift_v4i32:
131 ; AVX512:       # %bb.0:
132 ; AVX512-NEXT:    vpsllvd %xmm1, %xmm0, %xmm0
133 ; AVX512-NEXT:    retq
135 ; AVX512VL-LABEL: var_shift_v4i32:
136 ; AVX512VL:       # %bb.0:
137 ; AVX512VL-NEXT:    vpsllvd %xmm1, %xmm0, %xmm0
138 ; AVX512VL-NEXT:    retq
140 ; X32-SSE-LABEL: var_shift_v4i32:
141 ; X32-SSE:       # %bb.0:
142 ; X32-SSE-NEXT:    pslld $23, %xmm1
143 ; X32-SSE-NEXT:    paddd {{\.LCPI.*}}, %xmm1
144 ; X32-SSE-NEXT:    cvttps2dq %xmm1, %xmm1
145 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
146 ; X32-SSE-NEXT:    pmuludq %xmm1, %xmm0
147 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
148 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
149 ; X32-SSE-NEXT:    pmuludq %xmm2, %xmm1
150 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
151 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
152 ; X32-SSE-NEXT:    retl
153   %shift = shl <4 x i32> %a, %b
154   ret <4 x i32> %shift
157 define <8 x i16> @var_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
158 ; SSE2-LABEL: var_shift_v8i16:
159 ; SSE2:       # %bb.0:
160 ; SSE2-NEXT:    pxor %xmm2, %xmm2
161 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
162 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
163 ; SSE2-NEXT:    pslld $23, %xmm3
164 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]
165 ; SSE2-NEXT:    paddd %xmm4, %xmm3
166 ; SSE2-NEXT:    cvttps2dq %xmm3, %xmm3
167 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,2,2,3,4,5,6,7]
168 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,6,6,7]
169 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
170 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
171 ; SSE2-NEXT:    pslld $23, %xmm1
172 ; SSE2-NEXT:    paddd %xmm4, %xmm1
173 ; SSE2-NEXT:    cvttps2dq %xmm1, %xmm1
174 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
175 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
176 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
177 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
178 ; SSE2-NEXT:    pmullw %xmm1, %xmm0
179 ; SSE2-NEXT:    retq
181 ; SSE41-LABEL: var_shift_v8i16:
182 ; SSE41:       # %bb.0:
183 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
184 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
185 ; SSE41-NEXT:    pslld $23, %xmm1
186 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
187 ; SSE41-NEXT:    paddd %xmm3, %xmm1
188 ; SSE41-NEXT:    cvttps2dq %xmm1, %xmm1
189 ; SSE41-NEXT:    pslld $23, %xmm2
190 ; SSE41-NEXT:    paddd %xmm3, %xmm2
191 ; SSE41-NEXT:    cvttps2dq %xmm2, %xmm2
192 ; SSE41-NEXT:    packusdw %xmm1, %xmm2
193 ; SSE41-NEXT:    pmullw %xmm2, %xmm0
194 ; SSE41-NEXT:    retq
196 ; AVX1-LABEL: var_shift_v8i16:
197 ; AVX1:       # %bb.0:
198 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm2 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
199 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
200 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
201 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
202 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
203 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
204 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
205 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
206 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
207 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
208 ; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
209 ; AVX1-NEXT:    retq
211 ; AVX2-LABEL: var_shift_v8i16:
212 ; AVX2:       # %bb.0:
213 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
214 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
215 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
216 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
217 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
218 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
219 ; AVX2-NEXT:    vzeroupper
220 ; AVX2-NEXT:    retq
222 ; XOP-LABEL: var_shift_v8i16:
223 ; XOP:       # %bb.0:
224 ; XOP-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
225 ; XOP-NEXT:    retq
227 ; AVX512DQ-LABEL: var_shift_v8i16:
228 ; AVX512DQ:       # %bb.0:
229 ; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
230 ; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
231 ; AVX512DQ-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
232 ; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0
233 ; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
234 ; AVX512DQ-NEXT:    vzeroupper
235 ; AVX512DQ-NEXT:    retq
237 ; AVX512BW-LABEL: var_shift_v8i16:
238 ; AVX512BW:       # %bb.0:
239 ; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
240 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
241 ; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
242 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
243 ; AVX512BW-NEXT:    vzeroupper
244 ; AVX512BW-NEXT:    retq
246 ; AVX512DQVL-LABEL: var_shift_v8i16:
247 ; AVX512DQVL:       # %bb.0:
248 ; AVX512DQVL-NEXT:    vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
249 ; AVX512DQVL-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
250 ; AVX512DQVL-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
251 ; AVX512DQVL-NEXT:    vpmovdw %ymm0, %xmm0
252 ; AVX512DQVL-NEXT:    vzeroupper
253 ; AVX512DQVL-NEXT:    retq
255 ; AVX512BWVL-LABEL: var_shift_v8i16:
256 ; AVX512BWVL:       # %bb.0:
257 ; AVX512BWVL-NEXT:    vpsllvw %xmm1, %xmm0, %xmm0
258 ; AVX512BWVL-NEXT:    retq
260 ; X32-SSE-LABEL: var_shift_v8i16:
261 ; X32-SSE:       # %bb.0:
262 ; X32-SSE-NEXT:    pxor %xmm2, %xmm2
263 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm3
264 ; X32-SSE-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
265 ; X32-SSE-NEXT:    pslld $23, %xmm3
266 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]
267 ; X32-SSE-NEXT:    paddd %xmm4, %xmm3
268 ; X32-SSE-NEXT:    cvttps2dq %xmm3, %xmm3
269 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,2,2,3,4,5,6,7]
270 ; X32-SSE-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,6,6,7]
271 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
272 ; X32-SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
273 ; X32-SSE-NEXT:    pslld $23, %xmm1
274 ; X32-SSE-NEXT:    paddd %xmm4, %xmm1
275 ; X32-SSE-NEXT:    cvttps2dq %xmm1, %xmm1
276 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
277 ; X32-SSE-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
278 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
279 ; X32-SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
280 ; X32-SSE-NEXT:    pmullw %xmm1, %xmm0
281 ; X32-SSE-NEXT:    retl
282   %shift = shl <8 x i16> %a, %b
283   ret <8 x i16> %shift
286 define <16 x i8> @var_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
287 ; SSE2-LABEL: var_shift_v16i8:
288 ; SSE2:       # %bb.0:
289 ; SSE2-NEXT:    psllw $5, %xmm1
290 ; SSE2-NEXT:    pxor %xmm2, %xmm2
291 ; SSE2-NEXT:    pxor %xmm3, %xmm3
292 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
293 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
294 ; SSE2-NEXT:    pandn %xmm0, %xmm4
295 ; SSE2-NEXT:    psllw $4, %xmm0
296 ; SSE2-NEXT:    pand %xmm3, %xmm0
297 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
298 ; SSE2-NEXT:    por %xmm4, %xmm0
299 ; SSE2-NEXT:    paddb %xmm1, %xmm1
300 ; SSE2-NEXT:    pxor %xmm3, %xmm3
301 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
302 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
303 ; SSE2-NEXT:    pandn %xmm0, %xmm4
304 ; SSE2-NEXT:    psllw $2, %xmm0
305 ; SSE2-NEXT:    pand %xmm3, %xmm0
306 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
307 ; SSE2-NEXT:    por %xmm4, %xmm0
308 ; SSE2-NEXT:    paddb %xmm1, %xmm1
309 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
310 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
311 ; SSE2-NEXT:    pandn %xmm0, %xmm1
312 ; SSE2-NEXT:    paddb %xmm0, %xmm0
313 ; SSE2-NEXT:    pand %xmm2, %xmm0
314 ; SSE2-NEXT:    por %xmm1, %xmm0
315 ; SSE2-NEXT:    retq
317 ; SSE41-LABEL: var_shift_v16i8:
318 ; SSE41:       # %bb.0:
319 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
320 ; SSE41-NEXT:    psllw $5, %xmm1
321 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
322 ; SSE41-NEXT:    psllw $4, %xmm3
323 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
324 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
325 ; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2
326 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
327 ; SSE41-NEXT:    psllw $2, %xmm3
328 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
329 ; SSE41-NEXT:    paddb %xmm1, %xmm1
330 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
331 ; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2
332 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
333 ; SSE41-NEXT:    paddb %xmm2, %xmm3
334 ; SSE41-NEXT:    paddb %xmm1, %xmm1
335 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
336 ; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2
337 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
338 ; SSE41-NEXT:    retq
340 ; AVX-LABEL: var_shift_v16i8:
341 ; AVX:       # %bb.0:
342 ; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
343 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm2
344 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
345 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
346 ; AVX-NEXT:    vpsllw $2, %xmm0, %xmm2
347 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
348 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
349 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
350 ; AVX-NEXT:    vpaddb %xmm0, %xmm0, %xmm2
351 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
352 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
353 ; AVX-NEXT:    retq
355 ; XOP-LABEL: var_shift_v16i8:
356 ; XOP:       # %bb.0:
357 ; XOP-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
358 ; XOP-NEXT:    retq
360 ; AVX512DQ-LABEL: var_shift_v16i8:
361 ; AVX512DQ:       # %bb.0:
362 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
363 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
364 ; AVX512DQ-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
365 ; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
366 ; AVX512DQ-NEXT:    vzeroupper
367 ; AVX512DQ-NEXT:    retq
369 ; AVX512BW-LABEL: var_shift_v16i8:
370 ; AVX512BW:       # %bb.0:
371 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
372 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
373 ; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
374 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
375 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
376 ; AVX512BW-NEXT:    vzeroupper
377 ; AVX512BW-NEXT:    retq
379 ; AVX512DQVL-LABEL: var_shift_v16i8:
380 ; AVX512DQVL:       # %bb.0:
381 ; AVX512DQVL-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
382 ; AVX512DQVL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
383 ; AVX512DQVL-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
384 ; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm0
385 ; AVX512DQVL-NEXT:    vzeroupper
386 ; AVX512DQVL-NEXT:    retq
388 ; AVX512BWVL-LABEL: var_shift_v16i8:
389 ; AVX512BWVL:       # %bb.0:
390 ; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
391 ; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
392 ; AVX512BWVL-NEXT:    vpsllvw %ymm1, %ymm0, %ymm0
393 ; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0
394 ; AVX512BWVL-NEXT:    vzeroupper
395 ; AVX512BWVL-NEXT:    retq
397 ; X32-SSE-LABEL: var_shift_v16i8:
398 ; X32-SSE:       # %bb.0:
399 ; X32-SSE-NEXT:    psllw $5, %xmm1
400 ; X32-SSE-NEXT:    pxor %xmm2, %xmm2
401 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
402 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm3
403 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
404 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
405 ; X32-SSE-NEXT:    psllw $4, %xmm0
406 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
407 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
408 ; X32-SSE-NEXT:    por %xmm4, %xmm0
409 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
410 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
411 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm3
412 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
413 ; X32-SSE-NEXT:    pandn %xmm0, %xmm4
414 ; X32-SSE-NEXT:    psllw $2, %xmm0
415 ; X32-SSE-NEXT:    pand %xmm3, %xmm0
416 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
417 ; X32-SSE-NEXT:    por %xmm4, %xmm0
418 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
419 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm2
420 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm1
421 ; X32-SSE-NEXT:    pandn %xmm0, %xmm1
422 ; X32-SSE-NEXT:    paddb %xmm0, %xmm0
423 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
424 ; X32-SSE-NEXT:    por %xmm1, %xmm0
425 ; X32-SSE-NEXT:    retl
426   %shift = shl <16 x i8> %a, %b
427   ret <16 x i8> %shift
431 ; Uniform Variable Shifts
434 define <2 x i64> @splatvar_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
435 ; SSE-LABEL: splatvar_shift_v2i64:
436 ; SSE:       # %bb.0:
437 ; SSE-NEXT:    psllq %xmm1, %xmm0
438 ; SSE-NEXT:    retq
440 ; AVX-LABEL: splatvar_shift_v2i64:
441 ; AVX:       # %bb.0:
442 ; AVX-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
443 ; AVX-NEXT:    retq
445 ; XOP-LABEL: splatvar_shift_v2i64:
446 ; XOP:       # %bb.0:
447 ; XOP-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
448 ; XOP-NEXT:    retq
450 ; AVX512-LABEL: splatvar_shift_v2i64:
451 ; AVX512:       # %bb.0:
452 ; AVX512-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
453 ; AVX512-NEXT:    retq
455 ; AVX512VL-LABEL: splatvar_shift_v2i64:
456 ; AVX512VL:       # %bb.0:
457 ; AVX512VL-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
458 ; AVX512VL-NEXT:    retq
460 ; X32-SSE-LABEL: splatvar_shift_v2i64:
461 ; X32-SSE:       # %bb.0:
462 ; X32-SSE-NEXT:    psllq %xmm1, %xmm0
463 ; X32-SSE-NEXT:    retl
464   %splat = shufflevector <2 x i64> %b, <2 x i64> undef, <2 x i32> zeroinitializer
465   %shift = shl <2 x i64> %a, %splat
466   ret <2 x i64> %shift
469 define <4 x i32> @splatvar_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
470 ; SSE2-LABEL: splatvar_shift_v4i32:
471 ; SSE2:       # %bb.0:
472 ; SSE2-NEXT:    xorps %xmm2, %xmm2
473 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
474 ; SSE2-NEXT:    pslld %xmm2, %xmm0
475 ; SSE2-NEXT:    retq
477 ; SSE41-LABEL: splatvar_shift_v4i32:
478 ; SSE41:       # %bb.0:
479 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
480 ; SSE41-NEXT:    pslld %xmm1, %xmm0
481 ; SSE41-NEXT:    retq
483 ; AVX-LABEL: splatvar_shift_v4i32:
484 ; AVX:       # %bb.0:
485 ; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
486 ; AVX-NEXT:    vpslld %xmm1, %xmm0, %xmm0
487 ; AVX-NEXT:    retq
489 ; XOP-LABEL: splatvar_shift_v4i32:
490 ; XOP:       # %bb.0:
491 ; XOP-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
492 ; XOP-NEXT:    vpslld %xmm1, %xmm0, %xmm0
493 ; XOP-NEXT:    retq
495 ; AVX512-LABEL: splatvar_shift_v4i32:
496 ; AVX512:       # %bb.0:
497 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
498 ; AVX512-NEXT:    vpslld %xmm1, %xmm0, %xmm0
499 ; AVX512-NEXT:    retq
501 ; AVX512VL-LABEL: splatvar_shift_v4i32:
502 ; AVX512VL:       # %bb.0:
503 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
504 ; AVX512VL-NEXT:    vpslld %xmm1, %xmm0, %xmm0
505 ; AVX512VL-NEXT:    retq
507 ; X32-SSE-LABEL: splatvar_shift_v4i32:
508 ; X32-SSE:       # %bb.0:
509 ; X32-SSE-NEXT:    xorps %xmm2, %xmm2
510 ; X32-SSE-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
511 ; X32-SSE-NEXT:    pslld %xmm2, %xmm0
512 ; X32-SSE-NEXT:    retl
513   %splat = shufflevector <4 x i32> %b, <4 x i32> undef, <4 x i32> zeroinitializer
514   %shift = shl <4 x i32> %a, %splat
515   ret <4 x i32> %shift
518 define <8 x i16> @splatvar_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
519 ; SSE2-LABEL: splatvar_shift_v8i16:
520 ; SSE2:       # %bb.0:
521 ; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]
522 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
523 ; SSE2-NEXT:    psllw %xmm1, %xmm0
524 ; SSE2-NEXT:    retq
526 ; SSE41-LABEL: splatvar_shift_v8i16:
527 ; SSE41:       # %bb.0:
528 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
529 ; SSE41-NEXT:    psllw %xmm1, %xmm0
530 ; SSE41-NEXT:    retq
532 ; AVX-LABEL: splatvar_shift_v8i16:
533 ; AVX:       # %bb.0:
534 ; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
535 ; AVX-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
536 ; AVX-NEXT:    retq
538 ; XOP-LABEL: splatvar_shift_v8i16:
539 ; XOP:       # %bb.0:
540 ; XOP-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
541 ; XOP-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
542 ; XOP-NEXT:    retq
544 ; AVX512-LABEL: splatvar_shift_v8i16:
545 ; AVX512:       # %bb.0:
546 ; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
547 ; AVX512-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
548 ; AVX512-NEXT:    retq
550 ; AVX512VL-LABEL: splatvar_shift_v8i16:
551 ; AVX512VL:       # %bb.0:
552 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
553 ; AVX512VL-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
554 ; AVX512VL-NEXT:    retq
556 ; X32-SSE-LABEL: splatvar_shift_v8i16:
557 ; X32-SSE:       # %bb.0:
558 ; X32-SSE-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]
559 ; X32-SSE-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
560 ; X32-SSE-NEXT:    psllw %xmm1, %xmm0
561 ; X32-SSE-NEXT:    retl
562   %splat = shufflevector <8 x i16> %b, <8 x i16> undef, <8 x i32> zeroinitializer
563   %shift = shl <8 x i16> %a, %splat
564   ret <8 x i16> %shift
567 define <16 x i8> @splatvar_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
568 ; SSE2-LABEL: splatvar_shift_v16i8:
569 ; SSE2:       # %bb.0:
570 ; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
571 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
572 ; SSE2-NEXT:    psllw %xmm1, %xmm0
573 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
574 ; SSE2-NEXT:    psllw %xmm1, %xmm2
575 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
576 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm2[0,0,2,3,4,5,6,7]
577 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
578 ; SSE2-NEXT:    pand %xmm1, %xmm0
579 ; SSE2-NEXT:    retq
581 ; SSE41-LABEL: splatvar_shift_v16i8:
582 ; SSE41:       # %bb.0:
583 ; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
584 ; SSE41-NEXT:    psllw %xmm1, %xmm0
585 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
586 ; SSE41-NEXT:    psllw %xmm1, %xmm2
587 ; SSE41-NEXT:    pxor %xmm1, %xmm1
588 ; SSE41-NEXT:    pshufb %xmm1, %xmm2
589 ; SSE41-NEXT:    pand %xmm2, %xmm0
590 ; SSE41-NEXT:    retq
592 ; AVX1-LABEL: splatvar_shift_v16i8:
593 ; AVX1:       # %bb.0:
594 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
595 ; AVX1-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
596 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
597 ; AVX1-NEXT:    vpsllw %xmm1, %xmm2, %xmm1
598 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
599 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
600 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
601 ; AVX1-NEXT:    retq
603 ; AVX2-LABEL: splatvar_shift_v16i8:
604 ; AVX2:       # %bb.0:
605 ; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
606 ; AVX2-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
607 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
608 ; AVX2-NEXT:    vpsllw %xmm1, %xmm2, %xmm1
609 ; AVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
610 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
611 ; AVX2-NEXT:    retq
613 ; XOPAVX1-LABEL: splatvar_shift_v16i8:
614 ; XOPAVX1:       # %bb.0:
615 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
616 ; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
617 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
618 ; XOPAVX1-NEXT:    retq
620 ; XOPAVX2-LABEL: splatvar_shift_v16i8:
621 ; XOPAVX2:       # %bb.0:
622 ; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
623 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
624 ; XOPAVX2-NEXT:    retq
626 ; AVX512DQ-LABEL: splatvar_shift_v16i8:
627 ; AVX512DQ:       # %bb.0:
628 ; AVX512DQ-NEXT:    vpbroadcastb %xmm1, %xmm1
629 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
630 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
631 ; AVX512DQ-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
632 ; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
633 ; AVX512DQ-NEXT:    vzeroupper
634 ; AVX512DQ-NEXT:    retq
636 ; AVX512BW-LABEL: splatvar_shift_v16i8:
637 ; AVX512BW:       # %bb.0:
638 ; AVX512BW-NEXT:    vpbroadcastb %xmm1, %xmm1
639 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
640 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
641 ; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
642 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
643 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
644 ; AVX512BW-NEXT:    vzeroupper
645 ; AVX512BW-NEXT:    retq
647 ; AVX512DQVL-LABEL: splatvar_shift_v16i8:
648 ; AVX512DQVL:       # %bb.0:
649 ; AVX512DQVL-NEXT:    vpbroadcastb %xmm1, %xmm1
650 ; AVX512DQVL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
651 ; AVX512DQVL-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
652 ; AVX512DQVL-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
653 ; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm0
654 ; AVX512DQVL-NEXT:    vzeroupper
655 ; AVX512DQVL-NEXT:    retq
657 ; AVX512BWVL-LABEL: splatvar_shift_v16i8:
658 ; AVX512BWVL:       # %bb.0:
659 ; AVX512BWVL-NEXT:    vpbroadcastb %xmm1, %xmm1
660 ; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
661 ; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
662 ; AVX512BWVL-NEXT:    vpsllvw %ymm1, %ymm0, %ymm0
663 ; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0
664 ; AVX512BWVL-NEXT:    vzeroupper
665 ; AVX512BWVL-NEXT:    retq
667 ; X32-SSE-LABEL: splatvar_shift_v16i8:
668 ; X32-SSE:       # %bb.0:
669 ; X32-SSE-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
670 ; X32-SSE-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
671 ; X32-SSE-NEXT:    psllw %xmm1, %xmm0
672 ; X32-SSE-NEXT:    pcmpeqd %xmm2, %xmm2
673 ; X32-SSE-NEXT:    psllw %xmm1, %xmm2
674 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
675 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm2[0,0,2,3,4,5,6,7]
676 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
677 ; X32-SSE-NEXT:    pand %xmm1, %xmm0
678 ; X32-SSE-NEXT:    retl
679   %splat = shufflevector <16 x i8> %b, <16 x i8> undef, <16 x i32> zeroinitializer
680   %shift = shl <16 x i8> %a, %splat
681   ret <16 x i8> %shift
685 ; Constant Shifts
688 define <2 x i64> @constant_shift_v2i64(<2 x i64> %a) nounwind {
689 ; SSE2-LABEL: constant_shift_v2i64:
690 ; SSE2:       # %bb.0:
691 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
692 ; SSE2-NEXT:    psllq $1, %xmm1
693 ; SSE2-NEXT:    psllq $7, %xmm0
694 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
695 ; SSE2-NEXT:    retq
697 ; SSE41-LABEL: constant_shift_v2i64:
698 ; SSE41:       # %bb.0:
699 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
700 ; SSE41-NEXT:    psllq $7, %xmm1
701 ; SSE41-NEXT:    psllq $1, %xmm0
702 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
703 ; SSE41-NEXT:    retq
705 ; AVX1-LABEL: constant_shift_v2i64:
706 ; AVX1:       # %bb.0:
707 ; AVX1-NEXT:    vpsllq $7, %xmm0, %xmm1
708 ; AVX1-NEXT:    vpsllq $1, %xmm0, %xmm0
709 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
710 ; AVX1-NEXT:    retq
712 ; AVX2-LABEL: constant_shift_v2i64:
713 ; AVX2:       # %bb.0:
714 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %xmm0, %xmm0
715 ; AVX2-NEXT:    retq
717 ; XOPAVX1-LABEL: constant_shift_v2i64:
718 ; XOPAVX1:       # %bb.0:
719 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm0
720 ; XOPAVX1-NEXT:    retq
722 ; XOPAVX2-LABEL: constant_shift_v2i64:
723 ; XOPAVX2:       # %bb.0:
724 ; XOPAVX2-NEXT:    vpsllvq {{.*}}(%rip), %xmm0, %xmm0
725 ; XOPAVX2-NEXT:    retq
727 ; AVX512-LABEL: constant_shift_v2i64:
728 ; AVX512:       # %bb.0:
729 ; AVX512-NEXT:    vpsllvq {{.*}}(%rip), %xmm0, %xmm0
730 ; AVX512-NEXT:    retq
732 ; AVX512VL-LABEL: constant_shift_v2i64:
733 ; AVX512VL:       # %bb.0:
734 ; AVX512VL-NEXT:    vpsllvq {{.*}}(%rip), %xmm0, %xmm0
735 ; AVX512VL-NEXT:    retq
737 ; X32-SSE-LABEL: constant_shift_v2i64:
738 ; X32-SSE:       # %bb.0:
739 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
740 ; X32-SSE-NEXT:    psllq $1, %xmm1
741 ; X32-SSE-NEXT:    psllq $7, %xmm0
742 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
743 ; X32-SSE-NEXT:    retl
744   %shift = shl <2 x i64> %a, <i64 1, i64 7>
745   ret <2 x i64> %shift
748 define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind {
749 ; SSE2-LABEL: constant_shift_v4i32:
750 ; SSE2:       # %bb.0:
751 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
752 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
753 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
754 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
755 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
756 ; SSE2-NEXT:    pmuludq %xmm2, %xmm1
757 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
758 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
759 ; SSE2-NEXT:    retq
761 ; SSE41-LABEL: constant_shift_v4i32:
762 ; SSE41:       # %bb.0:
763 ; SSE41-NEXT:    pmulld {{.*}}(%rip), %xmm0
764 ; SSE41-NEXT:    retq
766 ; AVX1-LABEL: constant_shift_v4i32:
767 ; AVX1:       # %bb.0:
768 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
769 ; AVX1-NEXT:    retq
771 ; AVX2-LABEL: constant_shift_v4i32:
772 ; AVX2:       # %bb.0:
773 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %xmm0, %xmm0
774 ; AVX2-NEXT:    retq
776 ; XOPAVX1-LABEL: constant_shift_v4i32:
777 ; XOPAVX1:       # %bb.0:
778 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
779 ; XOPAVX1-NEXT:    retq
781 ; XOPAVX2-LABEL: constant_shift_v4i32:
782 ; XOPAVX2:       # %bb.0:
783 ; XOPAVX2-NEXT:    vpsllvd {{.*}}(%rip), %xmm0, %xmm0
784 ; XOPAVX2-NEXT:    retq
786 ; AVX512-LABEL: constant_shift_v4i32:
787 ; AVX512:       # %bb.0:
788 ; AVX512-NEXT:    vpsllvd {{.*}}(%rip), %xmm0, %xmm0
789 ; AVX512-NEXT:    retq
791 ; AVX512VL-LABEL: constant_shift_v4i32:
792 ; AVX512VL:       # %bb.0:
793 ; AVX512VL-NEXT:    vpsllvd {{.*}}(%rip), %xmm0, %xmm0
794 ; AVX512VL-NEXT:    retq
796 ; X32-SSE-LABEL: constant_shift_v4i32:
797 ; X32-SSE:       # %bb.0:
798 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
799 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
800 ; X32-SSE-NEXT:    pmuludq %xmm1, %xmm0
801 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
802 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
803 ; X32-SSE-NEXT:    pmuludq %xmm2, %xmm1
804 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
805 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
806 ; X32-SSE-NEXT:    retl
807   %shift = shl <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>
808   ret <4 x i32> %shift
811 define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind {
812 ; SSE-LABEL: constant_shift_v8i16:
813 ; SSE:       # %bb.0:
814 ; SSE-NEXT:    pmullw {{.*}}(%rip), %xmm0
815 ; SSE-NEXT:    retq
817 ; AVX-LABEL: constant_shift_v8i16:
818 ; AVX:       # %bb.0:
819 ; AVX-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
820 ; AVX-NEXT:    retq
822 ; XOP-LABEL: constant_shift_v8i16:
823 ; XOP:       # %bb.0:
824 ; XOP-NEXT:    vpshlw {{.*}}(%rip), %xmm0, %xmm0
825 ; XOP-NEXT:    retq
827 ; AVX512DQ-LABEL: constant_shift_v8i16:
828 ; AVX512DQ:       # %bb.0:
829 ; AVX512DQ-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
830 ; AVX512DQ-NEXT:    retq
832 ; AVX512BW-LABEL: constant_shift_v8i16:
833 ; AVX512BW:       # %bb.0:
834 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
835 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]
836 ; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
837 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
838 ; AVX512BW-NEXT:    vzeroupper
839 ; AVX512BW-NEXT:    retq
841 ; AVX512DQVL-LABEL: constant_shift_v8i16:
842 ; AVX512DQVL:       # %bb.0:
843 ; AVX512DQVL-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
844 ; AVX512DQVL-NEXT:    retq
846 ; AVX512BWVL-LABEL: constant_shift_v8i16:
847 ; AVX512BWVL:       # %bb.0:
848 ; AVX512BWVL-NEXT:    vpsllvw {{.*}}(%rip), %xmm0, %xmm0
849 ; AVX512BWVL-NEXT:    retq
851 ; X32-SSE-LABEL: constant_shift_v8i16:
852 ; X32-SSE:       # %bb.0:
853 ; X32-SSE-NEXT:    pmullw {{\.LCPI.*}}, %xmm0
854 ; X32-SSE-NEXT:    retl
855   %shift = shl <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>
856   ret <8 x i16> %shift
859 define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind {
860 ; SSE2-LABEL: constant_shift_v16i8:
861 ; SSE2:       # %bb.0:
862 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
863 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = 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]
864 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm1
865 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
866 ; SSE2-NEXT:    pand %xmm2, %xmm1
867 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
868 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm0
869 ; SSE2-NEXT:    pand %xmm2, %xmm0
870 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
871 ; SSE2-NEXT:    retq
873 ; SSE41-LABEL: constant_shift_v16i8:
874 ; SSE41:       # %bb.0:
875 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
876 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
877 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm0
878 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
879 ; SSE41-NEXT:    pand %xmm2, %xmm0
880 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm1
881 ; SSE41-NEXT:    pand %xmm2, %xmm1
882 ; SSE41-NEXT:    packuswb %xmm0, %xmm1
883 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
884 ; SSE41-NEXT:    retq
886 ; AVX1-LABEL: constant_shift_v16i8:
887 ; AVX1:       # %bb.0:
888 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
889 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm1, %xmm1
890 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
891 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
892 ; 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
893 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
894 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
895 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
896 ; AVX1-NEXT:    retq
898 ; AVX2-LABEL: constant_shift_v16i8:
899 ; AVX2:       # %bb.0:
900 ; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
901 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
902 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
903 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
904 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
905 ; AVX2-NEXT:    vzeroupper
906 ; AVX2-NEXT:    retq
908 ; XOP-LABEL: constant_shift_v16i8:
909 ; XOP:       # %bb.0:
910 ; XOP-NEXT:    vpshlb {{.*}}(%rip), %xmm0, %xmm0
911 ; XOP-NEXT:    retq
913 ; AVX512DQ-LABEL: constant_shift_v16i8:
914 ; AVX512DQ:       # %bb.0:
915 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
916 ; AVX512DQ-NEXT:    vpsllvd {{.*}}(%rip), %zmm0, %zmm0
917 ; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
918 ; AVX512DQ-NEXT:    vzeroupper
919 ; AVX512DQ-NEXT:    retq
921 ; AVX512BW-LABEL: constant_shift_v16i8:
922 ; AVX512BW:       # %bb.0:
923 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
924 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
925 ; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
926 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
927 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
928 ; AVX512BW-NEXT:    vzeroupper
929 ; AVX512BW-NEXT:    retq
931 ; AVX512DQVL-LABEL: constant_shift_v16i8:
932 ; AVX512DQVL:       # %bb.0:
933 ; AVX512DQVL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
934 ; AVX512DQVL-NEXT:    vpsllvd {{.*}}(%rip), %zmm0, %zmm0
935 ; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm0
936 ; AVX512DQVL-NEXT:    vzeroupper
937 ; AVX512DQVL-NEXT:    retq
939 ; AVX512BWVL-LABEL: constant_shift_v16i8:
940 ; AVX512BWVL:       # %bb.0:
941 ; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
942 ; AVX512BWVL-NEXT:    vpsllvw {{.*}}(%rip), %ymm0, %ymm0
943 ; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0
944 ; AVX512BWVL-NEXT:    vzeroupper
945 ; AVX512BWVL-NEXT:    retq
947 ; X32-SSE-LABEL: constant_shift_v16i8:
948 ; X32-SSE:       # %bb.0:
949 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
950 ; X32-SSE-NEXT:    punpckhbw {{.*#+}} xmm1 = 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]
951 ; X32-SSE-NEXT:    pmullw {{\.LCPI.*}}, %xmm1
952 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
953 ; X32-SSE-NEXT:    pand %xmm2, %xmm1
954 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
955 ; X32-SSE-NEXT:    pmullw {{\.LCPI.*}}, %xmm0
956 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
957 ; X32-SSE-NEXT:    packuswb %xmm1, %xmm0
958 ; X32-SSE-NEXT:    retl
959   %shift = shl <16 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>
960   ret <16 x i8> %shift
964 ; Uniform Constant Shifts
967 define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind {
968 ; SSE-LABEL: splatconstant_shift_v2i64:
969 ; SSE:       # %bb.0:
970 ; SSE-NEXT:    psllq $7, %xmm0
971 ; SSE-NEXT:    retq
973 ; AVX-LABEL: splatconstant_shift_v2i64:
974 ; AVX:       # %bb.0:
975 ; AVX-NEXT:    vpsllq $7, %xmm0, %xmm0
976 ; AVX-NEXT:    retq
978 ; XOP-LABEL: splatconstant_shift_v2i64:
979 ; XOP:       # %bb.0:
980 ; XOP-NEXT:    vpsllq $7, %xmm0, %xmm0
981 ; XOP-NEXT:    retq
983 ; AVX512-LABEL: splatconstant_shift_v2i64:
984 ; AVX512:       # %bb.0:
985 ; AVX512-NEXT:    vpsllq $7, %xmm0, %xmm0
986 ; AVX512-NEXT:    retq
988 ; AVX512VL-LABEL: splatconstant_shift_v2i64:
989 ; AVX512VL:       # %bb.0:
990 ; AVX512VL-NEXT:    vpsllq $7, %xmm0, %xmm0
991 ; AVX512VL-NEXT:    retq
993 ; X32-SSE-LABEL: splatconstant_shift_v2i64:
994 ; X32-SSE:       # %bb.0:
995 ; X32-SSE-NEXT:    psllq $7, %xmm0
996 ; X32-SSE-NEXT:    retl
997   %shift = shl <2 x i64> %a, <i64 7, i64 7>
998   ret <2 x i64> %shift
1001 define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind {
1002 ; SSE-LABEL: splatconstant_shift_v4i32:
1003 ; SSE:       # %bb.0:
1004 ; SSE-NEXT:    pslld $5, %xmm0
1005 ; SSE-NEXT:    retq
1007 ; AVX-LABEL: splatconstant_shift_v4i32:
1008 ; AVX:       # %bb.0:
1009 ; AVX-NEXT:    vpslld $5, %xmm0, %xmm0
1010 ; AVX-NEXT:    retq
1012 ; XOP-LABEL: splatconstant_shift_v4i32:
1013 ; XOP:       # %bb.0:
1014 ; XOP-NEXT:    vpslld $5, %xmm0, %xmm0
1015 ; XOP-NEXT:    retq
1017 ; AVX512-LABEL: splatconstant_shift_v4i32:
1018 ; AVX512:       # %bb.0:
1019 ; AVX512-NEXT:    vpslld $5, %xmm0, %xmm0
1020 ; AVX512-NEXT:    retq
1022 ; AVX512VL-LABEL: splatconstant_shift_v4i32:
1023 ; AVX512VL:       # %bb.0:
1024 ; AVX512VL-NEXT:    vpslld $5, %xmm0, %xmm0
1025 ; AVX512VL-NEXT:    retq
1027 ; X32-SSE-LABEL: splatconstant_shift_v4i32:
1028 ; X32-SSE:       # %bb.0:
1029 ; X32-SSE-NEXT:    pslld $5, %xmm0
1030 ; X32-SSE-NEXT:    retl
1031   %shift = shl <4 x i32> %a, <i32 5, i32 5, i32 5, i32 5>
1032   ret <4 x i32> %shift
1035 define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind {
1036 ; SSE-LABEL: splatconstant_shift_v8i16:
1037 ; SSE:       # %bb.0:
1038 ; SSE-NEXT:    psllw $3, %xmm0
1039 ; SSE-NEXT:    retq
1041 ; AVX-LABEL: splatconstant_shift_v8i16:
1042 ; AVX:       # %bb.0:
1043 ; AVX-NEXT:    vpsllw $3, %xmm0, %xmm0
1044 ; AVX-NEXT:    retq
1046 ; XOP-LABEL: splatconstant_shift_v8i16:
1047 ; XOP:       # %bb.0:
1048 ; XOP-NEXT:    vpsllw $3, %xmm0, %xmm0
1049 ; XOP-NEXT:    retq
1051 ; AVX512-LABEL: splatconstant_shift_v8i16:
1052 ; AVX512:       # %bb.0:
1053 ; AVX512-NEXT:    vpsllw $3, %xmm0, %xmm0
1054 ; AVX512-NEXT:    retq
1056 ; AVX512VL-LABEL: splatconstant_shift_v8i16:
1057 ; AVX512VL:       # %bb.0:
1058 ; AVX512VL-NEXT:    vpsllw $3, %xmm0, %xmm0
1059 ; AVX512VL-NEXT:    retq
1061 ; X32-SSE-LABEL: splatconstant_shift_v8i16:
1062 ; X32-SSE:       # %bb.0:
1063 ; X32-SSE-NEXT:    psllw $3, %xmm0
1064 ; X32-SSE-NEXT:    retl
1065   %shift = shl <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
1066   ret <8 x i16> %shift
1069 define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind {
1070 ; SSE-LABEL: splatconstant_shift_v16i8:
1071 ; SSE:       # %bb.0:
1072 ; SSE-NEXT:    psllw $3, %xmm0
1073 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
1074 ; SSE-NEXT:    retq
1076 ; AVX-LABEL: splatconstant_shift_v16i8:
1077 ; AVX:       # %bb.0:
1078 ; AVX-NEXT:    vpsllw $3, %xmm0, %xmm0
1079 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1080 ; AVX-NEXT:    retq
1082 ; XOP-LABEL: splatconstant_shift_v16i8:
1083 ; XOP:       # %bb.0:
1084 ; XOP-NEXT:    vpshlb {{.*}}(%rip), %xmm0, %xmm0
1085 ; XOP-NEXT:    retq
1087 ; AVX512-LABEL: splatconstant_shift_v16i8:
1088 ; AVX512:       # %bb.0:
1089 ; AVX512-NEXT:    vpsllw $3, %xmm0, %xmm0
1090 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1091 ; AVX512-NEXT:    retq
1093 ; AVX512VL-LABEL: splatconstant_shift_v16i8:
1094 ; AVX512VL:       # %bb.0:
1095 ; AVX512VL-NEXT:    vpsllw $3, %xmm0, %xmm0
1096 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1097 ; AVX512VL-NEXT:    retq
1099 ; X32-SSE-LABEL: splatconstant_shift_v16i8:
1100 ; X32-SSE:       # %bb.0:
1101 ; X32-SSE-NEXT:    psllw $3, %xmm0
1102 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
1103 ; X32-SSE-NEXT:    retl
1104   %shift = shl <16 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>
1105   ret <16 x i8> %shift