]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/vector-shift-shl-256.ll
Vendor import of llvm trunk r291274:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / vector-shift-shl-256.ll
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
7
8 ;
9 ; Variable Shifts
10 ;
11
12 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
13 ; AVX1-LABEL: var_shift_v4i64:
14 ; AVX1:       # BB#0:
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
26 ; AVX1-NEXT:    retq
27 ;
28 ; AVX2-LABEL: var_shift_v4i64:
29 ; AVX2:       # BB#0:
30 ; AVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
31 ; AVX2-NEXT:    retq
32 ;
33 ; XOPAVX1-LABEL: var_shift_v4i64:
34 ; XOPAVX1:       # BB#0:
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
40 ; XOPAVX1-NEXT:    retq
41 ;
42 ; XOPAVX2-LABEL: var_shift_v4i64:
43 ; XOPAVX2:       # BB#0:
44 ; XOPAVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
45 ; XOPAVX2-NEXT:    retq
46 ;
47 ; AVX512-LABEL: var_shift_v4i64:
48 ; AVX512:       # BB#0:
49 ; AVX512-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
50 ; AVX512-NEXT:    retq
51   %shift = shl <4 x i64> %a, %b
52   ret <4 x i64> %shift
53 }
54
55 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
56 ; AVX1-LABEL: var_shift_v8i32:
57 ; AVX1:       # BB#0:
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
70 ; AVX1-NEXT:    retq
71 ;
72 ; AVX2-LABEL: var_shift_v8i32:
73 ; AVX2:       # BB#0:
74 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
75 ; AVX2-NEXT:    retq
76 ;
77 ; XOPAVX1-LABEL: var_shift_v8i32:
78 ; XOPAVX1:       # BB#0:
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
84 ; XOPAVX1-NEXT:    retq
85 ;
86 ; XOPAVX2-LABEL: var_shift_v8i32:
87 ; XOPAVX2:       # BB#0:
88 ; XOPAVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
89 ; XOPAVX2-NEXT:    retq
90 ;
91 ; AVX512-LABEL: var_shift_v8i32:
92 ; AVX512:       # BB#0:
93 ; AVX512-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
94 ; AVX512-NEXT:    retq
95   %shift = shl <8 x i32> %a, %b
96   ret <8 x i32> %shift
97 }
98
99 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
100 ; AVX1-LABEL: var_shift_v16i16:
101 ; AVX1:       # BB#0:
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
133 ; AVX1-NEXT:    retq
134 ;
135 ; AVX2-LABEL: var_shift_v16i16:
136 ; AVX2:       # BB#0:
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
147 ; AVX2-NEXT:    retq
148 ;
149 ; XOPAVX1-LABEL: var_shift_v16i16:
150 ; XOPAVX1:       # BB#0:
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
156 ; XOPAVX1-NEXT:    retq
157 ;
158 ; XOPAVX2-LABEL: var_shift_v16i16:
159 ; XOPAVX2:       # BB#0:
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
165 ; XOPAVX2-NEXT:    retq
166 ;
167 ; AVX512-LABEL: var_shift_v16i16:
168 ; AVX512:       # BB#0:
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>
173 ; AVX512-NEXT:    retq
174   %shift = shl <16 x i16> %a, %b
175   ret <16 x i16> %shift
176 }
177
178 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
179 ; AVX1-LABEL: var_shift_v32i8:
180 ; AVX1:       # BB#0:
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
208 ; AVX1-NEXT:    retq
209 ;
210 ; AVX2-LABEL: var_shift_v32i8:
211 ; AVX2:       # BB#0:
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
223 ; AVX2-NEXT:    retq
224 ;
225 ; XOPAVX1-LABEL: var_shift_v32i8:
226 ; XOPAVX1:       # BB#0:
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
232 ; XOPAVX1-NEXT:    retq
233 ;
234 ; XOPAVX2-LABEL: var_shift_v32i8:
235 ; XOPAVX2:       # BB#0:
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
241 ; XOPAVX2-NEXT:    retq
242 ;
243 ; AVX512-LABEL: var_shift_v32i8:
244 ; AVX512:       # BB#0:
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
256 ; AVX512-NEXT:    retq
257   %shift = shl <32 x i8> %a, %b
258   ret <32 x i8> %shift
259 }
260
261 ;
262 ; Uniform Variable Shifts
263 ;
264
265 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
266 ; AVX1-LABEL: splatvar_shift_v4i64:
267 ; AVX1:       # BB#0:
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
272 ; AVX1-NEXT:    retq
273 ;
274 ; AVX2-LABEL: splatvar_shift_v4i64:
275 ; AVX2:       # BB#0:
276 ; AVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
277 ; AVX2-NEXT:    retq
278 ;
279 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
280 ; XOPAVX1:       # BB#0:
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
285 ; XOPAVX1-NEXT:    retq
286 ;
287 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
288 ; XOPAVX2:       # BB#0:
289 ; XOPAVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
290 ; XOPAVX2-NEXT:    retq
291 ;
292 ; AVX512-LABEL: splatvar_shift_v4i64:
293 ; AVX512:       # BB#0:
294 ; AVX512-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
295 ; AVX512-NEXT:    retq
296   %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
297   %shift = shl <4 x i64> %a, %splat
298   ret <4 x i64> %shift
299 }
300
301 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
302 ; AVX1-LABEL: splatvar_shift_v8i32:
303 ; AVX1:       # BB#0:
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
309 ; AVX1-NEXT:    retq
310 ;
311 ; AVX2-LABEL: splatvar_shift_v8i32:
312 ; AVX2:       # BB#0:
313 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
314 ; AVX2-NEXT:    vpslld %xmm1, %ymm0, %ymm0
315 ; AVX2-NEXT:    retq
316 ;
317 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
318 ; XOPAVX1:       # BB#0:
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
324 ; XOPAVX1-NEXT:    retq
325 ;
326 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
327 ; XOPAVX2:       # BB#0:
328 ; XOPAVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
329 ; XOPAVX2-NEXT:    vpslld %xmm1, %ymm0, %ymm0
330 ; XOPAVX2-NEXT:    retq
331 ;
332 ; AVX512-LABEL: splatvar_shift_v8i32:
333 ; AVX512:       # BB#0:
334 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
335 ; AVX512-NEXT:    vpslld %xmm1, %ymm0, %ymm0
336 ; AVX512-NEXT:    retq
337   %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
338   %shift = shl <8 x i32> %a, %splat
339   ret <8 x i32> %shift
340 }
341
342 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
343 ; AVX1-LABEL: splatvar_shift_v16i16:
344 ; AVX1:       # BB#0:
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
350 ; AVX1-NEXT:    retq
351 ;
352 ; AVX2-LABEL: splatvar_shift_v16i16:
353 ; AVX2:       # BB#0:
354 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
355 ; AVX2-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
356 ; AVX2-NEXT:    retq
357 ;
358 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
359 ; XOPAVX1:       # BB#0:
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
365 ; XOPAVX1-NEXT:    retq
366 ;
367 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
368 ; XOPAVX2:       # BB#0:
369 ; XOPAVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
370 ; XOPAVX2-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
371 ; XOPAVX2-NEXT:    retq
372 ;
373 ; AVX512-LABEL: splatvar_shift_v16i16:
374 ; AVX512:       # BB#0:
375 ; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
376 ; AVX512-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
377 ; AVX512-NEXT:    retq
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
381 }
382
383 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
384 ; AVX1-LABEL: splatvar_shift_v32i8:
385 ; AVX1:       # BB#0:
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
411 ; AVX1-NEXT:    retq
412 ;
413 ; AVX2-LABEL: splatvar_shift_v32i8:
414 ; AVX2:       # BB#0:
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
427 ; AVX2-NEXT:    retq
428 ;
429 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
430 ; XOPAVX1:       # BB#0:
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
437 ; XOPAVX1-NEXT:    retq
438 ;
439 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
440 ; XOPAVX2:       # BB#0:
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
447 ; XOPAVX2-NEXT:    retq
448 ;
449 ; AVX512-LABEL: splatvar_shift_v32i8:
450 ; AVX512:       # BB#0:
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
463 ; AVX512-NEXT:    retq
464   %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
465   %shift = shl <32 x i8> %a, %splat
466   ret <32 x i8> %shift
467 }
468
469 ;
470 ; Constant Shifts
471 ;
472
473 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
474 ; AVX1-LABEL: constant_shift_v4i64:
475 ; AVX1:       # BB#0:
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
484 ; AVX1-NEXT:    retq
485 ;
486 ; AVX2-LABEL: constant_shift_v4i64:
487 ; AVX2:       # BB#0:
488 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
489 ; AVX2-NEXT:    retq
490 ;
491 ; XOPAVX1-LABEL: constant_shift_v4i64:
492 ; XOPAVX1:       # BB#0:
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
497 ; XOPAVX1-NEXT:    retq
498 ;
499 ; XOPAVX2-LABEL: constant_shift_v4i64:
500 ; XOPAVX2:       # BB#0:
501 ; XOPAVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
502 ; XOPAVX2-NEXT:    retq
503 ;
504 ; AVX512-LABEL: constant_shift_v4i64:
505 ; AVX512:       # BB#0:
506 ; AVX512-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
507 ; AVX512-NEXT:    retq
508   %shift = shl <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
509   ret <4 x i64> %shift
510 }
511
512 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
513 ; AVX1-LABEL: constant_shift_v8i32:
514 ; AVX1:       # BB#0:
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
519 ; AVX1-NEXT:    retq
520 ;
521 ; AVX2-LABEL: constant_shift_v8i32:
522 ; AVX2:       # BB#0:
523 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
524 ; AVX2-NEXT:    retq
525 ;
526 ; XOPAVX1-LABEL: constant_shift_v8i32:
527 ; XOPAVX1:       # BB#0:
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
532 ; XOPAVX1-NEXT:    retq
533 ;
534 ; XOPAVX2-LABEL: constant_shift_v8i32:
535 ; XOPAVX2:       # BB#0:
536 ; XOPAVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
537 ; XOPAVX2-NEXT:    retq
538 ;
539 ; AVX512-LABEL: constant_shift_v8i32:
540 ; AVX512:       # BB#0:
541 ; AVX512-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
542 ; AVX512-NEXT:    retq
543   %shift = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
544   ret <8 x i32> %shift
545 }
546
547 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
548 ; AVX1-LABEL: constant_shift_v16i16:
549 ; AVX1:       # BB#0:
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
554 ; AVX1-NEXT:    retq
555 ;
556 ; AVX2-LABEL: constant_shift_v16i16:
557 ; AVX2:       # BB#0:
558 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
559 ; AVX2-NEXT:    retq
560 ;
561 ; XOPAVX1-LABEL: constant_shift_v16i16:
562 ; XOPAVX1:       # BB#0:
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
567 ; XOPAVX1-NEXT:    retq
568 ;
569 ; XOPAVX2-LABEL: constant_shift_v16i16:
570 ; XOPAVX2:       # BB#0:
571 ; XOPAVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
572 ; XOPAVX2-NEXT:    retq
573 ;
574 ; AVX512-LABEL: constant_shift_v16i16:
575 ; AVX512:       # BB#0:
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>
580 ; AVX512-NEXT:    retq
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
583 }
584
585 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
586 ; AVX1-LABEL: constant_shift_v32i8:
587 ; AVX1:       # BB#0:
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
612 ; AVX1-NEXT:    retq
613 ;
614 ; AVX2-LABEL: constant_shift_v32i8:
615 ; AVX2:       # BB#0:
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
628 ; AVX2-NEXT:    retq
629 ;
630 ; XOPAVX1-LABEL: constant_shift_v32i8:
631 ; XOPAVX1:       # BB#0:
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
637 ; XOPAVX1-NEXT:    retq
638 ;
639 ; XOPAVX2-LABEL: constant_shift_v32i8:
640 ; XOPAVX2:       # BB#0:
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
646 ; XOPAVX2-NEXT:    retq
647 ;
648 ; AVX512-LABEL: constant_shift_v32i8:
649 ; AVX512:       # BB#0:
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
662 ; AVX512-NEXT:    retq
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>
664   ret <32 x i8> %shift
665 }
666
667 ;
668 ; Uniform Constant Shifts
669 ;
670
671 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
672 ; AVX1-LABEL: splatconstant_shift_v4i64:
673 ; AVX1:       # BB#0:
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
678 ; AVX1-NEXT:    retq
679 ;
680 ; AVX2-LABEL: splatconstant_shift_v4i64:
681 ; AVX2:       # BB#0:
682 ; AVX2-NEXT:    vpsllq $7, %ymm0, %ymm0
683 ; AVX2-NEXT:    retq
684 ;
685 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
686 ; XOPAVX1:       # BB#0:
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
691 ; XOPAVX1-NEXT:    retq
692 ;
693 ; XOPAVX2-LABEL: splatconstant_shift_v4i64:
694 ; XOPAVX2:       # BB#0:
695 ; XOPAVX2-NEXT:    vpsllq $7, %ymm0, %ymm0
696 ; XOPAVX2-NEXT:    retq
697 ;
698 ; AVX512-LABEL: splatconstant_shift_v4i64:
699 ; AVX512:       # BB#0:
700 ; AVX512-NEXT:    vpsllq $7, %ymm0, %ymm0
701 ; AVX512-NEXT:    retq
702   %shift = shl <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
703   ret <4 x i64> %shift
704 }
705
706 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
707 ; AVX1-LABEL: splatconstant_shift_v8i32:
708 ; AVX1:       # BB#0:
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
713 ; AVX1-NEXT:    retq
714 ;
715 ; AVX2-LABEL: splatconstant_shift_v8i32:
716 ; AVX2:       # BB#0:
717 ; AVX2-NEXT:    vpslld $5, %ymm0, %ymm0
718 ; AVX2-NEXT:    retq
719 ;
720 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
721 ; XOPAVX1:       # BB#0:
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
726 ; XOPAVX1-NEXT:    retq
727 ;
728 ; XOPAVX2-LABEL: splatconstant_shift_v8i32:
729 ; XOPAVX2:       # BB#0:
730 ; XOPAVX2-NEXT:    vpslld $5, %ymm0, %ymm0
731 ; XOPAVX2-NEXT:    retq
732 ;
733 ; AVX512-LABEL: splatconstant_shift_v8i32:
734 ; AVX512:       # BB#0:
735 ; AVX512-NEXT:    vpslld $5, %ymm0, %ymm0
736 ; AVX512-NEXT:    retq
737   %shift = shl <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
738   ret <8 x i32> %shift
739 }
740
741 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
742 ; AVX1-LABEL: splatconstant_shift_v16i16:
743 ; AVX1:       # BB#0:
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
748 ; AVX1-NEXT:    retq
749 ;
750 ; AVX2-LABEL: splatconstant_shift_v16i16:
751 ; AVX2:       # BB#0:
752 ; AVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
753 ; AVX2-NEXT:    retq
754 ;
755 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
756 ; XOPAVX1:       # BB#0:
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
761 ; XOPAVX1-NEXT:    retq
762 ;
763 ; XOPAVX2-LABEL: splatconstant_shift_v16i16:
764 ; XOPAVX2:       # BB#0:
765 ; XOPAVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
766 ; XOPAVX2-NEXT:    retq
767 ;
768 ; AVX512-LABEL: splatconstant_shift_v16i16:
769 ; AVX512:       # BB#0:
770 ; AVX512-NEXT:    vpsllw $3, %ymm0, %ymm0
771 ; AVX512-NEXT:    retq
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
774 }
775
776 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
777 ; AVX1-LABEL: splatconstant_shift_v32i8:
778 ; AVX1:       # BB#0:
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
786 ; AVX1-NEXT:    retq
787 ;
788 ; AVX2-LABEL: splatconstant_shift_v32i8:
789 ; AVX2:       # BB#0:
790 ; AVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
791 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
792 ; AVX2-NEXT:    retq
793 ;
794 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
795 ; XOPAVX1:       # BB#0:
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
801 ; XOPAVX1-NEXT:    retq
802 ;
803 ; XOPAVX2-LABEL: splatconstant_shift_v32i8:
804 ; XOPAVX2:       # BB#0:
805 ; XOPAVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
806 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
807 ; XOPAVX2-NEXT:    retq
808 ;
809 ; AVX512-LABEL: splatconstant_shift_v32i8:
810 ; AVX512:       # BB#0:
811 ; AVX512-NEXT:    vpsllw $3, %ymm0, %ymm0
812 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
813 ; AVX512-NEXT:    retq
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>
815   ret <32 x i8> %shift
816 }