1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
8 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
9 ; AVX1-LABEL: var_shift_v4i64:
11 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
12 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
13 ; AVX1-NEXT: vpsllq %xmm2, %xmm3, %xmm4
14 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
15 ; AVX1-NEXT: vpsllq %xmm2, %xmm3, %xmm2
16 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
17 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm3
18 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
19 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
20 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
21 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
24 ; AVX2-LABEL: var_shift_v4i64:
26 ; AVX2-NEXT: vpsllvq %ymm1, %ymm0, %ymm0
28 %shift = shl <4 x i64> %a, %b
32 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
33 ; AVX1-LABEL: var_shift_v8i32:
35 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
36 ; AVX1-NEXT: vpslld $23, %xmm2, %xmm2
37 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
38 ; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2
39 ; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2
40 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
41 ; AVX1-NEXT: vpmulld %xmm4, %xmm2, %xmm2
42 ; AVX1-NEXT: vpslld $23, %xmm1, %xmm1
43 ; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1
44 ; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1
45 ; AVX1-NEXT: vpmulld %xmm0, %xmm1, %xmm0
46 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
49 ; AVX2-LABEL: var_shift_v8i32:
51 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
53 %shift = shl <8 x i32> %a, %b
57 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
58 ; AVX1-LABEL: var_shift_v16i16:
60 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
61 ; AVX1-NEXT: vpsllw $12, %xmm2, %xmm3
62 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm2
63 ; AVX1-NEXT: vpor %xmm3, %xmm2, %xmm2
64 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm3
65 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
66 ; AVX1-NEXT: vpsllw $8, %xmm4, %xmm5
67 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
68 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm4
69 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
70 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm4
71 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
72 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
73 ; AVX1-NEXT: vpsllw $1, %xmm2, %xmm4
74 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
75 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
76 ; AVX1-NEXT: vpsllw $12, %xmm1, %xmm3
77 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1
78 ; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1
79 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm3
80 ; AVX1-NEXT: vpsllw $8, %xmm0, %xmm4
81 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
82 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm1
83 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
84 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm1
85 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
86 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
87 ; AVX1-NEXT: vpsllw $1, %xmm0, %xmm1
88 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
89 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
90 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
93 ; AVX2-LABEL: var_shift_v16i16:
95 ; AVX2-NEXT: vpxor %ymm2, %ymm2, %ymm2
96 ; 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]
97 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
98 ; AVX2-NEXT: vpsllvd %ymm3, %ymm4, %ymm3
99 ; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3
100 ; 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]
101 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
102 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
103 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
104 ; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
106 %shift = shl <16 x i16> %a, %b
107 ret <16 x i16> %shift
110 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
111 ; AVX1-LABEL: var_shift_v32i8:
113 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
114 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm3
115 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
116 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
117 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
118 ; AVX1-NEXT: vpsllw $5, %xmm5, %xmm5
119 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
120 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm3
121 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
122 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
123 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
124 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
125 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm3
126 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
127 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
128 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm3
129 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
130 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
131 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
132 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm3
133 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
134 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
135 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
136 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm3
137 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
138 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
139 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
142 ; AVX2-LABEL: var_shift_v32i8:
144 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
145 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
146 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
147 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
148 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
149 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
150 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
151 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
152 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
153 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
154 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
156 %shift = shl <32 x i8> %a, %b
161 ; Uniform Variable Shifts
164 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
165 ; AVX1-LABEL: splatvar_shift_v4i64:
167 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
168 ; AVX1-NEXT: vpsllq %xmm1, %xmm2, %xmm2
169 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
170 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
173 ; AVX2-LABEL: splatvar_shift_v4i64:
175 ; AVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0
177 %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
178 %shift = shl <4 x i64> %a, %splat
182 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
183 ; AVX1-LABEL: splatvar_shift_v8i32:
185 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
186 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
187 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
188 ; AVX1-NEXT: vpslld %xmm1, %xmm2, %xmm2
189 ; AVX1-NEXT: vpslld %xmm1, %xmm0, %xmm0
190 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
193 ; AVX2-LABEL: splatvar_shift_v8i32:
195 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
196 ; AVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
197 ; AVX2-NEXT: vpslld %xmm1, %ymm0, %ymm0
199 %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
200 %shift = shl <8 x i32> %a, %splat
204 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
205 ; AVX1-LABEL: splatvar_shift_v16i16:
207 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
208 ; AVX1-NEXT: vmovd %xmm1, %eax
209 ; AVX1-NEXT: movzwl %ax, %eax
210 ; AVX1-NEXT: vmovd %eax, %xmm1
211 ; AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm2
212 ; AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0
213 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
216 ; AVX2-LABEL: splatvar_shift_v16i16:
218 ; AVX2-NEXT: vmovd %xmm1, %eax
219 ; AVX2-NEXT: movzwl %ax, %eax
220 ; AVX2-NEXT: vmovd %eax, %xmm1
221 ; AVX2-NEXT: vpsllw %xmm1, %ymm0, %ymm0
223 %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
224 %shift = shl <16 x i16> %a, %splat
225 ret <16 x i16> %shift
228 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
229 ; AVX1-LABEL: splatvar_shift_v32i8:
231 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
232 ; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
233 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
234 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm3
235 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
236 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
237 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
238 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm2, %xmm2
239 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm3
240 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
241 ; AVX1-NEXT: vpand %xmm5, %xmm3, %xmm3
242 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm6
243 ; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
244 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm3
245 ; AVX1-NEXT: vpaddb %xmm6, %xmm6, %xmm7
246 ; AVX1-NEXT: vpblendvb %xmm7, %xmm3, %xmm2, %xmm2
247 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm3
248 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
249 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
250 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm1
251 ; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1
252 ; AVX1-NEXT: vpblendvb %xmm6, %xmm1, %xmm0, %xmm0
253 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm1
254 ; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
255 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
258 ; AVX2-LABEL: splatvar_shift_v32i8:
260 ; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1
261 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
262 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
263 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
264 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
265 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
266 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
267 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
268 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
269 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
270 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
271 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
273 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
274 %shift = shl <32 x i8> %a, %splat
282 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
283 ; AVX1-LABEL: constant_shift_v4i64:
285 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
286 ; AVX1-NEXT: vpsllq $62, %xmm1, %xmm2
287 ; AVX1-NEXT: vpsllq $31, %xmm1, %xmm1
288 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
289 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm2
290 ; AVX1-NEXT: vpsllq $1, %xmm0, %xmm0
291 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
292 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
295 ; AVX2-LABEL: constant_shift_v4i64:
297 ; AVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
299 %shift = shl <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
303 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
304 ; AVX1-LABEL: constant_shift_v8i32:
306 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm1
307 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
308 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0
309 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
312 ; AVX2-LABEL: constant_shift_v8i32:
314 ; AVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
316 %shift = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
320 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
321 ; AVX1-LABEL: constant_shift_v16i16:
323 ; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm1
324 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
325 ; AVX1-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
326 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
329 ; AVX2-LABEL: constant_shift_v16i16:
331 ; AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
333 %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>
334 ret <16 x i16> %shift
337 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
338 ; AVX1-LABEL: constant_shift_v32i8:
340 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
341 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm2
342 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
343 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
344 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
345 ; AVX1-NEXT: vpsllw $5, %xmm4, %xmm4
346 ; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm1, %xmm1
347 ; AVX1-NEXT: vpsllw $2, %xmm1, %xmm2
348 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
349 ; AVX1-NEXT: vpand %xmm5, %xmm2, %xmm2
350 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm6
351 ; AVX1-NEXT: vpblendvb %xmm6, %xmm2, %xmm1, %xmm1
352 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm2
353 ; AVX1-NEXT: vpaddb %xmm6, %xmm6, %xmm7
354 ; AVX1-NEXT: vpblendvb %xmm7, %xmm2, %xmm1, %xmm1
355 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm2
356 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
357 ; AVX1-NEXT: vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
358 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm2
359 ; AVX1-NEXT: vpand %xmm5, %xmm2, %xmm2
360 ; AVX1-NEXT: vpblendvb %xmm6, %xmm2, %xmm0, %xmm0
361 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm2
362 ; AVX1-NEXT: vpblendvb %xmm7, %xmm2, %xmm0, %xmm0
363 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
366 ; AVX2-LABEL: constant_shift_v32i8:
368 ; 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]
369 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
370 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
371 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
372 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
373 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
374 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
375 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
376 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
377 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
378 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
379 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
381 %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>
386 ; Uniform Constant Shifts
389 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
390 ; AVX1-LABEL: splatconstant_shift_v4i64:
392 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm1
393 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
394 ; AVX1-NEXT: vpsllq $7, %xmm0, %xmm0
395 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
398 ; AVX2-LABEL: splatconstant_shift_v4i64:
400 ; AVX2-NEXT: vpsllq $7, %ymm0, %ymm0
402 %shift = shl <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
406 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
407 ; AVX1-LABEL: splatconstant_shift_v8i32:
409 ; AVX1-NEXT: vpslld $5, %xmm0, %xmm1
410 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
411 ; AVX1-NEXT: vpslld $5, %xmm0, %xmm0
412 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
415 ; AVX2-LABEL: splatconstant_shift_v8i32:
417 ; AVX2-NEXT: vpslld $5, %ymm0, %ymm0
419 %shift = shl <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
423 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
424 ; AVX1-LABEL: splatconstant_shift_v16i16:
426 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm1
427 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
428 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
429 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
432 ; AVX2-LABEL: splatconstant_shift_v16i16:
434 ; AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
436 %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>
437 ret <16 x i16> %shift
440 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
441 ; AVX1-LABEL: splatconstant_shift_v32i8:
443 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
444 ; AVX1-NEXT: vpsllw $3, %xmm1, %xmm1
445 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
446 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
447 ; AVX1-NEXT: vpsllw $3, %xmm0, %xmm0
448 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
449 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
452 ; AVX2-LABEL: splatconstant_shift_v32i8:
454 ; AVX2-NEXT: vpsllw $3, %ymm0, %ymm0
455 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
457 %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>