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