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