LEA code size optimization pass (Part 1): Remove redundant address recalculations...
[oota-llvm.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
7 ;
8 ; Variable Shifts
9 ;
10
11 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
12 ; AVX1-LABEL: var_shift_v4i64:
13 ; AVX1:       # BB#0:
14 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
15 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
16 ; AVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm4
17 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
18 ; AVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm2
19 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]
20 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm3
21 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
22 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
23 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
24 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
25 ; AVX1-NEXT:    retq
26 ;
27 ; AVX2-LABEL: var_shift_v4i64:
28 ; AVX2:       # BB#0:
29 ; AVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
30 ; AVX2-NEXT:    retq
31 ;
32 ; XOPAVX1-LABEL: var_shift_v4i64:
33 ; XOPAVX1:       # BB#0:
34 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
35 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
36 ; XOPAVX1-NEXT:    vpshlq %xmm2, %xmm3, %xmm2
37 ; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm0
38 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
39 ; XOPAVX1-NEXT:    retq
40 ;
41 ; XOPAVX2-LABEL: var_shift_v4i64:
42 ; XOPAVX2:       # BB#0:
43 ; XOPAVX2-NEXT:    vpsllvq %ymm1, %ymm0, %ymm0
44 ; XOPAVX2-NEXT:    retq
45   %shift = shl <4 x i64> %a, %b
46   ret <4 x i64> %shift
47 }
48
49 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
50 ; AVX1-LABEL: var_shift_v8i32:
51 ; AVX1:       # BB#0:
52 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
53 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
54 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
55 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
56 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
57 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
58 ; AVX1-NEXT:    vpmulld %xmm4, %xmm2, %xmm2
59 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
60 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
61 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
62 ; AVX1-NEXT:    vpmulld %xmm0, %xmm1, %xmm0
63 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
64 ; AVX1-NEXT:    retq
65 ;
66 ; AVX2-LABEL: var_shift_v8i32:
67 ; AVX2:       # BB#0:
68 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
69 ; AVX2-NEXT:    retq
70 ;
71 ; XOPAVX1-LABEL: var_shift_v8i32:
72 ; XOPAVX1:       # BB#0:
73 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
74 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
75 ; XOPAVX1-NEXT:    vpshld %xmm2, %xmm3, %xmm2
76 ; XOPAVX1-NEXT:    vpshld %xmm1, %xmm0, %xmm0
77 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
78 ; XOPAVX1-NEXT:    retq
79 ;
80 ; XOPAVX2-LABEL: var_shift_v8i32:
81 ; XOPAVX2:       # BB#0:
82 ; XOPAVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
83 ; XOPAVX2-NEXT:    retq
84   %shift = shl <8 x i32> %a, %b
85   ret <8 x i32> %shift
86 }
87
88 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
89 ; AVX1-LABEL: var_shift_v16i16:
90 ; AVX1:       # BB#0:
91 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
92 ; AVX1-NEXT:    vpsllw $12, %xmm2, %xmm3
93 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
94 ; AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2
95 ; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm3
96 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
97 ; AVX1-NEXT:    vpsllw $8, %xmm4, %xmm5
98 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
99 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm4
100 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
101 ; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm4
102 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
103 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
104 ; AVX1-NEXT:    vpsllw $1, %xmm2, %xmm4
105 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
106 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
107 ; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm3
108 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
109 ; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
110 ; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm3
111 ; AVX1-NEXT:    vpsllw $8, %xmm0, %xmm4
112 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
113 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm1
114 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
115 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm1
116 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
117 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
118 ; AVX1-NEXT:    vpsllw $1, %xmm0, %xmm1
119 ; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm3
120 ; AVX1-NEXT:    vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
121 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
122 ; AVX1-NEXT:    retq
123 ;
124 ; AVX2-LABEL: var_shift_v16i16:
125 ; AVX2:       # BB#0:
126 ; AVX2-NEXT:    vpxor %ymm2, %ymm2, %ymm2
127 ; 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]
128 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
129 ; AVX2-NEXT:    vpsllvd %ymm3, %ymm4, %ymm3
130 ; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
131 ; 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]
132 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
133 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
134 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
135 ; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
136 ; AVX2-NEXT:    retq
137 ;
138 ; XOPAVX1-LABEL: var_shift_v16i16:
139 ; XOPAVX1:       # BB#0:
140 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
141 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
142 ; XOPAVX1-NEXT:    vpshlw %xmm2, %xmm3, %xmm2
143 ; XOPAVX1-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
144 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
145 ; XOPAVX1-NEXT:    retq
146 ;
147 ; XOPAVX2-LABEL: var_shift_v16i16:
148 ; XOPAVX2:       # BB#0:
149 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
150 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
151 ; XOPAVX2-NEXT:    vpshlw %xmm2, %xmm3, %xmm2
152 ; XOPAVX2-NEXT:    vpshlw %xmm1, %xmm0, %xmm0
153 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
154 ; XOPAVX2-NEXT:    retq
155   %shift = shl <16 x i16> %a, %b
156   ret <16 x i16> %shift
157 }
158
159 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
160 ; AVX1-LABEL: var_shift_v32i8:
161 ; AVX1:       # BB#0:
162 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
163 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm3
164 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
165 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
166 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
167 ; AVX1-NEXT:    vpsllw $5, %xmm5, %xmm5
168 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
169 ; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm3
170 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
171 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
172 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
173 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
174 ; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm3
175 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
176 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
177 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm3
178 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
179 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
180 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
181 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm3
182 ; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
183 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
184 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
185 ; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm3
186 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
187 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
188 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
189 ; AVX1-NEXT:    retq
190 ;
191 ; AVX2-LABEL: var_shift_v32i8:
192 ; AVX2:       # BB#0:
193 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
194 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm2
195 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
196 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
197 ; AVX2-NEXT:    vpsllw $2, %ymm0, %ymm2
198 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
199 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
200 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
201 ; AVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
202 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
203 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
204 ; AVX2-NEXT:    retq
205 ;
206 ; XOPAVX1-LABEL: var_shift_v32i8:
207 ; XOPAVX1:       # BB#0:
208 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
209 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
210 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm3, %xmm2
211 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
212 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
213 ; XOPAVX1-NEXT:    retq
214 ;
215 ; XOPAVX2-LABEL: var_shift_v32i8:
216 ; XOPAVX2:       # BB#0:
217 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
218 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
219 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm3, %xmm2
220 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
221 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
222 ; XOPAVX2-NEXT:    retq
223   %shift = shl <32 x i8> %a, %b
224   ret <32 x i8> %shift
225 }
226
227 ;
228 ; Uniform Variable Shifts
229 ;
230
231 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
232 ; AVX1-LABEL: splatvar_shift_v4i64:
233 ; AVX1:       # BB#0:
234 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
235 ; AVX1-NEXT:    vpsllq %xmm1, %xmm2, %xmm2
236 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
237 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
238 ; AVX1-NEXT:    retq
239 ;
240 ; AVX2-LABEL: splatvar_shift_v4i64:
241 ; AVX2:       # BB#0:
242 ; AVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
243 ; AVX2-NEXT:    retq
244 ;
245 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
246 ; XOPAVX1:       # BB#0:
247 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
248 ; XOPAVX1-NEXT:    vpsllq %xmm1, %xmm2, %xmm2
249 ; XOPAVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
250 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
251 ; XOPAVX1-NEXT:    retq
252 ;
253 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
254 ; XOPAVX2:       # BB#0:
255 ; XOPAVX2-NEXT:    vpsllq %xmm1, %ymm0, %ymm0
256 ; XOPAVX2-NEXT:    retq
257   %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
258   %shift = shl <4 x i64> %a, %splat
259   ret <4 x i64> %shift
260 }
261
262 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
263 ; AVX1-LABEL: splatvar_shift_v8i32:
264 ; AVX1:       # BB#0:
265 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
266 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
267 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
268 ; AVX1-NEXT:    vpslld %xmm1, %xmm2, %xmm2
269 ; AVX1-NEXT:    vpslld %xmm1, %xmm0, %xmm0
270 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
271 ; AVX1-NEXT:    retq
272 ;
273 ; AVX2-LABEL: splatvar_shift_v8i32:
274 ; AVX2:       # BB#0:
275 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
276 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
277 ; AVX2-NEXT:    vpslld %xmm1, %ymm0, %ymm0
278 ; AVX2-NEXT:    retq
279 ;
280 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
281 ; XOPAVX1:       # BB#0:
282 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
283 ; XOPAVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
284 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
285 ; XOPAVX1-NEXT:    vpslld %xmm1, %xmm2, %xmm2
286 ; XOPAVX1-NEXT:    vpslld %xmm1, %xmm0, %xmm0
287 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
288 ; XOPAVX1-NEXT:    retq
289 ;
290 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
291 ; XOPAVX2:       # BB#0:
292 ; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
293 ; XOPAVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
294 ; XOPAVX2-NEXT:    vpslld %xmm1, %ymm0, %ymm0
295 ; XOPAVX2-NEXT:    retq
296   %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
297   %shift = shl <8 x i32> %a, %splat
298   ret <8 x i32> %shift
299 }
300
301 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
302 ; AVX1-LABEL: splatvar_shift_v16i16:
303 ; AVX1:       # BB#0:
304 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
305 ; AVX1-NEXT:    vmovd %xmm1, %eax
306 ; AVX1-NEXT:    movzwl %ax, %eax
307 ; AVX1-NEXT:    vmovd %eax, %xmm1
308 ; AVX1-NEXT:    vpsllw %xmm1, %xmm2, %xmm2
309 ; AVX1-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
310 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
311 ; AVX1-NEXT:    retq
312 ;
313 ; AVX2-LABEL: splatvar_shift_v16i16:
314 ; AVX2:       # BB#0:
315 ; AVX2-NEXT:    vmovd %xmm1, %eax
316 ; AVX2-NEXT:    movzwl %ax, %eax
317 ; AVX2-NEXT:    vmovd %eax, %xmm1
318 ; AVX2-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
319 ; AVX2-NEXT:    retq
320 ;
321 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
322 ; XOPAVX1:       # BB#0:
323 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
324 ; XOPAVX1-NEXT:    vmovd %xmm1, %eax
325 ; XOPAVX1-NEXT:    movzwl %ax, %eax
326 ; XOPAVX1-NEXT:    vmovd %eax, %xmm1
327 ; XOPAVX1-NEXT:    vpsllw %xmm1, %xmm2, %xmm2
328 ; XOPAVX1-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
329 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
330 ; XOPAVX1-NEXT:    retq
331 ;
332 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
333 ; XOPAVX2:       # BB#0:
334 ; XOPAVX2-NEXT:    vmovd %xmm1, %eax
335 ; XOPAVX2-NEXT:    movzwl %ax, %eax
336 ; XOPAVX2-NEXT:    vmovd %eax, %xmm1
337 ; XOPAVX2-NEXT:    vpsllw %xmm1, %ymm0, %ymm0
338 ; XOPAVX2-NEXT:    retq
339   %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
340   %shift = shl <16 x i16> %a, %splat
341   ret <16 x i16> %shift
342 }
343
344 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
345 ; AVX1-LABEL: splatvar_shift_v32i8:
346 ; AVX1:       # BB#0:
347 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
348 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
349 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
350 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm3
351 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
352 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
353 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
354 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm2, %xmm2
355 ; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm3
356 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
357 ; AVX1-NEXT:    vpand %xmm5, %xmm3, %xmm3
358 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm6
359 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
360 ; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm3
361 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm7
362 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm3, %xmm2, %xmm2
363 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm3
364 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
365 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
366 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm1
367 ; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
368 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm1, %xmm0, %xmm0
369 ; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm1
370 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
371 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
372 ; AVX1-NEXT:    retq
373 ;
374 ; AVX2-LABEL: splatvar_shift_v32i8:
375 ; AVX2:       # BB#0:
376 ; AVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
377 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm2
378 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
379 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
380 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
381 ; AVX2-NEXT:    vpsllw $2, %ymm0, %ymm2
382 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
383 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
384 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
385 ; AVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
386 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
387 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
388 ; AVX2-NEXT:    retq
389 ;
390 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
391 ; XOPAVX1:       # BB#0:
392 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
393 ; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
394 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
395 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm2, %xmm2
396 ; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
397 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
398 ; XOPAVX1-NEXT:    retq
399 ;
400 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
401 ; XOPAVX2:       # BB#0:
402 ; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
403 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
404 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
405 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
406 ; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0
407 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
408 ; XOPAVX2-NEXT:    retq
409   %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
410   %shift = shl <32 x i8> %a, %splat
411   ret <32 x i8> %shift
412 }
413
414 ;
415 ; Constant Shifts
416 ;
417
418 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
419 ; AVX1-LABEL: constant_shift_v4i64:
420 ; AVX1:       # BB#0:
421 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
422 ; AVX1-NEXT:    vpsllq $62, %xmm1, %xmm2
423 ; AVX1-NEXT:    vpsllq $31, %xmm1, %xmm1
424 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
425 ; AVX1-NEXT:    vpsllq $7, %xmm0, %xmm2
426 ; AVX1-NEXT:    vpsllq $1, %xmm0, %xmm0
427 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
428 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
429 ; AVX1-NEXT:    retq
430 ;
431 ; AVX2-LABEL: constant_shift_v4i64:
432 ; AVX2:       # BB#0:
433 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
434 ; AVX2-NEXT:    retq
435 ;
436 ; XOPAVX1-LABEL: constant_shift_v4i64:
437 ; XOPAVX1:       # BB#0:
438 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm1
439 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
440 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm0
441 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
442 ; XOPAVX1-NEXT:    retq
443 ;
444 ; XOPAVX2-LABEL: constant_shift_v4i64:
445 ; XOPAVX2:       # BB#0:
446 ; XOPAVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
447 ; XOPAVX2-NEXT:    retq
448   %shift = shl <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
449   ret <4 x i64> %shift
450 }
451
452 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
453 ; AVX1-LABEL: constant_shift_v8i32:
454 ; AVX1:       # BB#0:
455 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm1
456 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
457 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
458 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
459 ; AVX1-NEXT:    retq
460 ;
461 ; AVX2-LABEL: constant_shift_v8i32:
462 ; AVX2:       # BB#0:
463 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
464 ; AVX2-NEXT:    retq
465 ;
466 ; XOPAVX1-LABEL: constant_shift_v8i32:
467 ; XOPAVX1:       # BB#0:
468 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm1
469 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
470 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
471 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
472 ; XOPAVX1-NEXT:    retq
473 ;
474 ; XOPAVX2-LABEL: constant_shift_v8i32:
475 ; XOPAVX2:       # BB#0:
476 ; XOPAVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
477 ; XOPAVX2-NEXT:    retq
478   %shift = shl <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
479   ret <8 x i32> %shift
480 }
481
482 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
483 ; AVX1-LABEL: constant_shift_v16i16:
484 ; AVX1:       # BB#0:
485 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm1
486 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
487 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
488 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
489 ; AVX1-NEXT:    retq
490 ;
491 ; AVX2-LABEL: constant_shift_v16i16:
492 ; AVX2:       # BB#0:
493 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
494 ; AVX2-NEXT:    retq
495 ;
496 ; XOPAVX1-LABEL: constant_shift_v16i16:
497 ; XOPAVX1:       # BB#0:
498 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm0, %xmm1
499 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
500 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm0, %xmm0
501 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
502 ; XOPAVX1-NEXT:    retq
503 ;
504 ; XOPAVX2-LABEL: constant_shift_v16i16:
505 ; XOPAVX2:       # BB#0:
506 ; XOPAVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
507 ; XOPAVX2-NEXT:    retq
508   %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>
509   ret <16 x i16> %shift
510 }
511
512 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
513 ; AVX1-LABEL: constant_shift_v32i8:
514 ; AVX1:       # BB#0:
515 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
516 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm2
517 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
518 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
519 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
520 ; AVX1-NEXT:    vpsllw $5, %xmm4, %xmm4
521 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm1, %xmm1
522 ; AVX1-NEXT:    vpsllw $2, %xmm1, %xmm2
523 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
524 ; AVX1-NEXT:    vpand %xmm5, %xmm2, %xmm2
525 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm6
526 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm2, %xmm1, %xmm1
527 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm2
528 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm7
529 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm2, %xmm1, %xmm1
530 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm2
531 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
532 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm0, %xmm0
533 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm2
534 ; AVX1-NEXT:    vpand %xmm5, %xmm2, %xmm2
535 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm2, %xmm0, %xmm0
536 ; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm2
537 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm2, %xmm0, %xmm0
538 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
539 ; AVX1-NEXT:    retq
540 ;
541 ; AVX2-LABEL: constant_shift_v32i8:
542 ; AVX2:       # BB#0:
543 ; 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]
544 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
545 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm2
546 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
547 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
548 ; AVX2-NEXT:    vpsllw $2, %ymm0, %ymm2
549 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
550 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
551 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
552 ; AVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
553 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
554 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
555 ; AVX2-NEXT:    retq
556 ;
557 ; XOPAVX1-LABEL: constant_shift_v32i8:
558 ; XOPAVX1:       # BB#0:
559 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
560 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
561 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm1, %xmm1
562 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
563 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
564 ; XOPAVX1-NEXT:    retq
565 ;
566 ; XOPAVX2-LABEL: constant_shift_v32i8:
567 ; XOPAVX2:       # BB#0:
568 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
569 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
570 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm1, %xmm1
571 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
572 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
573 ; XOPAVX2-NEXT:    retq
574   %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>
575   ret <32 x i8> %shift
576 }
577
578 ;
579 ; Uniform Constant Shifts
580 ;
581
582 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
583 ; AVX1-LABEL: splatconstant_shift_v4i64:
584 ; AVX1:       # BB#0:
585 ; AVX1-NEXT:    vpsllq $7, %xmm0, %xmm1
586 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
587 ; AVX1-NEXT:    vpsllq $7, %xmm0, %xmm0
588 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
589 ; AVX1-NEXT:    retq
590 ;
591 ; AVX2-LABEL: splatconstant_shift_v4i64:
592 ; AVX2:       # BB#0:
593 ; AVX2-NEXT:    vpsllq $7, %ymm0, %ymm0
594 ; AVX2-NEXT:    retq
595 ;
596 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
597 ; XOPAVX1:       # BB#0:
598 ; XOPAVX1-NEXT:    vpsllq $7, %xmm0, %xmm1
599 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
600 ; XOPAVX1-NEXT:    vpsllq $7, %xmm0, %xmm0
601 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
602 ; XOPAVX1-NEXT:    retq
603 ;
604 ; XOPAVX2-LABEL: splatconstant_shift_v4i64:
605 ; XOPAVX2:       # BB#0:
606 ; XOPAVX2-NEXT:    vpsllq $7, %ymm0, %ymm0
607 ; XOPAVX2-NEXT:    retq
608   %shift = shl <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
609   ret <4 x i64> %shift
610 }
611
612 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
613 ; AVX1-LABEL: splatconstant_shift_v8i32:
614 ; AVX1:       # BB#0:
615 ; AVX1-NEXT:    vpslld $5, %xmm0, %xmm1
616 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
617 ; AVX1-NEXT:    vpslld $5, %xmm0, %xmm0
618 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
619 ; AVX1-NEXT:    retq
620 ;
621 ; AVX2-LABEL: splatconstant_shift_v8i32:
622 ; AVX2:       # BB#0:
623 ; AVX2-NEXT:    vpslld $5, %ymm0, %ymm0
624 ; AVX2-NEXT:    retq
625 ;
626 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
627 ; XOPAVX1:       # BB#0:
628 ; XOPAVX1-NEXT:    vpslld $5, %xmm0, %xmm1
629 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
630 ; XOPAVX1-NEXT:    vpslld $5, %xmm0, %xmm0
631 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
632 ; XOPAVX1-NEXT:    retq
633 ;
634 ; XOPAVX2-LABEL: splatconstant_shift_v8i32:
635 ; XOPAVX2:       # BB#0:
636 ; XOPAVX2-NEXT:    vpslld $5, %ymm0, %ymm0
637 ; XOPAVX2-NEXT:    retq
638   %shift = shl <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
639   ret <8 x i32> %shift
640 }
641
642 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
643 ; AVX1-LABEL: splatconstant_shift_v16i16:
644 ; AVX1:       # BB#0:
645 ; AVX1-NEXT:    vpsllw $3, %xmm0, %xmm1
646 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
647 ; AVX1-NEXT:    vpsllw $3, %xmm0, %xmm0
648 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
649 ; AVX1-NEXT:    retq
650 ;
651 ; AVX2-LABEL: splatconstant_shift_v16i16:
652 ; AVX2:       # BB#0:
653 ; AVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
654 ; AVX2-NEXT:    retq
655 ;
656 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
657 ; XOPAVX1:       # BB#0:
658 ; XOPAVX1-NEXT:    vpsllw $3, %xmm0, %xmm1
659 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
660 ; XOPAVX1-NEXT:    vpsllw $3, %xmm0, %xmm0
661 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
662 ; XOPAVX1-NEXT:    retq
663 ;
664 ; XOPAVX2-LABEL: splatconstant_shift_v16i16:
665 ; XOPAVX2:       # BB#0:
666 ; XOPAVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
667 ; XOPAVX2-NEXT:    retq
668   %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>
669   ret <16 x i16> %shift
670 }
671
672 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
673 ; AVX1-LABEL: splatconstant_shift_v32i8:
674 ; AVX1:       # BB#0:
675 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
676 ; AVX1-NEXT:    vpsllw $3, %xmm1, %xmm1
677 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
678 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
679 ; AVX1-NEXT:    vpsllw $3, %xmm0, %xmm0
680 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
681 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
682 ; AVX1-NEXT:    retq
683 ;
684 ; AVX2-LABEL: splatconstant_shift_v32i8:
685 ; AVX2:       # BB#0:
686 ; AVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
687 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
688 ; AVX2-NEXT:    retq
689 ;
690 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
691 ; XOPAVX1:       # BB#0:
692 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
693 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
694 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm1, %xmm1
695 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
696 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
697 ; XOPAVX1-NEXT:    retq
698 ;
699 ; XOPAVX2-LABEL: splatconstant_shift_v32i8:
700 ; XOPAVX2:       # BB#0:
701 ; XOPAVX2-NEXT:    vpsllw $3, %ymm0, %ymm0
702 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
703 ; XOPAVX2-NEXT:    retq
704   %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>
705   ret <32 x i8> %shift
706 }