[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / vector-shift-shl-256.ll
blob8e3aa95434596f59207b310e1cfd6ef23fe74136
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512DQ
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512VL --check-prefix=AVX512DQVL
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512VL --check-prefix=AVX512BWVL
11 ; 32-bit runs to make sure we do reasonable things for i64 shifts.
12 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx  | FileCheck %s --check-prefix=ALL --check-prefix=X32-AVX --check-prefix=X32-AVX1
13 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=X32-AVX --check-prefix=X32-AVX2
16 ; Variable Shifts
19 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
20 ; AVX1-LABEL: var_shift_v4i64:
21 ; AVX1:       # %bb.0:
22 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
23 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
24 ; AVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm4
25 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
26 ; AVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm2
27 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
28 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm3
29 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
30 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
31 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
32 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
33 ; AVX1-NEXT:    retq
35 ; AVX2-LABEL: var_shift_v4i64:
36 ; AVX2:       # %bb.0:
37 ; AVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
38 ; AVX2-NEXT:    retq
40 ; XOPAVX1-LABEL: var_shift_v4i64:
41 ; XOPAVX1:       # %bb.0:
42 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
43 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
44 ; XOPAVX1-NEXT:    vpshlq %xmm2, %xmm3, %xmm2
45 ; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm0
46 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
47 ; XOPAVX1-NEXT:    retq
49 ; XOPAVX2-LABEL: var_shift_v4i64:
50 ; XOPAVX2:       # %bb.0:
51 ; XOPAVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
52 ; XOPAVX2-NEXT:    retq
54 ; AVX512-LABEL: var_shift_v4i64:
55 ; AVX512:       # %bb.0:
56 ; AVX512-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
57 ; AVX512-NEXT:    retq
59 ; AVX512VL-LABEL: var_shift_v4i64:
60 ; AVX512VL:       # %bb.0:
61 ; AVX512VL-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
62 ; AVX512VL-NEXT:    retq
64 ; X32-AVX1-LABEL: var_shift_v4i64:
65 ; X32-AVX1:       # %bb.0:
66 ; X32-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
67 ; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
68 ; X32-AVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm4
69 ; X32-AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
70 ; X32-AVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm2
71 ; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
72 ; X32-AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm3
73 ; X32-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
74 ; X32-AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
75 ; X32-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
76 ; X32-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
77 ; X32-AVX1-NEXT:    retl
79 ; X32-AVX2-LABEL: var_shift_v4i64:
80 ; X32-AVX2:       # %bb.0:
81 ; X32-AVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
82 ; X32-AVX2-NEXT:    retl
83   %shift = shl <4 x i64> %a, %b
84   ret <4 x i64> %shift
87 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
88 ; AVX1-LABEL: var_shift_v8i32:
89 ; AVX1:       # %bb.0:
90 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
91 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
92 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
93 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
94 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
95 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
96 ; AVX1-NEXT:    vpmulld %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
102 ; AVX1-NEXT:    retq
104 ; AVX2-LABEL: var_shift_v8i32:
105 ; AVX2:       # %bb.0:
106 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
107 ; AVX2-NEXT:    retq
109 ; XOPAVX1-LABEL: var_shift_v8i32:
110 ; XOPAVX1:       # %bb.0:
111 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
112 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
113 ; XOPAVX1-NEXT:    vpshld %xmm2, %xmm3, %xmm2
114 ; XOPAVX1-NEXT:    vpshld %xmm1, %xmm0, %xmm0
115 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
116 ; XOPAVX1-NEXT:    retq
118 ; XOPAVX2-LABEL: var_shift_v8i32:
119 ; XOPAVX2:       # %bb.0:
120 ; XOPAVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
121 ; XOPAVX2-NEXT:    retq
123 ; AVX512-LABEL: var_shift_v8i32:
124 ; AVX512:       # %bb.0:
125 ; AVX512-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
126 ; AVX512-NEXT:    retq
128 ; AVX512VL-LABEL: var_shift_v8i32:
129 ; AVX512VL:       # %bb.0:
130 ; AVX512VL-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
131 ; AVX512VL-NEXT:    retq
133 ; X32-AVX1-LABEL: var_shift_v8i32:
134 ; X32-AVX1:       # %bb.0:
135 ; X32-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
136 ; X32-AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
137 ; X32-AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
138 ; X32-AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
139 ; X32-AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
140 ; X32-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
141 ; X32-AVX1-NEXT:    vpmulld %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:
150 ; X32-AVX2:       # %bb.0:
151 ; X32-AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
152 ; X32-AVX2-NEXT:    retl
153   %shift = shl <8 x i32> %a, %b
154   ret <8 x i32> %shift
157 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
158 ; AVX1-LABEL: var_shift_v16i16:
159 ; AVX1:       # %bb.0:
160 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
161 ; AVX1-NEXT:    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
184 ; AVX1-NEXT:    retq
186 ; AVX2-LABEL: var_shift_v16i16:
187 ; AVX2:       # %bb.0:
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
198 ; AVX2-NEXT:    retq
200 ; XOPAVX1-LABEL: var_shift_v16i16:
201 ; XOPAVX1:       # %bb.0:
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
207 ; XOPAVX1-NEXT:    retq
209 ; XOPAVX2-LABEL: var_shift_v16i16:
210 ; XOPAVX2:       # %bb.0:
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
216 ; XOPAVX2-NEXT:    retq
218 ; AVX512DQ-LABEL: var_shift_v16i16:
219 ; AVX512DQ:       # %bb.0:
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:
227 ; AVX512BW:       # %bb.0:
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:
248 ; X32-AVX1:       # %bb.0:
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:
276 ; X32-AVX2:       # %bb.0:
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:
294 ; AVX1:       # %bb.0:
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
322 ; AVX1-NEXT:    retq
324 ; AVX2-LABEL: var_shift_v32i8:
325 ; AVX2:       # %bb.0:
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
337 ; AVX2-NEXT:    retq
339 ; XOPAVX1-LABEL: var_shift_v32i8:
340 ; XOPAVX1:       # %bb.0:
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
346 ; XOPAVX1-NEXT:    retq
348 ; XOPAVX2-LABEL: var_shift_v32i8:
349 ; XOPAVX2:       # %bb.0:
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
355 ; XOPAVX2-NEXT:    retq
357 ; AVX512DQ-LABEL: var_shift_v32i8:
358 ; AVX512DQ:       # %bb.0:
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:
373 ; AVX512BW:       # %bb.0:
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:
404 ; X32-AVX1:       # %bb.0:
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:
435 ; X32-AVX2:       # %bb.0:
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
449   ret <32 x i8> %shift
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:
458 ; AVX1:       # %bb.0:
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
463 ; AVX1-NEXT:    retq
465 ; AVX2-LABEL: splatvar_shift_v4i64:
466 ; AVX2:       # %bb.0:
467 ; AVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
468 ; AVX2-NEXT:    retq
470 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
471 ; XOPAVX1:       # %bb.0:
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
476 ; XOPAVX1-NEXT:    retq
478 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
479 ; XOPAVX2:       # %bb.0:
480 ; XOPAVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
481 ; XOPAVX2-NEXT:    retq
483 ; AVX512-LABEL: splatvar_shift_v4i64:
484 ; AVX512:       # %bb.0:
485 ; AVX512-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
486 ; AVX512-NEXT:    retq
488 ; AVX512VL-LABEL: splatvar_shift_v4i64:
489 ; AVX512VL:       # %bb.0:
490 ; AVX512VL-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
491 ; AVX512VL-NEXT:    retq
493 ; X32-AVX1-LABEL: splatvar_shift_v4i64:
494 ; X32-AVX1:       # %bb.0:
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:
502 ; X32-AVX2:       # %bb.0:
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
507   ret <4 x i64> %shift
510 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
511 ; AVX1-LABEL: splatvar_shift_v8i32:
512 ; AVX1:       # %bb.0:
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
518 ; AVX1-NEXT:    retq
520 ; AVX2-LABEL: splatvar_shift_v8i32:
521 ; AVX2:       # %bb.0:
522 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
523 ; AVX2-NEXT:    vpslld %xmm1, %ymm0, %ymm0
524 ; AVX2-NEXT:    retq
526 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
527 ; XOPAVX1:       # %bb.0:
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
533 ; XOPAVX1-NEXT:    retq
535 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
536 ; XOPAVX2:       # %bb.0:
537 ; XOPAVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
538 ; XOPAVX2-NEXT:    vpslld %xmm1, %ymm0, %ymm0
539 ; XOPAVX2-NEXT:    retq
541 ; AVX512-LABEL: splatvar_shift_v8i32:
542 ; AVX512:       # %bb.0:
543 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
544 ; AVX512-NEXT:    vpslld %xmm1, %ymm0, %ymm0
545 ; AVX512-NEXT:    retq
547 ; AVX512VL-LABEL: splatvar_shift_v8i32:
548 ; AVX512VL:       # %bb.0:
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:
554 ; X32-AVX1:       # %bb.0:
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:
563 ; X32-AVX2:       # %bb.0:
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
569   ret <8 x i32> %shift
572 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
573 ; AVX1-LABEL: splatvar_shift_v16i16:
574 ; AVX1:       # %bb.0:
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
580 ; AVX1-NEXT:    retq
582 ; AVX2-LABEL: splatvar_shift_v16i16:
583 ; AVX2:       # %bb.0:
584 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
585 ; AVX2-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
586 ; AVX2-NEXT:    retq
588 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
589 ; XOPAVX1:       # %bb.0:
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
595 ; XOPAVX1-NEXT:    retq
597 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
598 ; XOPAVX2:       # %bb.0:
599 ; XOPAVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
600 ; XOPAVX2-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
601 ; XOPAVX2-NEXT:    retq
603 ; AVX512-LABEL: splatvar_shift_v16i16:
604 ; AVX512:       # %bb.0:
605 ; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
606 ; AVX512-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
607 ; AVX512-NEXT:    retq
609 ; AVX512VL-LABEL: splatvar_shift_v16i16:
610 ; AVX512VL:       # %bb.0:
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:
616 ; X32-AVX1:       # %bb.0:
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:
625 ; X32-AVX2:       # %bb.0:
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:
636 ; AVX1:       # %bb.0:
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
648 ; AVX1-NEXT:    retq
650 ; AVX2-LABEL: splatvar_shift_v32i8:
651 ; AVX2:       # %bb.0:
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
658 ; AVX2-NEXT:    retq
660 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
661 ; XOPAVX1:       # %bb.0:
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
668 ; XOPAVX1-NEXT:    retq
670 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
671 ; XOPAVX2:       # %bb.0:
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
678 ; XOPAVX2-NEXT:    retq
680 ; AVX512DQ-LABEL: splatvar_shift_v32i8:
681 ; AVX512DQ:       # %bb.0:
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:
691 ; AVX512BW:       # %bb.0:
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:
719 ; X32-AVX1:       # %bb.0:
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:
734 ; X32-AVX2:       # %bb.0:
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
744   ret <32 x i8> %shift
748 ; Constant Shifts
751 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
752 ; AVX1-LABEL: constant_shift_v4i64:
753 ; AVX1:       # %bb.0:
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
762 ; AVX1-NEXT:    retq
764 ; AVX2-LABEL: constant_shift_v4i64:
765 ; AVX2:       # %bb.0:
766 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
767 ; AVX2-NEXT:    retq
769 ; XOPAVX1-LABEL: constant_shift_v4i64:
770 ; XOPAVX1:       # %bb.0:
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
775 ; XOPAVX1-NEXT:    retq
777 ; XOPAVX2-LABEL: constant_shift_v4i64:
778 ; XOPAVX2:       # %bb.0:
779 ; XOPAVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
780 ; XOPAVX2-NEXT:    retq
782 ; AVX512-LABEL: constant_shift_v4i64:
783 ; AVX512:       # %bb.0:
784 ; AVX512-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
785 ; AVX512-NEXT:    retq
787 ; AVX512VL-LABEL: constant_shift_v4i64:
788 ; AVX512VL:       # %bb.0:
789 ; AVX512VL-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
790 ; AVX512VL-NEXT:    retq
792 ; X32-AVX1-LABEL: constant_shift_v4i64:
793 ; X32-AVX1:       # %bb.0:
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:
805 ; X32-AVX2:       # %bb.0:
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>
809   ret <4 x i64> %shift
812 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
813 ; AVX1-LABEL: constant_shift_v8i32:
814 ; AVX1:       # %bb.0:
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
819 ; AVX1-NEXT:    retq
821 ; AVX2-LABEL: constant_shift_v8i32:
822 ; AVX2:       # %bb.0:
823 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
824 ; AVX2-NEXT:    retq
826 ; XOPAVX1-LABEL: constant_shift_v8i32:
827 ; XOPAVX1:       # %bb.0:
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
832 ; XOPAVX1-NEXT:    retq
834 ; XOPAVX2-LABEL: constant_shift_v8i32:
835 ; XOPAVX2:       # %bb.0:
836 ; XOPAVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
837 ; XOPAVX2-NEXT:    retq
839 ; AVX512-LABEL: constant_shift_v8i32:
840 ; AVX512:       # %bb.0:
841 ; AVX512-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
842 ; AVX512-NEXT:    retq
844 ; AVX512VL-LABEL: constant_shift_v8i32:
845 ; AVX512VL:       # %bb.0:
846 ; AVX512VL-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
847 ; AVX512VL-NEXT:    retq
849 ; X32-AVX1-LABEL: constant_shift_v8i32:
850 ; X32-AVX1:       # %bb.0:
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:
858 ; X32-AVX2:       # %bb.0:
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>
862   ret <8 x i32> %shift
865 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
866 ; AVX1-LABEL: constant_shift_v16i16:
867 ; AVX1:       # %bb.0:
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
872 ; AVX1-NEXT:    retq
874 ; AVX2-LABEL: constant_shift_v16i16:
875 ; AVX2:       # %bb.0:
876 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
877 ; AVX2-NEXT:    retq
879 ; XOPAVX1-LABEL: constant_shift_v16i16:
880 ; XOPAVX1:       # %bb.0:
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
885 ; XOPAVX1-NEXT:    retq
887 ; XOPAVX2-LABEL: constant_shift_v16i16:
888 ; XOPAVX2:       # %bb.0:
889 ; XOPAVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
890 ; XOPAVX2-NEXT:    retq
892 ; AVX512DQ-LABEL: constant_shift_v16i16:
893 ; AVX512DQ:       # %bb.0:
894 ; AVX512DQ-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
895 ; AVX512DQ-NEXT:    retq
897 ; AVX512BW-LABEL: constant_shift_v16i16:
898 ; AVX512BW:       # %bb.0:
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:
916 ; X32-AVX1:       # %bb.0:
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:
924 ; X32-AVX2:       # %bb.0:
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:
933 ; AVX1:       # %bb.0:
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
953 ; AVX1-NEXT:    retq
955 ; AVX2-LABEL: constant_shift_v32i8:
956 ; AVX2:       # %bb.0:
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
969 ; AVX2-NEXT:    retq
971 ; XOPAVX1-LABEL: constant_shift_v32i8:
972 ; XOPAVX1:       # %bb.0:
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
978 ; XOPAVX1-NEXT:    retq
980 ; XOPAVX2-LABEL: constant_shift_v32i8:
981 ; XOPAVX2:       # %bb.0:
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
987 ; XOPAVX2-NEXT:    retq
989 ; AVX512DQ-LABEL: constant_shift_v32i8:
990 ; AVX512DQ:       # %bb.0:
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:
1083 ; AVX1:       # %bb.0:
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
1088 ; AVX1-NEXT:    retq
1090 ; AVX2-LABEL: splatconstant_shift_v4i64:
1091 ; AVX2:       # %bb.0:
1092 ; AVX2-NEXT:    vpsllq $7, %ymm0, %ymm0
1093 ; AVX2-NEXT:    retq
1095 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
1096 ; XOPAVX1:       # %bb.0:
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:
1104 ; XOPAVX2:       # %bb.0:
1105 ; XOPAVX2-NEXT:    vpsllq $7, %ymm0, %ymm0
1106 ; XOPAVX2-NEXT:    retq
1108 ; AVX512-LABEL: splatconstant_shift_v4i64:
1109 ; AVX512:       # %bb.0:
1110 ; AVX512-NEXT:    vpsllq $7, %ymm0, %ymm0
1111 ; AVX512-NEXT:    retq
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:
1136 ; AVX1:       # %bb.0:
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
1141 ; AVX1-NEXT:    retq
1143 ; AVX2-LABEL: splatconstant_shift_v8i32:
1144 ; AVX2:       # %bb.0:
1145 ; AVX2-NEXT:    vpslld $5, %ymm0, %ymm0
1146 ; AVX2-NEXT:    retq
1148 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
1149 ; XOPAVX1:       # %bb.0:
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:
1157 ; XOPAVX2:       # %bb.0:
1158 ; XOPAVX2-NEXT:    vpslld $5, %ymm0, %ymm0
1159 ; XOPAVX2-NEXT:    retq
1161 ; AVX512-LABEL: splatconstant_shift_v8i32:
1162 ; AVX512:       # %bb.0:
1163 ; AVX512-NEXT:    vpslld $5, %ymm0, %ymm0
1164 ; AVX512-NEXT:    retq
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:
1189 ; AVX1:       # %bb.0:
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
1194 ; AVX1-NEXT:    retq
1196 ; AVX2-LABEL: splatconstant_shift_v16i16:
1197 ; AVX2:       # %bb.0:
1198 ; AVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
1199 ; AVX2-NEXT:    retq
1201 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
1202 ; XOPAVX1:       # %bb.0:
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:
1210 ; XOPAVX2:       # %bb.0:
1211 ; XOPAVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
1212 ; XOPAVX2-NEXT:    retq
1214 ; AVX512-LABEL: splatconstant_shift_v16i16:
1215 ; AVX512:       # %bb.0:
1216 ; AVX512-NEXT:    vpsllw $3, %ymm0, %ymm0
1217 ; AVX512-NEXT:    retq
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:
1242 ; AVX1:       # %bb.0:
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
1250 ; AVX1-NEXT:    retq
1252 ; AVX2-LABEL: splatconstant_shift_v32i8:
1253 ; AVX2:       # %bb.0:
1254 ; AVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
1255 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1256 ; AVX2-NEXT:    retq
1258 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
1259 ; XOPAVX1:       # %bb.0:
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:
1268 ; XOPAVX2:       # %bb.0:
1269 ; XOPAVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
1270 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1271 ; XOPAVX2-NEXT:    retq
1273 ; AVX512-LABEL: splatconstant_shift_v32i8:
1274 ; AVX512:       # %bb.0:
1275 ; AVX512-NEXT:    vpsllw $3, %ymm0, %ymm0
1276 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1277 ; AVX512-NEXT:    retq
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