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