[x86] Rework all of the 128-bit vector shuffle tests with my handy test
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-128-v4.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse3 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE3
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+ssse3 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse4.1 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
6
7 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
8 target triple = "x86_64-unknown-unknown"
9
10 define <4 x i32> @shuffle_v4i32_0001(<4 x i32> %a, <4 x i32> %b) {
11 ; SSE-LABEL: shuffle_v4i32_0001:
12 ; SSE:       # BB#0:
13 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,1]
14 ; SSE-NEXT:    retq
15 ;
16 ; AVX-LABEL: shuffle_v4i32_0001:
17 ; AVX:       # BB#0:
18 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,1]
19 ; AVX-NEXT:    retq
20   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
21   ret <4 x i32> %shuffle
22 }
23 define <4 x i32> @shuffle_v4i32_0020(<4 x i32> %a, <4 x i32> %b) {
24 ; SSE-LABEL: shuffle_v4i32_0020:
25 ; SSE:       # BB#0:
26 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,2,0]
27 ; SSE-NEXT:    retq
28 ;
29 ; AVX-LABEL: shuffle_v4i32_0020:
30 ; AVX:       # BB#0:
31 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,2,0]
32 ; AVX-NEXT:    retq
33   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
34   ret <4 x i32> %shuffle
35 }
36 define <4 x i32> @shuffle_v4i32_0112(<4 x i32> %a, <4 x i32> %b) {
37 ; SSE-LABEL: shuffle_v4i32_0112:
38 ; SSE:       # BB#0:
39 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,2]
40 ; SSE-NEXT:    retq
41 ;
42 ; AVX-LABEL: shuffle_v4i32_0112:
43 ; AVX:       # BB#0:
44 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,2]
45 ; AVX-NEXT:    retq
46   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 1, i32 2>
47   ret <4 x i32> %shuffle
48 }
49 define <4 x i32> @shuffle_v4i32_0300(<4 x i32> %a, <4 x i32> %b) {
50 ; SSE-LABEL: shuffle_v4i32_0300:
51 ; SSE:       # BB#0:
52 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,0,0]
53 ; SSE-NEXT:    retq
54 ;
55 ; AVX-LABEL: shuffle_v4i32_0300:
56 ; AVX:       # BB#0:
57 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,3,0,0]
58 ; AVX-NEXT:    retq
59   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
60   ret <4 x i32> %shuffle
61 }
62 define <4 x i32> @shuffle_v4i32_1000(<4 x i32> %a, <4 x i32> %b) {
63 ; SSE-LABEL: shuffle_v4i32_1000:
64 ; SSE:       # BB#0:
65 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,0,0]
66 ; SSE-NEXT:    retq
67 ;
68 ; AVX-LABEL: shuffle_v4i32_1000:
69 ; AVX:       # BB#0:
70 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,0,0,0]
71 ; AVX-NEXT:    retq
72   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
73   ret <4 x i32> %shuffle
74 }
75 define <4 x i32> @shuffle_v4i32_2200(<4 x i32> %a, <4 x i32> %b) {
76 ; SSE-LABEL: shuffle_v4i32_2200:
77 ; SSE:       # BB#0:
78 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,0,0]
79 ; SSE-NEXT:    retq
80 ;
81 ; AVX-LABEL: shuffle_v4i32_2200:
82 ; AVX:       # BB#0:
83 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,2,0,0]
84 ; AVX-NEXT:    retq
85   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
86   ret <4 x i32> %shuffle
87 }
88 define <4 x i32> @shuffle_v4i32_3330(<4 x i32> %a, <4 x i32> %b) {
89 ; SSE-LABEL: shuffle_v4i32_3330:
90 ; SSE:       # BB#0:
91 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,3,3,0]
92 ; SSE-NEXT:    retq
93 ;
94 ; AVX-LABEL: shuffle_v4i32_3330:
95 ; AVX:       # BB#0:
96 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,0]
97 ; AVX-NEXT:    retq
98   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
99   ret <4 x i32> %shuffle
100 }
101 define <4 x i32> @shuffle_v4i32_3210(<4 x i32> %a, <4 x i32> %b) {
102 ; SSE-LABEL: shuffle_v4i32_3210:
103 ; SSE:       # BB#0:
104 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]
105 ; SSE-NEXT:    retq
106 ;
107 ; AVX-LABEL: shuffle_v4i32_3210:
108 ; AVX:       # BB#0:
109 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]
110 ; AVX-NEXT:    retq
111   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
112   ret <4 x i32> %shuffle
113 }
114
115 define <4 x i32> @shuffle_v4i32_2121(<4 x i32> %a, <4 x i32> %b) {
116 ; SSE-LABEL: shuffle_v4i32_2121:
117 ; SSE:       # BB#0:
118 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,1,2,1]
119 ; SSE-NEXT:    retq
120 ;
121 ; AVX-LABEL: shuffle_v4i32_2121:
122 ; AVX:       # BB#0:
123 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,1,2,1]
124 ; AVX-NEXT:    retq
125   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 1, i32 2, i32 1>
126   ret <4 x i32> %shuffle
127 }
128
129 define <4 x float> @shuffle_v4f32_0001(<4 x float> %a, <4 x float> %b) {
130 ; SSE-LABEL: shuffle_v4f32_0001:
131 ; SSE:       # BB#0:
132 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0,0,1]
133 ; SSE-NEXT:    retq
134 ;
135 ; AVX-LABEL: shuffle_v4f32_0001:
136 ; AVX:       # BB#0:
137 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,0,0,1]
138 ; AVX-NEXT:    retq
139   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
140   ret <4 x float> %shuffle
141 }
142 define <4 x float> @shuffle_v4f32_0020(<4 x float> %a, <4 x float> %b) {
143 ; SSE-LABEL: shuffle_v4f32_0020:
144 ; SSE:       # BB#0:
145 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0,2,0]
146 ; SSE-NEXT:    retq
147 ;
148 ; AVX-LABEL: shuffle_v4f32_0020:
149 ; AVX:       # BB#0:
150 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,0,2,0]
151 ; AVX-NEXT:    retq
152   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
153   ret <4 x float> %shuffle
154 }
155 define <4 x float> @shuffle_v4f32_0300(<4 x float> %a, <4 x float> %b) {
156 ; SSE-LABEL: shuffle_v4f32_0300:
157 ; SSE:       # BB#0:
158 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,3,0,0]
159 ; SSE-NEXT:    retq
160 ;
161 ; AVX-LABEL: shuffle_v4f32_0300:
162 ; AVX:       # BB#0:
163 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,3,0,0]
164 ; AVX-NEXT:    retq
165   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
166   ret <4 x float> %shuffle
167 }
168 define <4 x float> @shuffle_v4f32_1000(<4 x float> %a, <4 x float> %b) {
169 ; SSE-LABEL: shuffle_v4f32_1000:
170 ; SSE:       # BB#0:
171 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0,0,0]
172 ; SSE-NEXT:    retq
173 ;
174 ; AVX-LABEL: shuffle_v4f32_1000:
175 ; AVX:       # BB#0:
176 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[1,0,0,0]
177 ; AVX-NEXT:    retq
178   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
179   ret <4 x float> %shuffle
180 }
181 define <4 x float> @shuffle_v4f32_2200(<4 x float> %a, <4 x float> %b) {
182 ; SSE-LABEL: shuffle_v4f32_2200:
183 ; SSE:       # BB#0:
184 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,2,0,0]
185 ; SSE-NEXT:    retq
186 ;
187 ; AVX-LABEL: shuffle_v4f32_2200:
188 ; AVX:       # BB#0:
189 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[2,2,0,0]
190 ; AVX-NEXT:    retq
191   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
192   ret <4 x float> %shuffle
193 }
194 define <4 x float> @shuffle_v4f32_3330(<4 x float> %a, <4 x float> %b) {
195 ; SSE-LABEL: shuffle_v4f32_3330:
196 ; SSE:       # BB#0:
197 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,0]
198 ; SSE-NEXT:    retq
199 ;
200 ; AVX-LABEL: shuffle_v4f32_3330:
201 ; AVX:       # BB#0:
202 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,3,3,0]
203 ; AVX-NEXT:    retq
204   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
205   ret <4 x float> %shuffle
206 }
207 define <4 x float> @shuffle_v4f32_3210(<4 x float> %a, <4 x float> %b) {
208 ; SSE-LABEL: shuffle_v4f32_3210:
209 ; SSE:       # BB#0:
210 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
211 ; SSE-NEXT:    retq
212 ;
213 ; AVX-LABEL: shuffle_v4f32_3210:
214 ; AVX:       # BB#0:
215 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,2,1,0]
216 ; AVX-NEXT:    retq
217   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
218   ret <4 x float> %shuffle
219 }
220 define <4 x float> @shuffle_v4f32_0011(<4 x float> %a, <4 x float> %b) {
221 ; SSE-LABEL: shuffle_v4f32_0011:
222 ; SSE:       # BB#0:
223 ; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0,0,1,1]
224 ; SSE-NEXT:    retq
225 ;
226 ; AVX-LABEL: shuffle_v4f32_0011:
227 ; AVX:       # BB#0:
228 ; AVX-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm0[0,0,1,1]
229 ; AVX-NEXT:    retq
230   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 1, i32 1>
231   ret <4 x float> %shuffle
232 }
233 define <4 x float> @shuffle_v4f32_2233(<4 x float> %a, <4 x float> %b) {
234 ; SSE-LABEL: shuffle_v4f32_2233:
235 ; SSE:       # BB#0:
236 ; SSE-NEXT:    unpckhps {{.*#+}} xmm0 = xmm0[2,2,3,3]
237 ; SSE-NEXT:    retq
238 ;
239 ; AVX-LABEL: shuffle_v4f32_2233:
240 ; AVX:       # BB#0:
241 ; AVX-NEXT:    vunpckhps {{.*#+}} xmm0 = xmm0[2,2,3,3]
242 ; AVX-NEXT:    retq
243   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 2, i32 2, i32 3, i32 3>
244   ret <4 x float> %shuffle
245 }
246 define <4 x float> @shuffle_v4f32_0022(<4 x float> %a, <4 x float> %b) {
247 ; SSE2-LABEL: shuffle_v4f32_0022:
248 ; SSE2:       # BB#0:
249 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0,2,2]
250 ; SSE2-NEXT:    retq
251 ;
252 ; SSE3-LABEL: shuffle_v4f32_0022:
253 ; SSE3:       # BB#0:
254 ; SSE3-NEXT:    movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
255 ; SSE3-NEXT:    retq
256 ;
257 ; SSSE3-LABEL: shuffle_v4f32_0022:
258 ; SSSE3:       # BB#0:
259 ; SSSE3-NEXT:    movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
260 ; SSSE3-NEXT:    retq
261 ;
262 ; SSE41-LABEL: shuffle_v4f32_0022:
263 ; SSE41:       # BB#0:
264 ; SSE41-NEXT:    movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
265 ; SSE41-NEXT:    retq
266 ;
267 ; AVX-LABEL: shuffle_v4f32_0022:
268 ; AVX:       # BB#0:
269 ; AVX-NEXT:    vmovsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
270 ; AVX-NEXT:    retq
271   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 2>
272   ret <4 x float> %shuffle
273 }
274 define <4 x float> @shuffle_v4f32_1133(<4 x float> %a, <4 x float> %b) {
275 ; SSE2-LABEL: shuffle_v4f32_1133:
276 ; SSE2:       # BB#0:
277 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,3,3]
278 ; SSE2-NEXT:    retq
279 ;
280 ; SSE3-LABEL: shuffle_v4f32_1133:
281 ; SSE3:       # BB#0:
282 ; SSE3-NEXT:    movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
283 ; SSE3-NEXT:    retq
284 ;
285 ; SSSE3-LABEL: shuffle_v4f32_1133:
286 ; SSSE3:       # BB#0:
287 ; SSSE3-NEXT:    movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
288 ; SSSE3-NEXT:    retq
289 ;
290 ; SSE41-LABEL: shuffle_v4f32_1133:
291 ; SSE41:       # BB#0:
292 ; SSE41-NEXT:    movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
293 ; SSE41-NEXT:    retq
294 ;
295 ; AVX-LABEL: shuffle_v4f32_1133:
296 ; AVX:       # BB#0:
297 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
298 ; AVX-NEXT:    retq
299   %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 1, i32 1, i32 3, i32 3>
300   ret <4 x float> %shuffle
301 }
302
303 define <4 x i32> @shuffle_v4i32_0124(<4 x i32> %a, <4 x i32> %b) {
304 ; SSE2-LABEL: shuffle_v4i32_0124:
305 ; SSE2:       # BB#0:
306 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
307 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
308 ; SSE2-NEXT:    retq
309 ;
310 ; SSE3-LABEL: shuffle_v4i32_0124:
311 ; SSE3:       # BB#0:
312 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
313 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
314 ; SSE3-NEXT:    retq
315 ;
316 ; SSSE3-LABEL: shuffle_v4i32_0124:
317 ; SSSE3:       # BB#0:
318 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
319 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
320 ; SSSE3-NEXT:    retq
321 ;
322 ; SSE41-LABEL: shuffle_v4i32_0124:
323 ; SSE41:       # BB#0:
324 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
325 ; SSE41-NEXT:    retq
326 ;
327 ; AVX-LABEL: shuffle_v4i32_0124:
328 ; AVX:       # BB#0:
329 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
330 ; AVX-NEXT:    retq
331   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 4>
332   ret <4 x i32> %shuffle
333 }
334 define <4 x i32> @shuffle_v4i32_0142(<4 x i32> %a, <4 x i32> %b) {
335 ; SSE-LABEL: shuffle_v4i32_0142:
336 ; SSE:       # BB#0:
337 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
338 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
339 ; SSE-NEXT:    retq
340 ;
341 ; AVX-LABEL: shuffle_v4i32_0142:
342 ; AVX:       # BB#0:
343 ; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
344 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
345 ; AVX-NEXT:    retq
346   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 2>
347   ret <4 x i32> %shuffle
348 }
349 define <4 x i32> @shuffle_v4i32_0412(<4 x i32> %a, <4 x i32> %b) {
350 ; SSE-LABEL: shuffle_v4i32_0412:
351 ; SSE:       # BB#0:
352 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
353 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[1,2]
354 ; SSE-NEXT:    movaps %xmm1, %xmm0
355 ; SSE-NEXT:    retq
356 ;
357 ; AVX-LABEL: shuffle_v4i32_0412:
358 ; AVX:       # BB#0:
359 ; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
360 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm1[2,0],xmm0[1,2]
361 ; AVX-NEXT:    retq
362   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 2>
363   ret <4 x i32> %shuffle
364 }
365 define <4 x i32> @shuffle_v4i32_4012(<4 x i32> %a, <4 x i32> %b) {
366 ; SSE-LABEL: shuffle_v4i32_4012:
367 ; SSE:       # BB#0:
368 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
369 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
370 ; SSE-NEXT:    movaps %xmm1, %xmm0
371 ; SSE-NEXT:    retq
372 ;
373 ; AVX-LABEL: shuffle_v4i32_4012:
374 ; AVX:       # BB#0:
375 ; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
376 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm1[0,2],xmm0[1,2]
377 ; AVX-NEXT:    retq
378   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
379   ret <4 x i32> %shuffle
380 }
381 define <4 x i32> @shuffle_v4i32_0145(<4 x i32> %a, <4 x i32> %b) {
382 ; SSE-LABEL: shuffle_v4i32_0145:
383 ; SSE:       # BB#0:
384 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
385 ; SSE-NEXT:    retq
386 ;
387 ; AVX-LABEL: shuffle_v4i32_0145:
388 ; AVX:       # BB#0:
389 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
390 ; AVX-NEXT:    retq
391   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
392   ret <4 x i32> %shuffle
393 }
394 define <4 x i32> @shuffle_v4i32_0451(<4 x i32> %a, <4 x i32> %b) {
395 ; SSE-LABEL: shuffle_v4i32_0451:
396 ; SSE:       # BB#0:
397 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
398 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
399 ; SSE-NEXT:    retq
400 ;
401 ; AVX-LABEL: shuffle_v4i32_0451:
402 ; AVX:       # BB#0:
403 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
404 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
405 ; AVX-NEXT:    retq
406   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 5, i32 1>
407   ret <4 x i32> %shuffle
408 }
409 define <4 x i32> @shuffle_v4i32_4501(<4 x i32> %a, <4 x i32> %b) {
410 ; SSE-LABEL: shuffle_v4i32_4501:
411 ; SSE:       # BB#0:
412 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
413 ; SSE-NEXT:    movdqa %xmm1, %xmm0
414 ; SSE-NEXT:    retq
415 ;
416 ; AVX-LABEL: shuffle_v4i32_4501:
417 ; AVX:       # BB#0:
418 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
419 ; AVX-NEXT:    retq
420   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
421   ret <4 x i32> %shuffle
422 }
423 define <4 x i32> @shuffle_v4i32_4015(<4 x i32> %a, <4 x i32> %b) {
424 ; SSE-LABEL: shuffle_v4i32_4015:
425 ; SSE:       # BB#0:
426 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
427 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0,1,3]
428 ; SSE-NEXT:    retq
429 ;
430 ; AVX-LABEL: shuffle_v4i32_4015:
431 ; AVX:       # BB#0:
432 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
433 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[2,0,1,3]
434 ; AVX-NEXT:    retq
435   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 5>
436   ret <4 x i32> %shuffle
437 }
438
439 define <4 x float> @shuffle_v4f32_4zzz(<4 x float> %a) {
440 ; SSE2-LABEL: shuffle_v4f32_4zzz:
441 ; SSE2:       # BB#0:
442 ; SSE2-NEXT:    xorps %xmm1, %xmm1
443 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[1,0]
444 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
445 ; SSE2-NEXT:    retq
446 ;
447 ; SSE3-LABEL: shuffle_v4f32_4zzz:
448 ; SSE3:       # BB#0:
449 ; SSE3-NEXT:    xorps %xmm1, %xmm1
450 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[1,0]
451 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
452 ; SSE3-NEXT:    retq
453 ;
454 ; SSSE3-LABEL: shuffle_v4f32_4zzz:
455 ; SSSE3:       # BB#0:
456 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
457 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[1,0]
458 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
459 ; SSSE3-NEXT:    retq
460 ;
461 ; SSE41-LABEL: shuffle_v4f32_4zzz:
462 ; SSE41:       # BB#0:
463 ; SSE41-NEXT:    xorps %xmm1, %xmm1
464 ; SSE41-NEXT:    blendps {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
465 ; SSE41-NEXT:    movaps %xmm1, %xmm0
466 ; SSE41-NEXT:    retq
467 ;
468 ; AVX-LABEL: shuffle_v4f32_4zzz:
469 ; AVX:       # BB#0:
470 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
471 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
472 ; AVX-NEXT:    retq
473   %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
474   ret <4 x float> %shuffle
475 }
476
477 define <4 x float> @shuffle_v4f32_z4zz(<4 x float> %a) {
478 ; SSE2-LABEL: shuffle_v4f32_z4zz:
479 ; SSE2:       # BB#0:
480 ; SSE2-NEXT:    xorps %xmm1, %xmm1
481 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
482 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
483 ; SSE2-NEXT:    retq
484 ;
485 ; SSE3-LABEL: shuffle_v4f32_z4zz:
486 ; SSE3:       # BB#0:
487 ; SSE3-NEXT:    xorps %xmm1, %xmm1
488 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
489 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
490 ; SSE3-NEXT:    retq
491 ;
492 ; SSSE3-LABEL: shuffle_v4f32_z4zz:
493 ; SSSE3:       # BB#0:
494 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
495 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
496 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
497 ; SSSE3-NEXT:    retq
498 ;
499 ; SSE41-LABEL: shuffle_v4f32_z4zz:
500 ; SSE41:       # BB#0:
501 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = zero,xmm0[0],zero,zero
502 ; SSE41-NEXT:    retq
503 ;
504 ; AVX-LABEL: shuffle_v4f32_z4zz:
505 ; AVX:       # BB#0:
506 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = zero,xmm0[0],zero,zero
507 ; AVX-NEXT:    retq
508   %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 2, i32 4, i32 3, i32 0>
509   ret <4 x float> %shuffle
510 }
511
512 define <4 x float> @shuffle_v4f32_zz4z(<4 x float> %a) {
513 ; SSE2-LABEL: shuffle_v4f32_zz4z:
514 ; SSE2:       # BB#0:
515 ; SSE2-NEXT:    xorps %xmm1, %xmm1
516 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
517 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
518 ; SSE2-NEXT:    movaps %xmm1, %xmm0
519 ; SSE2-NEXT:    retq
520 ;
521 ; SSE3-LABEL: shuffle_v4f32_zz4z:
522 ; SSE3:       # BB#0:
523 ; SSE3-NEXT:    xorps %xmm1, %xmm1
524 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
525 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
526 ; SSE3-NEXT:    movaps %xmm1, %xmm0
527 ; SSE3-NEXT:    retq
528 ;
529 ; SSSE3-LABEL: shuffle_v4f32_zz4z:
530 ; SSSE3:       # BB#0:
531 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
532 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
533 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
534 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
535 ; SSSE3-NEXT:    retq
536 ;
537 ; SSE41-LABEL: shuffle_v4f32_zz4z:
538 ; SSE41:       # BB#0:
539 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = zero,zero,xmm0[0],zero
540 ; SSE41-NEXT:    retq
541 ;
542 ; AVX-LABEL: shuffle_v4f32_zz4z:
543 ; AVX:       # BB#0:
544 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = zero,zero,xmm0[0],zero
545 ; AVX-NEXT:    retq
546   %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 0, i32 4, i32 0>
547   ret <4 x float> %shuffle
548 }
549
550 define <4 x float> @shuffle_v4f32_zuu4(<4 x float> %a) {
551 ; SSE2-LABEL: shuffle_v4f32_zuu4:
552 ; SSE2:       # BB#0:
553 ; SSE2-NEXT:    xorps %xmm1, %xmm1
554 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
555 ; SSE2-NEXT:    movaps %xmm1, %xmm0
556 ; SSE2-NEXT:    retq
557 ;
558 ; SSE3-LABEL: shuffle_v4f32_zuu4:
559 ; SSE3:       # BB#0:
560 ; SSE3-NEXT:    xorps %xmm1, %xmm1
561 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
562 ; SSE3-NEXT:    movaps %xmm1, %xmm0
563 ; SSE3-NEXT:    retq
564 ;
565 ; SSSE3-LABEL: shuffle_v4f32_zuu4:
566 ; SSSE3:       # BB#0:
567 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
568 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
569 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
570 ; SSSE3-NEXT:    retq
571 ;
572 ; SSE41-LABEL: shuffle_v4f32_zuu4:
573 ; SSE41:       # BB#0:
574 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = zero,zero,zero,xmm0[0]
575 ; SSE41-NEXT:    retq
576 ;
577 ; AVX-LABEL: shuffle_v4f32_zuu4:
578 ; AVX:       # BB#0:
579 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = zero,zero,zero,xmm0[0]
580 ; AVX-NEXT:    retq
581   %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 4>
582   ret <4 x float> %shuffle
583 }
584
585 define <4 x float> @shuffle_v4f32_zzz7(<4 x float> %a) {
586 ; SSE2-LABEL: shuffle_v4f32_zzz7:
587 ; SSE2:       # BB#0:
588 ; SSE2-NEXT:    xorps %xmm1, %xmm1
589 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
590 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
591 ; SSE2-NEXT:    movaps %xmm1, %xmm0
592 ; SSE2-NEXT:    retq
593 ;
594 ; SSE3-LABEL: shuffle_v4f32_zzz7:
595 ; SSE3:       # BB#0:
596 ; SSE3-NEXT:    xorps %xmm1, %xmm1
597 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
598 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
599 ; SSE3-NEXT:    movaps %xmm1, %xmm0
600 ; SSE3-NEXT:    retq
601 ;
602 ; SSSE3-LABEL: shuffle_v4f32_zzz7:
603 ; SSSE3:       # BB#0:
604 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
605 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
606 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
607 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
608 ; SSSE3-NEXT:    retq
609 ;
610 ; SSE41-LABEL: shuffle_v4f32_zzz7:
611 ; SSE41:       # BB#0:
612 ; SSE41-NEXT:    xorps %xmm1, %xmm1
613 ; SSE41-NEXT:    blendps {{.*#+}} xmm1 = xmm1[0,1,2],xmm0[3]
614 ; SSE41-NEXT:    movaps %xmm1, %xmm0
615 ; SSE41-NEXT:    retq
616 ;
617 ; AVX-LABEL: shuffle_v4f32_zzz7:
618 ; AVX:       # BB#0:
619 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
620 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[3]
621 ; AVX-NEXT:    retq
622   %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
623   ret <4 x float> %shuffle
624 }
625
626 define <4 x float> @shuffle_v4f32_z6zz(<4 x float> %a) {
627 ; SSE2-LABEL: shuffle_v4f32_z6zz:
628 ; SSE2:       # BB#0:
629 ; SSE2-NEXT:    xorps %xmm1, %xmm1
630 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
631 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
632 ; SSE2-NEXT:    retq
633 ;
634 ; SSE3-LABEL: shuffle_v4f32_z6zz:
635 ; SSE3:       # BB#0:
636 ; SSE3-NEXT:    xorps %xmm1, %xmm1
637 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
638 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
639 ; SSE3-NEXT:    retq
640 ;
641 ; SSSE3-LABEL: shuffle_v4f32_z6zz:
642 ; SSSE3:       # BB#0:
643 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
644 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
645 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
646 ; SSSE3-NEXT:    retq
647 ;
648 ; SSE41-LABEL: shuffle_v4f32_z6zz:
649 ; SSE41:       # BB#0:
650 ; SSE41-NEXT:    insertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
651 ; SSE41-NEXT:    retq
652 ;
653 ; AVX-LABEL: shuffle_v4f32_z6zz:
654 ; AVX:       # BB#0:
655 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
656 ; AVX-NEXT:    retq
657   %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 6, i32 2, i32 3>
658   ret <4 x float> %shuffle
659 }
660
661 define <4 x i32> @shuffle_v4i32_4zzz(i32 %i) {
662 ; SSE-LABEL: shuffle_v4i32_4zzz:
663 ; SSE:       # BB#0:
664 ; SSE-NEXT:    movd %edi, %xmm0
665 ; SSE-NEXT:    retq
666 ;
667 ; AVX-LABEL: shuffle_v4i32_4zzz:
668 ; AVX:       # BB#0:
669 ; AVX-NEXT:    vmovd %edi, %xmm0
670 ; AVX-NEXT:    retq
671   %a = insertelement <4 x i32> undef, i32 %i, i32 0
672   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
673   ret <4 x i32> %shuffle
674 }
675
676 define <4 x i32> @shuffle_v4i32_z4zz(i32 %i) {
677 ; SSE-LABEL: shuffle_v4i32_z4zz:
678 ; SSE:       # BB#0:
679 ; SSE-NEXT:    movd %edi, %xmm0
680 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
681 ; SSE-NEXT:    retq
682 ;
683 ; AVX-LABEL: shuffle_v4i32_z4zz:
684 ; AVX:       # BB#0:
685 ; AVX-NEXT:    vmovd %edi, %xmm0
686 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
687 ; AVX-NEXT:    retq
688   %a = insertelement <4 x i32> undef, i32 %i, i32 0
689   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 2, i32 4, i32 3, i32 0>
690   ret <4 x i32> %shuffle
691 }
692
693 define <4 x i32> @shuffle_v4i32_zz4z(i32 %i) {
694 ; SSE-LABEL: shuffle_v4i32_zz4z:
695 ; SSE:       # BB#0:
696 ; SSE-NEXT:    movd %edi, %xmm0
697 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,0,1]
698 ; SSE-NEXT:    retq
699 ;
700 ; AVX-LABEL: shuffle_v4i32_zz4z:
701 ; AVX:       # BB#0:
702 ; AVX-NEXT:    vmovd %edi, %xmm0
703 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,0,1]
704 ; AVX-NEXT:    retq
705   %a = insertelement <4 x i32> undef, i32 %i, i32 0
706   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 0, i32 4, i32 0>
707   ret <4 x i32> %shuffle
708 }
709
710 define <4 x i32> @shuffle_v4i32_zuu4(i32 %i) {
711 ; SSE-LABEL: shuffle_v4i32_zuu4:
712 ; SSE:       # BB#0:
713 ; SSE-NEXT:    movd %edi, %xmm0
714 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,0]
715 ; SSE-NEXT:    retq
716 ;
717 ; AVX-LABEL: shuffle_v4i32_zuu4:
718 ; AVX:       # BB#0:
719 ; AVX-NEXT:    vmovd %edi, %xmm0
720 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,0]
721 ; AVX-NEXT:    retq
722   %a = insertelement <4 x i32> undef, i32 %i, i32 0
723   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 4>
724   ret <4 x i32> %shuffle
725 }
726
727 define <4 x i32> @shuffle_v4i32_z6zz(i32 %i) {
728 ; SSE-LABEL: shuffle_v4i32_z6zz:
729 ; SSE:       # BB#0:
730 ; SSE-NEXT:    movd %edi, %xmm0
731 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
732 ; SSE-NEXT:    retq
733 ;
734 ; AVX-LABEL: shuffle_v4i32_z6zz:
735 ; AVX:       # BB#0:
736 ; AVX-NEXT:    vmovd %edi, %xmm0
737 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
738 ; AVX-NEXT:    retq
739   %a = insertelement <4 x i32> undef, i32 %i, i32 2
740   %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 6, i32 2, i32 3>
741   ret <4 x i32> %shuffle
742 }
743
744 define <4 x i32> @shuffle_v4i32_7012(<4 x i32> %a, <4 x i32> %b) {
745 ; SSE2-LABEL: shuffle_v4i32_7012:
746 ; SSE2:       # BB#0:
747 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[0,0]
748 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
749 ; SSE2-NEXT:    movaps %xmm1, %xmm0
750 ; SSE2-NEXT:    retq
751 ;
752 ; SSE3-LABEL: shuffle_v4i32_7012:
753 ; SSE3:       # BB#0:
754 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[0,0]
755 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
756 ; SSE3-NEXT:    movaps %xmm1, %xmm0
757 ; SSE3-NEXT:    retq
758 ;
759 ; SSSE3-LABEL: shuffle_v4i32_7012:
760 ; SSSE3:       # BB#0:
761 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11]
762 ; SSSE3-NEXT:    retq
763 ;
764 ; SSE41-LABEL: shuffle_v4i32_7012:
765 ; SSE41:       # BB#0:
766 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11]
767 ; SSE41-NEXT:    retq
768 ;
769 ; AVX-LABEL: shuffle_v4i32_7012:
770 ; AVX:       # BB#0:
771 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11]
772 ; AVX-NEXT:    retq
773   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
774   ret <4 x i32> %shuffle
775 }
776
777 define <4 x i32> @shuffle_v4i32_6701(<4 x i32> %a, <4 x i32> %b) {
778 ; SSE2-LABEL: shuffle_v4i32_6701:
779 ; SSE2:       # BB#0:
780 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
781 ; SSE2-NEXT:    movapd %xmm1, %xmm0
782 ; SSE2-NEXT:    retq
783 ;
784 ; SSE3-LABEL: shuffle_v4i32_6701:
785 ; SSE3:       # BB#0:
786 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
787 ; SSE3-NEXT:    movapd %xmm1, %xmm0
788 ; SSE3-NEXT:    retq
789 ;
790 ; SSSE3-LABEL: shuffle_v4i32_6701:
791 ; SSSE3:       # BB#0:
792 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
793 ; SSSE3-NEXT:    retq
794 ;
795 ; SSE41-LABEL: shuffle_v4i32_6701:
796 ; SSE41:       # BB#0:
797 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
798 ; SSE41-NEXT:    retq
799 ;
800 ; AVX-LABEL: shuffle_v4i32_6701:
801 ; AVX:       # BB#0:
802 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
803 ; AVX-NEXT:    retq
804   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
805   ret <4 x i32> %shuffle
806 }
807
808 define <4 x i32> @shuffle_v4i32_5670(<4 x i32> %a, <4 x i32> %b) {
809 ; SSE2-LABEL: shuffle_v4i32_5670:
810 ; SSE2:       # BB#0:
811 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
812 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,2],xmm0[2,0]
813 ; SSE2-NEXT:    movaps %xmm1, %xmm0
814 ; SSE2-NEXT:    retq
815 ;
816 ; SSE3-LABEL: shuffle_v4i32_5670:
817 ; SSE3:       # BB#0:
818 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
819 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,2],xmm0[2,0]
820 ; SSE3-NEXT:    movaps %xmm1, %xmm0
821 ; SSE3-NEXT:    retq
822 ;
823 ; SSSE3-LABEL: shuffle_v4i32_5670:
824 ; SSSE3:       # BB#0:
825 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3]
826 ; SSSE3-NEXT:    retq
827 ;
828 ; SSE41-LABEL: shuffle_v4i32_5670:
829 ; SSE41:       # BB#0:
830 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3]
831 ; SSE41-NEXT:    retq
832 ;
833 ; AVX-LABEL: shuffle_v4i32_5670:
834 ; AVX:       # BB#0:
835 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3]
836 ; AVX-NEXT:    retq
837   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
838   ret <4 x i32> %shuffle
839 }
840
841 define <4 x i32> @shuffle_v4i32_1234(<4 x i32> %a, <4 x i32> %b) {
842 ; SSE2-LABEL: shuffle_v4i32_1234:
843 ; SSE2:       # BB#0:
844 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
845 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
846 ; SSE2-NEXT:    retq
847 ;
848 ; SSE3-LABEL: shuffle_v4i32_1234:
849 ; SSE3:       # BB#0:
850 ; SSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
851 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
852 ; SSE3-NEXT:    retq
853 ;
854 ; SSSE3-LABEL: shuffle_v4i32_1234:
855 ; SSSE3:       # BB#0:
856 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
857 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
858 ; SSSE3-NEXT:    retq
859 ;
860 ; SSE41-LABEL: shuffle_v4i32_1234:
861 ; SSE41:       # BB#0:
862 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
863 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
864 ; SSE41-NEXT:    retq
865 ;
866 ; AVX-LABEL: shuffle_v4i32_1234:
867 ; AVX:       # BB#0:
868 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
869 ; AVX-NEXT:    retq
870   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
871   ret <4 x i32> %shuffle
872 }
873
874 define <4 x i32> @shuffle_v4i32_2345(<4 x i32> %a, <4 x i32> %b) {
875 ; SSE2-LABEL: shuffle_v4i32_2345:
876 ; SSE2:       # BB#0:
877 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
878 ; SSE2-NEXT:    retq
879 ;
880 ; SSE3-LABEL: shuffle_v4i32_2345:
881 ; SSE3:       # BB#0:
882 ; SSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
883 ; SSE3-NEXT:    retq
884 ;
885 ; SSSE3-LABEL: shuffle_v4i32_2345:
886 ; SSSE3:       # BB#0:
887 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
888 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
889 ; SSSE3-NEXT:    retq
890 ;
891 ; SSE41-LABEL: shuffle_v4i32_2345:
892 ; SSE41:       # BB#0:
893 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
894 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
895 ; SSE41-NEXT:    retq
896 ;
897 ; AVX-LABEL: shuffle_v4i32_2345:
898 ; AVX:       # BB#0:
899 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
900 ; AVX-NEXT:    retq
901   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
902   ret <4 x i32> %shuffle
903 }
904
905 define <4 x i32> @shuffle_v4i32_3456(<4 x i32> %a, <4 x i32> %b) {
906 ; SSE2-LABEL: shuffle_v4i32_3456:
907 ; SSE2:       # BB#0:
908 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[0,0]
909 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,2]
910 ; SSE2-NEXT:    retq
911 ;
912 ; SSE3-LABEL: shuffle_v4i32_3456:
913 ; SSE3:       # BB#0:
914 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[0,0]
915 ; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,2]
916 ; SSE3-NEXT:    retq
917 ;
918 ; SSSE3-LABEL: shuffle_v4i32_3456:
919 ; SSSE3:       # BB#0:
920 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11]
921 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
922 ; SSSE3-NEXT:    retq
923 ;
924 ; SSE41-LABEL: shuffle_v4i32_3456:
925 ; SSE41:       # BB#0:
926 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11]
927 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
928 ; SSE41-NEXT:    retq
929 ;
930 ; AVX-LABEL: shuffle_v4i32_3456:
931 ; AVX:       # BB#0:
932 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11]
933 ; AVX-NEXT:    retq
934   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
935   ret <4 x i32> %shuffle
936 }
937
938 define <4 x i32> @shuffle_v4i32_0u1u(<4 x i32> %a, <4 x i32> %b) {
939 ; SSE-LABEL: shuffle_v4i32_0u1u:
940 ; SSE:       # BB#0:
941 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
942 ; SSE-NEXT:    retq
943 ;
944 ; AVX-LABEL: shuffle_v4i32_0u1u:
945 ; AVX:       # BB#0:
946 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
947 ; AVX-NEXT:    retq
948   %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 undef, i32 1, i32 undef>
949   ret <4 x i32> %shuffle
950 }
951
952 define <4 x i32> @shuffle_v4i32_0z1z(<4 x i32> %a) {
953 ; SSE2-LABEL: shuffle_v4i32_0z1z:
954 ; SSE2:       # BB#0:
955 ; SSE2-NEXT:    pxor %xmm1, %xmm1
956 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
957 ; SSE2-NEXT:    retq
958 ;
959 ; SSE3-LABEL: shuffle_v4i32_0z1z:
960 ; SSE3:       # BB#0:
961 ; SSE3-NEXT:    pxor %xmm1, %xmm1
962 ; SSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
963 ; SSE3-NEXT:    retq
964 ;
965 ; SSSE3-LABEL: shuffle_v4i32_0z1z:
966 ; SSSE3:       # BB#0:
967 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
968 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
969 ; SSSE3-NEXT:    retq
970 ;
971 ; SSE41-LABEL: shuffle_v4i32_0z1z:
972 ; SSE41:       # BB#0:
973 ; SSE41-NEXT:    pmovzxdq %xmm0, %xmm0
974 ; SSE41-NEXT:    retq
975 ;
976 ; AVX-LABEL: shuffle_v4i32_0z1z:
977 ; AVX:       # BB#0:
978 ; AVX-NEXT:    vpmovzxdq %xmm0, %xmm0
979 ; AVX-NEXT:    retq
980   %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 1, i32 7>
981   ret <4 x i32> %shuffle
982 }
983
984 define <4 x i32> @insert_reg_and_zero_v4i32(i32 %a) {
985 ; SSE-LABEL: insert_reg_and_zero_v4i32:
986 ; SSE:       # BB#0:
987 ; SSE-NEXT:    movd %edi, %xmm0
988 ; SSE-NEXT:    retq
989 ;
990 ; AVX-LABEL: insert_reg_and_zero_v4i32:
991 ; AVX:       # BB#0:
992 ; AVX-NEXT:    vmovd %edi, %xmm0
993 ; AVX-NEXT:    retq
994   %v = insertelement <4 x i32> undef, i32 %a, i32 0
995   %shuffle = shufflevector <4 x i32> %v, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
996   ret <4 x i32> %shuffle
997 }
998
999 define <4 x i32> @insert_mem_and_zero_v4i32(i32* %ptr) {
1000 ; SSE-LABEL: insert_mem_and_zero_v4i32:
1001 ; SSE:       # BB#0:
1002 ; SSE-NEXT:    movd (%rdi), %xmm0
1003 ; SSE-NEXT:    retq
1004 ;
1005 ; AVX-LABEL: insert_mem_and_zero_v4i32:
1006 ; AVX:       # BB#0:
1007 ; AVX-NEXT:    vmovd (%rdi), %xmm0
1008 ; AVX-NEXT:    retq
1009   %a = load i32* %ptr
1010   %v = insertelement <4 x i32> undef, i32 %a, i32 0
1011   %shuffle = shufflevector <4 x i32> %v, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1012   ret <4 x i32> %shuffle
1013 }
1014
1015 define <4 x float> @insert_reg_and_zero_v4f32(float %a) {
1016 ; SSE-LABEL: insert_reg_and_zero_v4f32:
1017 ; SSE:       # BB#0:
1018 ; SSE-NEXT:    xorps %xmm1, %xmm1
1019 ; SSE-NEXT:    movss %xmm0, %xmm1
1020 ; SSE-NEXT:    movaps %xmm1, %xmm0
1021 ; SSE-NEXT:    retq
1022 ;
1023 ; AVX-LABEL: insert_reg_and_zero_v4f32:
1024 ; AVX:       # BB#0:
1025 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1026 ; AVX-NEXT:    vmovss %xmm0, %xmm1, %xmm0
1027 ; AVX-NEXT:    retq
1028   %v = insertelement <4 x float> undef, float %a, i32 0
1029   %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1030   ret <4 x float> %shuffle
1031 }
1032
1033 define <4 x float> @insert_mem_and_zero_v4f32(float* %ptr) {
1034 ; SSE-LABEL: insert_mem_and_zero_v4f32:
1035 ; SSE:       # BB#0:
1036 ; SSE-NEXT:    movss (%rdi), %xmm0
1037 ; SSE-NEXT:    retq
1038 ;
1039 ; AVX-LABEL: insert_mem_and_zero_v4f32:
1040 ; AVX:       # BB#0:
1041 ; AVX-NEXT:    vmovss (%rdi), %xmm0
1042 ; AVX-NEXT:    retq
1043   %a = load float* %ptr
1044   %v = insertelement <4 x float> undef, float %a, i32 0
1045   %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1046   ret <4 x float> %shuffle
1047 }
1048
1049 define <4 x float> @shuffle_mem_v4f32_3210(<4 x float>* %ptr) {
1050 ; SSE-LABEL: shuffle_mem_v4f32_3210:
1051 ; SSE:       # BB#0:
1052 ; SSE-NEXT:    movaps (%rdi), %xmm0
1053 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
1054 ; SSE-NEXT:    retq
1055 ;
1056 ; AVX-LABEL: shuffle_mem_v4f32_3210:
1057 ; AVX:       # BB#0:
1058 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = mem[3,2,1,0]
1059 ; AVX-NEXT:    retq
1060   %a = load <4 x float>* %ptr
1061   %shuffle = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
1062   ret <4 x float> %shuffle
1063 }