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 -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
12 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
13 ; AVX1-LABEL: var_shift_v4i64:
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
28 ; AVX2-LABEL: var_shift_v4i64:
30 ; AVX2-NEXT: vpsllvq %ymm1, %ymm0, %ymm0
33 ; XOPAVX1-LABEL: var_shift_v4i64:
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
42 ; XOPAVX2-LABEL: var_shift_v4i64:
44 ; XOPAVX2-NEXT: vpsllvq %ymm1, %ymm0, %ymm0
47 ; AVX512-LABEL: var_shift_v4i64:
49 ; AVX512-NEXT: vpsllvq %ymm1, %ymm0, %ymm0
51 %shift = shl <4 x i64> %a, %b
55 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
56 ; AVX1-LABEL: var_shift_v8i32:
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
72 ; AVX2-LABEL: var_shift_v8i32:
74 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
77 ; XOPAVX1-LABEL: var_shift_v8i32:
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
86 ; XOPAVX2-LABEL: var_shift_v8i32:
88 ; XOPAVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
91 ; AVX512-LABEL: var_shift_v8i32:
93 ; AVX512-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
95 %shift = shl <8 x i32> %a, %b
99 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
100 ; AVX1-LABEL: var_shift_v16i16:
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
135 ; AVX2-LABEL: var_shift_v16i16:
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 = 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]
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 = 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]
144 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
145 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
146 ; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
149 ; XOPAVX1-LABEL: var_shift_v16i16:
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
158 ; XOPAVX2-LABEL: var_shift_v16i16:
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
167 ; AVX512-LABEL: var_shift_v16i16:
169 ; AVX512-NEXT: # kill: %YMM1<def> %YMM1<kill> %ZMM1<def>
170 ; AVX512-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
171 ; AVX512-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
172 ; AVX512-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
174 %shift = shl <16 x i16> %a, %b
175 ret <16 x i16> %shift
178 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
179 ; AVX1-LABEL: var_shift_v32i8:
181 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
182 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm3
183 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
184 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
185 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
186 ; AVX1-NEXT: vpsllw $5, %xmm5, %xmm5
187 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
188 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm3
189 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
190 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
191 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
192 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
193 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm3
194 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
195 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
196 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm3
197 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
198 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
199 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
200 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm3
201 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
202 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
203 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
204 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm3
205 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
206 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
207 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
210 ; AVX2-LABEL: var_shift_v32i8:
212 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
213 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
214 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
215 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
216 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
217 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
218 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
219 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
220 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
221 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
222 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
225 ; XOPAVX1-LABEL: var_shift_v32i8:
227 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
228 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
229 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm3, %xmm2
230 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0
231 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
234 ; XOPAVX2-LABEL: var_shift_v32i8:
236 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
237 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
238 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm3, %xmm2
239 ; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0
240 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
243 ; AVX512-LABEL: var_shift_v32i8:
245 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
246 ; AVX512-NEXT: vpsllw $4, %ymm0, %ymm2
247 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
248 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
249 ; AVX512-NEXT: vpsllw $2, %ymm0, %ymm2
250 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
251 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
252 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
253 ; AVX512-NEXT: vpaddb %ymm0, %ymm0, %ymm2
254 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
255 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
257 %shift = shl <32 x i8> %a, %b
262 ; Uniform Variable Shifts
265 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
266 ; AVX1-LABEL: splatvar_shift_v4i64:
268 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
269 ; AVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2
270 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
271 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
274 ; AVX2-LABEL: splatvar_shift_v4i64:
276 ; AVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0
279 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
281 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
282 ; XOPAVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2
283 ; XOPAVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
284 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
287 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
289 ; XOPAVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0
292 ; AVX512-LABEL: splatvar_shift_v4i64:
294 ; AVX512-NEXT: vpsllq %xmm1, %ymm0, %ymm0
296 %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
297 %shift = shl <4 x i64> %a, %splat
301 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
302 ; AVX1-LABEL: splatvar_shift_v8i32:
304 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
305 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
306 ; AVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2
307 ; AVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0
308 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
311 ; AVX2-LABEL: splatvar_shift_v8i32:
313 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
314 ; AVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0
317 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
319 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
320 ; XOPAVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
321 ; XOPAVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2
322 ; XOPAVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0
323 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
326 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
328 ; XOPAVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
329 ; XOPAVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0
332 ; AVX512-LABEL: splatvar_shift_v8i32:
334 ; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
335 ; AVX512-NEXT: vpslld %xmm1, %ymm0, %ymm0
337 %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
338 %shift = shl <8 x i32> %a, %splat
342 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
343 ; AVX1-LABEL: splatvar_shift_v16i16:
345 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
346 ; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
347 ; AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
348 ; AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
349 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
352 ; AVX2-LABEL: splatvar_shift_v16i16:
354 ; AVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
355 ; AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
358 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
360 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
361 ; XOPAVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
362 ; XOPAVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
363 ; XOPAVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
364 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
367 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
369 ; XOPAVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
370 ; XOPAVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
373 ; AVX512-LABEL: splatvar_shift_v16i16:
375 ; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
376 ; AVX512-NEXT: vpsllw %xmm1, %ymm0, %ymm0
378 %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
379 %shift = shl <16 x i16> %a, %splat
380 ret <16 x i16> %shift
383 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
384 ; AVX1-LABEL: splatvar_shift_v32i8:
386 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
387 ; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
388 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
389 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm3
390 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
391 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
392 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
393 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm2, %xmm2
394 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm3
395 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
396 ; AVX1-NEXT: vpand %xmm5, %xmm3, %xmm3
397 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm6
398 ; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
399 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm3
400 ; AVX1-NEXT: vpaddb %xmm6, %xmm6, %xmm7
401 ; AVX1-NEXT: vpblendvb %xmm7, %xmm3, %xmm2, %xmm2
402 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm3
403 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
404 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
405 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm1
406 ; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1
407 ; AVX1-NEXT: vpblendvb %xmm6, %xmm1, %xmm0, %xmm0
408 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm1
409 ; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
410 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
413 ; AVX2-LABEL: splatvar_shift_v32i8:
415 ; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1
416 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
417 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
418 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
419 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
420 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
421 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
422 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
423 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
424 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
425 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
426 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
429 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
431 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
432 ; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
433 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
434 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm2, %xmm2
435 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0
436 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
439 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
441 ; XOPAVX2-NEXT: vpbroadcastb %xmm1, %ymm1
442 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
443 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm3
444 ; XOPAVX2-NEXT: vpshlb %xmm3, %xmm2, %xmm2
445 ; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0
446 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
449 ; AVX512-LABEL: splatvar_shift_v32i8:
451 ; AVX512-NEXT: vpbroadcastb %xmm1, %ymm1
452 ; AVX512-NEXT: vpsllw $4, %ymm0, %ymm2
453 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
454 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
455 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
456 ; AVX512-NEXT: vpsllw $2, %ymm0, %ymm2
457 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
458 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
459 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
460 ; AVX512-NEXT: vpaddb %ymm0, %ymm0, %ymm2
461 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
462 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
464 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
465 %shift = shl <32 x i8> %a, %splat
473 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
474 ; AVX1-LABEL: constant_shift_v4i64:
476 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
477 ; AVX1-NEXT: vpsllq $62, %xmm1, %xmm2
478 ; AVX1-NEXT: vpsllq $31, %xmm1, %xmm1
479 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
480 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm2
481 ; AVX1-NEXT: vpsllq $1, %xmm0, %xmm0
482 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
483 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
486 ; AVX2-LABEL: constant_shift_v4i64:
488 ; AVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
491 ; XOPAVX1-LABEL: constant_shift_v4i64:
493 ; XOPAVX1-NEXT: vpshlq {{.*}}(%rip), %xmm0, %xmm1
494 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
495 ; XOPAVX1-NEXT: vpshlq {{.*}}(%rip), %xmm0, %xmm0
496 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
499 ; XOPAVX2-LABEL: constant_shift_v4i64:
501 ; XOPAVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
504 ; AVX512-LABEL: constant_shift_v4i64:
506 ; AVX512-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
508 %shift = shl <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
512 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
513 ; AVX1-LABEL: constant_shift_v8i32:
515 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm1
516 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
517 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0
518 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
521 ; AVX2-LABEL: constant_shift_v8i32:
523 ; AVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
526 ; XOPAVX1-LABEL: constant_shift_v8i32:
528 ; XOPAVX1-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm1
529 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
530 ; XOPAVX1-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm0
531 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
534 ; XOPAVX2-LABEL: constant_shift_v8i32:
536 ; XOPAVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
539 ; AVX512-LABEL: constant_shift_v8i32:
541 ; AVX512-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
543 %shift = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
547 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
548 ; AVX1-LABEL: constant_shift_v16i16:
550 ; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm1
551 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
552 ; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
553 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
556 ; AVX2-LABEL: constant_shift_v16i16:
558 ; AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
561 ; XOPAVX1-LABEL: constant_shift_v16i16:
563 ; XOPAVX1-NEXT: vpshlw {{.*}}(%rip), %xmm0, %xmm1
564 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
565 ; XOPAVX1-NEXT: vpshlw {{.*}}(%rip), %xmm0, %xmm0
566 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
569 ; XOPAVX2-LABEL: constant_shift_v16i16:
571 ; XOPAVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
574 ; AVX512-LABEL: constant_shift_v16i16:
576 ; AVX512-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
577 ; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
578 ; AVX512-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
579 ; AVX512-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
581 %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>
582 ret <16 x i16> %shift
585 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
586 ; AVX1-LABEL: constant_shift_v32i8:
588 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
589 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm2
590 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
591 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
592 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
593 ; AVX1-NEXT: vpsllw $5, %xmm4, %xmm4
594 ; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm1, %xmm1
595 ; AVX1-NEXT: vpsllw $2, %xmm1, %xmm2
596 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
597 ; AVX1-NEXT: vpand %xmm5, %xmm2, %xmm2
598 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm6
599 ; AVX1-NEXT: vpblendvb %xmm6, %xmm2, %xmm1, %xmm1
600 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm2
601 ; AVX1-NEXT: vpaddb %xmm6, %xmm6, %xmm7
602 ; AVX1-NEXT: vpblendvb %xmm7, %xmm2, %xmm1, %xmm1
603 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm2
604 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
605 ; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
606 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm2
607 ; AVX1-NEXT: vpand %xmm5, %xmm2, %xmm2
608 ; AVX1-NEXT: vpblendvb %xmm6, %xmm2, %xmm0, %xmm0
609 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm2
610 ; AVX1-NEXT: vpblendvb %xmm7, %xmm2, %xmm0, %xmm0
611 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
614 ; AVX2-LABEL: constant_shift_v32i8:
616 ; 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]
617 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
618 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
619 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
620 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
621 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
622 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
623 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
624 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
625 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
626 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
627 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
630 ; XOPAVX1-LABEL: constant_shift_v32i8:
632 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
633 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
634 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm1
635 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm0
636 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
639 ; XOPAVX2-LABEL: constant_shift_v32i8:
641 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
642 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
643 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm1, %xmm1
644 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm0, %xmm0
645 ; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
648 ; AVX512-LABEL: constant_shift_v32i8:
650 ; 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]
651 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
652 ; AVX512-NEXT: vpsllw $4, %ymm0, %ymm2
653 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
654 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
655 ; AVX512-NEXT: vpsllw $2, %ymm0, %ymm2
656 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
657 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
658 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
659 ; AVX512-NEXT: vpaddb %ymm0, %ymm0, %ymm2
660 ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
661 ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
663 %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>
668 ; Uniform Constant Shifts
671 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
672 ; AVX1-LABEL: splatconstant_shift_v4i64:
674 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm1
675 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
676 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm0
677 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
680 ; AVX2-LABEL: splatconstant_shift_v4i64:
682 ; AVX2-NEXT: vpsllq $7, %ymm0, %ymm0
685 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
687 ; XOPAVX1-NEXT: vpsllq $7, %xmm0, %xmm1
688 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
689 ; XOPAVX1-NEXT: vpsllq $7, %xmm0, %xmm0
690 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
693 ; XOPAVX2-LABEL: splatconstant_shift_v4i64:
695 ; XOPAVX2-NEXT: vpsllq $7, %ymm0, %ymm0
698 ; AVX512-LABEL: splatconstant_shift_v4i64:
700 ; AVX512-NEXT: vpsllq $7, %ymm0, %ymm0
702 %shift = shl <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
706 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
707 ; AVX1-LABEL: splatconstant_shift_v8i32:
709 ; AVX1-NEXT: vpslld $5, %xmm0, %xmm1
710 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
711 ; AVX1-NEXT: vpslld $5, %xmm0, %xmm0
712 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
715 ; AVX2-LABEL: splatconstant_shift_v8i32:
717 ; AVX2-NEXT: vpslld $5, %ymm0, %ymm0
720 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
722 ; XOPAVX1-NEXT: vpslld $5, %xmm0, %xmm1
723 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
724 ; XOPAVX1-NEXT: vpslld $5, %xmm0, %xmm0
725 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
728 ; XOPAVX2-LABEL: splatconstant_shift_v8i32:
730 ; XOPAVX2-NEXT: vpslld $5, %ymm0, %ymm0
733 ; AVX512-LABEL: splatconstant_shift_v8i32:
735 ; AVX512-NEXT: vpslld $5, %ymm0, %ymm0
737 %shift = shl <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
741 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
742 ; AVX1-LABEL: splatconstant_shift_v16i16:
744 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm1
745 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
746 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
747 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
750 ; AVX2-LABEL: splatconstant_shift_v16i16:
752 ; AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
755 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
757 ; XOPAVX1-NEXT: vpsllw $3, %xmm0, %xmm1
758 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
759 ; XOPAVX1-NEXT: vpsllw $3, %xmm0, %xmm0
760 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
763 ; XOPAVX2-LABEL: splatconstant_shift_v16i16:
765 ; XOPAVX2-NEXT: vpsllw $3, %ymm0, %ymm0
768 ; AVX512-LABEL: splatconstant_shift_v16i16:
770 ; AVX512-NEXT: vpsllw $3, %ymm0, %ymm0
772 %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>
773 ret <16 x i16> %shift
776 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
777 ; AVX1-LABEL: splatconstant_shift_v32i8:
779 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
780 ; AVX1-NEXT: vpsllw $3, %xmm1, %xmm1
781 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
782 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
783 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
784 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
785 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
788 ; AVX2-LABEL: splatconstant_shift_v32i8:
790 ; AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
791 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
794 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
796 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
797 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
798 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm1
799 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm0
800 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
803 ; XOPAVX2-LABEL: splatconstant_shift_v32i8:
805 ; XOPAVX2-NEXT: vpsllw $3, %ymm0, %ymm0
806 ; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
809 ; AVX512-LABEL: splatconstant_shift_v32i8:
811 ; AVX512-NEXT: vpsllw $3, %ymm0, %ymm0
812 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
814 %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>