[X86][SSE] Added tests for insertion of zero elements into vectors
[oota-llvm.git] / test / CodeGen / X86 / vector-shift-shl-256.ll
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-apple-darwin -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
7
8 ;
9 ; Variable Shifts
10 ;
11
12 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
13 ; AVX1-LABEL: var_shift_v4i64:
14 ; AVX1:       # BB#0:
15 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
16 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
17 ; AVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm4
18 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
19 ; AVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm2
20 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
21 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm3
22 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
23 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
24 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
25 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
26 ; AVX1-NEXT:    retq
27 ;
28 ; AVX2-LABEL: var_shift_v4i64:
29 ; AVX2:       # BB#0:
30 ; AVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
31 ; AVX2-NEXT:    retq
32 ;
33 ; XOPAVX1-LABEL: var_shift_v4i64:
34 ; XOPAVX1:       # BB#0:
35 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
36 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
37 ; XOPAVX1-NEXT:    vpshlq %xmm2, %xmm3, %xmm2
38 ; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm0
39 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
40 ; XOPAVX1-NEXT:    retq
41 ;
42 ; XOPAVX2-LABEL: var_shift_v4i64:
43 ; XOPAVX2:       # BB#0:
44 ; XOPAVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
45 ; XOPAVX2-NEXT:    retq
46 ;
47 ; AVX512-LABEL: var_shift_v4i64:
48 ; AVX512:       ## BB#0:
49 ; AVX512-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
50 ; AVX512-NEXT:    retq
51   %shift = shl <4 x i64> %a, %b
52   ret <4 x i64> %shift
53 }
54
55 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
56 ; AVX1-LABEL: var_shift_v8i32:
57 ; AVX1:       # BB#0:
58 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
59 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
60 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
61 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
62 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
63 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
64 ; AVX1-NEXT:    vpmulld %xmm4, %xmm2, %xmm2
65 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
66 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
67 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
68 ; AVX1-NEXT:    vpmulld %xmm0, %xmm1, %xmm0
69 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
70 ; AVX1-NEXT:    retq
71 ;
72 ; AVX2-LABEL: var_shift_v8i32:
73 ; AVX2:       # BB#0:
74 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
75 ; AVX2-NEXT:    retq
76 ;
77 ; XOPAVX1-LABEL: var_shift_v8i32:
78 ; XOPAVX1:       # BB#0:
79 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
80 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
81 ; XOPAVX1-NEXT:    vpshld %xmm2, %xmm3, %xmm2
82 ; XOPAVX1-NEXT:    vpshld %xmm1, %xmm0, %xmm0
83 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
84 ; XOPAVX1-NEXT:    retq
85 ;
86 ; XOPAVX2-LABEL: var_shift_v8i32:
87 ; XOPAVX2:       # BB#0:
88 ; XOPAVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
89 ; XOPAVX2-NEXT:    retq
90 ;
91 ; AVX512-LABEL: var_shift_v8i32:
92 ; AVX512:       ## BB#0:
93 ; AVX512-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
94 ; AVX512-NEXT:    retq
95   %shift = shl <8 x i32> %a, %b
96   ret <8 x i32> %shift
97 }
98
99 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
100 ; AVX1-LABEL: var_shift_v16i16:
101 ; AVX1:       # BB#0:
102 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
103 ; AVX1-NEXT:    vpsllw $12, %xmm2, %xmm3
104 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
105 ; AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2
106 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm3
107 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
108 ; AVX1-NEXT:    vpsllw $8, %xmm4, %xmm5
109 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
110 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm4
111 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
112 ; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm4
113 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
114 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
115 ; AVX1-NEXT:    vpsllw $1, %xmm2, %xmm4
116 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
117 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
118 ; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm3
119 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
120 ; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
121 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm3
122 ; AVX1-NEXT:    vpsllw $8, %xmm0, %xmm4
123 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
124 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm1
125 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
126 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm1
127 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
128 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
129 ; AVX1-NEXT:    vpsllw $1, %xmm0, %xmm1
130 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
131 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
132 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
133 ; AVX1-NEXT:    retq
134 ;
135 ; AVX2-LABEL: var_shift_v16i16:
136 ; AVX2:       # BB#0:
137 ; AVX2-NEXT:    vpxor %ymm2, %ymm2, %ymm2
138 ; 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]
139 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
140 ; AVX2-NEXT:    vpsllvd %ymm3, %ymm4, %ymm3
141 ; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
142 ; 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]
143 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
144 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
145 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
146 ; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
147 ; AVX2-NEXT:    retq
148 ;
149 ; XOPAVX1-LABEL: var_shift_v16i16:
150 ; XOPAVX1:       # BB#0:
151 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
152 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
153 ; XOPAVX1-NEXT:    vpshlw %xmm2, %xmm3, %xmm2
154 ; XOPAVX1-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
155 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
156 ; XOPAVX1-NEXT:    retq
157 ;
158 ; XOPAVX2-LABEL: var_shift_v16i16:
159 ; XOPAVX2:       # BB#0:
160 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
161 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
162 ; XOPAVX2-NEXT:    vpshlw %xmm2, %xmm3, %xmm2
163 ; XOPAVX2-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
164 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
165 ; XOPAVX2-NEXT:    retq
166 ;
167 ; AVX512-LABEL: var_shift_v16i16:
168 ; AVX512:       ## BB#0:
169 ; AVX512-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
170 ; AVX512-NEXT:    retq
171   %shift = shl <16 x i16> %a, %b
172   ret <16 x i16> %shift
173 }
174
175 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
176 ; AVX1-LABEL: var_shift_v32i8:
177 ; AVX1:       # BB#0:
178 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
179 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm3
180 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
181 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
182 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
183 ; AVX1-NEXT:    vpsllw $5, %xmm5, %xmm5
184 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
185 ; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm3
186 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
187 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
188 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
189 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
190 ; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm3
191 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
192 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
193 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm3
194 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
195 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
196 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
197 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm3
198 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
199 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
200 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
201 ; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm3
202 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
203 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
204 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
205 ; AVX1-NEXT:    retq
206 ;
207 ; AVX2-LABEL: var_shift_v32i8:
208 ; AVX2:       # BB#0:
209 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
210 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm2
211 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
212 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
213 ; AVX2-NEXT:    vpsllw $2, %ymm0, %ymm2
214 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
215 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
216 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
217 ; AVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
218 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
219 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
220 ; AVX2-NEXT:    retq
221 ;
222 ; XOPAVX1-LABEL: var_shift_v32i8:
223 ; XOPAVX1:       # BB#0:
224 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
225 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
226 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm3, %xmm2
227 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
228 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
229 ; XOPAVX1-NEXT:    retq
230 ;
231 ; XOPAVX2-LABEL: var_shift_v32i8:
232 ; XOPAVX2:       # BB#0:
233 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
234 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
235 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm3, %xmm2
236 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
237 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
238 ; XOPAVX2-NEXT:    retq
239 ;
240 ; AVX512-LABEL: var_shift_v32i8:
241 ; AVX512:       ## BB#0:
242 ; AVX512-NEXT:    vpsllw $5, %ymm1, %ymm1
243 ; AVX512-NEXT:    vpsllw $4, %ymm0, %ymm2
244 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
245 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
246 ; AVX512-NEXT:    vpsllw $2, %ymm0, %ymm2
247 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
248 ; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
249 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
250 ; AVX512-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
251 ; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
252 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
253 ; AVX512-NEXT:    retq
254   %shift = shl <32 x i8> %a, %b
255   ret <32 x i8> %shift
256 }
257
258 ;
259 ; Uniform Variable Shifts
260 ;
261
262 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
263 ; AVX1-LABEL: splatvar_shift_v4i64:
264 ; AVX1:       # BB#0:
265 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
266 ; AVX1-NEXT:    vpsllq %xmm1, %xmm2, %xmm2
267 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
268 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
269 ; AVX1-NEXT:    retq
270 ;
271 ; AVX2-LABEL: splatvar_shift_v4i64:
272 ; AVX2:       # BB#0:
273 ; AVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
274 ; AVX2-NEXT:    retq
275 ;
276 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
277 ; XOPAVX1:       # BB#0:
278 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
279 ; XOPAVX1-NEXT:    vpsllq %xmm1, %xmm2, %xmm2
280 ; XOPAVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
281 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
282 ; XOPAVX1-NEXT:    retq
283 ;
284 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
285 ; XOPAVX2:       # BB#0:
286 ; XOPAVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
287 ; XOPAVX2-NEXT:    retq
288 ;
289 ; AVX512-LABEL: splatvar_shift_v4i64:
290 ; AVX512:       ## BB#0:
291 ; AVX512-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
292 ; AVX512-NEXT:    retq
293   %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
294   %shift = shl <4 x i64> %a, %splat
295   ret <4 x i64> %shift
296 }
297
298 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
299 ; AVX1-LABEL: splatvar_shift_v8i32:
300 ; AVX1:       # BB#0:
301 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
302 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
303 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
304 ; AVX1-NEXT:    vpslld %xmm1, %xmm2, %xmm2
305 ; AVX1-NEXT:    vpslld %xmm1, %xmm0, %xmm0
306 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
307 ; AVX1-NEXT:    retq
308 ;
309 ; AVX2-LABEL: splatvar_shift_v8i32:
310 ; AVX2:       # BB#0:
311 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
312 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
313 ; AVX2-NEXT:    vpslld %xmm1, %ymm0, %ymm0
314 ; AVX2-NEXT:    retq
315 ;
316 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
317 ; XOPAVX1:       # BB#0:
318 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
319 ; XOPAVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
320 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
321 ; XOPAVX1-NEXT:    vpslld %xmm1, %xmm2, %xmm2
322 ; XOPAVX1-NEXT:    vpslld %xmm1, %xmm0, %xmm0
323 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
324 ; XOPAVX1-NEXT:    retq
325 ;
326 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
327 ; XOPAVX2:       # BB#0:
328 ; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
329 ; XOPAVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
330 ; XOPAVX2-NEXT:    vpslld %xmm1, %ymm0, %ymm0
331 ; XOPAVX2-NEXT:    retq
332 ;
333 ; AVX512-LABEL: splatvar_shift_v8i32:
334 ; AVX512:       ## BB#0:
335 ; AVX512-NEXT:    vxorps %xmm2, %xmm2, %xmm2
336 ; AVX512-NEXT:    vmovss %xmm1, %xmm2, %xmm1
337 ; AVX512-NEXT:    vpslld %xmm1, %ymm0, %ymm0
338 ; AVX512-NEXT:    retq
339   %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
340   %shift = shl <8 x i32> %a, %splat
341   ret <8 x i32> %shift
342 }
343
344 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
345 ; AVX1-LABEL: splatvar_shift_v16i16:
346 ; AVX1:       # BB#0:
347 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
348 ; AVX1-NEXT:    vmovd %xmm1, %eax
349 ; AVX1-NEXT:    movzwl %ax, %eax
350 ; AVX1-NEXT:    vmovd %eax, %xmm1
351 ; AVX1-NEXT:    vpsllw %xmm1, %xmm2, %xmm2
352 ; AVX1-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
353 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
354 ; AVX1-NEXT:    retq
355 ;
356 ; AVX2-LABEL: splatvar_shift_v16i16:
357 ; AVX2:       # BB#0:
358 ; AVX2-NEXT:    vmovd %xmm1, %eax
359 ; AVX2-NEXT:    movzwl %ax, %eax
360 ; AVX2-NEXT:    vmovd %eax, %xmm1
361 ; AVX2-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
362 ; AVX2-NEXT:    retq
363 ;
364 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
365 ; XOPAVX1:       # BB#0:
366 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
367 ; XOPAVX1-NEXT:    vmovd %xmm1, %eax
368 ; XOPAVX1-NEXT:    movzwl %ax, %eax
369 ; XOPAVX1-NEXT:    vmovd %eax, %xmm1
370 ; XOPAVX1-NEXT:    vpsllw %xmm1, %xmm2, %xmm2
371 ; XOPAVX1-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
372 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
373 ; XOPAVX1-NEXT:    retq
374 ;
375 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
376 ; XOPAVX2:       # BB#0:
377 ; XOPAVX2-NEXT:    vmovd %xmm1, %eax
378 ; XOPAVX2-NEXT:    movzwl %ax, %eax
379 ; XOPAVX2-NEXT:    vmovd %eax, %xmm1
380 ; XOPAVX2-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
381 ; XOPAVX2-NEXT:    retq
382 ;
383 ; AVX512-LABEL: splatvar_shift_v16i16:
384 ; AVX512:       ## BB#0:
385 ; AVX512-NEXT:    vmovd %xmm1, %eax
386 ; AVX512-NEXT:    movzwl %ax, %eax
387 ; AVX512-NEXT:    vmovd %eax, %xmm1
388 ; AVX512-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
389 ; AVX512-NEXT:    retq
390   %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
391   %shift = shl <16 x i16> %a, %splat
392   ret <16 x i16> %shift
393 }
394
395 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
396 ; AVX1-LABEL: splatvar_shift_v32i8:
397 ; AVX1:       # BB#0:
398 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
399 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
400 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
401 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm3
402 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
403 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
404 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
405 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm2, %xmm2
406 ; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm3
407 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
408 ; AVX1-NEXT:    vpand %xmm5, %xmm3, %xmm3
409 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm6
410 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
411 ; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm3
412 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm7
413 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm3, %xmm2, %xmm2
414 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm3
415 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
416 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
417 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm1
418 ; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
419 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm1, %xmm0, %xmm0
420 ; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm1
421 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
422 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
423 ; AVX1-NEXT:    retq
424 ;
425 ; AVX2-LABEL: splatvar_shift_v32i8:
426 ; AVX2:       # BB#0:
427 ; AVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
428 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm2
429 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
430 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
431 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
432 ; AVX2-NEXT:    vpsllw $2, %ymm0, %ymm2
433 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
434 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
435 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
436 ; AVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
437 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
438 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
439 ; AVX2-NEXT:    retq
440 ;
441 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
442 ; XOPAVX1:       # BB#0:
443 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
444 ; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
445 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
446 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm2, %xmm2
447 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
448 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
449 ; XOPAVX1-NEXT:    retq
450 ;
451 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
452 ; XOPAVX2:       # BB#0:
453 ; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
454 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
455 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
456 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
457 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
458 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
459 ; XOPAVX2-NEXT:    retq
460 ;
461 ; AVX512-LABEL: splatvar_shift_v32i8:
462 ; AVX512:       ## BB#0:
463 ; AVX512-NEXT:    vpbroadcastb %xmm1, %ymm1
464 ; AVX512-NEXT:    vpsllw $4, %ymm0, %ymm2
465 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
466 ; AVX512-NEXT:    vpsllw $5, %ymm1, %ymm1
467 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
468 ; AVX512-NEXT:    vpsllw $2, %ymm0, %ymm2
469 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
470 ; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
471 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
472 ; AVX512-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
473 ; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
474 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
475 ; AVX512-NEXT:    retq
476   %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
477   %shift = shl <32 x i8> %a, %splat
478   ret <32 x i8> %shift
479 }
480
481 ;
482 ; Constant Shifts
483 ;
484
485 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
486 ; AVX1-LABEL: constant_shift_v4i64:
487 ; AVX1:       # BB#0:
488 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
489 ; AVX1-NEXT:    vpsllq $62, %xmm1, %xmm2
490 ; AVX1-NEXT:    vpsllq $31, %xmm1, %xmm1
491 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
492 ; AVX1-NEXT:    vpsllq $7, %xmm0, %xmm2
493 ; AVX1-NEXT:    vpsllq $1, %xmm0, %xmm0
494 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
495 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
496 ; AVX1-NEXT:    retq
497 ;
498 ; AVX2-LABEL: constant_shift_v4i64:
499 ; AVX2:       # BB#0:
500 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
501 ; AVX2-NEXT:    retq
502 ;
503 ; XOPAVX1-LABEL: constant_shift_v4i64:
504 ; XOPAVX1:       # BB#0:
505 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm1
506 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
507 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm0
508 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
509 ; XOPAVX1-NEXT:    retq
510 ;
511 ; XOPAVX2-LABEL: constant_shift_v4i64:
512 ; XOPAVX2:       # BB#0:
513 ; XOPAVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
514 ; XOPAVX2-NEXT:    retq
515 ;
516 ; AVX512-LABEL: constant_shift_v4i64:
517 ; AVX512:       ## BB#0:
518 ; AVX512-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
519 ; AVX512-NEXT:    retq
520   %shift = shl <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
521   ret <4 x i64> %shift
522 }
523
524 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
525 ; AVX1-LABEL: constant_shift_v8i32:
526 ; AVX1:       # BB#0:
527 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm1
528 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
529 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
530 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
531 ; AVX1-NEXT:    retq
532 ;
533 ; AVX2-LABEL: constant_shift_v8i32:
534 ; AVX2:       # BB#0:
535 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
536 ; AVX2-NEXT:    retq
537 ;
538 ; XOPAVX1-LABEL: constant_shift_v8i32:
539 ; XOPAVX1:       # BB#0:
540 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm1
541 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
542 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
543 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
544 ; XOPAVX1-NEXT:    retq
545 ;
546 ; XOPAVX2-LABEL: constant_shift_v8i32:
547 ; XOPAVX2:       # BB#0:
548 ; XOPAVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
549 ; XOPAVX2-NEXT:    retq
550 ;
551 ; AVX512-LABEL: constant_shift_v8i32:
552 ; AVX512:       ## BB#0:
553 ; AVX512-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
554 ; AVX512-NEXT:    retq
555   %shift = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
556   ret <8 x i32> %shift
557 }
558
559 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
560 ; AVX1-LABEL: constant_shift_v16i16:
561 ; AVX1:       # BB#0:
562 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm1
563 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
564 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
565 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
566 ; AVX1-NEXT:    retq
567 ;
568 ; AVX2-LABEL: constant_shift_v16i16:
569 ; AVX2:       # BB#0:
570 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
571 ; AVX2-NEXT:    retq
572 ;
573 ; XOPAVX1-LABEL: constant_shift_v16i16:
574 ; XOPAVX1:       # BB#0:
575 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm0, %xmm1
576 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
577 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm0, %xmm0
578 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
579 ; XOPAVX1-NEXT:    retq
580 ;
581 ; XOPAVX2-LABEL: constant_shift_v16i16:
582 ; XOPAVX2:       # BB#0:
583 ; XOPAVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
584 ; XOPAVX2-NEXT:    retq
585 ;
586 ; AVX512-LABEL: constant_shift_v16i16:
587 ; AVX512:       ## BB#0:
588 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
589 ; AVX512-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
590 ; AVX512-NEXT:    retq
591   %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>
592   ret <16 x i16> %shift
593 }
594
595 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
596 ; AVX1-LABEL: constant_shift_v32i8:
597 ; AVX1:       # BB#0:
598 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
599 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm2
600 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
601 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
602 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
603 ; AVX1-NEXT:    vpsllw $5, %xmm4, %xmm4
604 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm1, %xmm1
605 ; AVX1-NEXT:    vpsllw $2, %xmm1, %xmm2
606 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
607 ; AVX1-NEXT:    vpand %xmm5, %xmm2, %xmm2
608 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm6
609 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm2, %xmm1, %xmm1
610 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm2
611 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm7
612 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm2, %xmm1, %xmm1
613 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm2
614 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
615 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
616 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm2
617 ; AVX1-NEXT:    vpand %xmm5, %xmm2, %xmm2
618 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm2, %xmm0, %xmm0
619 ; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm2
620 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm2, %xmm0, %xmm0
621 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
622 ; AVX1-NEXT:    retq
623 ;
624 ; AVX2-LABEL: constant_shift_v32i8:
625 ; AVX2:       # BB#0:
626 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
627 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
628 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm2
629 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
630 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
631 ; AVX2-NEXT:    vpsllw $2, %ymm0, %ymm2
632 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
633 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
634 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
635 ; AVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
636 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
637 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
638 ; AVX2-NEXT:    retq
639 ;
640 ; XOPAVX1-LABEL: constant_shift_v32i8:
641 ; XOPAVX1:       # BB#0:
642 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
643 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
644 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm1, %xmm1
645 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
646 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
647 ; XOPAVX1-NEXT:    retq
648 ;
649 ; XOPAVX2-LABEL: constant_shift_v32i8:
650 ; XOPAVX2:       # BB#0:
651 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
652 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
653 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm1, %xmm1
654 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
655 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
656 ; XOPAVX2-NEXT:    retq
657 ;
658 ; AVX512-LABEL: constant_shift_v32i8:
659 ; AVX512:       ## BB#0:
660 ; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
661 ; AVX512-NEXT:    vpsllw $5, %ymm1, %ymm1
662 ; AVX512-NEXT:    vpsllw $4, %ymm0, %ymm2
663 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
664 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
665 ; AVX512-NEXT:    vpsllw $2, %ymm0, %ymm2
666 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
667 ; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
668 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
669 ; AVX512-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
670 ; AVX512-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
671 ; AVX512-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
672 ; AVX512-NEXT:    retq
673   %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>
674   ret <32 x i8> %shift
675 }
676
677 ;
678 ; Uniform Constant Shifts
679 ;
680
681 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
682 ; AVX1-LABEL: splatconstant_shift_v4i64:
683 ; AVX1:       # BB#0:
684 ; AVX1-NEXT:    vpsllq $7, %xmm0, %xmm1
685 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
686 ; AVX1-NEXT:    vpsllq $7, %xmm0, %xmm0
687 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
688 ; AVX1-NEXT:    retq
689 ;
690 ; AVX2-LABEL: splatconstant_shift_v4i64:
691 ; AVX2:       # BB#0:
692 ; AVX2-NEXT:    vpsllq $7, %ymm0, %ymm0
693 ; AVX2-NEXT:    retq
694 ;
695 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
696 ; XOPAVX1:       # BB#0:
697 ; XOPAVX1-NEXT:    vpsllq $7, %xmm0, %xmm1
698 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
699 ; XOPAVX1-NEXT:    vpsllq $7, %xmm0, %xmm0
700 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
701 ; XOPAVX1-NEXT:    retq
702 ;
703 ; XOPAVX2-LABEL: splatconstant_shift_v4i64:
704 ; XOPAVX2:       # BB#0:
705 ; XOPAVX2-NEXT:    vpsllq $7, %ymm0, %ymm0
706 ; XOPAVX2-NEXT:    retq
707 ;
708 ; AVX512-LABEL: splatconstant_shift_v4i64:
709 ; AVX512:       ## BB#0:
710 ; AVX512-NEXT:    vpsllq $7, %ymm0, %ymm0
711 ; AVX512-NEXT:    retq
712   %shift = shl <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
713   ret <4 x i64> %shift
714 }
715
716 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
717 ; AVX1-LABEL: splatconstant_shift_v8i32:
718 ; AVX1:       # BB#0:
719 ; AVX1-NEXT:    vpslld $5, %xmm0, %xmm1
720 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
721 ; AVX1-NEXT:    vpslld $5, %xmm0, %xmm0
722 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
723 ; AVX1-NEXT:    retq
724 ;
725 ; AVX2-LABEL: splatconstant_shift_v8i32:
726 ; AVX2:       # BB#0:
727 ; AVX2-NEXT:    vpslld $5, %ymm0, %ymm0
728 ; AVX2-NEXT:    retq
729 ;
730 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
731 ; XOPAVX1:       # BB#0:
732 ; XOPAVX1-NEXT:    vpslld $5, %xmm0, %xmm1
733 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
734 ; XOPAVX1-NEXT:    vpslld $5, %xmm0, %xmm0
735 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
736 ; XOPAVX1-NEXT:    retq
737 ;
738 ; XOPAVX2-LABEL: splatconstant_shift_v8i32:
739 ; XOPAVX2:       # BB#0:
740 ; XOPAVX2-NEXT:    vpslld $5, %ymm0, %ymm0
741 ; XOPAVX2-NEXT:    retq
742 ;
743 ; AVX512-LABEL: splatconstant_shift_v8i32:
744 ; AVX512:       ## BB#0:
745 ; AVX512-NEXT:    vpslld $5, %ymm0, %ymm0
746 ; AVX512-NEXT:    retq
747   %shift = shl <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
748   ret <8 x i32> %shift
749 }
750
751 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
752 ; AVX1-LABEL: splatconstant_shift_v16i16:
753 ; AVX1:       # BB#0:
754 ; AVX1-NEXT:    vpsllw $3, %xmm0, %xmm1
755 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
756 ; AVX1-NEXT:    vpsllw $3, %xmm0, %xmm0
757 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
758 ; AVX1-NEXT:    retq
759 ;
760 ; AVX2-LABEL: splatconstant_shift_v16i16:
761 ; AVX2:       # BB#0:
762 ; AVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
763 ; AVX2-NEXT:    retq
764 ;
765 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
766 ; XOPAVX1:       # BB#0:
767 ; XOPAVX1-NEXT:    vpsllw $3, %xmm0, %xmm1
768 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
769 ; XOPAVX1-NEXT:    vpsllw $3, %xmm0, %xmm0
770 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
771 ; XOPAVX1-NEXT:    retq
772 ;
773 ; XOPAVX2-LABEL: splatconstant_shift_v16i16:
774 ; XOPAVX2:       # BB#0:
775 ; XOPAVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
776 ; XOPAVX2-NEXT:    retq
777 ;
778 ; AVX512-LABEL: splatconstant_shift_v16i16:
779 ; AVX512:       ## BB#0:
780 ; AVX512-NEXT:    vpsllw $3, %ymm0, %ymm0
781 ; AVX512-NEXT:    retq
782   %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>
783   ret <16 x i16> %shift
784 }
785
786 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
787 ; AVX1-LABEL: splatconstant_shift_v32i8:
788 ; AVX1:       # BB#0:
789 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
790 ; AVX1-NEXT:    vpsllw $3, %xmm1, %xmm1
791 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
792 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
793 ; AVX1-NEXT:    vpsllw $3, %xmm0, %xmm0
794 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
795 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
796 ; AVX1-NEXT:    retq
797 ;
798 ; AVX2-LABEL: splatconstant_shift_v32i8:
799 ; AVX2:       # BB#0:
800 ; AVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
801 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
802 ; AVX2-NEXT:    retq
803 ;
804 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
805 ; XOPAVX1:       # BB#0:
806 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
807 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
808 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm1, %xmm1
809 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
810 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
811 ; XOPAVX1-NEXT:    retq
812 ;
813 ; XOPAVX2-LABEL: splatconstant_shift_v32i8:
814 ; XOPAVX2:       # BB#0:
815 ; XOPAVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
816 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
817 ; XOPAVX2-NEXT:    retq
818 ;
819 ; AVX512-LABEL: splatconstant_shift_v32i8:
820 ; AVX512:       ## BB#0:
821 ; AVX512-NEXT:    vpsllw $3, %ymm0, %ymm0
822 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
823 ; AVX512-NEXT:    retq
824   %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>
825   ret <32 x i8> %shift
826 }