[MachO] Stop generating *coal* sections.
[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 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
5
6 ;
7 ; Variable Shifts
8 ;
9
10 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
11 ; AVX1-LABEL: var_shift_v4i64:
12 ; AVX1:       # BB#0:
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
24 ; AVX1-NEXT:    retq
25 ;
26 ; AVX2-LABEL: var_shift_v4i64:
27 ; AVX2:       # BB#0:
28 ; AVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
29 ; AVX2-NEXT:    retq
30 ;
31 ; XOPAVX1-LABEL: var_shift_v4i64:
32 ; XOPAVX1:       # BB#0:
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
38 ; XOPAVX1-NEXT:    retq
39 ;
40 ; XOPAVX2-LABEL: var_shift_v4i64:
41 ; XOPAVX2:       # BB#0:
42 ; XOPAVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
43 ; XOPAVX2-NEXT:    retq
44   %shift = shl <4 x i64> %a, %b
45   ret <4 x i64> %shift
46 }
47
48 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
49 ; AVX1-LABEL: var_shift_v8i32:
50 ; AVX1:       # BB#0:
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
63 ; AVX1-NEXT:    retq
64 ;
65 ; AVX2-LABEL: var_shift_v8i32:
66 ; AVX2:       # BB#0:
67 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
68 ; AVX2-NEXT:    retq
69 ;
70 ; XOPAVX1-LABEL: var_shift_v8i32:
71 ; XOPAVX1:       # BB#0:
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
77 ; XOPAVX1-NEXT:    retq
78 ;
79 ; XOPAVX2-LABEL: var_shift_v8i32:
80 ; XOPAVX2:       # BB#0:
81 ; XOPAVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
82 ; XOPAVX2-NEXT:    retq
83   %shift = shl <8 x i32> %a, %b
84   ret <8 x i32> %shift
85 }
86
87 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
88 ; AVX1-LABEL: var_shift_v16i16:
89 ; AVX1:       # BB#0:
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
121 ; AVX1-NEXT:    retq
122 ;
123 ; AVX2-LABEL: var_shift_v16i16:
124 ; AVX2:       # BB#0:
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
135 ; AVX2-NEXT:    retq
136 ;
137 ; XOPAVX1-LABEL: var_shift_v16i16:
138 ; XOPAVX1:       # BB#0:
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
144 ; XOPAVX1-NEXT:    retq
145 ;
146 ; XOPAVX2-LABEL: var_shift_v16i16:
147 ; XOPAVX2:       # BB#0:
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
153 ; XOPAVX2-NEXT:    retq
154   %shift = shl <16 x i16> %a, %b
155   ret <16 x i16> %shift
156 }
157
158 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
159 ; AVX1-LABEL: var_shift_v32i8:
160 ; AVX1:       # BB#0:
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
188 ; AVX1-NEXT:    retq
189 ;
190 ; AVX2-LABEL: var_shift_v32i8:
191 ; AVX2:       # BB#0:
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
203 ; AVX2-NEXT:    retq
204 ;
205 ; XOPAVX1-LABEL: var_shift_v32i8:
206 ; XOPAVX1:       # BB#0:
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
212 ; XOPAVX1-NEXT:    retq
213 ;
214 ; XOPAVX2-LABEL: var_shift_v32i8:
215 ; XOPAVX2:       # BB#0:
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
221 ; XOPAVX2-NEXT:    retq
222   %shift = shl <32 x i8> %a, %b
223   ret <32 x i8> %shift
224 }
225
226 ;
227 ; Uniform Variable Shifts
228 ;
229
230 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
231 ; AVX1-LABEL: splatvar_shift_v4i64:
232 ; AVX1:       # BB#0:
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
237 ; AVX1-NEXT:    retq
238 ;
239 ; AVX2-LABEL: splatvar_shift_v4i64:
240 ; AVX2:       # BB#0:
241 ; AVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
242 ; AVX2-NEXT:    retq
243 ;
244 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
245 ; XOPAVX1:       # BB#0:
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
250 ; XOPAVX1-NEXT:    retq
251 ;
252 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
253 ; XOPAVX2:       # BB#0:
254 ; XOPAVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
255 ; XOPAVX2-NEXT:    retq
256   %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
257   %shift = shl <4 x i64> %a, %splat
258   ret <4 x i64> %shift
259 }
260
261 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
262 ; AVX1-LABEL: splatvar_shift_v8i32:
263 ; AVX1:       # BB#0:
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
270 ; AVX1-NEXT:    retq
271 ;
272 ; AVX2-LABEL: splatvar_shift_v8i32:
273 ; AVX2:       # BB#0:
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
277 ; AVX2-NEXT:    retq
278 ;
279 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
280 ; XOPAVX1:       # BB#0:
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
287 ; XOPAVX1-NEXT:    retq
288 ;
289 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
290 ; XOPAVX2:       # BB#0:
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
294 ; XOPAVX2-NEXT:    retq
295   %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
296   %shift = shl <8 x i32> %a, %splat
297   ret <8 x i32> %shift
298 }
299
300 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
301 ; AVX1-LABEL: splatvar_shift_v16i16:
302 ; AVX1:       # BB#0:
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
310 ; AVX1-NEXT:    retq
311 ;
312 ; AVX2-LABEL: splatvar_shift_v16i16:
313 ; AVX2:       # BB#0:
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
318 ; AVX2-NEXT:    retq
319 ;
320 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
321 ; XOPAVX1:       # BB#0:
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
329 ; XOPAVX1-NEXT:    retq
330 ;
331 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
332 ; XOPAVX2:       # BB#0:
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
337 ; XOPAVX2-NEXT:    retq
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
341 }
342
343 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
344 ; AVX1-LABEL: splatvar_shift_v32i8:
345 ; AVX1:       # BB#0:
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
371 ; AVX1-NEXT:    retq
372 ;
373 ; AVX2-LABEL: splatvar_shift_v32i8:
374 ; AVX2:       # BB#0:
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
387 ; AVX2-NEXT:    retq
388 ;
389 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
390 ; XOPAVX1:       # BB#0:
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
397 ; XOPAVX1-NEXT:    retq
398 ;
399 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
400 ; XOPAVX2:       # BB#0:
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
407 ; XOPAVX2-NEXT:    retq
408   %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
409   %shift = shl <32 x i8> %a, %splat
410   ret <32 x i8> %shift
411 }
412
413 ;
414 ; Constant Shifts
415 ;
416
417 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
418 ; AVX1-LABEL: constant_shift_v4i64:
419 ; AVX1:       # BB#0:
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
428 ; AVX1-NEXT:    retq
429 ;
430 ; AVX2-LABEL: constant_shift_v4i64:
431 ; AVX2:       # BB#0:
432 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
433 ; AVX2-NEXT:    retq
434 ;
435 ; XOPAVX1-LABEL: constant_shift_v4i64:
436 ; XOPAVX1:       # BB#0:
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
441 ; XOPAVX1-NEXT:    retq
442 ;
443 ; XOPAVX2-LABEL: constant_shift_v4i64:
444 ; XOPAVX2:       # BB#0:
445 ; XOPAVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
446 ; XOPAVX2-NEXT:    retq
447   %shift = shl <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
448   ret <4 x i64> %shift
449 }
450
451 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
452 ; AVX1-LABEL: constant_shift_v8i32:
453 ; AVX1:       # BB#0:
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
458 ; AVX1-NEXT:    retq
459 ;
460 ; AVX2-LABEL: constant_shift_v8i32:
461 ; AVX2:       # BB#0:
462 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
463 ; AVX2-NEXT:    retq
464 ;
465 ; XOPAVX1-LABEL: constant_shift_v8i32:
466 ; XOPAVX1:       # BB#0:
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
471 ; XOPAVX1-NEXT:    retq
472 ;
473 ; XOPAVX2-LABEL: constant_shift_v8i32:
474 ; XOPAVX2:       # BB#0:
475 ; XOPAVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
476 ; XOPAVX2-NEXT:    retq
477   %shift = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
478   ret <8 x i32> %shift
479 }
480
481 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
482 ; AVX1-LABEL: constant_shift_v16i16:
483 ; AVX1:       # BB#0:
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
488 ; AVX1-NEXT:    retq
489 ;
490 ; AVX2-LABEL: constant_shift_v16i16:
491 ; AVX2:       # BB#0:
492 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
493 ; AVX2-NEXT:    retq
494 ;
495 ; XOPAVX1-LABEL: constant_shift_v16i16:
496 ; XOPAVX1:       # BB#0:
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
501 ; XOPAVX1-NEXT:    retq
502 ;
503 ; XOPAVX2-LABEL: constant_shift_v16i16:
504 ; XOPAVX2:       # BB#0:
505 ; XOPAVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
506 ; XOPAVX2-NEXT:    retq
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
509 }
510
511 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
512 ; AVX1-LABEL: constant_shift_v32i8:
513 ; AVX1:       # BB#0:
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
538 ; AVX1-NEXT:    retq
539 ;
540 ; AVX2-LABEL: constant_shift_v32i8:
541 ; AVX2:       # BB#0:
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
554 ; AVX2-NEXT:    retq
555 ;
556 ; XOPAVX1-LABEL: constant_shift_v32i8:
557 ; XOPAVX1:       # BB#0:
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
563 ; XOPAVX1-NEXT:    retq
564 ;
565 ; XOPAVX2-LABEL: constant_shift_v32i8:
566 ; XOPAVX2:       # BB#0:
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
572 ; XOPAVX2-NEXT:    retq
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>
574   ret <32 x i8> %shift
575 }
576
577 ;
578 ; Uniform Constant Shifts
579 ;
580
581 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
582 ; AVX1-LABEL: splatconstant_shift_v4i64:
583 ; AVX1:       # BB#0:
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
588 ; AVX1-NEXT:    retq
589 ;
590 ; AVX2-LABEL: splatconstant_shift_v4i64:
591 ; AVX2:       # BB#0:
592 ; AVX2-NEXT:    vpsllq $7, %ymm0, %ymm0
593 ; AVX2-NEXT:    retq
594 ;
595 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
596 ; XOPAVX1:       # BB#0:
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
601 ; XOPAVX1-NEXT:    retq
602 ;
603 ; XOPAVX2-LABEL: splatconstant_shift_v4i64:
604 ; XOPAVX2:       # BB#0:
605 ; XOPAVX2-NEXT:    vpsllq $7, %ymm0, %ymm0
606 ; XOPAVX2-NEXT:    retq
607   %shift = shl <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
608   ret <4 x i64> %shift
609 }
610
611 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
612 ; AVX1-LABEL: splatconstant_shift_v8i32:
613 ; AVX1:       # BB#0:
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
618 ; AVX1-NEXT:    retq
619 ;
620 ; AVX2-LABEL: splatconstant_shift_v8i32:
621 ; AVX2:       # BB#0:
622 ; AVX2-NEXT:    vpslld $5, %ymm0, %ymm0
623 ; AVX2-NEXT:    retq
624 ;
625 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
626 ; XOPAVX1:       # BB#0:
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
631 ; XOPAVX1-NEXT:    retq
632 ;
633 ; XOPAVX2-LABEL: splatconstant_shift_v8i32:
634 ; XOPAVX2:       # BB#0:
635 ; XOPAVX2-NEXT:    vpslld $5, %ymm0, %ymm0
636 ; XOPAVX2-NEXT:    retq
637   %shift = shl <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
638   ret <8 x i32> %shift
639 }
640
641 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
642 ; AVX1-LABEL: splatconstant_shift_v16i16:
643 ; AVX1:       # BB#0:
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
648 ; AVX1-NEXT:    retq
649 ;
650 ; AVX2-LABEL: splatconstant_shift_v16i16:
651 ; AVX2:       # BB#0:
652 ; AVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
653 ; AVX2-NEXT:    retq
654 ;
655 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
656 ; XOPAVX1:       # BB#0:
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
661 ; XOPAVX1-NEXT:    retq
662 ;
663 ; XOPAVX2-LABEL: splatconstant_shift_v16i16:
664 ; XOPAVX2:       # BB#0:
665 ; XOPAVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
666 ; XOPAVX2-NEXT:    retq
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
669 }
670
671 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
672 ; AVX1-LABEL: splatconstant_shift_v32i8:
673 ; AVX1:       # BB#0:
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
681 ; AVX1-NEXT:    retq
682 ;
683 ; AVX2-LABEL: splatconstant_shift_v32i8:
684 ; AVX2:       # BB#0:
685 ; AVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
686 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
687 ; AVX2-NEXT:    retq
688 ;
689 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
690 ; XOPAVX1:       # BB#0:
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
696 ; XOPAVX1-NEXT:    retq
697 ;
698 ; XOPAVX2-LABEL: splatconstant_shift_v32i8:
699 ; XOPAVX2:       # BB#0:
700 ; XOPAVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
701 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
702 ; XOPAVX2-NEXT:    retq
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>
704   ret <32 x i8> %shift
705 }