0f4ada5910befd1f99a22b4f97f11ed34724b493
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-128-v4.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE3
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+ssse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
7
8 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
9 target triple = "x86_64-unknown-unknown"
10
11 define <4 x i32> @shuffle_v4i32_0001(<4 x i32> %a, <4 x i32> %b) {
12 ; SSE-LABEL: shuffle_v4i32_0001:
13 ; SSE:       # BB#0:
14 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,1]
15 ; SSE-NEXT:    retq
16 ;
17 ; AVX-LABEL: shuffle_v4i32_0001:
18 ; AVX:       # BB#0:
19 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,1]
20 ; AVX-NEXT:    retq
21   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
22   ret <4 x i32> %shuffle
23 }
24 define <4 x i32> @shuffle_v4i32_0020(<4 x i32> %a, <4 x i32> %b) {
25 ; SSE-LABEL: shuffle_v4i32_0020:
26 ; SSE:       # BB#0:
27 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,2,0]
28 ; SSE-NEXT:    retq
29 ;
30 ; AVX-LABEL: shuffle_v4i32_0020:
31 ; AVX:       # BB#0:
32 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,2,0]
33 ; AVX-NEXT:    retq
34   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
35   ret <4 x i32> %shuffle
36 }
37 define <4 x i32> @shuffle_v4i32_0112(<4 x i32> %a, <4 x i32> %b) {
38 ; SSE-LABEL: shuffle_v4i32_0112:
39 ; SSE:       # BB#0:
40 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,2]
41 ; SSE-NEXT:    retq
42 ;
43 ; AVX-LABEL: shuffle_v4i32_0112:
44 ; AVX:       # BB#0:
45 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,2]
46 ; AVX-NEXT:    retq
47   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 1, i32 2>
48   ret <4 x i32> %shuffle
49 }
50 define <4 x i32> @shuffle_v4i32_0300(<4 x i32> %a, <4 x i32> %b) {
51 ; SSE-LABEL: shuffle_v4i32_0300:
52 ; SSE:       # BB#0:
53 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,0,0]
54 ; SSE-NEXT:    retq
55 ;
56 ; AVX-LABEL: shuffle_v4i32_0300:
57 ; AVX:       # BB#0:
58 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,3,0,0]
59 ; AVX-NEXT:    retq
60   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
61   ret <4 x i32> %shuffle
62 }
63 define <4 x i32> @shuffle_v4i32_1000(<4 x i32> %a, <4 x i32> %b) {
64 ; SSE-LABEL: shuffle_v4i32_1000:
65 ; SSE:       # BB#0:
66 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,0,0]
67 ; SSE-NEXT:    retq
68 ;
69 ; AVX-LABEL: shuffle_v4i32_1000:
70 ; AVX:       # BB#0:
71 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,0,0,0]
72 ; AVX-NEXT:    retq
73   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
74   ret <4 x i32> %shuffle
75 }
76 define <4 x i32> @shuffle_v4i32_2200(<4 x i32> %a, <4 x i32> %b) {
77 ; SSE-LABEL: shuffle_v4i32_2200:
78 ; SSE:       # BB#0:
79 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,0,0]
80 ; SSE-NEXT:    retq
81 ;
82 ; AVX-LABEL: shuffle_v4i32_2200:
83 ; AVX:       # BB#0:
84 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,2,0,0]
85 ; AVX-NEXT:    retq
86   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
87   ret <4 x i32> %shuffle
88 }
89 define <4 x i32> @shuffle_v4i32_3330(<4 x i32> %a, <4 x i32> %b) {
90 ; SSE-LABEL: shuffle_v4i32_3330:
91 ; SSE:       # BB#0:
92 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,3,3,0]
93 ; SSE-NEXT:    retq
94 ;
95 ; AVX-LABEL: shuffle_v4i32_3330:
96 ; AVX:       # BB#0:
97 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,0]
98 ; AVX-NEXT:    retq
99   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
100   ret <4 x i32> %shuffle
101 }
102 define <4 x i32> @shuffle_v4i32_3210(<4 x i32> %a, <4 x i32> %b) {
103 ; SSE-LABEL: shuffle_v4i32_3210:
104 ; SSE:       # BB#0:
105 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]
106 ; SSE-NEXT:    retq
107 ;
108 ; AVX-LABEL: shuffle_v4i32_3210:
109 ; AVX:       # BB#0:
110 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]
111 ; AVX-NEXT:    retq
112   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
113   ret <4 x i32> %shuffle
114 }
115
116 define <4 x i32> @shuffle_v4i32_2121(<4 x i32> %a, <4 x i32> %b) {
117 ; SSE-LABEL: shuffle_v4i32_2121:
118 ; SSE:       # BB#0:
119 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,1,2,1]
120 ; SSE-NEXT:    retq
121 ;
122 ; AVX-LABEL: shuffle_v4i32_2121:
123 ; AVX:       # BB#0:
124 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,1,2,1]
125 ; AVX-NEXT:    retq
126   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 1, i32 2, i32 1>
127   ret <4 x i32> %shuffle
128 }
129
130 define <4 x float> @shuffle_v4f32_0001(<4 x float> %a, <4 x float> %b) {
131 ; SSE-LABEL: shuffle_v4f32_0001:
132 ; SSE:       # BB#0:
133 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0,0,1]
134 ; SSE-NEXT:    retq
135 ;
136 ; AVX-LABEL: shuffle_v4f32_0001:
137 ; AVX:       # BB#0:
138 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,0,0,1]
139 ; AVX-NEXT:    retq
140   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
141   ret <4 x float> %shuffle
142 }
143 define <4 x float> @shuffle_v4f32_0020(<4 x float> %a, <4 x float> %b) {
144 ; SSE-LABEL: shuffle_v4f32_0020:
145 ; SSE:       # BB#0:
146 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0,2,0]
147 ; SSE-NEXT:    retq
148 ;
149 ; AVX-LABEL: shuffle_v4f32_0020:
150 ; AVX:       # BB#0:
151 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,0,2,0]
152 ; AVX-NEXT:    retq
153   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
154   ret <4 x float> %shuffle
155 }
156 define <4 x float> @shuffle_v4f32_0300(<4 x float> %a, <4 x float> %b) {
157 ; SSE-LABEL: shuffle_v4f32_0300:
158 ; SSE:       # BB#0:
159 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,3,0,0]
160 ; SSE-NEXT:    retq
161 ;
162 ; AVX-LABEL: shuffle_v4f32_0300:
163 ; AVX:       # BB#0:
164 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,3,0,0]
165 ; AVX-NEXT:    retq
166   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
167   ret <4 x float> %shuffle
168 }
169 define <4 x float> @shuffle_v4f32_1000(<4 x float> %a, <4 x float> %b) {
170 ; SSE-LABEL: shuffle_v4f32_1000:
171 ; SSE:       # BB#0:
172 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0,0,0]
173 ; SSE-NEXT:    retq
174 ;
175 ; AVX-LABEL: shuffle_v4f32_1000:
176 ; AVX:       # BB#0:
177 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[1,0,0,0]
178 ; AVX-NEXT:    retq
179   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
180   ret <4 x float> %shuffle
181 }
182 define <4 x float> @shuffle_v4f32_2200(<4 x float> %a, <4 x float> %b) {
183 ; SSE-LABEL: shuffle_v4f32_2200:
184 ; SSE:       # BB#0:
185 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,2,0,0]
186 ; SSE-NEXT:    retq
187 ;
188 ; AVX-LABEL: shuffle_v4f32_2200:
189 ; AVX:       # BB#0:
190 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[2,2,0,0]
191 ; AVX-NEXT:    retq
192   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
193   ret <4 x float> %shuffle
194 }
195 define <4 x float> @shuffle_v4f32_3330(<4 x float> %a, <4 x float> %b) {
196 ; SSE-LABEL: shuffle_v4f32_3330:
197 ; SSE:       # BB#0:
198 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,0]
199 ; SSE-NEXT:    retq
200 ;
201 ; AVX-LABEL: shuffle_v4f32_3330:
202 ; AVX:       # BB#0:
203 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,3,3,0]
204 ; AVX-NEXT:    retq
205   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
206   ret <4 x float> %shuffle
207 }
208 define <4 x float> @shuffle_v4f32_3210(<4 x float> %a, <4 x float> %b) {
209 ; SSE-LABEL: shuffle_v4f32_3210:
210 ; SSE:       # BB#0:
211 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
212 ; SSE-NEXT:    retq
213 ;
214 ; AVX-LABEL: shuffle_v4f32_3210:
215 ; AVX:       # BB#0:
216 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,2,1,0]
217 ; AVX-NEXT:    retq
218   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
219   ret <4 x float> %shuffle
220 }
221 define <4 x float> @shuffle_v4f32_0011(<4 x float> %a, <4 x float> %b) {
222 ; SSE-LABEL: shuffle_v4f32_0011:
223 ; SSE:       # BB#0:
224 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0,0,1,1]
225 ; SSE-NEXT:    retq
226 ;
227 ; AVX-LABEL: shuffle_v4f32_0011:
228 ; AVX:       # BB#0:
229 ; AVX-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm0[0,0,1,1]
230 ; AVX-NEXT:    retq
231   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 1, i32 1>
232   ret <4 x float> %shuffle
233 }
234 define <4 x float> @shuffle_v4f32_2233(<4 x float> %a, <4 x float> %b) {
235 ; SSE-LABEL: shuffle_v4f32_2233:
236 ; SSE:       # BB#0:
237 ; SSE-NEXT:    unpckhps {{.*#+}} xmm0 = xmm0[2,2,3,3]
238 ; SSE-NEXT:    retq
239 ;
240 ; AVX-LABEL: shuffle_v4f32_2233:
241 ; AVX:       # BB#0:
242 ; AVX-NEXT:    vunpckhps {{.*#+}} xmm0 = xmm0[2,2,3,3]
243 ; AVX-NEXT:    retq
244   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 2, i32 2, i32 3, i32 3>
245   ret <4 x float> %shuffle
246 }
247 define <4 x float> @shuffle_v4f32_0022(<4 x float> %a, <4 x float> %b) {
248 ; SSE2-LABEL: shuffle_v4f32_0022:
249 ; SSE2:       # BB#0:
250 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0,2,2]
251 ; SSE2-NEXT:    retq
252 ;
253 ; SSE3-LABEL: shuffle_v4f32_0022:
254 ; SSE3:       # BB#0:
255 ; SSE3-NEXT:    movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
256 ; SSE3-NEXT:    retq
257 ;
258 ; SSSE3-LABEL: shuffle_v4f32_0022:
259 ; SSSE3:       # BB#0:
260 ; SSSE3-NEXT:    movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
261 ; SSSE3-NEXT:    retq
262 ;
263 ; SSE41-LABEL: shuffle_v4f32_0022:
264 ; SSE41:       # BB#0:
265 ; SSE41-NEXT:    movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
266 ; SSE41-NEXT:    retq
267 ;
268 ; AVX-LABEL: shuffle_v4f32_0022:
269 ; AVX:       # BB#0:
270 ; AVX-NEXT:    vmovsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
271 ; AVX-NEXT:    retq
272   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 2>
273   ret <4 x float> %shuffle
274 }
275 define <4 x float> @shuffle_v4f32_1133(<4 x float> %a, <4 x float> %b) {
276 ; SSE2-LABEL: shuffle_v4f32_1133:
277 ; SSE2:       # BB#0:
278 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,3,3]
279 ; SSE2-NEXT:    retq
280 ;
281 ; SSE3-LABEL: shuffle_v4f32_1133:
282 ; SSE3:       # BB#0:
283 ; SSE3-NEXT:    movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
284 ; SSE3-NEXT:    retq
285 ;
286 ; SSSE3-LABEL: shuffle_v4f32_1133:
287 ; SSSE3:       # BB#0:
288 ; SSSE3-NEXT:    movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
289 ; SSSE3-NEXT:    retq
290 ;
291 ; SSE41-LABEL: shuffle_v4f32_1133:
292 ; SSE41:       # BB#0:
293 ; SSE41-NEXT:    movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
294 ; SSE41-NEXT:    retq
295 ;
296 ; AVX-LABEL: shuffle_v4f32_1133:
297 ; AVX:       # BB#0:
298 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
299 ; AVX-NEXT:    retq
300   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 1, i32 1, i32 3, i32 3>
301   ret <4 x float> %shuffle
302 }
303
304 define <4 x i32> @shuffle_v4i32_0124(<4 x i32> %a, <4 x i32> %b) {
305 ; SSE2-LABEL: shuffle_v4i32_0124:
306 ; SSE2:       # BB#0:
307 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
308 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
309 ; SSE2-NEXT:    retq
310 ;
311 ; SSE3-LABEL: shuffle_v4i32_0124:
312 ; SSE3:       # BB#0:
313 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
314 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
315 ; SSE3-NEXT:    retq
316 ;
317 ; SSSE3-LABEL: shuffle_v4i32_0124:
318 ; SSSE3:       # BB#0:
319 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
320 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
321 ; SSSE3-NEXT:    retq
322 ;
323 ; SSE41-LABEL: shuffle_v4i32_0124:
324 ; SSE41:       # BB#0:
325 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,2,0]
326 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5],xmm1[6,7]
327 ; SSE41-NEXT:    retq
328 ;
329 ; AVX1-LABEL: shuffle_v4i32_0124:
330 ; AVX1:       # BB#0:
331 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,2,0]
332 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5],xmm1[6,7]
333 ; AVX1-NEXT:    retq
334 ;
335 ; AVX2-LABEL: shuffle_v4i32_0124:
336 ; AVX2:       # BB#0:
337 ; AVX2-NEXT:    vpbroadcastd %xmm1, %xmm1
338 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]
339 ; AVX2-NEXT:    retq
340   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 4>
341   ret <4 x i32> %shuffle
342 }
343 define <4 x i32> @shuffle_v4i32_0142(<4 x i32> %a, <4 x i32> %b) {
344 ; SSE2-LABEL: shuffle_v4i32_0142:
345 ; SSE2:       # BB#0:
346 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
347 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
348 ; SSE2-NEXT:    retq
349 ;
350 ; SSE3-LABEL: shuffle_v4i32_0142:
351 ; SSE3:       # BB#0:
352 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
353 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
354 ; SSE3-NEXT:    retq
355 ;
356 ; SSSE3-LABEL: shuffle_v4i32_0142:
357 ; SSSE3:       # BB#0:
358 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
359 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
360 ; SSSE3-NEXT:    retq
361 ;
362 ; SSE41-LABEL: shuffle_v4i32_0142:
363 ; SSE41:       # BB#0:
364 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
365 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,2,2]
366 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
367 ; SSE41-NEXT:    retq
368 ;
369 ; AVX1-LABEL: shuffle_v4i32_0142:
370 ; AVX1:       # BB#0:
371 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
372 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,2,2]
373 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
374 ; AVX1-NEXT:    retq
375 ;
376 ; AVX2-LABEL: shuffle_v4i32_0142:
377 ; AVX2:       # BB#0:
378 ; AVX2-NEXT:    vpbroadcastq %xmm1, %xmm1
379 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,2,2]
380 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]
381 ; AVX2-NEXT:    retq
382   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 2>
383   ret <4 x i32> %shuffle
384 }
385 define <4 x i32> @shuffle_v4i32_0412(<4 x i32> %a, <4 x i32> %b) {
386 ; SSE2-LABEL: shuffle_v4i32_0412:
387 ; SSE2:       # BB#0:
388 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
389 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[1,2]
390 ; SSE2-NEXT:    movaps %xmm1, %xmm0
391 ; SSE2-NEXT:    retq
392 ;
393 ; SSE3-LABEL: shuffle_v4i32_0412:
394 ; SSE3:       # BB#0:
395 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
396 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[1,2]
397 ; SSE3-NEXT:    movaps %xmm1, %xmm0
398 ; SSE3-NEXT:    retq
399 ;
400 ; SSSE3-LABEL: shuffle_v4i32_0412:
401 ; SSSE3:       # BB#0:
402 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
403 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[1,2]
404 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
405 ; SSSE3-NEXT:    retq
406 ;
407 ; SSE41-LABEL: shuffle_v4i32_0412:
408 ; SSE41:       # BB#0:
409 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
410 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,2]
411 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
412 ; SSE41-NEXT:    retq
413 ;
414 ; AVX1-LABEL: shuffle_v4i32_0412:
415 ; AVX1:       # BB#0:
416 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
417 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,2]
418 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
419 ; AVX1-NEXT:    retq
420 ;
421 ; AVX2-LABEL: shuffle_v4i32_0412:
422 ; AVX2:       # BB#0:
423 ; AVX2-NEXT:    vpbroadcastd %xmm1, %xmm1
424 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,2]
425 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
426 ; AVX2-NEXT:    retq
427   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 2>
428   ret <4 x i32> %shuffle
429 }
430 define <4 x i32> @shuffle_v4i32_4012(<4 x i32> %a, <4 x i32> %b) {
431 ; SSE2-LABEL: shuffle_v4i32_4012:
432 ; SSE2:       # BB#0:
433 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
434 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
435 ; SSE2-NEXT:    movaps %xmm1, %xmm0
436 ; SSE2-NEXT:    retq
437 ;
438 ; SSE3-LABEL: shuffle_v4i32_4012:
439 ; SSE3:       # BB#0:
440 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
441 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
442 ; SSE3-NEXT:    movaps %xmm1, %xmm0
443 ; SSE3-NEXT:    retq
444 ;
445 ; SSSE3-LABEL: shuffle_v4i32_4012:
446 ; SSSE3:       # BB#0:
447 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
448 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
449 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
450 ; SSSE3-NEXT:    retq
451 ;
452 ; SSE41-LABEL: shuffle_v4i32_4012:
453 ; SSE41:       # BB#0:
454 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,2]
455 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7]
456 ; SSE41-NEXT:    retq
457 ;
458 ; AVX1-LABEL: shuffle_v4i32_4012:
459 ; AVX1:       # BB#0:
460 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,2]
461 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7]
462 ; AVX1-NEXT:    retq
463 ;
464 ; AVX2-LABEL: shuffle_v4i32_4012:
465 ; AVX2:       # BB#0:
466 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,2]
467 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
468 ; AVX2-NEXT:    retq
469   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
470   ret <4 x i32> %shuffle
471 }
472 define <4 x i32> @shuffle_v4i32_0145(<4 x i32> %a, <4 x i32> %b) {
473 ; SSE-LABEL: shuffle_v4i32_0145:
474 ; SSE:       # BB#0:
475 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
476 ; SSE-NEXT:    retq
477 ;
478 ; AVX-LABEL: shuffle_v4i32_0145:
479 ; AVX:       # BB#0:
480 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
481 ; AVX-NEXT:    retq
482   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
483   ret <4 x i32> %shuffle
484 }
485 define <4 x i32> @shuffle_v4i32_0451(<4 x i32> %a, <4 x i32> %b) {
486 ; SSE2-LABEL: shuffle_v4i32_0451:
487 ; SSE2:       # BB#0:
488 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
489 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,3,2]
490 ; SSE2-NEXT:    retq
491 ;
492 ; SSE3-LABEL: shuffle_v4i32_0451:
493 ; SSE3:       # BB#0:
494 ; SSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
495 ; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,3,2]
496 ; SSE3-NEXT:    retq
497 ;
498 ; SSSE3-LABEL: shuffle_v4i32_0451:
499 ; SSSE3:       # BB#0:
500 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
501 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,3,2]
502 ; SSSE3-NEXT:    retq
503 ;
504 ; SSE41-LABEL: shuffle_v4i32_0451:
505 ; SSE41:       # BB#0:
506 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
507 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
508 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5],xmm0[6,7]
509 ; SSE41-NEXT:    retq
510 ;
511 ; AVX1-LABEL: shuffle_v4i32_0451:
512 ; AVX1:       # BB#0:
513 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
514 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
515 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5],xmm0[6,7]
516 ; AVX1-NEXT:    retq
517 ;
518 ; AVX2-LABEL: shuffle_v4i32_0451:
519 ; AVX2:       # BB#0:
520 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
521 ; AVX2-NEXT:    vpbroadcastq %xmm0, %xmm0
522 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2],xmm0[3]
523 ; AVX2-NEXT:    retq
524   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 5, i32 1>
525   ret <4 x i32> %shuffle
526 }
527 define <4 x i32> @shuffle_v4i32_4501(<4 x i32> %a, <4 x i32> %b) {
528 ; SSE-LABEL: shuffle_v4i32_4501:
529 ; SSE:       # BB#0:
530 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
531 ; SSE-NEXT:    movdqa %xmm1, %xmm0
532 ; SSE-NEXT:    retq
533 ;
534 ; AVX-LABEL: shuffle_v4i32_4501:
535 ; AVX:       # BB#0:
536 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
537 ; AVX-NEXT:    retq
538   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
539   ret <4 x i32> %shuffle
540 }
541 define <4 x i32> @shuffle_v4i32_4015(<4 x i32> %a, <4 x i32> %b) {
542 ; SSE2-LABEL: shuffle_v4i32_4015:
543 ; SSE2:       # BB#0:
544 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
545 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,2,3]
546 ; SSE2-NEXT:    retq
547 ;
548 ; SSE3-LABEL: shuffle_v4i32_4015:
549 ; SSE3:       # BB#0:
550 ; SSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
551 ; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,2,3]
552 ; SSE3-NEXT:    retq
553 ;
554 ; SSSE3-LABEL: shuffle_v4i32_4015:
555 ; SSSE3:       # BB#0:
556 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
557 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,2,3]
558 ; SSSE3-NEXT:    retq
559 ;
560 ; SSE41-LABEL: shuffle_v4i32_4015:
561 ; SSE41:       # BB#0:
562 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
563 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
564 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5],xmm1[6,7]
565 ; SSE41-NEXT:    retq
566 ;
567 ; AVX1-LABEL: shuffle_v4i32_4015:
568 ; AVX1:       # BB#0:
569 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
570 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
571 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5],xmm1[6,7]
572 ; AVX1-NEXT:    retq
573 ;
574 ; AVX2-LABEL: shuffle_v4i32_4015:
575 ; AVX2:       # BB#0:
576 ; AVX2-NEXT:    vpbroadcastq %xmm1, %xmm1
577 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
578 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3]
579 ; AVX2-NEXT:    retq
580   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 5>
581   ret <4 x i32> %shuffle
582 }
583
584 define <4 x float> @shuffle_v4f32_4zzz(<4 x float> %a) {
585 ; SSE2-LABEL: shuffle_v4f32_4zzz:
586 ; SSE2:       # BB#0:
587 ; SSE2-NEXT:    xorps %xmm1, %xmm1
588 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
589 ; SSE2-NEXT:    movaps %xmm1, %xmm0
590 ; SSE2-NEXT:    retq
591 ;
592 ; SSE3-LABEL: shuffle_v4f32_4zzz:
593 ; SSE3:       # BB#0:
594 ; SSE3-NEXT:    xorps %xmm1, %xmm1
595 ; SSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
596 ; SSE3-NEXT:    movaps %xmm1, %xmm0
597 ; SSE3-NEXT:    retq
598 ;
599 ; SSSE3-LABEL: shuffle_v4f32_4zzz:
600 ; SSSE3:       # BB#0:
601 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
602 ; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
603 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
604 ; SSSE3-NEXT:    retq
605 ;
606 ; SSE41-LABEL: shuffle_v4f32_4zzz:
607 ; SSE41:       # BB#0:
608 ; SSE41-NEXT:    xorps %xmm1, %xmm1
609 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
610 ; SSE41-NEXT:    retq
611 ;
612 ; AVX-LABEL: shuffle_v4f32_4zzz:
613 ; AVX:       # BB#0:
614 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
615 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
616 ; AVX-NEXT:    retq
617   %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
618   ret <4 x float> %shuffle
619 }
620
621 define <4 x float> @shuffle_v4f32_z4zz(<4 x float> %a) {
622 ; SSE2-LABEL: shuffle_v4f32_z4zz:
623 ; SSE2:       # BB#0:
624 ; SSE2-NEXT:    xorps %xmm1, %xmm1
625 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
626 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
627 ; SSE2-NEXT:    retq
628 ;
629 ; SSE3-LABEL: shuffle_v4f32_z4zz:
630 ; SSE3:       # BB#0:
631 ; SSE3-NEXT:    xorps %xmm1, %xmm1
632 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
633 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
634 ; SSE3-NEXT:    retq
635 ;
636 ; SSSE3-LABEL: shuffle_v4f32_z4zz:
637 ; SSSE3:       # BB#0:
638 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
639 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
640 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
641 ; SSSE3-NEXT:    retq
642 ;
643 ; SSE41-LABEL: shuffle_v4f32_z4zz:
644 ; SSE41:       # BB#0:
645 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = zero,xmm0[0],zero,zero
646 ; SSE41-NEXT:    retq
647 ;
648 ; AVX-LABEL: shuffle_v4f32_z4zz:
649 ; AVX:       # BB#0:
650 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = zero,xmm0[0],zero,zero
651 ; AVX-NEXT:    retq
652   %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 2, i32 4, i32 3, i32 0>
653   ret <4 x float> %shuffle
654 }
655
656 define <4 x float> @shuffle_v4f32_zz4z(<4 x float> %a) {
657 ; SSE2-LABEL: shuffle_v4f32_zz4z:
658 ; SSE2:       # BB#0:
659 ; SSE2-NEXT:    xorps %xmm1, %xmm1
660 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
661 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[0,2]
662 ; SSE2-NEXT:    movaps %xmm1, %xmm0
663 ; SSE2-NEXT:    retq
664 ;
665 ; SSE3-LABEL: shuffle_v4f32_zz4z:
666 ; SSE3:       # BB#0:
667 ; SSE3-NEXT:    xorps %xmm1, %xmm1
668 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
669 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[0,2]
670 ; SSE3-NEXT:    movaps %xmm1, %xmm0
671 ; SSE3-NEXT:    retq
672 ;
673 ; SSSE3-LABEL: shuffle_v4f32_zz4z:
674 ; SSSE3:       # BB#0:
675 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
676 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
677 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[0,2]
678 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
679 ; SSSE3-NEXT:    retq
680 ;
681 ; SSE41-LABEL: shuffle_v4f32_zz4z:
682 ; SSE41:       # BB#0:
683 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = zero,zero,xmm0[0],zero
684 ; SSE41-NEXT:    retq
685 ;
686 ; AVX-LABEL: shuffle_v4f32_zz4z:
687 ; AVX:       # BB#0:
688 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = zero,zero,xmm0[0],zero
689 ; AVX-NEXT:    retq
690   %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 0, i32 4, i32 0>
691   ret <4 x float> %shuffle
692 }
693
694 define <4 x float> @shuffle_v4f32_zuu4(<4 x float> %a) {
695 ; SSE2-LABEL: shuffle_v4f32_zuu4:
696 ; SSE2:       # BB#0:
697 ; SSE2-NEXT:    xorps %xmm1, %xmm1
698 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
699 ; SSE2-NEXT:    movaps %xmm1, %xmm0
700 ; SSE2-NEXT:    retq
701 ;
702 ; SSE3-LABEL: shuffle_v4f32_zuu4:
703 ; SSE3:       # BB#0:
704 ; SSE3-NEXT:    xorps %xmm1, %xmm1
705 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
706 ; SSE3-NEXT:    movaps %xmm1, %xmm0
707 ; SSE3-NEXT:    retq
708 ;
709 ; SSSE3-LABEL: shuffle_v4f32_zuu4:
710 ; SSSE3:       # BB#0:
711 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
712 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
713 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
714 ; SSSE3-NEXT:    retq
715 ;
716 ; SSE41-LABEL: shuffle_v4f32_zuu4:
717 ; SSE41:       # BB#0:
718 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = zero,zero,zero,xmm0[0]
719 ; SSE41-NEXT:    retq
720 ;
721 ; AVX-LABEL: shuffle_v4f32_zuu4:
722 ; AVX:       # BB#0:
723 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = zero,zero,zero,xmm0[0]
724 ; AVX-NEXT:    retq
725   %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 4>
726   ret <4 x float> %shuffle
727 }
728
729 define <4 x float> @shuffle_v4f32_zzz7(<4 x float> %a) {
730 ; SSE2-LABEL: shuffle_v4f32_zzz7:
731 ; SSE2:       # BB#0:
732 ; SSE2-NEXT:    xorps %xmm1, %xmm1
733 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
734 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
735 ; SSE2-NEXT:    movaps %xmm1, %xmm0
736 ; SSE2-NEXT:    retq
737 ;
738 ; SSE3-LABEL: shuffle_v4f32_zzz7:
739 ; SSE3:       # BB#0:
740 ; SSE3-NEXT:    xorps %xmm1, %xmm1
741 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
742 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
743 ; SSE3-NEXT:    movaps %xmm1, %xmm0
744 ; SSE3-NEXT:    retq
745 ;
746 ; SSSE3-LABEL: shuffle_v4f32_zzz7:
747 ; SSSE3:       # BB#0:
748 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
749 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
750 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
751 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
752 ; SSSE3-NEXT:    retq
753 ;
754 ; SSE41-LABEL: shuffle_v4f32_zzz7:
755 ; SSE41:       # BB#0:
756 ; SSE41-NEXT:    xorps %xmm1, %xmm1
757 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[3]
758 ; SSE41-NEXT:    retq
759 ;
760 ; AVX-LABEL: shuffle_v4f32_zzz7:
761 ; AVX:       # BB#0:
762 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
763 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[3]
764 ; AVX-NEXT:    retq
765   %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
766   ret <4 x float> %shuffle
767 }
768
769 define <4 x float> @shuffle_v4f32_z6zz(<4 x float> %a) {
770 ; SSE2-LABEL: shuffle_v4f32_z6zz:
771 ; SSE2:       # BB#0:
772 ; SSE2-NEXT:    xorps %xmm1, %xmm1
773 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
774 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
775 ; SSE2-NEXT:    retq
776 ;
777 ; SSE3-LABEL: shuffle_v4f32_z6zz:
778 ; SSE3:       # BB#0:
779 ; SSE3-NEXT:    xorps %xmm1, %xmm1
780 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
781 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
782 ; SSE3-NEXT:    retq
783 ;
784 ; SSSE3-LABEL: shuffle_v4f32_z6zz:
785 ; SSSE3:       # BB#0:
786 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
787 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
788 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
789 ; SSSE3-NEXT:    retq
790 ;
791 ; SSE41-LABEL: shuffle_v4f32_z6zz:
792 ; SSE41:       # BB#0:
793 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
794 ; SSE41-NEXT:    retq
795 ;
796 ; AVX-LABEL: shuffle_v4f32_z6zz:
797 ; AVX:       # BB#0:
798 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
799 ; AVX-NEXT:    retq
800   %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 6, i32 2, i32 3>
801   ret <4 x float> %shuffle
802 }
803
804 define <4 x float> @shuffle_v4f32_0z23(<4 x float> %a) {
805 ; SSE2-LABEL: shuffle_v4f32_0z23:
806 ; SSE2:       # BB#0:
807 ; SSE2-NEXT:    xorps %xmm1, %xmm1
808 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]
809 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]
810 ; SSE2-NEXT:    movaps %xmm1, %xmm0
811 ; SSE2-NEXT:    retq
812 ;
813 ; SSE3-LABEL: shuffle_v4f32_0z23:
814 ; SSE3:       # BB#0:
815 ; SSE3-NEXT:    xorps %xmm1, %xmm1
816 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]
817 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]
818 ; SSE3-NEXT:    movaps %xmm1, %xmm0
819 ; SSE3-NEXT:    retq
820 ;
821 ; SSSE3-LABEL: shuffle_v4f32_0z23:
822 ; SSSE3:       # BB#0:
823 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
824 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]
825 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]
826 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
827 ; SSSE3-NEXT:    retq
828 ;
829 ; SSE41-LABEL: shuffle_v4f32_0z23:
830 ; SSE41:       # BB#0:
831 ; SSE41-NEXT:    xorps %xmm1, %xmm1
832 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
833 ; SSE41-NEXT:    retq
834 ;
835 ; AVX-LABEL: shuffle_v4f32_0z23:
836 ; AVX:       # BB#0:
837 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
838 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
839 ; AVX-NEXT:    retq
840   %shuffle = shufflevector <4 x float> %a, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 4, i32 2, i32 3>
841   ret <4 x float> %shuffle
842 }
843
844 define <4 x float> @shuffle_v4f32_01z3(<4 x float> %a) {
845 ; SSE2-LABEL: shuffle_v4f32_01z3:
846 ; SSE2:       # BB#0:
847 ; SSE2-NEXT:    xorps %xmm1, %xmm1
848 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[3,0]
849 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
850 ; SSE2-NEXT:    retq
851 ;
852 ; SSE3-LABEL: shuffle_v4f32_01z3:
853 ; SSE3:       # BB#0:
854 ; SSE3-NEXT:    xorps %xmm1, %xmm1
855 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[3,0]
856 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
857 ; SSE3-NEXT:    retq
858 ;
859 ; SSSE3-LABEL: shuffle_v4f32_01z3:
860 ; SSSE3:       # BB#0:
861 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
862 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[3,0]
863 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
864 ; SSSE3-NEXT:    retq
865 ;
866 ; SSE41-LABEL: shuffle_v4f32_01z3:
867 ; SSE41:       # BB#0:
868 ; SSE41-NEXT:    xorps %xmm1, %xmm1
869 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]
870 ; SSE41-NEXT:    retq
871 ;
872 ; AVX-LABEL: shuffle_v4f32_01z3:
873 ; AVX:       # BB#0:
874 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
875 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]
876 ; AVX-NEXT:    retq
877   %shuffle = shufflevector <4 x float> %a, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 4, i32 3>
878   ret <4 x float> %shuffle
879 }
880
881 define <4 x float> @shuffle_v4f32_012z(<4 x float> %a) {
882 ; SSE2-LABEL: shuffle_v4f32_012z:
883 ; SSE2:       # BB#0:
884 ; SSE2-NEXT:    xorps %xmm1, %xmm1
885 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[2,0]
886 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
887 ; SSE2-NEXT:    retq
888 ;
889 ; SSE3-LABEL: shuffle_v4f32_012z:
890 ; SSE3:       # BB#0:
891 ; SSE3-NEXT:    xorps %xmm1, %xmm1
892 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[2,0]
893 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
894 ; SSE3-NEXT:    retq
895 ;
896 ; SSSE3-LABEL: shuffle_v4f32_012z:
897 ; SSSE3:       # BB#0:
898 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
899 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[2,0]
900 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
901 ; SSSE3-NEXT:    retq
902 ;
903 ; SSE41-LABEL: shuffle_v4f32_012z:
904 ; SSE41:       # BB#0:
905 ; SSE41-NEXT:    xorps %xmm1, %xmm1
906 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]
907 ; SSE41-NEXT:    retq
908 ;
909 ; AVX-LABEL: shuffle_v4f32_012z:
910 ; AVX:       # BB#0:
911 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
912 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]
913 ; AVX-NEXT:    retq
914   %shuffle = shufflevector <4 x float> %a, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
915   ret <4 x float> %shuffle
916 }
917
918 define <4 x float> @shuffle_v4f32_0zz3(<4 x float> %a) {
919 ; SSE2-LABEL: shuffle_v4f32_0zz3:
920 ; SSE2:       # BB#0:
921 ; SSE2-NEXT:    xorps %xmm1, %xmm1
922 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,3],xmm1[1,2]
923 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
924 ; SSE2-NEXT:    retq
925 ;
926 ; SSE3-LABEL: shuffle_v4f32_0zz3:
927 ; SSE3:       # BB#0:
928 ; SSE3-NEXT:    xorps %xmm1, %xmm1
929 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,3],xmm1[1,2]
930 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
931 ; SSE3-NEXT:    retq
932 ;
933 ; SSSE3-LABEL: shuffle_v4f32_0zz3:
934 ; SSSE3:       # BB#0:
935 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
936 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,3],xmm1[1,2]
937 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
938 ; SSSE3-NEXT:    retq
939 ;
940 ; SSE41-LABEL: shuffle_v4f32_0zz3:
941 ; SSE41:       # BB#0:
942 ; SSE41-NEXT:    xorps %xmm1, %xmm1
943 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2],xmm0[3]
944 ; SSE41-NEXT:    retq
945 ;
946 ; AVX-LABEL: shuffle_v4f32_0zz3:
947 ; AVX:       # BB#0:
948 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
949 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2],xmm0[3]
950 ; AVX-NEXT:    retq
951   %shuffle = shufflevector <4 x float> %a, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 4, i32 4, i32 3>
952   ret <4 x float> %shuffle
953 }
954
955 define <4 x float> @shuffle_v4f32_0z2z(<4 x float> %v) {
956 ; SSE2-LABEL: shuffle_v4f32_0z2z:
957 ; SSE2:       # BB#0:
958 ; SSE2-NEXT:    xorps %xmm1, %xmm1
959 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,0]
960 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
961 ; SSE2-NEXT:    retq
962 ;
963 ; SSE3-LABEL: shuffle_v4f32_0z2z:
964 ; SSE3:       # BB#0:
965 ; SSE3-NEXT:    xorps %xmm1, %xmm1
966 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,0]
967 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
968 ; SSE3-NEXT:    retq
969 ;
970 ; SSSE3-LABEL: shuffle_v4f32_0z2z:
971 ; SSSE3:       # BB#0:
972 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
973 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,0]
974 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
975 ; SSSE3-NEXT:    retq
976 ;
977 ; SSE41-LABEL: shuffle_v4f32_0z2z:
978 ; SSE41:       # BB#0:
979 ; SSE41-NEXT:    xorps %xmm1, %xmm1
980 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
981 ; SSE41-NEXT:    retq
982 ;
983 ; AVX-LABEL: shuffle_v4f32_0z2z:
984 ; AVX:       # BB#0:
985 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
986 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
987 ; AVX-NEXT:    retq
988   %shuffle = shufflevector <4 x float> %v, <4 x float> <float 0.000000e+00, float undef, float undef, float undef>, <4 x i32> <i32 0, i32 4, i32 2, i32 4>
989   ret <4 x float> %shuffle
990 }
991
992 define <4 x float> @shuffle_v4f32_u051(<4 x float> %a, <4 x float> %b) {
993 ; SSE-LABEL: shuffle_v4f32_u051:
994 ; SSE:       # BB#0:
995 ; SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
996 ; SSE-NEXT:    movaps %xmm1, %xmm0
997 ; SSE-NEXT:    retq
998 ;
999 ; AVX-LABEL: shuffle_v4f32_u051:
1000 ; AVX:       # BB#0:
1001 ; AVX-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1002 ; AVX-NEXT:    retq
1003   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 undef, i32 0, i32 5, i32 1>
1004   ret <4 x float> %shuffle
1005 }
1006
1007 define <4 x i32> @shuffle_v4i32_4zzz(<4 x i32> %a) {
1008 ; SSE2-LABEL: shuffle_v4i32_4zzz:
1009 ; SSE2:       # BB#0:
1010 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1011 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1012 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1013 ; SSE2-NEXT:    retq
1014 ;
1015 ; SSE3-LABEL: shuffle_v4i32_4zzz:
1016 ; SSE3:       # BB#0:
1017 ; SSE3-NEXT:    xorps %xmm1, %xmm1
1018 ; SSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1019 ; SSE3-NEXT:    movaps %xmm1, %xmm0
1020 ; SSE3-NEXT:    retq
1021 ;
1022 ; SSSE3-LABEL: shuffle_v4i32_4zzz:
1023 ; SSSE3:       # BB#0:
1024 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
1025 ; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1026 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
1027 ; SSSE3-NEXT:    retq
1028 ;
1029 ; SSE41-LABEL: shuffle_v4i32_4zzz:
1030 ; SSE41:       # BB#0:
1031 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1032 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1033 ; SSE41-NEXT:    retq
1034 ;
1035 ; AVX-LABEL: shuffle_v4i32_4zzz:
1036 ; AVX:       # BB#0:
1037 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1038 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1039 ; AVX-NEXT:    retq
1040   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
1041   ret <4 x i32> %shuffle
1042 }
1043
1044 define <4 x i32> @shuffle_v4i32_z4zz(<4 x i32> %a) {
1045 ; SSE2-LABEL: shuffle_v4i32_z4zz:
1046 ; SSE2:       # BB#0:
1047 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1048 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1049 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,1,1]
1050 ; SSE2-NEXT:    retq
1051 ;
1052 ; SSE3-LABEL: shuffle_v4i32_z4zz:
1053 ; SSE3:       # BB#0:
1054 ; SSE3-NEXT:    xorps %xmm1, %xmm1
1055 ; SSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1056 ; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,1,1]
1057 ; SSE3-NEXT:    retq
1058 ;
1059 ; SSSE3-LABEL: shuffle_v4i32_z4zz:
1060 ; SSSE3:       # BB#0:
1061 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
1062 ; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1063 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,1,1]
1064 ; SSSE3-NEXT:    retq
1065 ;
1066 ; SSE41-LABEL: shuffle_v4i32_z4zz:
1067 ; SSE41:       # BB#0:
1068 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1069 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1070 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,1,1]
1071 ; SSE41-NEXT:    retq
1072 ;
1073 ; AVX-LABEL: shuffle_v4i32_z4zz:
1074 ; AVX:       # BB#0:
1075 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1076 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1077 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
1078 ; AVX-NEXT:    retq
1079   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 2, i32 4, i32 3, i32 0>
1080   ret <4 x i32> %shuffle
1081 }
1082
1083 define <4 x i32> @shuffle_v4i32_zz4z(<4 x i32> %a) {
1084 ; SSE2-LABEL: shuffle_v4i32_zz4z:
1085 ; SSE2:       # BB#0:
1086 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1087 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1088 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,0,1]
1089 ; SSE2-NEXT:    retq
1090 ;
1091 ; SSE3-LABEL: shuffle_v4i32_zz4z:
1092 ; SSE3:       # BB#0:
1093 ; SSE3-NEXT:    xorps %xmm1, %xmm1
1094 ; SSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1095 ; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,0,1]
1096 ; SSE3-NEXT:    retq
1097 ;
1098 ; SSSE3-LABEL: shuffle_v4i32_zz4z:
1099 ; SSSE3:       # BB#0:
1100 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
1101 ; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1102 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,0,1]
1103 ; SSSE3-NEXT:    retq
1104 ;
1105 ; SSE41-LABEL: shuffle_v4i32_zz4z:
1106 ; SSE41:       # BB#0:
1107 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1108 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1109 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,0,1]
1110 ; SSE41-NEXT:    retq
1111 ;
1112 ; AVX-LABEL: shuffle_v4i32_zz4z:
1113 ; AVX:       # BB#0:
1114 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1115 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1116 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,0,1]
1117 ; AVX-NEXT:    retq
1118   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 0, i32 4, i32 0>
1119   ret <4 x i32> %shuffle
1120 }
1121
1122 define <4 x i32> @shuffle_v4i32_zuu4(<4 x i32> %a) {
1123 ; SSE-LABEL: shuffle_v4i32_zuu4:
1124 ; SSE:       # BB#0:
1125 ; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3]
1126 ; SSE-NEXT:    retq
1127 ;
1128 ; AVX-LABEL: shuffle_v4i32_zuu4:
1129 ; AVX:       # BB#0:
1130 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3]
1131 ; AVX-NEXT:    retq
1132   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 4>
1133   ret <4 x i32> %shuffle
1134 }
1135
1136 define <4 x i32> @shuffle_v4i32_z6zz(<4 x i32> %a) {
1137 ; SSE2-LABEL: shuffle_v4i32_z6zz:
1138 ; SSE2:       # BB#0:
1139 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1140 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
1141 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1142 ; SSE2-NEXT:    retq
1143 ;
1144 ; SSE3-LABEL: shuffle_v4i32_z6zz:
1145 ; SSE3:       # BB#0:
1146 ; SSE3-NEXT:    xorps %xmm1, %xmm1
1147 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
1148 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1149 ; SSE3-NEXT:    retq
1150 ;
1151 ; SSSE3-LABEL: shuffle_v4i32_z6zz:
1152 ; SSSE3:       # BB#0:
1153 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
1154 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
1155 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1156 ; SSSE3-NEXT:    retq
1157 ;
1158 ; SSE41-LABEL: shuffle_v4i32_z6zz:
1159 ; SSE41:       # BB#0:
1160 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
1161 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1162 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
1163 ; SSE41-NEXT:    retq
1164 ;
1165 ; AVX1-LABEL: shuffle_v4i32_z6zz:
1166 ; AVX1:       # BB#0:
1167 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
1168 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1169 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7]
1170 ; AVX1-NEXT:    retq
1171 ;
1172 ; AVX2-LABEL: shuffle_v4i32_z6zz:
1173 ; AVX2:       # BB#0:
1174 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
1175 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1176 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]
1177 ; AVX2-NEXT:    retq
1178   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 6, i32 2, i32 3>
1179   ret <4 x i32> %shuffle
1180 }
1181
1182 define <4 x i32> @shuffle_v4i32_7012(<4 x i32> %a, <4 x i32> %b) {
1183 ; SSE2-LABEL: shuffle_v4i32_7012:
1184 ; SSE2:       # BB#0:
1185 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[0,0]
1186 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
1187 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1188 ; SSE2-NEXT:    retq
1189 ;
1190 ; SSE3-LABEL: shuffle_v4i32_7012:
1191 ; SSE3:       # BB#0:
1192 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[0,0]
1193 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
1194 ; SSE3-NEXT:    movaps %xmm1, %xmm0
1195 ; SSE3-NEXT:    retq
1196 ;
1197 ; SSSE3-LABEL: shuffle_v4i32_7012:
1198 ; SSSE3:       # BB#0:
1199 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11]
1200 ; SSSE3-NEXT:    retq
1201 ;
1202 ; SSE41-LABEL: shuffle_v4i32_7012:
1203 ; SSE41:       # BB#0:
1204 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11]
1205 ; SSE41-NEXT:    retq
1206 ;
1207 ; AVX-LABEL: shuffle_v4i32_7012:
1208 ; AVX:       # BB#0:
1209 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11]
1210 ; AVX-NEXT:    retq
1211   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
1212   ret <4 x i32> %shuffle
1213 }
1214
1215 define <4 x i32> @shuffle_v4i32_6701(<4 x i32> %a, <4 x i32> %b) {
1216 ; SSE2-LABEL: shuffle_v4i32_6701:
1217 ; SSE2:       # BB#0:
1218 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
1219 ; SSE2-NEXT:    movapd %xmm1, %xmm0
1220 ; SSE2-NEXT:    retq
1221 ;
1222 ; SSE3-LABEL: shuffle_v4i32_6701:
1223 ; SSE3:       # BB#0:
1224 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
1225 ; SSE3-NEXT:    movapd %xmm1, %xmm0
1226 ; SSE3-NEXT:    retq
1227 ;
1228 ; SSSE3-LABEL: shuffle_v4i32_6701:
1229 ; SSSE3:       # BB#0:
1230 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
1231 ; SSSE3-NEXT:    retq
1232 ;
1233 ; SSE41-LABEL: shuffle_v4i32_6701:
1234 ; SSE41:       # BB#0:
1235 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
1236 ; SSE41-NEXT:    retq
1237 ;
1238 ; AVX-LABEL: shuffle_v4i32_6701:
1239 ; AVX:       # BB#0:
1240 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
1241 ; AVX-NEXT:    retq
1242   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
1243   ret <4 x i32> %shuffle
1244 }
1245
1246 define <4 x i32> @shuffle_v4i32_5670(<4 x i32> %a, <4 x i32> %b) {
1247 ; SSE2-LABEL: shuffle_v4i32_5670:
1248 ; SSE2:       # BB#0:
1249 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
1250 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,2],xmm0[2,0]
1251 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1252 ; SSE2-NEXT:    retq
1253 ;
1254 ; SSE3-LABEL: shuffle_v4i32_5670:
1255 ; SSE3:       # BB#0:
1256 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
1257 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,2],xmm0[2,0]
1258 ; SSE3-NEXT:    movaps %xmm1, %xmm0
1259 ; SSE3-NEXT:    retq
1260 ;
1261 ; SSSE3-LABEL: shuffle_v4i32_5670:
1262 ; SSSE3:       # BB#0:
1263 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3]
1264 ; SSSE3-NEXT:    retq
1265 ;
1266 ; SSE41-LABEL: shuffle_v4i32_5670:
1267 ; SSE41:       # BB#0:
1268 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3]
1269 ; SSE41-NEXT:    retq
1270 ;
1271 ; AVX-LABEL: shuffle_v4i32_5670:
1272 ; AVX:       # BB#0:
1273 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3]
1274 ; AVX-NEXT:    retq
1275   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
1276   ret <4 x i32> %shuffle
1277 }
1278
1279 define <4 x i32> @shuffle_v4i32_1234(<4 x i32> %a, <4 x i32> %b) {
1280 ; SSE2-LABEL: shuffle_v4i32_1234:
1281 ; SSE2:       # BB#0:
1282 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
1283 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
1284 ; SSE2-NEXT:    retq
1285 ;
1286 ; SSE3-LABEL: shuffle_v4i32_1234:
1287 ; SSE3:       # BB#0:
1288 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
1289 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
1290 ; SSE3-NEXT:    retq
1291 ;
1292 ; SSSE3-LABEL: shuffle_v4i32_1234:
1293 ; SSSE3:       # BB#0:
1294 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
1295 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1296 ; SSSE3-NEXT:    retq
1297 ;
1298 ; SSE41-LABEL: shuffle_v4i32_1234:
1299 ; SSE41:       # BB#0:
1300 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
1301 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1302 ; SSE41-NEXT:    retq
1303 ;
1304 ; AVX-LABEL: shuffle_v4i32_1234:
1305 ; AVX:       # BB#0:
1306 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
1307 ; AVX-NEXT:    retq
1308   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
1309   ret <4 x i32> %shuffle
1310 }
1311
1312 define <4 x i32> @shuffle_v4i32_2345(<4 x i32> %a, <4 x i32> %b) {
1313 ; SSE2-LABEL: shuffle_v4i32_2345:
1314 ; SSE2:       # BB#0:
1315 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
1316 ; SSE2-NEXT:    retq
1317 ;
1318 ; SSE3-LABEL: shuffle_v4i32_2345:
1319 ; SSE3:       # BB#0:
1320 ; SSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
1321 ; SSE3-NEXT:    retq
1322 ;
1323 ; SSSE3-LABEL: shuffle_v4i32_2345:
1324 ; SSSE3:       # BB#0:
1325 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
1326 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1327 ; SSSE3-NEXT:    retq
1328 ;
1329 ; SSE41-LABEL: shuffle_v4i32_2345:
1330 ; SSE41:       # BB#0:
1331 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
1332 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1333 ; SSE41-NEXT:    retq
1334 ;
1335 ; AVX-LABEL: shuffle_v4i32_2345:
1336 ; AVX:       # BB#0:
1337 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
1338 ; AVX-NEXT:    retq
1339   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
1340   ret <4 x i32> %shuffle
1341 }
1342
1343 define <4 x i32> @shuffle_v4i32_40u1(<4 x i32> %a, <4 x i32> %b) {
1344 ; SSE-LABEL: shuffle_v4i32_40u1:
1345 ; SSE:       # BB#0:
1346 ; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1347 ; SSE-NEXT:    movdqa %xmm1, %xmm0
1348 ; SSE-NEXT:    retq
1349 ;
1350 ; AVX-LABEL: shuffle_v4i32_40u1:
1351 ; AVX:       # BB#0:
1352 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1353 ; AVX-NEXT:    retq
1354   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 0, i32 undef, i32 1>
1355   ret <4 x i32> %shuffle
1356 }
1357
1358 define <4 x i32> @shuffle_v4i32_3456(<4 x i32> %a, <4 x i32> %b) {
1359 ; SSE2-LABEL: shuffle_v4i32_3456:
1360 ; SSE2:       # BB#0:
1361 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[0,0]
1362 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,2]
1363 ; SSE2-NEXT:    retq
1364 ;
1365 ; SSE3-LABEL: shuffle_v4i32_3456:
1366 ; SSE3:       # BB#0:
1367 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[0,0]
1368 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,2]
1369 ; SSE3-NEXT:    retq
1370 ;
1371 ; SSSE3-LABEL: shuffle_v4i32_3456:
1372 ; SSSE3:       # BB#0:
1373 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11]
1374 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1375 ; SSSE3-NEXT:    retq
1376 ;
1377 ; SSE41-LABEL: shuffle_v4i32_3456:
1378 ; SSE41:       # BB#0:
1379 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11]
1380 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1381 ; SSE41-NEXT:    retq
1382 ;
1383 ; AVX-LABEL: shuffle_v4i32_3456:
1384 ; AVX:       # BB#0:
1385 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11]
1386 ; AVX-NEXT:    retq
1387   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
1388   ret <4 x i32> %shuffle
1389 }
1390
1391 define <4 x i32> @shuffle_v4i32_0u1u(<4 x i32> %a, <4 x i32> %b) {
1392 ; SSE2-LABEL: shuffle_v4i32_0u1u:
1393 ; SSE2:       # BB#0:
1394 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
1395 ; SSE2-NEXT:    retq
1396 ;
1397 ; SSE3-LABEL: shuffle_v4i32_0u1u:
1398 ; SSE3:       # BB#0:
1399 ; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
1400 ; SSE3-NEXT:    retq
1401 ;
1402 ; SSSE3-LABEL: shuffle_v4i32_0u1u:
1403 ; SSSE3:       # BB#0:
1404 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
1405 ; SSSE3-NEXT:    retq
1406 ;
1407 ; SSE41-LABEL: shuffle_v4i32_0u1u:
1408 ; SSE41:       # BB#0:
1409 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1410 ; SSE41-NEXT:    retq
1411 ;
1412 ; AVX-LABEL: shuffle_v4i32_0u1u:
1413 ; AVX:       # BB#0:
1414 ; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1415 ; AVX-NEXT:    retq
1416   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 undef, i32 1, i32 undef>
1417   ret <4 x i32> %shuffle
1418 }
1419
1420 define <4 x i32> @shuffle_v4i32_0z1z(<4 x i32> %a) {
1421 ; SSE2-LABEL: shuffle_v4i32_0z1z:
1422 ; SSE2:       # BB#0:
1423 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1424 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1425 ; SSE2-NEXT:    retq
1426 ;
1427 ; SSE3-LABEL: shuffle_v4i32_0z1z:
1428 ; SSE3:       # BB#0:
1429 ; SSE3-NEXT:    pxor %xmm1, %xmm1
1430 ; SSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1431 ; SSE3-NEXT:    retq
1432 ;
1433 ; SSSE3-LABEL: shuffle_v4i32_0z1z:
1434 ; SSSE3:       # BB#0:
1435 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1436 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1437 ; SSSE3-NEXT:    retq
1438 ;
1439 ; SSE41-LABEL: shuffle_v4i32_0z1z:
1440 ; SSE41:       # BB#0:
1441 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1442 ; SSE41-NEXT:    retq
1443 ;
1444 ; AVX-LABEL: shuffle_v4i32_0z1z:
1445 ; AVX:       # BB#0:
1446 ; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1447 ; AVX-NEXT:    retq
1448   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 1, i32 7>
1449   ret <4 x i32> %shuffle
1450 }
1451
1452 define <4 x i32> @shuffle_v4i32_01zu(<4 x i32> %a) {
1453 ; SSE-LABEL: shuffle_v4i32_01zu:
1454 ; SSE:       # BB#0:
1455 ; SSE-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
1456 ; SSE-NEXT:    retq
1457 ;
1458 ; AVX-LABEL: shuffle_v4i32_01zu:
1459 ; AVX:       # BB#0:
1460 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
1461 ; AVX-NEXT:    retq
1462   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 7, i32 undef>
1463   ret <4 x i32> %shuffle
1464 }
1465
1466 define <4 x i32> @shuffle_v4i32_0z23(<4 x i32> %a) {
1467 ; SSE2-LABEL: shuffle_v4i32_0z23:
1468 ; SSE2:       # BB#0:
1469 ; SSE2-NEXT:    andps {{.*}}(%rip), %xmm0
1470 ; SSE2-NEXT:    retq
1471 ;
1472 ; SSE3-LABEL: shuffle_v4i32_0z23:
1473 ; SSE3:       # BB#0:
1474 ; SSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1475 ; SSE3-NEXT:    retq
1476 ;
1477 ; SSSE3-LABEL: shuffle_v4i32_0z23:
1478 ; SSSE3:       # BB#0:
1479 ; SSSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1480 ; SSSE3-NEXT:    retq
1481 ;
1482 ; SSE41-LABEL: shuffle_v4i32_0z23:
1483 ; SSE41:       # BB#0:
1484 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1485 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
1486 ; SSE41-NEXT:    retq
1487 ;
1488 ; AVX1-LABEL: shuffle_v4i32_0z23:
1489 ; AVX1:       # BB#0:
1490 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1491 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
1492 ; AVX1-NEXT:    retq
1493 ;
1494 ; AVX2-LABEL: shuffle_v4i32_0z23:
1495 ; AVX2:       # BB#0:
1496 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1497 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
1498 ; AVX2-NEXT:    retq
1499   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 4, i32 2, i32 3>
1500   ret <4 x i32> %shuffle
1501 }
1502
1503 define <4 x i32> @shuffle_v4i32_01z3(<4 x i32> %a) {
1504 ; SSE2-LABEL: shuffle_v4i32_01z3:
1505 ; SSE2:       # BB#0:
1506 ; SSE2-NEXT:    andps {{.*}}(%rip), %xmm0
1507 ; SSE2-NEXT:    retq
1508 ;
1509 ; SSE3-LABEL: shuffle_v4i32_01z3:
1510 ; SSE3:       # BB#0:
1511 ; SSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1512 ; SSE3-NEXT:    retq
1513 ;
1514 ; SSSE3-LABEL: shuffle_v4i32_01z3:
1515 ; SSSE3:       # BB#0:
1516 ; SSSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1517 ; SSSE3-NEXT:    retq
1518 ;
1519 ; SSE41-LABEL: shuffle_v4i32_01z3:
1520 ; SSE41:       # BB#0:
1521 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1522 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
1523 ; SSE41-NEXT:    retq
1524 ;
1525 ; AVX1-LABEL: shuffle_v4i32_01z3:
1526 ; AVX1:       # BB#0:
1527 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1528 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
1529 ; AVX1-NEXT:    retq
1530 ;
1531 ; AVX2-LABEL: shuffle_v4i32_01z3:
1532 ; AVX2:       # BB#0:
1533 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1534 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]
1535 ; AVX2-NEXT:    retq
1536   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 4, i32 3>
1537   ret <4 x i32> %shuffle
1538 }
1539
1540 define <4 x i32> @shuffle_v4i32_012z(<4 x i32> %a) {
1541 ; SSE2-LABEL: shuffle_v4i32_012z:
1542 ; SSE2:       # BB#0:
1543 ; SSE2-NEXT:    andps {{.*}}(%rip), %xmm0
1544 ; SSE2-NEXT:    retq
1545 ;
1546 ; SSE3-LABEL: shuffle_v4i32_012z:
1547 ; SSE3:       # BB#0:
1548 ; SSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1549 ; SSE3-NEXT:    retq
1550 ;
1551 ; SSSE3-LABEL: shuffle_v4i32_012z:
1552 ; SSSE3:       # BB#0:
1553 ; SSSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1554 ; SSSE3-NEXT:    retq
1555 ;
1556 ; SSE41-LABEL: shuffle_v4i32_012z:
1557 ; SSE41:       # BB#0:
1558 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1559 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5],xmm1[6,7]
1560 ; SSE41-NEXT:    retq
1561 ;
1562 ; AVX1-LABEL: shuffle_v4i32_012z:
1563 ; AVX1:       # BB#0:
1564 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1565 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5],xmm1[6,7]
1566 ; AVX1-NEXT:    retq
1567 ;
1568 ; AVX2-LABEL: shuffle_v4i32_012z:
1569 ; AVX2:       # BB#0:
1570 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1571 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]
1572 ; AVX2-NEXT:    retq
1573   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
1574   ret <4 x i32> %shuffle
1575 }
1576
1577 define <4 x i32> @shuffle_v4i32_0zz3(<4 x i32> %a) {
1578 ; SSE2-LABEL: shuffle_v4i32_0zz3:
1579 ; SSE2:       # BB#0:
1580 ; SSE2-NEXT:    andps {{.*}}(%rip), %xmm0
1581 ; SSE2-NEXT:    retq
1582 ;
1583 ; SSE3-LABEL: shuffle_v4i32_0zz3:
1584 ; SSE3:       # BB#0:
1585 ; SSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1586 ; SSE3-NEXT:    retq
1587 ;
1588 ; SSSE3-LABEL: shuffle_v4i32_0zz3:
1589 ; SSSE3:       # BB#0:
1590 ; SSSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1591 ; SSSE3-NEXT:    retq
1592 ;
1593 ; SSE41-LABEL: shuffle_v4i32_0zz3:
1594 ; SSE41:       # BB#0:
1595 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1596 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5],xmm0[6,7]
1597 ; SSE41-NEXT:    retq
1598 ;
1599 ; AVX1-LABEL: shuffle_v4i32_0zz3:
1600 ; AVX1:       # BB#0:
1601 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1602 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5],xmm0[6,7]
1603 ; AVX1-NEXT:    retq
1604 ;
1605 ; AVX2-LABEL: shuffle_v4i32_0zz3:
1606 ; AVX2:       # BB#0:
1607 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1608 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2],xmm0[3]
1609 ; AVX2-NEXT:    retq
1610   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 4, i32 4, i32 3>
1611   ret <4 x i32> %shuffle
1612 }
1613
1614 define <4 x i32> @shuffle_v4i32_bitcast_0415(<4 x i32> %a, <4 x i32> %b) {
1615 ; SSE-LABEL: shuffle_v4i32_bitcast_0415:
1616 ; SSE:       # BB#0:
1617 ; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1618 ; SSE-NEXT:    retq
1619 ;
1620 ; AVX-LABEL: shuffle_v4i32_bitcast_0415:
1621 ; AVX:       # BB#0:
1622 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1623 ; AVX-NEXT:    retq
1624   %shuffle32 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 5, i32 0, i32 4>
1625   %bitcast64 = bitcast <4 x i32> %shuffle32 to <2 x double>
1626   %shuffle64 = shufflevector <2 x double> %bitcast64, <2 x double> undef, <2 x i32> <i32 1, i32 0>
1627   %bitcast32 = bitcast <2 x double> %shuffle64 to <4 x i32>
1628   ret <4 x i32> %bitcast32
1629 }
1630
1631 define <4 x float> @shuffle_v4f32_bitcast_4401(<4 x float> %a, <4 x i32> %b) {
1632 ; SSE-LABEL: shuffle_v4f32_bitcast_4401:
1633 ; SSE:       # BB#0:
1634 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
1635 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1636 ; SSE-NEXT:    movapd %xmm1, %xmm0
1637 ; SSE-NEXT:    retq
1638 ;
1639 ; AVX-LABEL: shuffle_v4f32_bitcast_4401:
1640 ; AVX:       # BB#0:
1641 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
1642 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1643 ; AVX-NEXT:    retq
1644   %1 = shufflevector <4 x i32> %b, <4 x i32> undef, <4 x i32> <i32 0, i32 0, i32 1, i32 1>
1645   %2 = bitcast <4 x i32> %1 to <2 x double>
1646   %3 = bitcast <4 x float> %a to <2 x double>
1647   %4 = shufflevector <2 x double> %2, <2 x double> %3, <2 x i32> <i32 0, i32 2>
1648   %5 = bitcast <2 x double> %4 to <4 x float>
1649   ret <4 x float> %5
1650 }
1651
1652 define <4 x float> @shuffle_v4f32_bitcast_0045(<4 x float> %a, <4 x i32> %b) {
1653 ; SSE-LABEL: shuffle_v4f32_bitcast_0045:
1654 ; SSE:       # BB#0:
1655 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,1]
1656 ; SSE-NEXT:    retq
1657 ;
1658 ; AVX-LABEL: shuffle_v4f32_bitcast_0045:
1659 ; AVX:       # BB#0:
1660 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,1]
1661 ; AVX-NEXT:    retq
1662   %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 1, i32 1>
1663   %2 = bitcast <4 x i32> %b to <4 x float>
1664   %3 = shufflevector <4 x float> %1, <4 x float> %2, <4 x i32> <i32 1, i32 0, i32 4, i32 5>
1665   ret <4 x float> %3
1666 }
1667
1668 define <4 x i32> @insert_reg_and_zero_v4i32(i32 %a) {
1669 ; SSE-LABEL: insert_reg_and_zero_v4i32:
1670 ; SSE:       # BB#0:
1671 ; SSE-NEXT:    movd %edi, %xmm0
1672 ; SSE-NEXT:    retq
1673 ;
1674 ; AVX-LABEL: insert_reg_and_zero_v4i32:
1675 ; AVX:       # BB#0:
1676 ; AVX-NEXT:    vmovd %edi, %xmm0
1677 ; AVX-NEXT:    retq
1678   %v = insertelement <4 x i32> undef, i32 %a, i32 0
1679   %shuffle = shufflevector <4 x i32> %v, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1680   ret <4 x i32> %shuffle
1681 }
1682
1683 define <4 x i32> @insert_mem_and_zero_v4i32(i32* %ptr) {
1684 ; SSE-LABEL: insert_mem_and_zero_v4i32:
1685 ; SSE:       # BB#0:
1686 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1687 ; SSE-NEXT:    retq
1688 ;
1689 ; AVX-LABEL: insert_mem_and_zero_v4i32:
1690 ; AVX:       # BB#0:
1691 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1692 ; AVX-NEXT:    retq
1693   %a = load i32, i32* %ptr
1694   %v = insertelement <4 x i32> undef, i32 %a, i32 0
1695   %shuffle = shufflevector <4 x i32> %v, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1696   ret <4 x i32> %shuffle
1697 }
1698
1699 define <4 x float> @insert_reg_and_zero_v4f32(float %a) {
1700 ; SSE2-LABEL: insert_reg_and_zero_v4f32:
1701 ; SSE2:       # BB#0:
1702 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1703 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1704 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1705 ; SSE2-NEXT:    retq
1706 ;
1707 ; SSE3-LABEL: insert_reg_and_zero_v4f32:
1708 ; SSE3:       # BB#0:
1709 ; SSE3-NEXT:    xorps %xmm1, %xmm1
1710 ; SSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1711 ; SSE3-NEXT:    movaps %xmm1, %xmm0
1712 ; SSE3-NEXT:    retq
1713 ;
1714 ; SSSE3-LABEL: insert_reg_and_zero_v4f32:
1715 ; SSSE3:       # BB#0:
1716 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
1717 ; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1718 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
1719 ; SSSE3-NEXT:    retq
1720 ;
1721 ; SSE41-LABEL: insert_reg_and_zero_v4f32:
1722 ; SSE41:       # BB#0:
1723 ; SSE41-NEXT:    xorps %xmm1, %xmm1
1724 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1725 ; SSE41-NEXT:    retq
1726 ;
1727 ; AVX-LABEL: insert_reg_and_zero_v4f32:
1728 ; AVX:       # BB#0:
1729 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1730 ; AVX-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1731 ; AVX-NEXT:    retq
1732   %v = insertelement <4 x float> undef, float %a, i32 0
1733   %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1734   ret <4 x float> %shuffle
1735 }
1736
1737 define <4 x float> @insert_mem_and_zero_v4f32(float* %ptr) {
1738 ; SSE-LABEL: insert_mem_and_zero_v4f32:
1739 ; SSE:       # BB#0:
1740 ; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1741 ; SSE-NEXT:    retq
1742 ;
1743 ; AVX-LABEL: insert_mem_and_zero_v4f32:
1744 ; AVX:       # BB#0:
1745 ; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1746 ; AVX-NEXT:    retq
1747   %a = load float, float* %ptr
1748   %v = insertelement <4 x float> undef, float %a, i32 0
1749   %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1750   ret <4 x float> %shuffle
1751 }
1752
1753 define <4 x i32> @insert_reg_lo_v4i32(i64 %a, <4 x i32> %b) {
1754 ; SSE2-LABEL: insert_reg_lo_v4i32:
1755 ; SSE2:       # BB#0:
1756 ; SSE2-NEXT:    movd %rdi, %xmm1
1757 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1758 ; SSE2-NEXT:    retq
1759 ;
1760 ; SSE3-LABEL: insert_reg_lo_v4i32:
1761 ; SSE3:       # BB#0:
1762 ; SSE3-NEXT:    movd %rdi, %xmm1
1763 ; SSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1764 ; SSE3-NEXT:    retq
1765 ;
1766 ; SSSE3-LABEL: insert_reg_lo_v4i32:
1767 ; SSSE3:       # BB#0:
1768 ; SSSE3-NEXT:    movd %rdi, %xmm1
1769 ; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1770 ; SSSE3-NEXT:    retq
1771 ;
1772 ; SSE41-LABEL: insert_reg_lo_v4i32:
1773 ; SSE41:       # BB#0:
1774 ; SSE41-NEXT:    movd %rdi, %xmm1
1775 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1776 ; SSE41-NEXT:    retq
1777 ;
1778 ; AVX1-LABEL: insert_reg_lo_v4i32:
1779 ; AVX1:       # BB#0:
1780 ; AVX1-NEXT:    vmovq %rdi, %xmm1
1781 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1782 ; AVX1-NEXT:    retq
1783 ;
1784 ; AVX2-LABEL: insert_reg_lo_v4i32:
1785 ; AVX2:       # BB#0:
1786 ; AVX2-NEXT:    vmovq %rdi, %xmm1
1787 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1788 ; AVX2-NEXT:    retq
1789   %a.cast = bitcast i64 %a to <2 x i32>
1790   %v = shufflevector <2 x i32> %a.cast, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1791   %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1792   ret <4 x i32> %shuffle
1793 }
1794
1795 define <4 x i32> @insert_mem_lo_v4i32(<2 x i32>* %ptr, <4 x i32> %b) {
1796 ; SSE2-LABEL: insert_mem_lo_v4i32:
1797 ; SSE2:       # BB#0:
1798 ; SSE2-NEXT:    movlpd (%rdi), %xmm0
1799 ; SSE2-NEXT:    retq
1800 ;
1801 ; SSE3-LABEL: insert_mem_lo_v4i32:
1802 ; SSE3:       # BB#0:
1803 ; SSE3-NEXT:    movlpd (%rdi), %xmm0
1804 ; SSE3-NEXT:    retq
1805 ;
1806 ; SSSE3-LABEL: insert_mem_lo_v4i32:
1807 ; SSSE3:       # BB#0:
1808 ; SSSE3-NEXT:    movlpd (%rdi), %xmm0
1809 ; SSSE3-NEXT:    retq
1810 ;
1811 ; SSE41-LABEL: insert_mem_lo_v4i32:
1812 ; SSE41:       # BB#0:
1813 ; SSE41-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1814 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1815 ; SSE41-NEXT:    retq
1816 ;
1817 ; AVX1-LABEL: insert_mem_lo_v4i32:
1818 ; AVX1:       # BB#0:
1819 ; AVX1-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1820 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1821 ; AVX1-NEXT:    retq
1822 ;
1823 ; AVX2-LABEL: insert_mem_lo_v4i32:
1824 ; AVX2:       # BB#0:
1825 ; AVX2-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1826 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1827 ; AVX2-NEXT:    retq
1828   %a = load <2 x i32>, <2 x i32>* %ptr
1829   %v = shufflevector <2 x i32> %a, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1830   %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1831   ret <4 x i32> %shuffle
1832 }
1833
1834 define <4 x i32> @insert_reg_hi_v4i32(i64 %a, <4 x i32> %b) {
1835 ; SSE-LABEL: insert_reg_hi_v4i32:
1836 ; SSE:       # BB#0:
1837 ; SSE-NEXT:    movd %rdi, %xmm1
1838 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1839 ; SSE-NEXT:    retq
1840 ;
1841 ; AVX-LABEL: insert_reg_hi_v4i32:
1842 ; AVX:       # BB#0:
1843 ; AVX-NEXT:    vmovq %rdi, %xmm1
1844 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1845 ; AVX-NEXT:    retq
1846   %a.cast = bitcast i64 %a to <2 x i32>
1847   %v = shufflevector <2 x i32> %a.cast, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1848   %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1849   ret <4 x i32> %shuffle
1850 }
1851
1852 define <4 x i32> @insert_mem_hi_v4i32(<2 x i32>* %ptr, <4 x i32> %b) {
1853 ; SSE-LABEL: insert_mem_hi_v4i32:
1854 ; SSE:       # BB#0:
1855 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1856 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1857 ; SSE-NEXT:    retq
1858 ;
1859 ; AVX-LABEL: insert_mem_hi_v4i32:
1860 ; AVX:       # BB#0:
1861 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1862 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1863 ; AVX-NEXT:    retq
1864   %a = load <2 x i32>, <2 x i32>* %ptr
1865   %v = shufflevector <2 x i32> %a, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1866   %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1867   ret <4 x i32> %shuffle
1868 }
1869
1870 define <4 x float> @insert_reg_lo_v4f32(double %a, <4 x float> %b) {
1871 ; SSE-LABEL: insert_reg_lo_v4f32:
1872 ; SSE:       # BB#0:
1873 ; SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1874 ; SSE-NEXT:    movapd %xmm1, %xmm0
1875 ; SSE-NEXT:    retq
1876 ;
1877 ; AVX-LABEL: insert_reg_lo_v4f32:
1878 ; AVX:       # BB#0:
1879 ; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1880 ; AVX-NEXT:    retq
1881   %a.cast = bitcast double %a to <2 x float>
1882   %v = shufflevector <2 x float> %a.cast, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1883   %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1884   ret <4 x float> %shuffle
1885 }
1886
1887 define <4 x float> @insert_mem_lo_v4f32(<2 x float>* %ptr, <4 x float> %b) {
1888 ; SSE-LABEL: insert_mem_lo_v4f32:
1889 ; SSE:       # BB#0:
1890 ; SSE-NEXT:    movlpd (%rdi), %xmm0
1891 ; SSE-NEXT:    retq
1892 ;
1893 ; AVX-LABEL: insert_mem_lo_v4f32:
1894 ; AVX:       # BB#0:
1895 ; AVX-NEXT:    vmovlpd (%rdi), %xmm0, %xmm0
1896 ; AVX-NEXT:    retq
1897   %a = load <2 x float>, <2 x float>* %ptr
1898   %v = shufflevector <2 x float> %a, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1899   %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1900   ret <4 x float> %shuffle
1901 }
1902
1903 define <4 x float> @insert_reg_hi_v4f32(double %a, <4 x float> %b) {
1904 ; SSE-LABEL: insert_reg_hi_v4f32:
1905 ; SSE:       # BB#0:
1906 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1907 ; SSE-NEXT:    movapd %xmm1, %xmm0
1908 ; SSE-NEXT:    retq
1909 ;
1910 ; AVX-LABEL: insert_reg_hi_v4f32:
1911 ; AVX:       # BB#0:
1912 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1913 ; AVX-NEXT:    retq
1914   %a.cast = bitcast double %a to <2 x float>
1915   %v = shufflevector <2 x float> %a.cast, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1916   %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1917   ret <4 x float> %shuffle
1918 }
1919
1920 define <4 x float> @insert_mem_hi_v4f32(<2 x float>* %ptr, <4 x float> %b) {
1921 ; SSE-LABEL: insert_mem_hi_v4f32:
1922 ; SSE:       # BB#0:
1923 ; SSE-NEXT:    movhpd (%rdi), %xmm0
1924 ; SSE-NEXT:    retq
1925 ;
1926 ; AVX-LABEL: insert_mem_hi_v4f32:
1927 ; AVX:       # BB#0:
1928 ; AVX-NEXT:    vmovhpd (%rdi), %xmm0, %xmm0
1929 ; AVX-NEXT:    retq
1930   %a = load <2 x float>, <2 x float>* %ptr
1931   %v = shufflevector <2 x float> %a, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1932   %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1933   ret <4 x float> %shuffle
1934 }
1935
1936 define <4 x float> @shuffle_mem_v4f32_3210(<4 x float>* %ptr) {
1937 ; SSE-LABEL: shuffle_mem_v4f32_3210:
1938 ; SSE:       # BB#0:
1939 ; SSE-NEXT:    movaps (%rdi), %xmm0
1940 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
1941 ; SSE-NEXT:    retq
1942 ;
1943 ; AVX-LABEL: shuffle_mem_v4f32_3210:
1944 ; AVX:       # BB#0:
1945 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = mem[3,2,1,0]
1946 ; AVX-NEXT:    retq
1947   %a = load <4 x float>, <4 x float>* %ptr
1948   %shuffle = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
1949   ret <4 x float> %shuffle
1950 }
1951
1952 define <4 x i32> @insert_dup_mem_v4i32(i32* %ptr) {
1953 ; SSE-LABEL: insert_dup_mem_v4i32:
1954 ; SSE:       # BB#0:
1955 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1956 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
1957 ; SSE-NEXT:    retq
1958 ;
1959 ; AVX-LABEL: insert_dup_mem_v4i32:
1960 ; AVX:       # BB#0:
1961 ; AVX-NEXT:    vbroadcastss (%rdi), %xmm0
1962 ; AVX-NEXT:    retq
1963   %tmp = load i32, i32* %ptr, align 4
1964   %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %tmp, i32 0
1965   %tmp2 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <4 x i32> zeroinitializer
1966   ret <4 x i32> %tmp2
1967 }
1968
1969 ;
1970 ; Shuffle to logical bit shifts
1971 ;
1972
1973 define <4 x i32> @shuffle_v4i32_z0zX(<4 x i32> %a) {
1974 ; SSE-LABEL: shuffle_v4i32_z0zX:
1975 ; SSE:       # BB#0:
1976 ; SSE-NEXT:    psllq $32, %xmm0
1977 ; SSE-NEXT:    retq
1978 ;
1979 ; AVX-LABEL: shuffle_v4i32_z0zX:
1980 ; AVX:       # BB#0:
1981 ; AVX-NEXT:    vpsllq $32, %xmm0, %xmm0
1982 ; AVX-NEXT:    retq
1983   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 4, i32 0, i32 4, i32 undef>
1984   ret <4 x i32> %shuffle
1985 }
1986
1987 define <4 x i32> @shuffle_v4i32_1z3z(<4 x i32> %a) {
1988 ; SSE-LABEL: shuffle_v4i32_1z3z:
1989 ; SSE:       # BB#0:
1990 ; SSE-NEXT:    psrlq $32, %xmm0
1991 ; SSE-NEXT:    retq
1992 ;
1993 ; AVX-LABEL: shuffle_v4i32_1z3z:
1994 ; AVX:       # BB#0:
1995 ; AVX-NEXT:    vpsrlq $32, %xmm0, %xmm0
1996 ; AVX-NEXT:    retq
1997   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 1, i32 4, i32 3, i32 4>
1998   ret <4 x i32> %shuffle
1999 }