[x86] Teach the 128-bit vector shuffle lowering routines to take
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-128-v4.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -x86-experimental-vector-shuffle-legality | 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 -x86-experimental-vector-shuffle-legality | 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 -x86-experimental-vector-shuffle-legality | 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 -x86-experimental-vector-shuffle-legality | 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 -x86-experimental-vector-shuffle-legality | 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 -x86-experimental-vector-shuffle-legality | 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:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
489 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
490 ; SSE2-NEXT:    retq
491 ;
492 ; SSE3-LABEL: shuffle_v4i32_0451:
493 ; SSE3:       # BB#0:
494 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
495 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
496 ; SSE3-NEXT:    retq
497 ;
498 ; SSSE3-LABEL: shuffle_v4i32_0451:
499 ; SSSE3:       # BB#0:
500 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
501 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
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:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
545 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0,1,3]
546 ; SSE2-NEXT:    retq
547 ;
548 ; SSE3-LABEL: shuffle_v4i32_4015:
549 ; SSE3:       # BB#0:
550 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
551 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0,1,3]
552 ; SSE3-NEXT:    retq
553 ;
554 ; SSSE3-LABEL: shuffle_v4i32_4015:
555 ; SSSE3:       # BB#0:
556 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
557 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0,1,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_u051(<4 x float> %a, <4 x float> %b) {
956 ; SSE-LABEL: shuffle_v4f32_u051:
957 ; SSE:       # BB#0:
958 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[1,0]
959 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,2]
960 ; SSE-NEXT:    retq
961 ;
962 ; AVX-LABEL: shuffle_v4f32_u051:
963 ; AVX:       # BB#0:
964 ; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[1,0]
965 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,2]
966 ; AVX-NEXT:    retq
967   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 undef, i32 0, i32 5, i32 1>
968   ret <4 x float> %shuffle
969 }
970
971 define <4 x i32> @shuffle_v4i32_4zzz(<4 x i32> %a) {
972 ; SSE2-LABEL: shuffle_v4i32_4zzz:
973 ; SSE2:       # BB#0:
974 ; SSE2-NEXT:    xorps %xmm1, %xmm1
975 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
976 ; SSE2-NEXT:    movaps %xmm1, %xmm0
977 ; SSE2-NEXT:    retq
978 ;
979 ; SSE3-LABEL: shuffle_v4i32_4zzz:
980 ; SSE3:       # BB#0:
981 ; SSE3-NEXT:    xorps %xmm1, %xmm1
982 ; SSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
983 ; SSE3-NEXT:    movaps %xmm1, %xmm0
984 ; SSE3-NEXT:    retq
985 ;
986 ; SSSE3-LABEL: shuffle_v4i32_4zzz:
987 ; SSSE3:       # BB#0:
988 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
989 ; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
990 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
991 ; SSSE3-NEXT:    retq
992 ;
993 ; SSE41-LABEL: shuffle_v4i32_4zzz:
994 ; SSE41:       # BB#0:
995 ; SSE41-NEXT:    pxor %xmm1, %xmm1
996 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
997 ; SSE41-NEXT:    retq
998 ;
999 ; AVX-LABEL: shuffle_v4i32_4zzz:
1000 ; AVX:       # BB#0:
1001 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1002 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1003 ; AVX-NEXT:    retq
1004   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
1005   ret <4 x i32> %shuffle
1006 }
1007
1008 define <4 x i32> @shuffle_v4i32_z4zz(<4 x i32> %a) {
1009 ; SSE2-LABEL: shuffle_v4i32_z4zz:
1010 ; SSE2:       # BB#0:
1011 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1012 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1013 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,1,1]
1014 ; SSE2-NEXT:    retq
1015 ;
1016 ; SSE3-LABEL: shuffle_v4i32_z4zz:
1017 ; SSE3:       # BB#0:
1018 ; SSE3-NEXT:    xorps %xmm1, %xmm1
1019 ; SSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1020 ; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,1,1]
1021 ; SSE3-NEXT:    retq
1022 ;
1023 ; SSSE3-LABEL: shuffle_v4i32_z4zz:
1024 ; SSSE3:       # BB#0:
1025 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
1026 ; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1027 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,1,1]
1028 ; SSSE3-NEXT:    retq
1029 ;
1030 ; SSE41-LABEL: shuffle_v4i32_z4zz:
1031 ; SSE41:       # BB#0:
1032 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1033 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1034 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,1,1]
1035 ; SSE41-NEXT:    retq
1036 ;
1037 ; AVX-LABEL: shuffle_v4i32_z4zz:
1038 ; AVX:       # BB#0:
1039 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1040 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1041 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
1042 ; AVX-NEXT:    retq
1043   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 2, i32 4, i32 3, i32 0>
1044   ret <4 x i32> %shuffle
1045 }
1046
1047 define <4 x i32> @shuffle_v4i32_zz4z(<4 x i32> %a) {
1048 ; SSE2-LABEL: shuffle_v4i32_zz4z:
1049 ; SSE2:       # BB#0:
1050 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1051 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1052 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,0,1]
1053 ; SSE2-NEXT:    retq
1054 ;
1055 ; SSE3-LABEL: shuffle_v4i32_zz4z:
1056 ; SSE3:       # BB#0:
1057 ; SSE3-NEXT:    xorps %xmm1, %xmm1
1058 ; SSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1059 ; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,0,1]
1060 ; SSE3-NEXT:    retq
1061 ;
1062 ; SSSE3-LABEL: shuffle_v4i32_zz4z:
1063 ; SSSE3:       # BB#0:
1064 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
1065 ; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1066 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,0,1]
1067 ; SSSE3-NEXT:    retq
1068 ;
1069 ; SSE41-LABEL: shuffle_v4i32_zz4z:
1070 ; SSE41:       # BB#0:
1071 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1072 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1073 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,0,1]
1074 ; SSE41-NEXT:    retq
1075 ;
1076 ; AVX-LABEL: shuffle_v4i32_zz4z:
1077 ; AVX:       # BB#0:
1078 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1079 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1080 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,0,1]
1081 ; AVX-NEXT:    retq
1082   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 0, i32 4, i32 0>
1083   ret <4 x i32> %shuffle
1084 }
1085
1086 define <4 x i32> @shuffle_v4i32_zuu4(<4 x i32> %a) {
1087 ; SSE-LABEL: shuffle_v4i32_zuu4:
1088 ; SSE:       # BB#0:
1089 ; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3]
1090 ; SSE-NEXT:    retq
1091 ;
1092 ; AVX-LABEL: shuffle_v4i32_zuu4:
1093 ; AVX:       # BB#0:
1094 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3]
1095 ; AVX-NEXT:    retq
1096   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 4>
1097   ret <4 x i32> %shuffle
1098 }
1099
1100 define <4 x i32> @shuffle_v4i32_z6zz(<4 x i32> %a) {
1101 ; SSE2-LABEL: shuffle_v4i32_z6zz:
1102 ; SSE2:       # BB#0:
1103 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1104 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
1105 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1106 ; SSE2-NEXT:    retq
1107 ;
1108 ; SSE3-LABEL: shuffle_v4i32_z6zz:
1109 ; SSE3:       # BB#0:
1110 ; SSE3-NEXT:    xorps %xmm1, %xmm1
1111 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
1112 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1113 ; SSE3-NEXT:    retq
1114 ;
1115 ; SSSE3-LABEL: shuffle_v4i32_z6zz:
1116 ; SSSE3:       # BB#0:
1117 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
1118 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
1119 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1120 ; SSSE3-NEXT:    retq
1121 ;
1122 ; SSE41-LABEL: shuffle_v4i32_z6zz:
1123 ; SSE41:       # BB#0:
1124 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
1125 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1126 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
1127 ; SSE41-NEXT:    retq
1128 ;
1129 ; AVX1-LABEL: shuffle_v4i32_z6zz:
1130 ; AVX1:       # BB#0:
1131 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
1132 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1133 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7]
1134 ; AVX1-NEXT:    retq
1135 ;
1136 ; AVX2-LABEL: shuffle_v4i32_z6zz:
1137 ; AVX2:       # BB#0:
1138 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
1139 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1140 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]
1141 ; AVX2-NEXT:    retq
1142   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 6, i32 2, i32 3>
1143   ret <4 x i32> %shuffle
1144 }
1145
1146 define <4 x i32> @shuffle_v4i32_7012(<4 x i32> %a, <4 x i32> %b) {
1147 ; SSE2-LABEL: shuffle_v4i32_7012:
1148 ; SSE2:       # BB#0:
1149 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[0,0]
1150 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
1151 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1152 ; SSE2-NEXT:    retq
1153 ;
1154 ; SSE3-LABEL: shuffle_v4i32_7012:
1155 ; SSE3:       # BB#0:
1156 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[0,0]
1157 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
1158 ; SSE3-NEXT:    movaps %xmm1, %xmm0
1159 ; SSE3-NEXT:    retq
1160 ;
1161 ; SSSE3-LABEL: shuffle_v4i32_7012:
1162 ; SSSE3:       # BB#0:
1163 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11]
1164 ; SSSE3-NEXT:    retq
1165 ;
1166 ; SSE41-LABEL: shuffle_v4i32_7012:
1167 ; SSE41:       # BB#0:
1168 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11]
1169 ; SSE41-NEXT:    retq
1170 ;
1171 ; AVX-LABEL: shuffle_v4i32_7012:
1172 ; AVX:       # BB#0:
1173 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11]
1174 ; AVX-NEXT:    retq
1175   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
1176   ret <4 x i32> %shuffle
1177 }
1178
1179 define <4 x i32> @shuffle_v4i32_6701(<4 x i32> %a, <4 x i32> %b) {
1180 ; SSE2-LABEL: shuffle_v4i32_6701:
1181 ; SSE2:       # BB#0:
1182 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
1183 ; SSE2-NEXT:    movapd %xmm1, %xmm0
1184 ; SSE2-NEXT:    retq
1185 ;
1186 ; SSE3-LABEL: shuffle_v4i32_6701:
1187 ; SSE3:       # BB#0:
1188 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
1189 ; SSE3-NEXT:    movapd %xmm1, %xmm0
1190 ; SSE3-NEXT:    retq
1191 ;
1192 ; SSSE3-LABEL: shuffle_v4i32_6701:
1193 ; SSSE3:       # BB#0:
1194 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
1195 ; SSSE3-NEXT:    retq
1196 ;
1197 ; SSE41-LABEL: shuffle_v4i32_6701:
1198 ; SSE41:       # BB#0:
1199 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
1200 ; SSE41-NEXT:    retq
1201 ;
1202 ; AVX-LABEL: shuffle_v4i32_6701:
1203 ; AVX:       # BB#0:
1204 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
1205 ; AVX-NEXT:    retq
1206   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
1207   ret <4 x i32> %shuffle
1208 }
1209
1210 define <4 x i32> @shuffle_v4i32_5670(<4 x i32> %a, <4 x i32> %b) {
1211 ; SSE2-LABEL: shuffle_v4i32_5670:
1212 ; SSE2:       # BB#0:
1213 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
1214 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,2],xmm0[2,0]
1215 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1216 ; SSE2-NEXT:    retq
1217 ;
1218 ; SSE3-LABEL: shuffle_v4i32_5670:
1219 ; SSE3:       # BB#0:
1220 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
1221 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,2],xmm0[2,0]
1222 ; SSE3-NEXT:    movaps %xmm1, %xmm0
1223 ; SSE3-NEXT:    retq
1224 ;
1225 ; SSSE3-LABEL: shuffle_v4i32_5670:
1226 ; SSSE3:       # BB#0:
1227 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3]
1228 ; SSSE3-NEXT:    retq
1229 ;
1230 ; SSE41-LABEL: shuffle_v4i32_5670:
1231 ; SSE41:       # BB#0:
1232 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3]
1233 ; SSE41-NEXT:    retq
1234 ;
1235 ; AVX-LABEL: shuffle_v4i32_5670:
1236 ; AVX:       # BB#0:
1237 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3]
1238 ; AVX-NEXT:    retq
1239   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
1240   ret <4 x i32> %shuffle
1241 }
1242
1243 define <4 x i32> @shuffle_v4i32_1234(<4 x i32> %a, <4 x i32> %b) {
1244 ; SSE2-LABEL: shuffle_v4i32_1234:
1245 ; SSE2:       # BB#0:
1246 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
1247 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
1248 ; SSE2-NEXT:    retq
1249 ;
1250 ; SSE3-LABEL: shuffle_v4i32_1234:
1251 ; SSE3:       # BB#0:
1252 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
1253 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
1254 ; SSE3-NEXT:    retq
1255 ;
1256 ; SSSE3-LABEL: shuffle_v4i32_1234:
1257 ; SSSE3:       # BB#0:
1258 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
1259 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1260 ; SSSE3-NEXT:    retq
1261 ;
1262 ; SSE41-LABEL: shuffle_v4i32_1234:
1263 ; SSE41:       # BB#0:
1264 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
1265 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1266 ; SSE41-NEXT:    retq
1267 ;
1268 ; AVX-LABEL: shuffle_v4i32_1234:
1269 ; AVX:       # BB#0:
1270 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
1271 ; AVX-NEXT:    retq
1272   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
1273   ret <4 x i32> %shuffle
1274 }
1275
1276 define <4 x i32> @shuffle_v4i32_2345(<4 x i32> %a, <4 x i32> %b) {
1277 ; SSE2-LABEL: shuffle_v4i32_2345:
1278 ; SSE2:       # BB#0:
1279 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
1280 ; SSE2-NEXT:    retq
1281 ;
1282 ; SSE3-LABEL: shuffle_v4i32_2345:
1283 ; SSE3:       # BB#0:
1284 ; SSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
1285 ; SSE3-NEXT:    retq
1286 ;
1287 ; SSSE3-LABEL: shuffle_v4i32_2345:
1288 ; SSSE3:       # BB#0:
1289 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
1290 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1291 ; SSSE3-NEXT:    retq
1292 ;
1293 ; SSE41-LABEL: shuffle_v4i32_2345:
1294 ; SSE41:       # BB#0:
1295 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
1296 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1297 ; SSE41-NEXT:    retq
1298 ;
1299 ; AVX-LABEL: shuffle_v4i32_2345:
1300 ; AVX:       # BB#0:
1301 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
1302 ; AVX-NEXT:    retq
1303   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
1304   ret <4 x i32> %shuffle
1305 }
1306
1307 define <4 x i32> @shuffle_v4i32_40u1(<4 x i32> %a, <4 x i32> %b) {
1308 ; SSE2-LABEL: shuffle_v4i32_40u1:
1309 ; SSE2:       # BB#0:
1310 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
1311 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,1]
1312 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1313 ; SSE2-NEXT:    retq
1314 ;
1315 ; SSE3-LABEL: shuffle_v4i32_40u1:
1316 ; SSE3:       # BB#0:
1317 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
1318 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,1]
1319 ; SSE3-NEXT:    movaps %xmm1, %xmm0
1320 ; SSE3-NEXT:    retq
1321 ;
1322 ; SSSE3-LABEL: shuffle_v4i32_40u1:
1323 ; SSSE3:       # BB#0:
1324 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
1325 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,1]
1326 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
1327 ; SSSE3-NEXT:    retq
1328 ;
1329 ; SSE41-LABEL: shuffle_v4i32_40u1:
1330 ; SSE41:       # BB#0:
1331 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1332 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7]
1333 ; SSE41-NEXT:    retq
1334 ;
1335 ; AVX1-LABEL: shuffle_v4i32_40u1:
1336 ; AVX1:       # BB#0:
1337 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1338 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7]
1339 ; AVX1-NEXT:    retq
1340 ;
1341 ; AVX2-LABEL: shuffle_v4i32_40u1:
1342 ; AVX2:       # BB#0:
1343 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
1344 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1345 ; AVX2-NEXT:    retq
1346   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 0, i32 undef, i32 1>
1347   ret <4 x i32> %shuffle
1348 }
1349
1350 define <4 x i32> @shuffle_v4i32_3456(<4 x i32> %a, <4 x i32> %b) {
1351 ; SSE2-LABEL: shuffle_v4i32_3456:
1352 ; SSE2:       # BB#0:
1353 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[0,0]
1354 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,2]
1355 ; SSE2-NEXT:    retq
1356 ;
1357 ; SSE3-LABEL: shuffle_v4i32_3456:
1358 ; SSE3:       # BB#0:
1359 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[0,0]
1360 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,2]
1361 ; SSE3-NEXT:    retq
1362 ;
1363 ; SSSE3-LABEL: shuffle_v4i32_3456:
1364 ; SSSE3:       # BB#0:
1365 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11]
1366 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1367 ; SSSE3-NEXT:    retq
1368 ;
1369 ; SSE41-LABEL: shuffle_v4i32_3456:
1370 ; SSE41:       # BB#0:
1371 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11]
1372 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1373 ; SSE41-NEXT:    retq
1374 ;
1375 ; AVX-LABEL: shuffle_v4i32_3456:
1376 ; AVX:       # BB#0:
1377 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11]
1378 ; AVX-NEXT:    retq
1379   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
1380   ret <4 x i32> %shuffle
1381 }
1382
1383 define <4 x i32> @shuffle_v4i32_0u1u(<4 x i32> %a, <4 x i32> %b) {
1384 ; SSE2-LABEL: shuffle_v4i32_0u1u:
1385 ; SSE2:       # BB#0:
1386 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
1387 ; SSE2-NEXT:    retq
1388 ;
1389 ; SSE3-LABEL: shuffle_v4i32_0u1u:
1390 ; SSE3:       # BB#0:
1391 ; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
1392 ; SSE3-NEXT:    retq
1393 ;
1394 ; SSSE3-LABEL: shuffle_v4i32_0u1u:
1395 ; SSSE3:       # BB#0:
1396 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
1397 ; SSSE3-NEXT:    retq
1398 ;
1399 ; SSE41-LABEL: shuffle_v4i32_0u1u:
1400 ; SSE41:       # BB#0:
1401 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1402 ; SSE41-NEXT:    retq
1403 ;
1404 ; AVX-LABEL: shuffle_v4i32_0u1u:
1405 ; AVX:       # BB#0:
1406 ; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1407 ; AVX-NEXT:    retq
1408   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 undef, i32 1, i32 undef>
1409   ret <4 x i32> %shuffle
1410 }
1411
1412 define <4 x i32> @shuffle_v4i32_0z1z(<4 x i32> %a) {
1413 ; SSE2-LABEL: shuffle_v4i32_0z1z:
1414 ; SSE2:       # BB#0:
1415 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1416 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1417 ; SSE2-NEXT:    retq
1418 ;
1419 ; SSE3-LABEL: shuffle_v4i32_0z1z:
1420 ; SSE3:       # BB#0:
1421 ; SSE3-NEXT:    pxor %xmm1, %xmm1
1422 ; SSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1423 ; SSE3-NEXT:    retq
1424 ;
1425 ; SSSE3-LABEL: shuffle_v4i32_0z1z:
1426 ; SSSE3:       # BB#0:
1427 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1428 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1429 ; SSSE3-NEXT:    retq
1430 ;
1431 ; SSE41-LABEL: shuffle_v4i32_0z1z:
1432 ; SSE41:       # BB#0:
1433 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1434 ; SSE41-NEXT:    retq
1435 ;
1436 ; AVX-LABEL: shuffle_v4i32_0z1z:
1437 ; AVX:       # BB#0:
1438 ; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1439 ; AVX-NEXT:    retq
1440   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 1, i32 7>
1441   ret <4 x i32> %shuffle
1442 }
1443
1444 define <4 x i32> @shuffle_v4i32_01zu(<4 x i32> %a) {
1445 ; SSE-LABEL: shuffle_v4i32_01zu:
1446 ; SSE:       # BB#0:
1447 ; SSE-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
1448 ; SSE-NEXT:    retq
1449 ;
1450 ; AVX-LABEL: shuffle_v4i32_01zu:
1451 ; AVX:       # BB#0:
1452 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
1453 ; AVX-NEXT:    retq
1454   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 7, i32 undef>
1455   ret <4 x i32> %shuffle
1456 }
1457
1458 define <4 x i32> @shuffle_v4i32_0z23(<4 x i32> %a) {
1459 ; SSE2-LABEL: shuffle_v4i32_0z23:
1460 ; SSE2:       # BB#0:
1461 ; SSE2-NEXT:    andps {{.*}}(%rip), %xmm0
1462 ; SSE2-NEXT:    retq
1463 ;
1464 ; SSE3-LABEL: shuffle_v4i32_0z23:
1465 ; SSE3:       # BB#0:
1466 ; SSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1467 ; SSE3-NEXT:    retq
1468 ;
1469 ; SSSE3-LABEL: shuffle_v4i32_0z23:
1470 ; SSSE3:       # BB#0:
1471 ; SSSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1472 ; SSSE3-NEXT:    retq
1473 ;
1474 ; SSE41-LABEL: shuffle_v4i32_0z23:
1475 ; SSE41:       # BB#0:
1476 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1477 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
1478 ; SSE41-NEXT:    retq
1479 ;
1480 ; AVX1-LABEL: shuffle_v4i32_0z23:
1481 ; AVX1:       # BB#0:
1482 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1483 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
1484 ; AVX1-NEXT:    retq
1485 ;
1486 ; AVX2-LABEL: shuffle_v4i32_0z23:
1487 ; AVX2:       # BB#0:
1488 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1489 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
1490 ; AVX2-NEXT:    retq
1491   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 4, i32 2, i32 3>
1492   ret <4 x i32> %shuffle
1493 }
1494
1495 define <4 x i32> @shuffle_v4i32_01z3(<4 x i32> %a) {
1496 ; SSE2-LABEL: shuffle_v4i32_01z3:
1497 ; SSE2:       # BB#0:
1498 ; SSE2-NEXT:    andps {{.*}}(%rip), %xmm0
1499 ; SSE2-NEXT:    retq
1500 ;
1501 ; SSE3-LABEL: shuffle_v4i32_01z3:
1502 ; SSE3:       # BB#0:
1503 ; SSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1504 ; SSE3-NEXT:    retq
1505 ;
1506 ; SSSE3-LABEL: shuffle_v4i32_01z3:
1507 ; SSSE3:       # BB#0:
1508 ; SSSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1509 ; SSSE3-NEXT:    retq
1510 ;
1511 ; SSE41-LABEL: shuffle_v4i32_01z3:
1512 ; SSE41:       # BB#0:
1513 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1514 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
1515 ; SSE41-NEXT:    retq
1516 ;
1517 ; AVX1-LABEL: shuffle_v4i32_01z3:
1518 ; AVX1:       # BB#0:
1519 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1520 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
1521 ; AVX1-NEXT:    retq
1522 ;
1523 ; AVX2-LABEL: shuffle_v4i32_01z3:
1524 ; AVX2:       # BB#0:
1525 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1526 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]
1527 ; AVX2-NEXT:    retq
1528   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 4, i32 3>
1529   ret <4 x i32> %shuffle
1530 }
1531
1532 define <4 x i32> @shuffle_v4i32_012z(<4 x i32> %a) {
1533 ; SSE2-LABEL: shuffle_v4i32_012z:
1534 ; SSE2:       # BB#0:
1535 ; SSE2-NEXT:    andps {{.*}}(%rip), %xmm0
1536 ; SSE2-NEXT:    retq
1537 ;
1538 ; SSE3-LABEL: shuffle_v4i32_012z:
1539 ; SSE3:       # BB#0:
1540 ; SSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1541 ; SSE3-NEXT:    retq
1542 ;
1543 ; SSSE3-LABEL: shuffle_v4i32_012z:
1544 ; SSSE3:       # BB#0:
1545 ; SSSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1546 ; SSSE3-NEXT:    retq
1547 ;
1548 ; SSE41-LABEL: shuffle_v4i32_012z:
1549 ; SSE41:       # BB#0:
1550 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1551 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5],xmm1[6,7]
1552 ; SSE41-NEXT:    retq
1553 ;
1554 ; AVX1-LABEL: shuffle_v4i32_012z:
1555 ; AVX1:       # BB#0:
1556 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1557 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5],xmm1[6,7]
1558 ; AVX1-NEXT:    retq
1559 ;
1560 ; AVX2-LABEL: shuffle_v4i32_012z:
1561 ; AVX2:       # BB#0:
1562 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1563 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]
1564 ; AVX2-NEXT:    retq
1565   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
1566   ret <4 x i32> %shuffle
1567 }
1568
1569 define <4 x i32> @shuffle_v4i32_0zz3(<4 x i32> %a) {
1570 ; SSE2-LABEL: shuffle_v4i32_0zz3:
1571 ; SSE2:       # BB#0:
1572 ; SSE2-NEXT:    andps {{.*}}(%rip), %xmm0
1573 ; SSE2-NEXT:    retq
1574 ;
1575 ; SSE3-LABEL: shuffle_v4i32_0zz3:
1576 ; SSE3:       # BB#0:
1577 ; SSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1578 ; SSE3-NEXT:    retq
1579 ;
1580 ; SSSE3-LABEL: shuffle_v4i32_0zz3:
1581 ; SSSE3:       # BB#0:
1582 ; SSSE3-NEXT:    andps {{.*}}(%rip), %xmm0
1583 ; SSSE3-NEXT:    retq
1584 ;
1585 ; SSE41-LABEL: shuffle_v4i32_0zz3:
1586 ; SSE41:       # BB#0:
1587 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1588 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5],xmm0[6,7]
1589 ; SSE41-NEXT:    retq
1590 ;
1591 ; AVX1-LABEL: shuffle_v4i32_0zz3:
1592 ; AVX1:       # BB#0:
1593 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1594 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5],xmm0[6,7]
1595 ; AVX1-NEXT:    retq
1596 ;
1597 ; AVX2-LABEL: shuffle_v4i32_0zz3:
1598 ; AVX2:       # BB#0:
1599 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1600 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2],xmm0[3]
1601 ; AVX2-NEXT:    retq
1602   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 4, i32 4, i32 3>
1603   ret <4 x i32> %shuffle
1604 }
1605
1606 define <4 x i32> @insert_reg_and_zero_v4i32(i32 %a) {
1607 ; SSE-LABEL: insert_reg_and_zero_v4i32:
1608 ; SSE:       # BB#0:
1609 ; SSE-NEXT:    movd %edi, %xmm0
1610 ; SSE-NEXT:    retq
1611 ;
1612 ; AVX-LABEL: insert_reg_and_zero_v4i32:
1613 ; AVX:       # BB#0:
1614 ; AVX-NEXT:    vmovd %edi, %xmm0
1615 ; AVX-NEXT:    retq
1616   %v = insertelement <4 x i32> undef, i32 %a, i32 0
1617   %shuffle = shufflevector <4 x i32> %v, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1618   ret <4 x i32> %shuffle
1619 }
1620
1621 define <4 x i32> @insert_mem_and_zero_v4i32(i32* %ptr) {
1622 ; SSE-LABEL: insert_mem_and_zero_v4i32:
1623 ; SSE:       # BB#0:
1624 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1625 ; SSE-NEXT:    retq
1626 ;
1627 ; AVX-LABEL: insert_mem_and_zero_v4i32:
1628 ; AVX:       # BB#0:
1629 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1630 ; AVX-NEXT:    retq
1631   %a = load i32* %ptr
1632   %v = insertelement <4 x i32> undef, i32 %a, i32 0
1633   %shuffle = shufflevector <4 x i32> %v, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1634   ret <4 x i32> %shuffle
1635 }
1636
1637 define <4 x float> @insert_reg_and_zero_v4f32(float %a) {
1638 ; SSE2-LABEL: insert_reg_and_zero_v4f32:
1639 ; SSE2:       # BB#0:
1640 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1641 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1642 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1643 ; SSE2-NEXT:    retq
1644 ;
1645 ; SSE3-LABEL: insert_reg_and_zero_v4f32:
1646 ; SSE3:       # BB#0:
1647 ; SSE3-NEXT:    xorps %xmm1, %xmm1
1648 ; SSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1649 ; SSE3-NEXT:    movaps %xmm1, %xmm0
1650 ; SSE3-NEXT:    retq
1651 ;
1652 ; SSSE3-LABEL: insert_reg_and_zero_v4f32:
1653 ; SSSE3:       # BB#0:
1654 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
1655 ; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1656 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
1657 ; SSSE3-NEXT:    retq
1658 ;
1659 ; SSE41-LABEL: insert_reg_and_zero_v4f32:
1660 ; SSE41:       # BB#0:
1661 ; SSE41-NEXT:    xorps %xmm1, %xmm1
1662 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1663 ; SSE41-NEXT:    retq
1664 ;
1665 ; AVX-LABEL: insert_reg_and_zero_v4f32:
1666 ; AVX:       # BB#0:
1667 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1668 ; AVX-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1669 ; AVX-NEXT:    retq
1670   %v = insertelement <4 x float> undef, float %a, i32 0
1671   %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1672   ret <4 x float> %shuffle
1673 }
1674
1675 define <4 x float> @insert_mem_and_zero_v4f32(float* %ptr) {
1676 ; SSE-LABEL: insert_mem_and_zero_v4f32:
1677 ; SSE:       # BB#0:
1678 ; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1679 ; SSE-NEXT:    retq
1680 ;
1681 ; AVX-LABEL: insert_mem_and_zero_v4f32:
1682 ; AVX:       # BB#0:
1683 ; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1684 ; AVX-NEXT:    retq
1685   %a = load float* %ptr
1686   %v = insertelement <4 x float> undef, float %a, i32 0
1687   %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1688   ret <4 x float> %shuffle
1689 }
1690
1691 define <4 x i32> @insert_reg_lo_v4i32(i64 %a, <4 x i32> %b) {
1692 ; SSE2-LABEL: insert_reg_lo_v4i32:
1693 ; SSE2:       # BB#0:
1694 ; SSE2-NEXT:    movd %rdi, %xmm1
1695 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1696 ; SSE2-NEXT:    retq
1697 ;
1698 ; SSE3-LABEL: insert_reg_lo_v4i32:
1699 ; SSE3:       # BB#0:
1700 ; SSE3-NEXT:    movd %rdi, %xmm1
1701 ; SSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1702 ; SSE3-NEXT:    retq
1703 ;
1704 ; SSSE3-LABEL: insert_reg_lo_v4i32:
1705 ; SSSE3:       # BB#0:
1706 ; SSSE3-NEXT:    movd %rdi, %xmm1
1707 ; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1708 ; SSSE3-NEXT:    retq
1709 ;
1710 ; SSE41-LABEL: insert_reg_lo_v4i32:
1711 ; SSE41:       # BB#0:
1712 ; SSE41-NEXT:    movd %rdi, %xmm1
1713 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1714 ; SSE41-NEXT:    retq
1715 ;
1716 ; AVX1-LABEL: insert_reg_lo_v4i32:
1717 ; AVX1:       # BB#0:
1718 ; AVX1-NEXT:    vmovq %rdi, %xmm1
1719 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1720 ; AVX1-NEXT:    retq
1721 ;
1722 ; AVX2-LABEL: insert_reg_lo_v4i32:
1723 ; AVX2:       # BB#0:
1724 ; AVX2-NEXT:    vmovq %rdi, %xmm1
1725 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1726 ; AVX2-NEXT:    retq
1727   %a.cast = bitcast i64 %a to <2 x i32>
1728   %v = shufflevector <2 x i32> %a.cast, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1729   %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1730   ret <4 x i32> %shuffle
1731 }
1732
1733 define <4 x i32> @insert_mem_lo_v4i32(<2 x i32>* %ptr, <4 x i32> %b) {
1734 ; SSE2-LABEL: insert_mem_lo_v4i32:
1735 ; SSE2:       # BB#0:
1736 ; SSE2-NEXT:    movlpd (%rdi), %xmm0
1737 ; SSE2-NEXT:    retq
1738 ;
1739 ; SSE3-LABEL: insert_mem_lo_v4i32:
1740 ; SSE3:       # BB#0:
1741 ; SSE3-NEXT:    movlpd (%rdi), %xmm0
1742 ; SSE3-NEXT:    retq
1743 ;
1744 ; SSSE3-LABEL: insert_mem_lo_v4i32:
1745 ; SSSE3:       # BB#0:
1746 ; SSSE3-NEXT:    movlpd (%rdi), %xmm0
1747 ; SSSE3-NEXT:    retq
1748 ;
1749 ; SSE41-LABEL: insert_mem_lo_v4i32:
1750 ; SSE41:       # BB#0:
1751 ; SSE41-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1752 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1753 ; SSE41-NEXT:    retq
1754 ;
1755 ; AVX1-LABEL: insert_mem_lo_v4i32:
1756 ; AVX1:       # BB#0:
1757 ; AVX1-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1758 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1759 ; AVX1-NEXT:    retq
1760 ;
1761 ; AVX2-LABEL: insert_mem_lo_v4i32:
1762 ; AVX2:       # BB#0:
1763 ; AVX2-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1764 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1765 ; AVX2-NEXT:    retq
1766   %a = load <2 x i32>* %ptr
1767   %v = shufflevector <2 x i32> %a, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1768   %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1769   ret <4 x i32> %shuffle
1770 }
1771
1772 define <4 x i32> @insert_reg_hi_v4i32(i64 %a, <4 x i32> %b) {
1773 ; SSE-LABEL: insert_reg_hi_v4i32:
1774 ; SSE:       # BB#0:
1775 ; SSE-NEXT:    movd %rdi, %xmm1
1776 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1777 ; SSE-NEXT:    retq
1778 ;
1779 ; AVX-LABEL: insert_reg_hi_v4i32:
1780 ; AVX:       # BB#0:
1781 ; AVX-NEXT:    vmovq %rdi, %xmm1
1782 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1783 ; AVX-NEXT:    retq
1784   %a.cast = bitcast i64 %a to <2 x i32>
1785   %v = shufflevector <2 x i32> %a.cast, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1786   %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1787   ret <4 x i32> %shuffle
1788 }
1789
1790 define <4 x i32> @insert_mem_hi_v4i32(<2 x i32>* %ptr, <4 x i32> %b) {
1791 ; SSE-LABEL: insert_mem_hi_v4i32:
1792 ; SSE:       # BB#0:
1793 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1794 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1795 ; SSE-NEXT:    retq
1796 ;
1797 ; AVX-LABEL: insert_mem_hi_v4i32:
1798 ; AVX:       # BB#0:
1799 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1800 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1801 ; AVX-NEXT:    retq
1802   %a = load <2 x i32>* %ptr
1803   %v = shufflevector <2 x i32> %a, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1804   %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1805   ret <4 x i32> %shuffle
1806 }
1807
1808 define <4 x float> @insert_reg_lo_v4f32(double %a, <4 x float> %b) {
1809 ; SSE-LABEL: insert_reg_lo_v4f32:
1810 ; SSE:       # BB#0:
1811 ; SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1812 ; SSE-NEXT:    movapd %xmm1, %xmm0
1813 ; SSE-NEXT:    retq
1814 ;
1815 ; AVX-LABEL: insert_reg_lo_v4f32:
1816 ; AVX:       # BB#0:
1817 ; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1818 ; AVX-NEXT:    retq
1819   %a.cast = bitcast double %a to <2 x float>
1820   %v = shufflevector <2 x float> %a.cast, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1821   %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1822   ret <4 x float> %shuffle
1823 }
1824
1825 define <4 x float> @insert_mem_lo_v4f32(<2 x float>* %ptr, <4 x float> %b) {
1826 ; SSE-LABEL: insert_mem_lo_v4f32:
1827 ; SSE:       # BB#0:
1828 ; SSE-NEXT:    movlpd (%rdi), %xmm0
1829 ; SSE-NEXT:    retq
1830 ;
1831 ; AVX-LABEL: insert_mem_lo_v4f32:
1832 ; AVX:       # BB#0:
1833 ; AVX-NEXT:    vmovlpd (%rdi), %xmm0, %xmm0
1834 ; AVX-NEXT:    retq
1835   %a = load <2 x float>* %ptr
1836   %v = shufflevector <2 x float> %a, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1837   %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1838   ret <4 x float> %shuffle
1839 }
1840
1841 define <4 x float> @insert_reg_hi_v4f32(double %a, <4 x float> %b) {
1842 ; SSE-LABEL: insert_reg_hi_v4f32:
1843 ; SSE:       # BB#0:
1844 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1845 ; SSE-NEXT:    movapd %xmm1, %xmm0
1846 ; SSE-NEXT:    retq
1847 ;
1848 ; AVX-LABEL: insert_reg_hi_v4f32:
1849 ; AVX:       # BB#0:
1850 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1851 ; AVX-NEXT:    retq
1852   %a.cast = bitcast double %a to <2 x float>
1853   %v = shufflevector <2 x float> %a.cast, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1854   %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1855   ret <4 x float> %shuffle
1856 }
1857
1858 define <4 x float> @insert_mem_hi_v4f32(<2 x float>* %ptr, <4 x float> %b) {
1859 ; SSE-LABEL: insert_mem_hi_v4f32:
1860 ; SSE:       # BB#0:
1861 ; SSE-NEXT:    movhpd (%rdi), %xmm0
1862 ; SSE-NEXT:    retq
1863 ;
1864 ; AVX-LABEL: insert_mem_hi_v4f32:
1865 ; AVX:       # BB#0:
1866 ; AVX-NEXT:    vmovhpd (%rdi), %xmm0, %xmm0
1867 ; AVX-NEXT:    retq
1868   %a = load <2 x float>* %ptr
1869   %v = shufflevector <2 x float> %a, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1870   %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1871   ret <4 x float> %shuffle
1872 }
1873
1874 define <4 x float> @shuffle_mem_v4f32_3210(<4 x float>* %ptr) {
1875 ; SSE-LABEL: shuffle_mem_v4f32_3210:
1876 ; SSE:       # BB#0:
1877 ; SSE-NEXT:    movaps (%rdi), %xmm0
1878 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
1879 ; SSE-NEXT:    retq
1880 ;
1881 ; AVX-LABEL: shuffle_mem_v4f32_3210:
1882 ; AVX:       # BB#0:
1883 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = mem[3,2,1,0]
1884 ; AVX-NEXT:    retq
1885   %a = load <4 x float>* %ptr
1886   %shuffle = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
1887   ret <4 x float> %shuffle
1888 }
1889
1890 ;
1891 ; Shuffle to logical bit shifts
1892 ;
1893
1894 define <4 x i32> @shuffle_v4i32_z0zX(<4 x i32> %a) {
1895 ; SSE-LABEL: shuffle_v4i32_z0zX:
1896 ; SSE:       # BB#0:
1897 ; SSE-NEXT:    psllq $32, %xmm0
1898 ; SSE-NEXT:    retq
1899 ;
1900 ; AVX-LABEL: shuffle_v4i32_z0zX:
1901 ; AVX:       # BB#0:
1902 ; AVX-NEXT:    vpsllq $32, %xmm0, %xmm0
1903 ; AVX-NEXT:    retq
1904   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 4, i32 0, i32 4, i32 undef>
1905   ret <4 x i32> %shuffle
1906 }
1907
1908 define <4 x i32> @shuffle_v4i32_1z3z(<4 x i32> %a) {
1909 ; SSE-LABEL: shuffle_v4i32_1z3z:
1910 ; SSE:       # BB#0:
1911 ; SSE-NEXT:    psrlq $32, %xmm0
1912 ; SSE-NEXT:    retq
1913 ;
1914 ; AVX-LABEL: shuffle_v4i32_1z3z:
1915 ; AVX:       # BB#0:
1916 ; AVX-NEXT:    vpsrlq $32, %xmm0, %xmm0
1917 ; AVX-NEXT:    retq
1918   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 1, i32 4, i32 3, i32 4>
1919   ret <4 x i32> %shuffle
1920 }