fd81573edec90aad15c870195d83082c7e12603b
[oota-llvm.git] / test / CodeGen / X86 / swizzle-2.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 | FileCheck %s
3
4 ; Test that we correctly fold a shuffle that performs a swizzle of another
5 ; shuffle node according to the rule
6 ;  shuffle (shuffle (x, undef, M0), undef, M1) -> shuffle(x, undef, M2)
7 ;
8 ; We only do this if the resulting mask is legal to avoid introducing an
9 ; illegal shuffle that is expanded into a sub-optimal sequence of instructions
10 ; during lowering stage.
11
12 define <4 x i32> @swizzle_1(<4 x i32> %v) {
13 ; CHECK-LABEL: swizzle_1:
14 ; CHECK:       # BB#0:
15 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,3,2]
16 ; CHECK-NEXT:    retq
17   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 0, i32 1>
18   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 0, i32 1>
19   ret <4 x i32> %2
20 }
21
22 define <4 x i32> @swizzle_2(<4 x i32> %v) {
23 ; CHECK-LABEL: swizzle_2:
24 ; CHECK:       # BB#0:
25 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,1,3,0]
26 ; CHECK-NEXT:    retq
27   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 3, i32 1, i32 0, i32 2>
28   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 1, i32 0, i32 2>
29   ret <4 x i32> %2
30 }
31
32 define <4 x i32> @swizzle_3(<4 x i32> %v) {
33 ; CHECK-LABEL: swizzle_3:
34 ; CHECK:       # BB#0:
35 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,3,2]
36 ; CHECK-NEXT:    retq
37   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
38   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
39   ret <4 x i32> %2
40 }
41
42 define <4 x i32> @swizzle_4(<4 x i32> %v) {
43 ; CHECK-LABEL: swizzle_4:
44 ; CHECK:       # BB#0:
45 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,0,2]
46 ; CHECK-NEXT:    retq
47   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 2, i32 1, i32 3, i32 0>
48   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 1, i32 3, i32 0>
49   ret <4 x i32> %2
50 }
51
52 define <4 x i32> @swizzle_5(<4 x i32> %v) {
53 ; CHECK-LABEL: swizzle_5:
54 ; CHECK:       # BB#0:
55 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
56 ; CHECK-NEXT:    retq
57   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
58   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
59   ret <4 x i32> %2
60 }
61
62 define <4 x i32> @swizzle_6(<4 x i32> %v) {
63 ; CHECK-LABEL: swizzle_6:
64 ; CHECK:       # BB#0:
65 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,1,3]
66 ; CHECK-NEXT:    retq
67   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 0, i32 3>
68   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 0, i32 3>
69   ret <4 x i32> %2
70 }
71
72 define <4 x i32> @swizzle_7(<4 x i32> %v) {
73 ; CHECK-LABEL: swizzle_7:
74 ; CHECK:       # BB#0:
75 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,3,1]
76 ; CHECK-NEXT:    retq
77   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 0, i32 3, i32 1, i32 2>
78   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 3, i32 1, i32 2>
79   ret <4 x i32> %2
80 }
81
82 define <4 x i32> @swizzle_8(<4 x i32> %v) {
83 ; CHECK-LABEL: swizzle_8:
84 ; CHECK:       # BB#0:
85 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,0]
86 ; CHECK-NEXT:    retq
87   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 2, i32 1>
88   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 2, i32 1>
89   ret <4 x i32> %2
90 }
91
92 define <4 x i32> @swizzle_9(<4 x i32> %v) {
93 ; CHECK-LABEL: swizzle_9:
94 ; CHECK:       # BB#0:
95 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
96 ; CHECK-NEXT:    retq
97   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
98   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
99   ret <4 x i32> %2
100 }
101
102 define <4 x i32> @swizzle_10(<4 x i32> %v) {
103 ; CHECK-LABEL: swizzle_10:
104 ; CHECK:       # BB#0:
105 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,2,0,3]
106 ; CHECK-NEXT:    retq
107   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 2, i32 0, i32 1, i32 3>
108   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 0, i32 1, i32 3>
109   ret <4 x i32> %2
110 }
111
112 define <4 x i32> @swizzle_11(<4 x i32> %v) {
113 ; CHECK-LABEL: swizzle_11:
114 ; CHECK:       # BB#0:
115 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]
116 ; CHECK-NEXT:    retq
117   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 2, i32 0, i32 3, i32 1>
118   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 0, i32 3, i32 1>
119   ret <4 x i32> %2
120 }
121
122 define <4 x i32> @swizzle_12(<4 x i32> %v) {
123 ; CHECK-LABEL: swizzle_12:
124 ; CHECK:       # BB#0:
125 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,1,2]
126 ; CHECK-NEXT:    retq
127   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 3, i32 1>
128   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 3, i32 1>
129   ret <4 x i32> %2
130 }
131
132 define <4 x i32> @swizzle_13(<4 x i32> %v) {
133 ; CHECK-LABEL: swizzle_13:
134 ; CHECK:       # BB#0:
135 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]
136 ; CHECK-NEXT:    retq
137   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 0, i32 2>
138   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 0, i32 2>
139   ret <4 x i32> %2
140 }
141
142 define <4 x i32> @swizzle_14(<4 x i32> %v) {
143 ; CHECK-LABEL: swizzle_14:
144 ; CHECK:       # BB#0:
145 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,0,2,1]
146 ; CHECK-NEXT:    retq
147   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 2, i32 0>
148   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 2, i32 0>
149   ret <4 x i32> %2
150 }
151
152 define <4 x float> @swizzle_15(<4 x float> %v) {
153 ; CHECK-LABEL: swizzle_15:
154 ; CHECK:       # BB#0:
155 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0,3,2]
156 ; CHECK-NEXT:    retq
157   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 0, i32 1>
158   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 0, i32 1>
159   ret <4 x float> %2
160 }
161
162 define <4 x float> @swizzle_16(<4 x float> %v) {
163 ; CHECK-LABEL: swizzle_16:
164 ; CHECK:       # BB#0:
165 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,1,3,0]
166 ; CHECK-NEXT:    retq
167   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 1, i32 0, i32 2>
168   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 3, i32 1, i32 0, i32 2>
169   ret <4 x float> %2
170 }
171
172 define <4 x float> @swizzle_17(<4 x float> %v) {
173 ; CHECK-LABEL: swizzle_17:
174 ; CHECK:       # BB#0:
175 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0,3,2]
176 ; CHECK-NEXT:    retq
177   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
178   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
179   ret <4 x float> %2
180 }
181
182 define <4 x float> @swizzle_18(<4 x float> %v) {
183 ; CHECK-LABEL: swizzle_18:
184 ; CHECK:       # BB#0:
185 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,1,0,2]
186 ; CHECK-NEXT:    retq
187   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 2, i32 1, i32 3, i32 0>
188   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 2, i32 1, i32 3, i32 0>
189   ret <4 x float> %2
190 }
191
192 define <4 x float> @swizzle_19(<4 x float> %v) {
193 ; CHECK-LABEL: swizzle_19:
194 ; CHECK:       # BB#0:
195 ; CHECK-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
196 ; CHECK-NEXT:    retq
197   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
198   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
199   ret <4 x float> %2
200 }
201
202 define <4 x float> @swizzle_20(<4 x float> %v) {
203 ; CHECK-LABEL: swizzle_20:
204 ; CHECK:       # BB#0:
205 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0,1,3]
206 ; CHECK-NEXT:    retq
207   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 0, i32 3>
208   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 0, i32 3>
209   ret <4 x float> %2
210 }
211
212 define <4 x float> @swizzle_21(<4 x float> %v) {
213 ; CHECK-LABEL: swizzle_21:
214 ; CHECK:       # BB#0:
215 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
216 ; CHECK-NEXT:    retq
217   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 0, i32 3, i32 1, i32 2>
218   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 0, i32 3, i32 1, i32 2>
219   ret <4 x float> %2
220 }
221
222 define <4 x float> @swizzle_22(<4 x float> %v) {
223 ; CHECK-LABEL: swizzle_22:
224 ; CHECK:       # BB#0:
225 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3,2,0]
226 ; CHECK-NEXT:    retq
227   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 0, i32 2, i32 1>
228   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 3, i32 0, i32 2, i32 1>
229   ret <4 x float> %2
230 }
231
232 define <4 x float> @swizzle_23(<4 x float> %v) {
233 ; CHECK-LABEL: swizzle_23:
234 ; CHECK:       # BB#0:
235 ; CHECK-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
236 ; CHECK-NEXT:    retq
237   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
238   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
239   ret <4 x float> %2
240 }
241
242 define <4 x float> @swizzle_24(<4 x float> %v) {
243 ; CHECK-LABEL: swizzle_24:
244 ; CHECK:       # BB#0:
245 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2,0,3]
246 ; CHECK-NEXT:    retq
247   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 2, i32 0, i32 1, i32 3>
248   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 2, i32 0, i32 1, i32 3>
249   ret <4 x float> %2
250 }
251
252 define <4 x float> @swizzle_25(<4 x float> %v) {
253 ; CHECK-LABEL: swizzle_25:
254 ; CHECK:       # BB#0:
255 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
256 ; CHECK-NEXT:    retq
257   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 2, i32 0, i32 3, i32 1>
258   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 2, i32 0, i32 3, i32 1>
259   ret <4 x float> %2
260 }
261
262 define <4 x float> @swizzle_26(<4 x float> %v) {
263 ; CHECK-LABEL: swizzle_26:
264 ; CHECK:       # BB#0:
265 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,3,1,2]
266 ; CHECK-NEXT:    retq
267   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 0, i32 2, i32 3, i32 1>
268   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 0, i32 2, i32 3, i32 1>
269   ret <4 x float> %2
270 }
271
272 define <4 x float> @swizzle_27(<4 x float> %v) {
273 ; CHECK-LABEL: swizzle_27:
274 ; CHECK:       # BB#0:
275 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
276 ; CHECK-NEXT:    retq
277   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 0, i32 2>
278   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 0, i32 2>
279   ret <4 x float> %2
280 }
281
282 define <4 x float> @swizzle_28(<4 x float> %v) {
283 ; CHECK-LABEL: swizzle_28:
284 ; CHECK:       # BB#0:
285 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0,2,1]
286 ; CHECK-NEXT:    retq
287   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 2, i32 0>
288   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 2, i32 0>
289   ret <4 x float> %2
290 }
291
292 define <4 x float> @swizzle_29(<4 x float> %v) {
293 ; CHECK-LABEL: swizzle_29:
294 ; CHECK:       # BB#0:
295 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3,2,0]
296 ; CHECK-NEXT:    retq
297   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 1, i32 2, i32 0>
298   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 0, i32 2, i32 3>
299   ret <4 x float> %2
300 }
301
302 ; Make sure that we combine the shuffles from each function below into a single
303 ; legal shuffle (either pshuflw or pshufb depending on the masks).
304
305 define <8 x i16> @swizzle_30(<8 x i16> %v) {
306 ; CHECK-LABEL: swizzle_30:
307 ; CHECK:       # BB#0:
308 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,3,2,0,4,5,6,7]
309 ; CHECK-NEXT:    retq
310   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 3, i32 1, i32 2, i32 0, i32 7, i32 5, i32 6, i32 4>
311   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 2, i32 3, i32 7, i32 5, i32 6, i32 4>
312   ret <8 x i16> %2
313 }
314
315 define <8 x i16> @swizzle_31(<8 x i16> %v) {
316 ; CHECK-LABEL: swizzle_31:
317 ; CHECK:       # BB#0:
318 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,3,2,0,4,5,6,7]
319 ; CHECK-NEXT:    retq
320   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 3, i32 0, i32 2, i32 1, i32 7, i32 5, i32 6, i32 4>
321   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 3, i32 0, i32 2, i32 1, i32 7, i32 5, i32 6, i32 4>
322   ret <8 x i16> %2
323 }
324
325 define <8 x i16> @swizzle_32(<8 x i16> %v) {
326 ; CHECK-LABEL: swizzle_32:
327 ; CHECK:       # BB#0:
328 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,2,3]
329 ; CHECK-NEXT:    retq
330   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 0, i32 7, i32 5, i32 6, i32 4>
331   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 0, i32 7, i32 5, i32 6, i32 4>
332   ret <8 x i16> %2
333 }
334
335 define <8 x i16> @swizzle_33(<8 x i16> %v) {
336 ; CHECK-LABEL: swizzle_33:
337 ; CHECK:       # BB#0:
338 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,1,3,0,4,5,6,7]
339 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,7,6,4]
340 ; CHECK-NEXT:    retq
341   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 4, i32 6, i32 5, i32 7, i32 2, i32 3, i32 1, i32 0>
342   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 4, i32 6, i32 5, i32 7, i32 2, i32 3, i32 1, i32 0>
343   ret <8 x i16> %2
344 }
345
346 define <8 x i16> @swizzle_34(<8 x i16> %v) {
347 ; CHECK-LABEL: swizzle_34:
348 ; CHECK:       # BB#0:
349 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,3,0,2,4,5,6,7]
350 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,4,5]
351 ; CHECK-NEXT:    retq
352   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 4, i32 7, i32 6, i32 5, i32 1, i32 2, i32 0, i32 3>
353   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 4, i32 7, i32 6, i32 5, i32 1, i32 2, i32 0, i32 3>
354   ret <8 x i16> %2
355 }
356
357 define <8 x i16> @swizzle_35(<8 x i16> %v) {
358 ; CHECK-LABEL: swizzle_35:
359 ; CHECK:       # BB#0:
360 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,1,0,3,4,5,6,7]
361 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,7,6]
362 ; CHECK-NEXT:    retq
363   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 7, i32 4, i32 6, i32 5, i32 1, i32 3, i32 0, i32 2>
364   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 7, i32 4, i32 6, i32 5, i32 1, i32 3, i32 0, i32 2>
365   ret <8 x i16> %2
366 }
367
368 define <8 x i16> @swizzle_36(<8 x i16> %v) {
369 ; CHECK-LABEL: swizzle_36:
370 ; CHECK:       # BB#0:
371 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,2,1,4,5,6,7]
372 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,5,7]
373 ; CHECK-NEXT:    retq
374   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 4, i32 6, i32 7, i32 5, i32 0, i32 1, i32 3, i32 2>
375   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 4, i32 6, i32 7, i32 5, i32 0, i32 1, i32 3, i32 2>
376   ret <8 x i16> %2
377 }
378
379 define <8 x i16> @swizzle_37(<8 x i16> %v) {
380 ; CHECK-LABEL: swizzle_37:
381 ; CHECK:       # BB#0:
382 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,7,6,5]
383 ; CHECK-NEXT:    retq
384   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 7, i32 5, i32 6, i32 4>
385   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 7, i32 4, i32 6, i32 5>
386   ret <8 x i16> %2
387 }
388
389 define <8 x i16> @swizzle_38(<8 x i16> %v) {
390 ; CHECK-LABEL: swizzle_38:
391 ; CHECK:       # BB#0:
392 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,1,0,3,4,5,6,7]
393 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,6,7]
394 ; CHECK-NEXT:    retq
395   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 5, i32 6, i32 4, i32 7, i32 0, i32 2, i32 1, i32 3>
396   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 5, i32 6, i32 4, i32 7, i32 0, i32 2, i32 1, i32 3>
397   ret <8 x i16> %2
398 }
399
400 define <8 x i16> @swizzle_39(<8 x i16> %v) {
401 ; CHECK-LABEL: swizzle_39:
402 ; CHECK:       # BB#0:
403 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,3,1,0,4,5,6,7]
404 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,4,5]
405 ; CHECK-NEXT:    retq
406   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 5, i32 4, i32 6, i32 7, i32 3, i32 2, i32 1, i32 0>
407   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 5, i32 4, i32 6, i32 7, i32 3, i32 2, i32 1, i32 0>
408   ret <8 x i16> %2
409 }
410
411 define <8 x i16> @swizzle_40(<8 x i16> %v) {
412 ; CHECK-LABEL: swizzle_40:
413 ; CHECK:       # BB#0:
414 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,1,2,0,4,5,6,7]
415 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,5,7]
416 ; CHECK-NEXT:    retq
417   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 6, i32 4, i32 7, i32 5, i32 1, i32 0, i32 3, i32 2>
418   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 6, i32 4, i32 7, i32 5, i32 1, i32 0, i32 3, i32 2>
419   ret <8 x i16> %2
420 }
421
422 define <8 x i16> @swizzle_41(<8 x i16> %v) {
423 ; CHECK-LABEL: swizzle_41:
424 ; CHECK:       # BB#0:
425 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
426 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,3,2]
427 ; CHECK-NEXT:    retq
428   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 6, i32 7, i32 5, i32 4, i32 0, i32 1, i32 3, i32 2>
429   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 6, i32 7, i32 5, i32 4, i32 0, i32 1, i32 3, i32 2>
430   ret <8 x i16> %2
431 }
432
433 define <8 x i16> @swizzle_42(<8 x i16> %v) {
434 ; CHECK-LABEL: swizzle_42:
435 ; CHECK:       # BB#0:
436 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6]
437 ; CHECK-NEXT:    retq
438   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 3, i32 2, i32 7, i32 6, i32 4, i32 5>
439   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 3, i32 2, i32 7, i32 6, i32 4, i32 5>
440   ret <8 x i16> %2
441 }