AVX-512: store <4 x i1> and <2 x i1> values in memory
[oota-llvm.git] / test / CodeGen / X86 / vector-shift-shl-256.ll
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
3
4 ;
5 ; Variable Shifts
6 ;
7
8 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
9 ; AVX1-LABEL: var_shift_v4i64:
10 ; AVX1:       # BB#0:
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
22 ; AVX1-NEXT:    retq
23 ;
24 ; AVX2-LABEL: var_shift_v4i64:
25 ; AVX2:       # BB#0:
26 ; AVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
27 ; AVX2-NEXT:    retq
28   %shift = shl <4 x i64> %a, %b
29   ret <4 x i64> %shift
30 }
31
32 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
33 ; AVX1-LABEL: var_shift_v8i32:
34 ; AVX1:       # BB#0:
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
47 ; AVX1-NEXT:    retq
48 ;
49 ; AVX2-LABEL: var_shift_v8i32:
50 ; AVX2:       # BB#0:
51 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
52 ; AVX2-NEXT:    retq
53   %shift = shl <8 x i32> %a, %b
54   ret <8 x i32> %shift
55 }
56
57 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
58 ; AVX1-LABEL: var_shift_v16i16:
59 ; AVX1:       # BB#0:
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
91 ; AVX1-NEXT:    retq
92 ;
93 ; AVX2-LABEL: var_shift_v16i16:
94 ; AVX2:       # BB#0:
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
105 ; AVX2-NEXT:    retq
106   %shift = shl <16 x i16> %a, %b
107   ret <16 x i16> %shift
108 }
109
110 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
111 ; AVX1-LABEL: var_shift_v32i8:
112 ; AVX1:       # BB#0:
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
140 ; AVX1-NEXT:    retq
141 ;
142 ; AVX2-LABEL: var_shift_v32i8:
143 ; AVX2:       # BB#0:
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
155 ; AVX2-NEXT:    retq
156   %shift = shl <32 x i8> %a, %b
157   ret <32 x i8> %shift
158 }
159
160 ;
161 ; Uniform Variable Shifts
162 ;
163
164 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
165 ; AVX1-LABEL: splatvar_shift_v4i64:
166 ; AVX1:       # BB#0:
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
171 ; AVX1-NEXT:    retq
172 ;
173 ; AVX2-LABEL: splatvar_shift_v4i64:
174 ; AVX2:       # BB#0:
175 ; AVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
176 ; AVX2-NEXT:    retq
177   %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
178   %shift = shl <4 x i64> %a, %splat
179   ret <4 x i64> %shift
180 }
181
182 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
183 ; AVX1-LABEL: splatvar_shift_v8i32:
184 ; AVX1:       # BB#0:
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
191 ; AVX1-NEXT:    retq
192 ;
193 ; AVX2-LABEL: splatvar_shift_v8i32:
194 ; AVX2:       # BB#0:
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
198 ; AVX2-NEXT:    retq
199   %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
200   %shift = shl <8 x i32> %a, %splat
201   ret <8 x i32> %shift
202 }
203
204 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
205 ; AVX1-LABEL: splatvar_shift_v16i16:
206 ; AVX1:       # BB#0:
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
214 ; AVX1-NEXT:    retq
215 ;
216 ; AVX2-LABEL: splatvar_shift_v16i16:
217 ; AVX2:       # BB#0:
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
222 ; AVX2-NEXT:    retq
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
226 }
227
228 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
229 ; AVX1-LABEL: splatvar_shift_v32i8:
230 ; AVX1:       # BB#0:
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
256 ; AVX1-NEXT:    retq
257 ;
258 ; AVX2-LABEL: splatvar_shift_v32i8:
259 ; AVX2:       # BB#0:
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
272 ; AVX2-NEXT:    retq
273   %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
274   %shift = shl <32 x i8> %a, %splat
275   ret <32 x i8> %shift
276 }
277
278 ;
279 ; Constant Shifts
280 ;
281
282 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
283 ; AVX1-LABEL: constant_shift_v4i64:
284 ; AVX1:       # BB#0:
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
293 ; AVX1-NEXT:    retq
294 ;
295 ; AVX2-LABEL: constant_shift_v4i64:
296 ; AVX2:       # BB#0:
297 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
298 ; AVX2-NEXT:    retq
299   %shift = shl <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
300   ret <4 x i64> %shift
301 }
302
303 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
304 ; AVX1-LABEL: constant_shift_v8i32:
305 ; AVX1:       # BB#0:
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
310 ; AVX1-NEXT:    retq
311 ;
312 ; AVX2-LABEL: constant_shift_v8i32:
313 ; AVX2:       # BB#0:
314 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
315 ; AVX2-NEXT:    retq
316   %shift = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
317   ret <8 x i32> %shift
318 }
319
320 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
321 ; AVX1-LABEL: constant_shift_v16i16:
322 ; AVX1:       # BB#0:
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
327 ; AVX1-NEXT:    retq
328 ;
329 ; AVX2-LABEL: constant_shift_v16i16:
330 ; AVX2:       # BB#0:
331 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
332 ; AVX2-NEXT:    retq
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
335 }
336
337 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
338 ; AVX1-LABEL: constant_shift_v32i8:
339 ; AVX1:       # BB#0:
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
364 ; AVX1-NEXT:    retq
365 ;
366 ; AVX2-LABEL: constant_shift_v32i8:
367 ; AVX2:       # BB#0:
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
380 ; AVX2-NEXT:    retq
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>
382   ret <32 x i8> %shift
383 }
384
385 ;
386 ; Uniform Constant Shifts
387 ;
388
389 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
390 ; AVX1-LABEL: splatconstant_shift_v4i64:
391 ; AVX1:       # BB#0:
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
396 ; AVX1-NEXT:    retq
397 ;
398 ; AVX2-LABEL: splatconstant_shift_v4i64:
399 ; AVX2:       # BB#0:
400 ; AVX2-NEXT:    vpsllq $7, %ymm0, %ymm0
401 ; AVX2-NEXT:    retq
402   %shift = shl <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
403   ret <4 x i64> %shift
404 }
405
406 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
407 ; AVX1-LABEL: splatconstant_shift_v8i32:
408 ; AVX1:       # BB#0:
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
413 ; AVX1-NEXT:    retq
414 ;
415 ; AVX2-LABEL: splatconstant_shift_v8i32:
416 ; AVX2:       # BB#0:
417 ; AVX2-NEXT:    vpslld $5, %ymm0, %ymm0
418 ; AVX2-NEXT:    retq
419   %shift = shl <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
420   ret <8 x i32> %shift
421 }
422
423 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
424 ; AVX1-LABEL: splatconstant_shift_v16i16:
425 ; AVX1:       # BB#0:
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
430 ; AVX1-NEXT:    retq
431 ;
432 ; AVX2-LABEL: splatconstant_shift_v16i16:
433 ; AVX2:       # BB#0:
434 ; AVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
435 ; AVX2-NEXT:    retq
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
438 }
439
440 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
441 ; AVX1-LABEL: splatconstant_shift_v32i8:
442 ; AVX1:       # BB#0:
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
450 ; AVX1-NEXT:    retq
451 ;
452 ; AVX2-LABEL: splatconstant_shift_v32i8:
453 ; AVX2:       # BB#0:
454 ; AVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
455 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
456 ; AVX2-NEXT:    retq
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>
458   ret <32 x i8> %shift
459 }