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
11 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
12 ; AVX1-LABEL: var_shift_v4i64:
14 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
15 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
16 ; AVX1-NEXT: vpsllq %xmm2, %xmm3, %xmm4
17 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
18 ; AVX1-NEXT: vpsllq %xmm2, %xmm3, %xmm2
19 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
20 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm3
21 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
22 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
23 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
24 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
27 ; AVX2-LABEL: var_shift_v4i64:
29 ; AVX2-NEXT: vpsllvq %ymm1, %ymm0, %ymm0
32 ; XOPAVX1-LABEL: var_shift_v4i64:
34 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
35 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
36 ; XOPAVX1-NEXT: vpshlq %xmm2, %xmm3, %xmm2
37 ; XOPAVX1-NEXT: vpshlq %xmm1, %xmm0, %xmm0
38 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
41 ; XOPAVX2-LABEL: var_shift_v4i64:
43 ; XOPAVX2-NEXT: vpsllvq %ymm1, %ymm0, %ymm0
45 %shift = shl <4 x i64> %a, %b
49 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
50 ; AVX1-LABEL: var_shift_v8i32:
52 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
53 ; AVX1-NEXT: vpslld $23, %xmm2, %xmm2
54 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
55 ; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2
56 ; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2
57 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
58 ; AVX1-NEXT: vpmulld %xmm4, %xmm2, %xmm2
59 ; AVX1-NEXT: vpslld $23, %xmm1, %xmm1
60 ; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1
61 ; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1
62 ; AVX1-NEXT: vpmulld %xmm0, %xmm1, %xmm0
63 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
66 ; AVX2-LABEL: var_shift_v8i32:
68 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
71 ; XOPAVX1-LABEL: var_shift_v8i32:
73 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
74 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
75 ; XOPAVX1-NEXT: vpshld %xmm2, %xmm3, %xmm2
76 ; XOPAVX1-NEXT: vpshld %xmm1, %xmm0, %xmm0
77 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
80 ; XOPAVX2-LABEL: var_shift_v8i32:
82 ; XOPAVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
84 %shift = shl <8 x i32> %a, %b
88 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
89 ; AVX1-LABEL: var_shift_v16i16:
91 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
92 ; AVX1-NEXT: vpsllw $12, %xmm2, %xmm3
93 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm2
94 ; AVX1-NEXT: vpor %xmm3, %xmm2, %xmm2
95 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm3
96 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
97 ; AVX1-NEXT: vpsllw $8, %xmm4, %xmm5
98 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
99 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm4
100 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
101 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm4
102 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
103 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
104 ; AVX1-NEXT: vpsllw $1, %xmm2, %xmm4
105 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
106 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
107 ; AVX1-NEXT: vpsllw $12, %xmm1, %xmm3
108 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1
109 ; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1
110 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm3
111 ; AVX1-NEXT: vpsllw $8, %xmm0, %xmm4
112 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
113 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm1
114 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
115 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm1
116 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
117 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
118 ; AVX1-NEXT: vpsllw $1, %xmm0, %xmm1
119 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
120 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
121 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
124 ; AVX2-LABEL: var_shift_v16i16:
126 ; AVX2-NEXT: vpxor %ymm2, %ymm2, %ymm2
127 ; 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]
128 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
129 ; AVX2-NEXT: vpsllvd %ymm3, %ymm4, %ymm3
130 ; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3
131 ; 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]
132 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
133 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
134 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
135 ; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
138 ; XOPAVX1-LABEL: var_shift_v16i16:
140 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
141 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
142 ; XOPAVX1-NEXT: vpshlw %xmm2, %xmm3, %xmm2
143 ; XOPAVX1-NEXT: vpshlw %xmm1, %xmm0, %xmm0
144 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
147 ; XOPAVX2-LABEL: var_shift_v16i16:
149 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
150 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
151 ; XOPAVX2-NEXT: vpshlw %xmm2, %xmm3, %xmm2
152 ; XOPAVX2-NEXT: vpshlw %xmm1, %xmm0, %xmm0
153 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
155 %shift = shl <16 x i16> %a, %b
156 ret <16 x i16> %shift
159 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
160 ; AVX1-LABEL: var_shift_v32i8:
162 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
163 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm3
164 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
165 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
166 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
167 ; AVX1-NEXT: vpsllw $5, %xmm5, %xmm5
168 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
169 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm3
170 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
171 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
172 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
173 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
174 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm3
175 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
176 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
177 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm3
178 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
179 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
180 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
181 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm3
182 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
183 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
184 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
185 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm3
186 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
187 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
188 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
191 ; AVX2-LABEL: var_shift_v32i8:
193 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
194 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
195 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
196 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
197 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
198 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
199 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
200 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
201 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
202 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
203 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
206 ; XOPAVX1-LABEL: var_shift_v32i8:
208 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
209 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
210 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm3, %xmm2
211 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0
212 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
215 ; XOPAVX2-LABEL: var_shift_v32i8:
217 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
218 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
219 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm3, %xmm2
220 ; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0
221 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
223 %shift = shl <32 x i8> %a, %b
228 ; Uniform Variable Shifts
231 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
232 ; AVX1-LABEL: splatvar_shift_v4i64:
234 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
235 ; AVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2
236 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
237 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
240 ; AVX2-LABEL: splatvar_shift_v4i64:
242 ; AVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0
245 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
247 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
248 ; XOPAVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2
249 ; XOPAVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
250 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
253 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
255 ; XOPAVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0
257 %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
258 %shift = shl <4 x i64> %a, %splat
262 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
263 ; AVX1-LABEL: splatvar_shift_v8i32:
265 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
266 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
267 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
268 ; AVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2
269 ; AVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0
270 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
273 ; AVX2-LABEL: splatvar_shift_v8i32:
275 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
276 ; AVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
277 ; AVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0
280 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
282 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
283 ; XOPAVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
284 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
285 ; XOPAVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2
286 ; XOPAVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0
287 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
290 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
292 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
293 ; XOPAVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
294 ; XOPAVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0
296 %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
297 %shift = shl <8 x i32> %a, %splat
301 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
302 ; AVX1-LABEL: splatvar_shift_v16i16:
304 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
305 ; AVX1-NEXT: vmovd %xmm1, %eax
306 ; AVX1-NEXT: movzwl %ax, %eax
307 ; AVX1-NEXT: vmovd %eax, %xmm1
308 ; AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
309 ; AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
310 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
313 ; AVX2-LABEL: splatvar_shift_v16i16:
315 ; AVX2-NEXT: vmovd %xmm1, %eax
316 ; AVX2-NEXT: movzwl %ax, %eax
317 ; AVX2-NEXT: vmovd %eax, %xmm1
318 ; AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
321 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
323 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
324 ; XOPAVX1-NEXT: vmovd %xmm1, %eax
325 ; XOPAVX1-NEXT: movzwl %ax, %eax
326 ; XOPAVX1-NEXT: vmovd %eax, %xmm1
327 ; XOPAVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
328 ; XOPAVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
329 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
332 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
334 ; XOPAVX2-NEXT: vmovd %xmm1, %eax
335 ; XOPAVX2-NEXT: movzwl %ax, %eax
336 ; XOPAVX2-NEXT: vmovd %eax, %xmm1
337 ; XOPAVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
339 %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
340 %shift = shl <16 x i16> %a, %splat
341 ret <16 x i16> %shift
344 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
345 ; AVX1-LABEL: splatvar_shift_v32i8:
347 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
348 ; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
349 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
350 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm3
351 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
352 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
353 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
354 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm2, %xmm2
355 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm3
356 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
357 ; AVX1-NEXT: vpand %xmm5, %xmm3, %xmm3
358 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm6
359 ; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
360 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm3
361 ; AVX1-NEXT: vpaddb %xmm6, %xmm6, %xmm7
362 ; AVX1-NEXT: vpblendvb %xmm7, %xmm3, %xmm2, %xmm2
363 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm3
364 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
365 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
366 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm1
367 ; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1
368 ; AVX1-NEXT: vpblendvb %xmm6, %xmm1, %xmm0, %xmm0
369 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm1
370 ; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
371 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
374 ; AVX2-LABEL: splatvar_shift_v32i8:
376 ; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1
377 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
378 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
379 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
380 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
381 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
382 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
383 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
384 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
385 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
386 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
387 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
390 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
392 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
393 ; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
394 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
395 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm2, %xmm2
396 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0
397 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
400 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
402 ; XOPAVX2-NEXT: vpbroadcastb %xmm1, %ymm1
403 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
404 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm3
405 ; XOPAVX2-NEXT: vpshlb %xmm3, %xmm2, %xmm2
406 ; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0
407 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
409 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
410 %shift = shl <32 x i8> %a, %splat
418 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
419 ; AVX1-LABEL: constant_shift_v4i64:
421 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
422 ; AVX1-NEXT: vpsllq $62, %xmm1, %xmm2
423 ; AVX1-NEXT: vpsllq $31, %xmm1, %xmm1
424 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
425 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm2
426 ; AVX1-NEXT: vpsllq $1, %xmm0, %xmm0
427 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
428 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
431 ; AVX2-LABEL: constant_shift_v4i64:
433 ; AVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
436 ; XOPAVX1-LABEL: constant_shift_v4i64:
438 ; XOPAVX1-NEXT: vpshlq {{.*}}(%rip), %xmm0, %xmm1
439 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
440 ; XOPAVX1-NEXT: vpshlq {{.*}}(%rip), %xmm0, %xmm0
441 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
444 ; XOPAVX2-LABEL: constant_shift_v4i64:
446 ; XOPAVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
448 %shift = shl <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
452 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
453 ; AVX1-LABEL: constant_shift_v8i32:
455 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm1
456 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
457 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0
458 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
461 ; AVX2-LABEL: constant_shift_v8i32:
463 ; AVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
466 ; XOPAVX1-LABEL: constant_shift_v8i32:
468 ; XOPAVX1-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm1
469 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
470 ; XOPAVX1-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm0
471 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
474 ; XOPAVX2-LABEL: constant_shift_v8i32:
476 ; XOPAVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
478 %shift = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
482 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
483 ; AVX1-LABEL: constant_shift_v16i16:
485 ; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm1
486 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
487 ; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
488 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
491 ; AVX2-LABEL: constant_shift_v16i16:
493 ; AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
496 ; XOPAVX1-LABEL: constant_shift_v16i16:
498 ; XOPAVX1-NEXT: vpshlw {{.*}}(%rip), %xmm0, %xmm1
499 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
500 ; XOPAVX1-NEXT: vpshlw {{.*}}(%rip), %xmm0, %xmm0
501 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
504 ; XOPAVX2-LABEL: constant_shift_v16i16:
506 ; XOPAVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
508 %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>
509 ret <16 x i16> %shift
512 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
513 ; AVX1-LABEL: constant_shift_v32i8:
515 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
516 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm2
517 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
518 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
519 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
520 ; AVX1-NEXT: vpsllw $5, %xmm4, %xmm4
521 ; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm1, %xmm1
522 ; AVX1-NEXT: vpsllw $2, %xmm1, %xmm2
523 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
524 ; AVX1-NEXT: vpand %xmm5, %xmm2, %xmm2
525 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm6
526 ; AVX1-NEXT: vpblendvb %xmm6, %xmm2, %xmm1, %xmm1
527 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm2
528 ; AVX1-NEXT: vpaddb %xmm6, %xmm6, %xmm7
529 ; AVX1-NEXT: vpblendvb %xmm7, %xmm2, %xmm1, %xmm1
530 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm2
531 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
532 ; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
533 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm2
534 ; AVX1-NEXT: vpand %xmm5, %xmm2, %xmm2
535 ; AVX1-NEXT: vpblendvb %xmm6, %xmm2, %xmm0, %xmm0
536 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm2
537 ; AVX1-NEXT: vpblendvb %xmm7, %xmm2, %xmm0, %xmm0
538 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
541 ; AVX2-LABEL: constant_shift_v32i8:
543 ; 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]
544 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
545 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
546 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
547 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
548 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
549 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
550 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
551 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
552 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
553 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
554 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
557 ; XOPAVX1-LABEL: constant_shift_v32i8:
559 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
560 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
561 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm1
562 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm0
563 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
566 ; XOPAVX2-LABEL: constant_shift_v32i8:
568 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
569 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
570 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm1, %xmm1
571 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm0, %xmm0
572 ; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
574 %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>
579 ; Uniform Constant Shifts
582 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
583 ; AVX1-LABEL: splatconstant_shift_v4i64:
585 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm1
586 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
587 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm0
588 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
591 ; AVX2-LABEL: splatconstant_shift_v4i64:
593 ; AVX2-NEXT: vpsllq $7, %ymm0, %ymm0
596 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
598 ; XOPAVX1-NEXT: vpsllq $7, %xmm0, %xmm1
599 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
600 ; XOPAVX1-NEXT: vpsllq $7, %xmm0, %xmm0
601 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
604 ; XOPAVX2-LABEL: splatconstant_shift_v4i64:
606 ; XOPAVX2-NEXT: vpsllq $7, %ymm0, %ymm0
608 %shift = shl <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
612 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
613 ; AVX1-LABEL: splatconstant_shift_v8i32:
615 ; AVX1-NEXT: vpslld $5, %xmm0, %xmm1
616 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
617 ; AVX1-NEXT: vpslld $5, %xmm0, %xmm0
618 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
621 ; AVX2-LABEL: splatconstant_shift_v8i32:
623 ; AVX2-NEXT: vpslld $5, %ymm0, %ymm0
626 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
628 ; XOPAVX1-NEXT: vpslld $5, %xmm0, %xmm1
629 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
630 ; XOPAVX1-NEXT: vpslld $5, %xmm0, %xmm0
631 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
634 ; XOPAVX2-LABEL: splatconstant_shift_v8i32:
636 ; XOPAVX2-NEXT: vpslld $5, %ymm0, %ymm0
638 %shift = shl <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
642 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
643 ; AVX1-LABEL: splatconstant_shift_v16i16:
645 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm1
646 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
647 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
648 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
651 ; AVX2-LABEL: splatconstant_shift_v16i16:
653 ; AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
656 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
658 ; XOPAVX1-NEXT: vpsllw $3, %xmm0, %xmm1
659 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
660 ; XOPAVX1-NEXT: vpsllw $3, %xmm0, %xmm0
661 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
664 ; XOPAVX2-LABEL: splatconstant_shift_v16i16:
666 ; XOPAVX2-NEXT: vpsllw $3, %ymm0, %ymm0
668 %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>
669 ret <16 x i16> %shift
672 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
673 ; AVX1-LABEL: splatconstant_shift_v32i8:
675 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
676 ; AVX1-NEXT: vpsllw $3, %xmm1, %xmm1
677 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
678 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
679 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
680 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
681 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
684 ; AVX2-LABEL: splatconstant_shift_v32i8:
686 ; AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
687 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
690 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
692 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
693 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
694 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm1
695 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm0
696 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
699 ; XOPAVX2-LABEL: splatconstant_shift_v32i8:
701 ; XOPAVX2-NEXT: vpsllw $3, %ymm0, %ymm0
702 ; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
704 %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>