1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
10 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
11 ; AVX1-LABEL: var_shift_v4i64:
13 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
14 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
15 ; AVX1-NEXT: vpsllq %xmm2, %xmm3, %xmm4
16 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
17 ; AVX1-NEXT: vpsllq %xmm2, %xmm3, %xmm2
18 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
19 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm3
20 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
21 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
22 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
23 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
26 ; AVX2-LABEL: var_shift_v4i64:
28 ; AVX2-NEXT: vpsllvq %ymm1, %ymm0, %ymm0
31 ; XOPAVX1-LABEL: var_shift_v4i64:
33 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
34 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
35 ; XOPAVX1-NEXT: vpshlq %xmm2, %xmm3, %xmm2
36 ; XOPAVX1-NEXT: vpshlq %xmm1, %xmm0, %xmm0
37 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
40 ; XOPAVX2-LABEL: var_shift_v4i64:
42 ; XOPAVX2-NEXT: vpsllvq %ymm1, %ymm0, %ymm0
44 %shift = shl <4 x i64> %a, %b
48 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
49 ; AVX1-LABEL: var_shift_v8i32:
51 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
52 ; AVX1-NEXT: vpslld $23, %xmm2, %xmm2
53 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
54 ; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2
55 ; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2
56 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
57 ; AVX1-NEXT: vpmulld %xmm4, %xmm2, %xmm2
58 ; AVX1-NEXT: vpslld $23, %xmm1, %xmm1
59 ; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1
60 ; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1
61 ; AVX1-NEXT: vpmulld %xmm0, %xmm1, %xmm0
62 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
65 ; AVX2-LABEL: var_shift_v8i32:
67 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
70 ; XOPAVX1-LABEL: var_shift_v8i32:
72 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
73 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
74 ; XOPAVX1-NEXT: vpshld %xmm2, %xmm3, %xmm2
75 ; XOPAVX1-NEXT: vpshld %xmm1, %xmm0, %xmm0
76 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
79 ; XOPAVX2-LABEL: var_shift_v8i32:
81 ; XOPAVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
83 %shift = shl <8 x i32> %a, %b
87 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
88 ; AVX1-LABEL: var_shift_v16i16:
90 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
91 ; AVX1-NEXT: vpsllw $12, %xmm2, %xmm3
92 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm2
93 ; AVX1-NEXT: vpor %xmm3, %xmm2, %xmm2
94 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm3
95 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
96 ; AVX1-NEXT: vpsllw $8, %xmm4, %xmm5
97 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
98 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm4
99 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
100 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm4
101 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
102 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
103 ; AVX1-NEXT: vpsllw $1, %xmm2, %xmm4
104 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
105 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
106 ; AVX1-NEXT: vpsllw $12, %xmm1, %xmm3
107 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1
108 ; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1
109 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm3
110 ; AVX1-NEXT: vpsllw $8, %xmm0, %xmm4
111 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
112 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm1
113 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
114 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm1
115 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
116 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
117 ; AVX1-NEXT: vpsllw $1, %xmm0, %xmm1
118 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
119 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
120 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
123 ; AVX2-LABEL: var_shift_v16i16:
125 ; AVX2-NEXT: vpxor %ymm2, %ymm2, %ymm2
126 ; 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]
127 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
128 ; AVX2-NEXT: vpsllvd %ymm3, %ymm4, %ymm3
129 ; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3
130 ; 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]
131 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
132 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
133 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
134 ; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
137 ; XOPAVX1-LABEL: var_shift_v16i16:
139 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
140 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
141 ; XOPAVX1-NEXT: vpshlw %xmm2, %xmm3, %xmm2
142 ; XOPAVX1-NEXT: vpshlw %xmm1, %xmm0, %xmm0
143 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
146 ; XOPAVX2-LABEL: var_shift_v16i16:
148 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
149 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
150 ; XOPAVX2-NEXT: vpshlw %xmm2, %xmm3, %xmm2
151 ; XOPAVX2-NEXT: vpshlw %xmm1, %xmm0, %xmm0
152 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
154 %shift = shl <16 x i16> %a, %b
155 ret <16 x i16> %shift
158 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
159 ; AVX1-LABEL: var_shift_v32i8:
161 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
162 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm3
163 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
164 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
165 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
166 ; AVX1-NEXT: vpsllw $5, %xmm5, %xmm5
167 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
168 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm3
169 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
170 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
171 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
172 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
173 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm3
174 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
175 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
176 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm3
177 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
178 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
179 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
180 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm3
181 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
182 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
183 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
184 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm3
185 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
186 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
187 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
190 ; AVX2-LABEL: var_shift_v32i8:
192 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
193 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
194 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
195 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
196 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
197 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
198 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
199 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
200 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
201 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
202 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
205 ; XOPAVX1-LABEL: var_shift_v32i8:
207 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
208 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
209 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm3, %xmm2
210 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0
211 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
214 ; XOPAVX2-LABEL: var_shift_v32i8:
216 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
217 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
218 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm3, %xmm2
219 ; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0
220 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
222 %shift = shl <32 x i8> %a, %b
227 ; Uniform Variable Shifts
230 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
231 ; AVX1-LABEL: splatvar_shift_v4i64:
233 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
234 ; AVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2
235 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
236 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
239 ; AVX2-LABEL: splatvar_shift_v4i64:
241 ; AVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0
244 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
246 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
247 ; XOPAVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2
248 ; XOPAVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
249 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
252 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
254 ; XOPAVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0
256 %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
257 %shift = shl <4 x i64> %a, %splat
261 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
262 ; AVX1-LABEL: splatvar_shift_v8i32:
264 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
265 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
266 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
267 ; AVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2
268 ; AVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0
269 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
272 ; AVX2-LABEL: splatvar_shift_v8i32:
274 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
275 ; AVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
276 ; AVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0
279 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
281 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
282 ; XOPAVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
283 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
284 ; XOPAVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2
285 ; XOPAVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0
286 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
289 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
291 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
292 ; XOPAVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
293 ; XOPAVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0
295 %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
296 %shift = shl <8 x i32> %a, %splat
300 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
301 ; AVX1-LABEL: splatvar_shift_v16i16:
303 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
304 ; AVX1-NEXT: vmovd %xmm1, %eax
305 ; AVX1-NEXT: movzwl %ax, %eax
306 ; AVX1-NEXT: vmovd %eax, %xmm1
307 ; AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
308 ; AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
309 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
312 ; AVX2-LABEL: splatvar_shift_v16i16:
314 ; AVX2-NEXT: vmovd %xmm1, %eax
315 ; AVX2-NEXT: movzwl %ax, %eax
316 ; AVX2-NEXT: vmovd %eax, %xmm1
317 ; AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
320 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
322 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
323 ; XOPAVX1-NEXT: vmovd %xmm1, %eax
324 ; XOPAVX1-NEXT: movzwl %ax, %eax
325 ; XOPAVX1-NEXT: vmovd %eax, %xmm1
326 ; XOPAVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
327 ; XOPAVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
328 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
331 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
333 ; XOPAVX2-NEXT: vmovd %xmm1, %eax
334 ; XOPAVX2-NEXT: movzwl %ax, %eax
335 ; XOPAVX2-NEXT: vmovd %eax, %xmm1
336 ; XOPAVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
338 %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
339 %shift = shl <16 x i16> %a, %splat
340 ret <16 x i16> %shift
343 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
344 ; AVX1-LABEL: splatvar_shift_v32i8:
346 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
347 ; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
348 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
349 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm3
350 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
351 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
352 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
353 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm2, %xmm2
354 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm3
355 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
356 ; AVX1-NEXT: vpand %xmm5, %xmm3, %xmm3
357 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm6
358 ; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
359 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm3
360 ; AVX1-NEXT: vpaddb %xmm6, %xmm6, %xmm7
361 ; AVX1-NEXT: vpblendvb %xmm7, %xmm3, %xmm2, %xmm2
362 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm3
363 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
364 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
365 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm1
366 ; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1
367 ; AVX1-NEXT: vpblendvb %xmm6, %xmm1, %xmm0, %xmm0
368 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm1
369 ; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
370 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
373 ; AVX2-LABEL: splatvar_shift_v32i8:
375 ; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1
376 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
377 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
378 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
379 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
380 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
381 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
382 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
383 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
384 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
385 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
386 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
389 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
391 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
392 ; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
393 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
394 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm2, %xmm2
395 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0
396 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
399 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
401 ; XOPAVX2-NEXT: vpbroadcastb %xmm1, %ymm1
402 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
403 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm3
404 ; XOPAVX2-NEXT: vpshlb %xmm3, %xmm2, %xmm2
405 ; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0
406 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
408 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
409 %shift = shl <32 x i8> %a, %splat
417 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
418 ; AVX1-LABEL: constant_shift_v4i64:
420 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
421 ; AVX1-NEXT: vpsllq $62, %xmm1, %xmm2
422 ; AVX1-NEXT: vpsllq $31, %xmm1, %xmm1
423 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
424 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm2
425 ; AVX1-NEXT: vpsllq $1, %xmm0, %xmm0
426 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
427 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
430 ; AVX2-LABEL: constant_shift_v4i64:
432 ; AVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
435 ; XOPAVX1-LABEL: constant_shift_v4i64:
437 ; XOPAVX1-NEXT: vpshlq {{.*}}(%rip), %xmm0, %xmm1
438 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
439 ; XOPAVX1-NEXT: vpshlq {{.*}}(%rip), %xmm0, %xmm0
440 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
443 ; XOPAVX2-LABEL: constant_shift_v4i64:
445 ; XOPAVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
447 %shift = shl <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
451 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
452 ; AVX1-LABEL: constant_shift_v8i32:
454 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm1
455 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
456 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0
457 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
460 ; AVX2-LABEL: constant_shift_v8i32:
462 ; AVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
465 ; XOPAVX1-LABEL: constant_shift_v8i32:
467 ; XOPAVX1-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm1
468 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
469 ; XOPAVX1-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm0
470 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
473 ; XOPAVX2-LABEL: constant_shift_v8i32:
475 ; XOPAVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
477 %shift = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
481 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
482 ; AVX1-LABEL: constant_shift_v16i16:
484 ; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm1
485 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
486 ; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
487 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
490 ; AVX2-LABEL: constant_shift_v16i16:
492 ; AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
495 ; XOPAVX1-LABEL: constant_shift_v16i16:
497 ; XOPAVX1-NEXT: vpshlw {{.*}}(%rip), %xmm0, %xmm1
498 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
499 ; XOPAVX1-NEXT: vpshlw {{.*}}(%rip), %xmm0, %xmm0
500 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
503 ; XOPAVX2-LABEL: constant_shift_v16i16:
505 ; XOPAVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
507 %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>
508 ret <16 x i16> %shift
511 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
512 ; AVX1-LABEL: constant_shift_v32i8:
514 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
515 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm2
516 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
517 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
518 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
519 ; AVX1-NEXT: vpsllw $5, %xmm4, %xmm4
520 ; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm1, %xmm1
521 ; AVX1-NEXT: vpsllw $2, %xmm1, %xmm2
522 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
523 ; AVX1-NEXT: vpand %xmm5, %xmm2, %xmm2
524 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm6
525 ; AVX1-NEXT: vpblendvb %xmm6, %xmm2, %xmm1, %xmm1
526 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm2
527 ; AVX1-NEXT: vpaddb %xmm6, %xmm6, %xmm7
528 ; AVX1-NEXT: vpblendvb %xmm7, %xmm2, %xmm1, %xmm1
529 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm2
530 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
531 ; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
532 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm2
533 ; AVX1-NEXT: vpand %xmm5, %xmm2, %xmm2
534 ; AVX1-NEXT: vpblendvb %xmm6, %xmm2, %xmm0, %xmm0
535 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm2
536 ; AVX1-NEXT: vpblendvb %xmm7, %xmm2, %xmm0, %xmm0
537 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
540 ; AVX2-LABEL: constant_shift_v32i8:
542 ; 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]
543 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
544 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
545 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
546 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
547 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
548 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
549 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
550 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
551 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
552 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
553 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
556 ; XOPAVX1-LABEL: constant_shift_v32i8:
558 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
559 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
560 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm1
561 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm0
562 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
565 ; XOPAVX2-LABEL: constant_shift_v32i8:
567 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
568 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
569 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm1, %xmm1
570 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm0, %xmm0
571 ; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
573 %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>
578 ; Uniform Constant Shifts
581 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
582 ; AVX1-LABEL: splatconstant_shift_v4i64:
584 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm1
585 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
586 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm0
587 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
590 ; AVX2-LABEL: splatconstant_shift_v4i64:
592 ; AVX2-NEXT: vpsllq $7, %ymm0, %ymm0
595 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
597 ; XOPAVX1-NEXT: vpsllq $7, %xmm0, %xmm1
598 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
599 ; XOPAVX1-NEXT: vpsllq $7, %xmm0, %xmm0
600 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
603 ; XOPAVX2-LABEL: splatconstant_shift_v4i64:
605 ; XOPAVX2-NEXT: vpsllq $7, %ymm0, %ymm0
607 %shift = shl <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
611 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
612 ; AVX1-LABEL: splatconstant_shift_v8i32:
614 ; AVX1-NEXT: vpslld $5, %xmm0, %xmm1
615 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
616 ; AVX1-NEXT: vpslld $5, %xmm0, %xmm0
617 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
620 ; AVX2-LABEL: splatconstant_shift_v8i32:
622 ; AVX2-NEXT: vpslld $5, %ymm0, %ymm0
625 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
627 ; XOPAVX1-NEXT: vpslld $5, %xmm0, %xmm1
628 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
629 ; XOPAVX1-NEXT: vpslld $5, %xmm0, %xmm0
630 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
633 ; XOPAVX2-LABEL: splatconstant_shift_v8i32:
635 ; XOPAVX2-NEXT: vpslld $5, %ymm0, %ymm0
637 %shift = shl <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
641 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
642 ; AVX1-LABEL: splatconstant_shift_v16i16:
644 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm1
645 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
646 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
647 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
650 ; AVX2-LABEL: splatconstant_shift_v16i16:
652 ; AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
655 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
657 ; XOPAVX1-NEXT: vpsllw $3, %xmm0, %xmm1
658 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
659 ; XOPAVX1-NEXT: vpsllw $3, %xmm0, %xmm0
660 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
663 ; XOPAVX2-LABEL: splatconstant_shift_v16i16:
665 ; XOPAVX2-NEXT: vpsllw $3, %ymm0, %ymm0
667 %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>
668 ret <16 x i16> %shift
671 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
672 ; AVX1-LABEL: splatconstant_shift_v32i8:
674 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
675 ; AVX1-NEXT: vpsllw $3, %xmm1, %xmm1
676 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
677 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
678 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
679 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
680 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
683 ; AVX2-LABEL: splatconstant_shift_v32i8:
685 ; AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
686 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
689 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
691 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
692 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
693 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm1
694 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm0
695 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
698 ; XOPAVX2-LABEL: splatconstant_shift_v32i8:
700 ; XOPAVX2-NEXT: vpsllw $3, %ymm0, %ymm0
701 ; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
703 %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>