[x86] Fix an oversight in the v8i32 path of the new vector shuffle
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-256-v8.ll
1 ; RUN: llc < %s -mcpu=x86-64 -mattr=+avx -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=AVX1
2 ; RUN: llc < %s -mcpu=x86-64 -mattr=+avx2 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=AVX2
3
4 target triple = "x86_64-unknown-unknown"
5
6 define <8 x float> @shuffle_v8f32_00000000(<8 x float> %a, <8 x float> %b) {
7 ; ALL-LABEL: @shuffle_v8f32_00000000
8 ; ALL:       # BB#0:
9 ; ALL-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,0,0,0]
10 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
11 ; ALL-NEXT:    retq
12   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
13   ret <8 x float> %shuffle
14 }
15
16 define <8 x float> @shuffle_v8f32_00000010(<8 x float> %a, <8 x float> %b) {
17 ; ALL-LABEL: @shuffle_v8f32_00000010
18 ; ALL:       # BB#0:
19 ; ALL-NEXT:    vpermilps {{.*}} # xmm1 = xmm0[0,0,0,0]
20 ; ALL-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,0,1,0]
21 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
22 ; ALL-NEXT:    retq
23   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0>
24   ret <8 x float> %shuffle
25 }
26
27 define <8 x float> @shuffle_v8f32_00000200(<8 x float> %a, <8 x float> %b) {
28 ; ALL-LABEL: @shuffle_v8f32_00000200
29 ; ALL:       # BB#0:
30 ; ALL-NEXT:    vpermilps {{.*}} # xmm1 = xmm0[0,0,0,0]
31 ; ALL-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,2,0,0]
32 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
33 ; ALL-NEXT:    retq
34   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 2, i32 0, i32 0>
35   ret <8 x float> %shuffle
36 }
37
38 define <8 x float> @shuffle_v8f32_00003000(<8 x float> %a, <8 x float> %b) {
39 ; ALL-LABEL: @shuffle_v8f32_00003000
40 ; ALL:       # BB#0:
41 ; ALL-NEXT:    vpermilps {{.*}} # xmm1 = xmm0[0,0,0,0]
42 ; ALL-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[3,0,0,0]
43 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
44 ; ALL-NEXT:    retq
45   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 3, i32 0, i32 0, i32 0>
46   ret <8 x float> %shuffle
47 }
48
49 define <8 x float> @shuffle_v8f32_00040000(<8 x float> %a, <8 x float> %b) {
50 ; ALL-LABEL: @shuffle_v8f32_00040000
51 ; ALL:       # BB#0:
52 ; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm1
53 ; ALL-NEXT:    vshufps {{.*}} # xmm1 = xmm1[0,0],xmm0[0,0]
54 ; ALL-NEXT:    vshufps {{.*}} # xmm1 = xmm0[0,0],xmm1[2,0]
55 ; ALL-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,0,0,0]
56 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
57 ; ALL-NEXT:    retq
58   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 4, i32 0, i32 0, i32 0, i32 0>
59   ret <8 x float> %shuffle
60 }
61
62 define <8 x float> @shuffle_v8f32_00500000(<8 x float> %a, <8 x float> %b) {
63 ; ALL-LABEL: @shuffle_v8f32_00500000
64 ; ALL:       # BB#0:
65 ; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm1
66 ; ALL-NEXT:    vshufps {{.*}} # xmm1 = xmm1[1,0],xmm0[0,0]
67 ; ALL-NEXT:    vshufps {{.*}} # xmm1 = xmm0[0,0],xmm1[0,2]
68 ; ALL-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,0,0,0]
69 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
70 ; ALL-NEXT:    retq
71   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 5, i32 0, i32 0, i32 0, i32 0, i32 0>
72   ret <8 x float> %shuffle
73 }
74
75 define <8 x float> @shuffle_v8f32_06000000(<8 x float> %a, <8 x float> %b) {
76 ; ALL-LABEL: @shuffle_v8f32_06000000
77 ; ALL:       # BB#0:
78 ; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm1
79 ; ALL-NEXT:    vshufps {{.*}} # xmm1 = xmm1[2,0],xmm0[0,0]
80 ; ALL-NEXT:    vshufps {{.*}} # xmm1 = xmm1[2,0],xmm0[0,0]
81 ; ALL-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,0,0,0]
82 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
83 ; ALL-NEXT:    retq
84   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 6, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
85   ret <8 x float> %shuffle
86 }
87
88 define <8 x float> @shuffle_v8f32_70000000(<8 x float> %a, <8 x float> %b) {
89 ; ALL-LABEL: @shuffle_v8f32_70000000
90 ; ALL:       # BB#0:
91 ; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm1
92 ; ALL-NEXT:    vshufps {{.*}} # xmm1 = xmm1[3,0],xmm0[0,0]
93 ; ALL-NEXT:    vshufps {{.*}} # xmm1 = xmm1[0,2],xmm0[0,0]
94 ; ALL-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,0,0,0]
95 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
96 ; ALL-NEXT:    retq
97   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 7, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
98   ret <8 x float> %shuffle
99 }
100
101 define <8 x float> @shuffle_v8f32_01014545(<8 x float> %a, <8 x float> %b) {
102 ; ALL-LABEL: @shuffle_v8f32_01014545
103 ; ALL:       # BB#0:
104 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,1,0,1,4,5,4,5]
105 ; ALL-NEXT:    retq
106   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5>
107   ret <8 x float> %shuffle
108 }
109
110 define <8 x float> @shuffle_v8f32_00112233(<8 x float> %a, <8 x float> %b) {
111 ; ALL-LABEL: @shuffle_v8f32_00112233
112 ; ALL:       # BB#0:
113 ; ALL-NEXT:    vunpcklps {{.*}} # xmm1 = xmm0[0,0,1,1]
114 ; ALL-NEXT:    vunpckhps {{.*}} # xmm0 = xmm0[2,2,3,3]
115 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
116 ; ALL-NEXT:    retq
117   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 1, i32 1, i32 2, i32 2, i32 3, i32 3>
118   ret <8 x float> %shuffle
119 }
120
121 define <8 x float> @shuffle_v8f32_00001111(<8 x float> %a, <8 x float> %b) {
122 ; ALL-LABEL: @shuffle_v8f32_00001111
123 ; ALL:       # BB#0:
124 ; ALL-NEXT:    vpermilps {{.*}} # xmm1 = xmm0[0,0,0,0]
125 ; ALL-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[1,1,1,1]
126 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
127 ; ALL-NEXT:    retq
128   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>
129   ret <8 x float> %shuffle
130 }
131
132 define <8 x float> @shuffle_v8f32_81a3c5e7(<8 x float> %a, <8 x float> %b) {
133 ; ALL-LABEL: @shuffle_v8f32_81a3c5e7
134 ; ALL:       # BB#0:
135 ; ALL-NEXT:    vblendps {{.*}} # ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7]
136 ; ALL-NEXT:    retq
137   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7>
138   ret <8 x float> %shuffle
139 }
140
141 define <8 x float> @shuffle_v8f32_08080808(<8 x float> %a, <8 x float> %b) {
142 ; ALL-LABEL: @shuffle_v8f32_08080808
143 ; ALL:       # BB#0:
144 ; ALL-NEXT:    vpermilps {{.*}} # xmm1 = xmm1[0,0,2,0]
145 ; ALL-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,1,0,3]
146 ; ALL-NEXT:    vblendps {{.*}} # xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
147 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
148 ; ALL-NEXT:    retq
149   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 8, i32 0, i32 8, i32 0, i32 8, i32 0, i32 8>
150   ret <8 x float> %shuffle
151 }
152
153 define <8 x float> @shuffle_v8f32_08084c4c(<8 x float> %a, <8 x float> %b) {
154 ; ALL-LABEL: @shuffle_v8f32_08084c4c
155 ; ALL:       # BB#0:
156 ; ALL-NEXT:    vshufps {{.*}} # ymm0 = ymm0[0,0],ymm1[0,0],ymm0[4,4],ymm1[4,4]
157 ; ALL-NEXT:    vshufps {{.*}} # ymm0 = ymm0[0,2,1,3,4,6,5,7]
158 ; ALL-NEXT:    retq
159   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 8, i32 0, i32 8, i32 4, i32 12, i32 4, i32 12>
160   ret <8 x float> %shuffle
161 }
162
163 define <8 x float> @shuffle_v8f32_8823cc67(<8 x float> %a, <8 x float> %b) {
164 ; ALL-LABEL: @shuffle_v8f32_8823cc67
165 ; ALL:       # BB#0:
166 ; ALL-NEXT:    vshufps {{.*}} # ymm0 = ymm1[0,0],ymm0[2,3],ymm1[4,4],ymm0[6,7]
167 ; ALL-NEXT:    retq
168   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 8, i32 8, i32 2, i32 3, i32 12, i32 12, i32 6, i32 7>
169   ret <8 x float> %shuffle
170 }
171
172 define <8 x float> @shuffle_v8f32_9832dc76(<8 x float> %a, <8 x float> %b) {
173 ; ALL-LABEL: @shuffle_v8f32_9832dc76
174 ; ALL:       # BB#0:
175 ; ALL-NEXT:    vshufps {{.*}} # ymm0 = ymm1[1,0],ymm0[3,2],ymm1[5,4],ymm0[7,6]
176 ; ALL-NEXT:    retq
177   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 9, i32 8, i32 3, i32 2, i32 13, i32 12, i32 7, i32 6>
178   ret <8 x float> %shuffle
179 }
180
181 define <8 x float> @shuffle_v8f32_9810dc54(<8 x float> %a, <8 x float> %b) {
182 ; ALL-LABEL: @shuffle_v8f32_9810dc54
183 ; ALL:       # BB#0:
184 ; ALL-NEXT:    vshufps {{.*}} # ymm0 = ymm1[1,0],ymm0[1,0],ymm1[5,4],ymm0[5,4]
185 ; ALL-NEXT:    retq
186   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 9, i32 8, i32 1, i32 0, i32 13, i32 12, i32 5, i32 4>
187   ret <8 x float> %shuffle
188 }
189
190 define <8 x float> @shuffle_v8f32_08194c5d(<8 x float> %a, <8 x float> %b) {
191 ; ALL-LABEL: @shuffle_v8f32_08194c5d
192 ; ALL:       # BB#0:
193 ; ALL-NEXT:    vunpcklps {{.*}} # ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
194 ; ALL-NEXT:    retq
195   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 4, i32 12, i32 5, i32 13>
196   ret <8 x float> %shuffle
197 }
198
199 define <8 x float> @shuffle_v8f32_2a3b6e7f(<8 x float> %a, <8 x float> %b) {
200 ; ALL-LABEL: @shuffle_v8f32_2a3b6e7f
201 ; ALL:       # BB#0:
202 ; ALL-NEXT:    vunpckhps {{.*}} # ymm0 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
203 ; ALL-NEXT:    retq
204   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 2, i32 10, i32 3, i32 11, i32 6, i32 14, i32 7, i32 15>
205   ret <8 x float> %shuffle
206 }
207
208 define <8 x float> @shuffle_v8f32_08192a3b(<8 x float> %a, <8 x float> %b) {
209 ; ALL-LABEL: @shuffle_v8f32_08192a3b
210 ; ALL:       # BB#0:
211 ; ALL-NEXT:    vpermilps {{.*}} # xmm2 = xmm1[0,2,2,3]
212 ; ALL-NEXT:    vpermilps {{.*}} # xmm3 = xmm0[2,1,3,3]
213 ; ALL-NEXT:    vblendps {{.*}} # xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
214 ; ALL-NEXT:    vpermilps {{.*}} # xmm1 = xmm1[0,0,2,1]
215 ; ALL-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,1,1,3]
216 ; ALL-NEXT:    vblendps {{.*}} # xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
217 ; ALL-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
218 ; ALL-NEXT:    retq
219   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
220   ret <8 x float> %shuffle
221 }
222
223 define <8 x float> @shuffle_v8f32_08991abb(<8 x float> %a, <8 x float> %b) {
224 ; ALL-LABEL: @shuffle_v8f32_08991abb
225 ; ALL:       # BB#0:
226 ; ALL-NEXT:    vpermilps {{.*}} # xmm2 = xmm0[1,1,2,3]
227 ; ALL-NEXT:    vpermilps {{.*}} # xmm3 = xmm1[0,2,3,3]
228 ; ALL-NEXT:    vblendps {{.*}} # xmm2 = xmm2[0],xmm3[1,2,3]
229 ; ALL-NEXT:    vunpcklps {{.*}} # xmm1 = xmm1[0,0,1,1]
230 ; ALL-NEXT:    vblendps {{.*}} # xmm0 = xmm0[0],xmm1[1,2,3]
231 ; ALL-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
232 ; ALL-NEXT:    retq
233   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 8, i32 9, i32 9, i32 1, i32 10, i32 11, i32 11>
234   ret <8 x float> %shuffle
235 }
236
237 define <8 x float> @shuffle_v8f32_091b2d3f(<8 x float> %a, <8 x float> %b) {
238 ; ALL-LABEL: @shuffle_v8f32_091b2d3f
239 ; ALL:       # BB#0:
240 ; ALL-NEXT:    vextractf128 $1, %ymm1, %xmm2
241 ; ALL-NEXT:    vpermilps {{.*}} # xmm3 = xmm0[2,1,3,3]
242 ; ALL-NEXT:    vblendps {{.*}} # xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
243 ; ALL-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,1,1,3]
244 ; ALL-NEXT:    vblendps {{.*}} # xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
245 ; ALL-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
246 ; ALL-NEXT:    retq
247   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 9, i32 1, i32 11, i32 2, i32 13, i32 3, i32 15>
248   ret <8 x float> %shuffle
249 }
250
251 define <8 x float> @shuffle_v8f32_09ab1def(<8 x float> %a, <8 x float> %b) {
252 ; ALL-LABEL: @shuffle_v8f32_09ab1def
253 ; ALL:       # BB#0:
254 ; ALL-NEXT:    vextractf128 $1, %ymm1, %xmm2
255 ; ALL-NEXT:    vpermilps {{.*}} # xmm3 = xmm0[1,1,2,3]
256 ; ALL-NEXT:    vblendps {{.*}} # xmm2 = xmm3[0],xmm2[1,2,3]
257 ; ALL-NEXT:    vblendps {{.*}} # xmm0 = xmm0[0],xmm1[1,2,3]
258 ; ALL-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
259 ; ALL-NEXT:    retq
260   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 9, i32 10, i32 11, i32 1, i32 13, i32 14, i32 15>
261   ret <8 x float> %shuffle
262 }
263
264 define <8 x float> @shuffle_v8f32_00014445(<8 x float> %a, <8 x float> %b) {
265 ; ALL-LABEL: @shuffle_v8f32_00014445
266 ; ALL:       # BB#0:
267 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,0,1,4,4,4,5]
268 ; ALL-NEXT:    retq
269   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 1, i32 4, i32 4, i32 4, i32 5>
270   ret <8 x float> %shuffle
271 }
272
273 define <8 x float> @shuffle_v8f32_00204464(<8 x float> %a, <8 x float> %b) {
274 ; ALL-LABEL: @shuffle_v8f32_00204464
275 ; ALL:       # BB#0:
276 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,2,0,4,4,6,4]
277 ; ALL-NEXT:    retq
278   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 0, i32 4, i32 4, i32 6, i32 4>
279   ret <8 x float> %shuffle
280 }
281
282 define <8 x float> @shuffle_v8f32_03004744(<8 x float> %a, <8 x float> %b) {
283 ; ALL-LABEL: @shuffle_v8f32_03004744
284 ; ALL:       # BB#0:
285 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,3,0,0,4,7,4,4]
286 ; ALL-NEXT:    retq
287   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 3, i32 0, i32 0, i32 4, i32 7, i32 4, i32 4>
288   ret <8 x float> %shuffle
289 }
290
291 define <8 x float> @shuffle_v8f32_10005444(<8 x float> %a, <8 x float> %b) {
292 ; ALL-LABEL: @shuffle_v8f32_10005444
293 ; ALL:       # BB#0:
294 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,0,0,0,5,4,4,4]
295 ; ALL-NEXT:    retq
296   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 1, i32 0, i32 0, i32 0, i32 5, i32 4, i32 4, i32 4>
297   ret <8 x float> %shuffle
298 }
299
300 define <8 x float> @shuffle_v8f32_22006644(<8 x float> %a, <8 x float> %b) {
301 ; ALL-LABEL: @shuffle_v8f32_22006644
302 ; ALL:       # BB#0:
303 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[2,2,0,0,6,6,4,4]
304 ; ALL-NEXT:    retq
305   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 2, i32 2, i32 0, i32 0, i32 6, i32 6, i32 4, i32 4>
306   ret <8 x float> %shuffle
307 }
308
309 define <8 x float> @shuffle_v8f32_33307774(<8 x float> %a, <8 x float> %b) {
310 ; ALL-LABEL: @shuffle_v8f32_33307774
311 ; ALL:       # BB#0:
312 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[3,3,3,0,7,7,7,4]
313 ; ALL-NEXT:    retq
314   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 3, i32 3, i32 3, i32 0, i32 7, i32 7, i32 7, i32 4>
315   ret <8 x float> %shuffle
316 }
317
318 define <8 x float> @shuffle_v8f32_32107654(<8 x float> %a, <8 x float> %b) {
319 ; ALL-LABEL: @shuffle_v8f32_32107654
320 ; ALL:       # BB#0:
321 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[3,2,1,0,7,6,5,4]
322 ; ALL-NEXT:    retq
323   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
324   ret <8 x float> %shuffle
325 }
326
327 define <8 x float> @shuffle_v8f32_00234467(<8 x float> %a, <8 x float> %b) {
328 ; ALL-LABEL: @shuffle_v8f32_00234467
329 ; ALL:       # BB#0:
330 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,2,3,4,4,6,7]
331 ; ALL-NEXT:    retq
332   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 3, i32 4, i32 4, i32 6, i32 7>
333   ret <8 x float> %shuffle
334 }
335
336 define <8 x float> @shuffle_v8f32_00224466(<8 x float> %a, <8 x float> %b) {
337 ; ALL-LABEL: @shuffle_v8f32_00224466
338 ; ALL:       # BB#0:
339 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,2,2,4,4,6,6]
340 ; ALL-NEXT:    retq
341   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>
342   ret <8 x float> %shuffle
343 }
344
345 define <8 x float> @shuffle_v8f32_10325476(<8 x float> %a, <8 x float> %b) {
346 ; ALL-LABEL: @shuffle_v8f32_10325476
347 ; ALL:       # BB#0:
348 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,0,3,2,5,4,7,6]
349 ; ALL-NEXT:    retq
350   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
351   ret <8 x float> %shuffle
352 }
353
354 define <8 x float> @shuffle_v8f32_11335577(<8 x float> %a, <8 x float> %b) {
355 ; ALL-LABEL: @shuffle_v8f32_11335577
356 ; ALL:       # BB#0:
357 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,1,3,3,5,5,7,7]
358 ; ALL-NEXT:    retq
359   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>
360   ret <8 x float> %shuffle
361 }
362
363 define <8 x float> @shuffle_v8f32_10235467(<8 x float> %a, <8 x float> %b) {
364 ; ALL-LABEL: @shuffle_v8f32_10235467
365 ; ALL:       # BB#0:
366 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,0,2,3,5,4,6,7]
367 ; ALL-NEXT:    retq
368   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 1, i32 0, i32 2, i32 3, i32 5, i32 4, i32 6, i32 7>
369   ret <8 x float> %shuffle
370 }
371
372 define <8 x float> @shuffle_v8f32_10225466(<8 x float> %a, <8 x float> %b) {
373 ; ALL-LABEL: @shuffle_v8f32_10225466
374 ; ALL:       # BB#0:
375 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,0,2,2,5,4,6,6]
376 ; ALL-NEXT:    retq
377   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 1, i32 0, i32 2, i32 2, i32 5, i32 4, i32 6, i32 6>
378   ret <8 x float> %shuffle
379 }
380
381 define <8 x float> @shuffle_v8f32_00015444(<8 x float> %a, <8 x float> %b) {
382 ; ALL-LABEL: @shuffle_v8f32_00015444
383 ; ALL:       # BB#0:
384 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,0,1,5,4,4,4]
385 ; ALL-NEXT:    retq
386   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 1, i32 5, i32 4, i32 4, i32 4>
387   ret <8 x float> %shuffle
388 }
389
390 define <8 x float> @shuffle_v8f32_00204644(<8 x float> %a, <8 x float> %b) {
391 ; ALL-LABEL: @shuffle_v8f32_00204644
392 ; ALL:       # BB#0:
393 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,2,0,4,6,4,4]
394 ; ALL-NEXT:    retq
395   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 0, i32 4, i32 6, i32 4, i32 4>
396   ret <8 x float> %shuffle
397 }
398
399 define <8 x float> @shuffle_v8f32_03004474(<8 x float> %a, <8 x float> %b) {
400 ; ALL-LABEL: @shuffle_v8f32_03004474
401 ; ALL:       # BB#0:
402 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,3,0,0,4,4,7,4]
403 ; ALL-NEXT:    retq
404   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 3, i32 0, i32 0, i32 4, i32 4, i32 7, i32 4>
405   ret <8 x float> %shuffle
406 }
407
408 define <8 x float> @shuffle_v8f32_10004444(<8 x float> %a, <8 x float> %b) {
409 ; ALL-LABEL: @shuffle_v8f32_10004444
410 ; ALL:       # BB#0:
411 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,0,0,0,4,4,4,4]
412 ; ALL-NEXT:    retq
413   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 1, i32 0, i32 0, i32 0, i32 4, i32 4, i32 4, i32 4>
414   ret <8 x float> %shuffle
415 }
416
417 define <8 x float> @shuffle_v8f32_22006446(<8 x float> %a, <8 x float> %b) {
418 ; ALL-LABEL: @shuffle_v8f32_22006446
419 ; ALL:       # BB#0:
420 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[2,2,0,0,6,4,4,6]
421 ; ALL-NEXT:    retq
422   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 2, i32 2, i32 0, i32 0, i32 6, i32 4, i32 4, i32 6>
423   ret <8 x float> %shuffle
424 }
425
426 define <8 x float> @shuffle_v8f32_33307474(<8 x float> %a, <8 x float> %b) {
427 ; ALL-LABEL: @shuffle_v8f32_33307474
428 ; ALL:       # BB#0:
429 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[3,3,3,0,7,4,7,4]
430 ; ALL-NEXT:    retq
431   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 3, i32 3, i32 3, i32 0, i32 7, i32 4, i32 7, i32 4>
432   ret <8 x float> %shuffle
433 }
434
435 define <8 x float> @shuffle_v8f32_32104567(<8 x float> %a, <8 x float> %b) {
436 ; ALL-LABEL: @shuffle_v8f32_32104567
437 ; ALL:       # BB#0:
438 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[3,2,1,0,4,5,6,7]
439 ; ALL-NEXT:    retq
440   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 4, i32 5, i32 6, i32 7>
441   ret <8 x float> %shuffle
442 }
443
444 define <8 x float> @shuffle_v8f32_00236744(<8 x float> %a, <8 x float> %b) {
445 ; ALL-LABEL: @shuffle_v8f32_00236744
446 ; ALL:       # BB#0:
447 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,2,3,6,7,4,4]
448 ; ALL-NEXT:    retq
449   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 3, i32 6, i32 7, i32 4, i32 4>
450   ret <8 x float> %shuffle
451 }
452
453 define <8 x float> @shuffle_v8f32_00226644(<8 x float> %a, <8 x float> %b) {
454 ; ALL-LABEL: @shuffle_v8f32_00226644
455 ; ALL:       # BB#0:
456 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,2,2,6,6,4,4]
457 ; ALL-NEXT:    retq
458   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 6, i32 6, i32 4, i32 4>
459   ret <8 x float> %shuffle
460 }
461
462 define <8 x float> @shuffle_v8f32_10324567(<8 x float> %a, <8 x float> %b) {
463 ; ALL-LABEL: @shuffle_v8f32_10324567
464 ; ALL:       # BB#0:
465 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,0,3,2,4,5,6,7]
466 ; ALL-NEXT:    retq
467   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 4, i32 5, i32 6, i32 7>
468   ret <8 x float> %shuffle
469 }
470
471 define <8 x float> @shuffle_v8f32_11334567(<8 x float> %a, <8 x float> %b) {
472 ; ALL-LABEL: @shuffle_v8f32_11334567
473 ; ALL:       # BB#0:
474 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,1,3,3,4,5,6,7]
475 ; ALL-NEXT:    retq
476   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 4, i32 5, i32 6, i32 7>
477   ret <8 x float> %shuffle
478 }
479
480 define <8 x float> @shuffle_v8f32_01235467(<8 x float> %a, <8 x float> %b) {
481 ; ALL-LABEL: @shuffle_v8f32_01235467
482 ; ALL:       # BB#0:
483 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,1,2,3,5,4,6,7]
484 ; ALL-NEXT:    retq
485   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 5, i32 4, i32 6, i32 7>
486   ret <8 x float> %shuffle
487 }
488
489 define <8 x float> @shuffle_v8f32_01235466(<8 x float> %a, <8 x float> %b) {
490 ; ALL-LABEL: @shuffle_v8f32_01235466
491 ; ALL:       # BB#0:
492 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,1,2,3,5,4,6,6]
493 ; ALL-NEXT:    retq
494   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 5, i32 4, i32 6, i32 6>
495   ret <8 x float> %shuffle
496 }
497
498 define <8 x float> @shuffle_v8f32_002u6u44(<8 x float> %a, <8 x float> %b) {
499 ; ALL-LABEL: @shuffle_v8f32_002u6u44
500 ; ALL:       # BB#0:
501 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,2,u,6,u,4,4]
502 ; ALL-NEXT:    retq
503   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 undef, i32 6, i32 undef, i32 4, i32 4>
504   ret <8 x float> %shuffle
505 }
506
507 define <8 x float> @shuffle_v8f32_00uu66uu(<8 x float> %a, <8 x float> %b) {
508 ; ALL-LABEL: @shuffle_v8f32_00uu66uu
509 ; ALL:       # BB#0:
510 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,u,u,6,6,u,u]
511 ; ALL-NEXT:    retq
512   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 0, i32 undef, i32 undef, i32 6, i32 6, i32 undef, i32 undef>
513   ret <8 x float> %shuffle
514 }
515
516 define <8 x float> @shuffle_v8f32_103245uu(<8 x float> %a, <8 x float> %b) {
517 ; ALL-LABEL: @shuffle_v8f32_103245uu
518 ; ALL:       # BB#0:
519 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,0,3,2,4,5,u,u]
520 ; ALL-NEXT:    retq
521   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 4, i32 5, i32 undef, i32 undef>
522   ret <8 x float> %shuffle
523 }
524
525 define <8 x float> @shuffle_v8f32_1133uu67(<8 x float> %a, <8 x float> %b) {
526 ; ALL-LABEL: @shuffle_v8f32_1133uu67
527 ; ALL:       # BB#0:
528 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,1,3,3,u,u,6,7]
529 ; ALL-NEXT:    retq
530   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 undef, i32 undef, i32 6, i32 7>
531   ret <8 x float> %shuffle
532 }
533
534 define <8 x float> @shuffle_v8f32_0uu354uu(<8 x float> %a, <8 x float> %b) {
535 ; ALL-LABEL: @shuffle_v8f32_0uu354uu
536 ; ALL:       # BB#0:
537 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,u,u,3,5,4,u,u]
538 ; ALL-NEXT:    retq
539   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 undef, i32 undef, i32 3, i32 5, i32 4, i32 undef, i32 undef>
540   ret <8 x float> %shuffle
541 }
542
543 define <8 x float> @shuffle_v8f32_uuu3uu66(<8 x float> %a, <8 x float> %b) {
544 ; ALL-LABEL: @shuffle_v8f32_uuu3uu66
545 ; ALL:       # BB#0:
546 ; ALL-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[u,u,u,3,u,u,6,6]
547 ; ALL-NEXT:    retq
548   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 3, i32 undef, i32 undef, i32 6, i32 6>
549   ret <8 x float> %shuffle
550 }
551
552 define <8 x i32> @shuffle_v8i32_00000000(<8 x i32> %a, <8 x i32> %b) {
553 ; AVX1-LABEL: @shuffle_v8i32_00000000
554 ; AVX1:       # BB#0:
555 ; AVX1-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,0,0,0]
556 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
557 ; AVX1-NEXT:    retq
558 ;
559 ; AVX2-LABEL: @shuffle_v8i32_00000000
560 ; AVX2:       # BB#0:
561 ; AVX2-NEXT:    vpxor %ymm1, %ymm1, %ymm1
562 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
563 ; AVX2-NEXT:    retq
564   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
565   ret <8 x i32> %shuffle
566 }
567
568 define <8 x i32> @shuffle_v8i32_00000010(<8 x i32> %a, <8 x i32> %b) {
569 ; AVX1-LABEL: @shuffle_v8i32_00000010
570 ; AVX1:       # BB#0:
571 ; AVX1-NEXT:    vpermilps {{.*}} # xmm1 = xmm0[0,0,0,0]
572 ; AVX1-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,0,1,0]
573 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
574 ; AVX1-NEXT:    retq
575 ;
576 ; AVX2-LABEL: @shuffle_v8i32_00000010
577 ; AVX2:       # BB#0:
578 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,0,0,0,0,0,1,0]
579 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
580 ; AVX2-NEXT:    retq
581   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0>
582   ret <8 x i32> %shuffle
583 }
584
585 define <8 x i32> @shuffle_v8i32_00000200(<8 x i32> %a, <8 x i32> %b) {
586 ; AVX1-LABEL: @shuffle_v8i32_00000200
587 ; AVX1:       # BB#0:
588 ; AVX1-NEXT:    vpermilps {{.*}} # xmm1 = xmm0[0,0,0,0]
589 ; AVX1-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,2,0,0]
590 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
591 ; AVX1-NEXT:    retq
592 ;
593 ; AVX2-LABEL: @shuffle_v8i32_00000200
594 ; AVX2:       # BB#0:
595 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,0,0,0,0,2,0,0]
596 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
597 ; AVX2-NEXT:    retq
598   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 2, i32 0, i32 0>
599   ret <8 x i32> %shuffle
600 }
601
602 define <8 x i32> @shuffle_v8i32_00003000(<8 x i32> %a, <8 x i32> %b) {
603 ; AVX1-LABEL: @shuffle_v8i32_00003000
604 ; AVX1:       # BB#0:
605 ; AVX1-NEXT:    vpermilps {{.*}} # xmm1 = xmm0[0,0,0,0]
606 ; AVX1-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[3,0,0,0]
607 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
608 ; AVX1-NEXT:    retq
609 ;
610 ; AVX2-LABEL: @shuffle_v8i32_00003000
611 ; AVX2:       # BB#0:
612 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,0,0,0,3,0,0,0]
613 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
614 ; AVX2-NEXT:    retq
615   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 3, i32 0, i32 0, i32 0>
616   ret <8 x i32> %shuffle
617 }
618
619 define <8 x i32> @shuffle_v8i32_00040000(<8 x i32> %a, <8 x i32> %b) {
620 ; AVX1-LABEL: @shuffle_v8i32_00040000
621 ; AVX1:       # BB#0:
622 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
623 ; AVX1-NEXT:    vshufps {{.*}} # xmm1 = xmm1[0,0],xmm0[0,0]
624 ; AVX1-NEXT:    vshufps {{.*}} # xmm1 = xmm0[0,0],xmm1[2,0]
625 ; AVX1-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,0,0,0]
626 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
627 ; AVX1-NEXT:    retq
628 ;
629 ; AVX2-LABEL: @shuffle_v8i32_00040000
630 ; AVX2:       # BB#0:
631 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,0,0,4,0,0,0,0]
632 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
633 ; AVX2-NEXT:    retq
634   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 4, i32 0, i32 0, i32 0, i32 0>
635   ret <8 x i32> %shuffle
636 }
637
638 define <8 x i32> @shuffle_v8i32_00500000(<8 x i32> %a, <8 x i32> %b) {
639 ; AVX1-LABEL: @shuffle_v8i32_00500000
640 ; AVX1:       # BB#0:
641 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
642 ; AVX1-NEXT:    vshufps {{.*}} # xmm1 = xmm1[1,0],xmm0[0,0]
643 ; AVX1-NEXT:    vshufps {{.*}} # xmm1 = xmm0[0,0],xmm1[0,2]
644 ; AVX1-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,0,0,0]
645 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
646 ; AVX1-NEXT:    retq
647 ;
648 ; AVX2-LABEL: @shuffle_v8i32_00500000
649 ; AVX2:       # BB#0:
650 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,0,5,0,0,0,0,0]
651 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
652 ; AVX2-NEXT:    retq
653   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 5, i32 0, i32 0, i32 0, i32 0, i32 0>
654   ret <8 x i32> %shuffle
655 }
656
657 define <8 x i32> @shuffle_v8i32_06000000(<8 x i32> %a, <8 x i32> %b) {
658 ; AVX1-LABEL: @shuffle_v8i32_06000000
659 ; AVX1:       # BB#0:
660 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
661 ; AVX1-NEXT:    vshufps {{.*}} # xmm1 = xmm1[2,0],xmm0[0,0]
662 ; AVX1-NEXT:    vshufps {{.*}} # xmm1 = xmm1[2,0],xmm0[0,0]
663 ; AVX1-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,0,0,0]
664 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
665 ; AVX1-NEXT:    retq
666 ;
667 ; AVX2-LABEL: @shuffle_v8i32_06000000
668 ; AVX2:       # BB#0:
669 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,6,0,0,0,0,0,0]
670 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
671 ; AVX2-NEXT:    retq
672   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 6, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
673   ret <8 x i32> %shuffle
674 }
675
676 define <8 x i32> @shuffle_v8i32_70000000(<8 x i32> %a, <8 x i32> %b) {
677 ; AVX1-LABEL: @shuffle_v8i32_70000000
678 ; AVX1:       # BB#0:
679 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
680 ; AVX1-NEXT:    vshufps {{.*}} # xmm1 = xmm1[3,0],xmm0[0,0]
681 ; AVX1-NEXT:    vshufps {{.*}} # xmm1 = xmm1[0,2],xmm0[0,0]
682 ; AVX1-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,0,0,0]
683 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
684 ; AVX1-NEXT:    retq
685 ;
686 ; AVX2-LABEL: @shuffle_v8i32_70000000
687 ; AVX2:       # BB#0:
688 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
689 ; AVX2-NEXT:    movl $7, %eax
690 ; AVX2-NEXT:    vpinsrd $0, %eax, %xmm1, %xmm1
691 ; AVX2-NEXT:    vpxor %ymm2, %ymm2, %ymm2
692 ; AVX2-NEXT:    vinserti128 $0, %xmm1, %ymm2, %ymm1
693 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
694 ; AVX2-NEXT:    retq
695   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 7, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
696   ret <8 x i32> %shuffle
697 }
698
699 define <8 x i32> @shuffle_v8i32_01014545(<8 x i32> %a, <8 x i32> %b) {
700 ; AVX1-LABEL: @shuffle_v8i32_01014545
701 ; AVX1:       # BB#0:
702 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,2,2]
703 ; AVX1-NEXT:    retq
704 ;
705 ; AVX2-LABEL: @shuffle_v8i32_01014545
706 ; AVX2:       # BB#0:
707 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[0,1,0,1,4,5,4,5]
708 ; AVX2-NEXT:    retq
709   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5>
710   ret <8 x i32> %shuffle
711 }
712
713 define <8 x i32> @shuffle_v8i32_00112233(<8 x i32> %a, <8 x i32> %b) {
714 ; AVX1-LABEL: @shuffle_v8i32_00112233
715 ; AVX1:       # BB#0:
716 ; AVX1-NEXT:    vunpcklps {{.*}} # xmm1 = xmm0[0,0,1,1]
717 ; AVX1-NEXT:    vunpckhps {{.*}} # xmm0 = xmm0[2,2,3,3]
718 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
719 ; AVX1-NEXT:    retq
720 ;
721 ; AVX2-LABEL: @shuffle_v8i32_00112233
722 ; AVX2:       # BB#0:
723 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,0,1,1,2,2,3,3]
724 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
725 ; AVX2-NEXT:    retq
726   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 1, i32 1, i32 2, i32 2, i32 3, i32 3>
727   ret <8 x i32> %shuffle
728 }
729
730 define <8 x i32> @shuffle_v8i32_00001111(<8 x i32> %a, <8 x i32> %b) {
731 ; AVX1-LABEL: @shuffle_v8i32_00001111
732 ; AVX1:       # BB#0:
733 ; AVX1-NEXT:    vpermilps {{.*}} # xmm1 = xmm0[0,0,0,0]
734 ; AVX1-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[1,1,1,1]
735 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
736 ; AVX1-NEXT:    retq
737 ;
738 ; AVX2-LABEL: @shuffle_v8i32_00001111
739 ; AVX2:       # BB#0:
740 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,0,0,0,1,1,1,1]
741 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
742 ; AVX2-NEXT:    retq
743   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>
744   ret <8 x i32> %shuffle
745 }
746
747 define <8 x i32> @shuffle_v8i32_81a3c5e7(<8 x i32> %a, <8 x i32> %b) {
748 ; AVX1-LABEL: @shuffle_v8i32_81a3c5e7
749 ; AVX1:       # BB#0:
750 ; AVX1-NEXT:    vblendps {{.*}} # ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7]
751 ; AVX1-NEXT:    retq
752 ;
753 ; AVX2-LABEL: @shuffle_v8i32_81a3c5e7
754 ; AVX2:       # BB#0:
755 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7]
756 ; AVX2-NEXT:    retq
757   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7>
758   ret <8 x i32> %shuffle
759 }
760
761 define <8 x i32> @shuffle_v8i32_08080808(<8 x i32> %a, <8 x i32> %b) {
762 ; AVX1-LABEL: @shuffle_v8i32_08080808
763 ; AVX1:       # BB#0:
764 ; AVX1-NEXT:    vpermilps {{.*}} # xmm1 = xmm1[0,0,2,0]
765 ; AVX1-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,1,0,3]
766 ; AVX1-NEXT:    vblendps {{.*}} # xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
767 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
768 ; AVX1-NEXT:    retq
769 ;
770 ; AVX2-LABEL: @shuffle_v8i32_08080808
771 ; AVX2:       # BB#0:
772 ; AVX2-NEXT:    vpxor %ymm2, %ymm2, %ymm2
773 ; AVX2-NEXT:    vpermd %ymm1, %ymm2, %ymm1
774 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,0,0,0]
775 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
776 ; AVX2-NEXT:    retq
777   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 8, i32 0, i32 8, i32 0, i32 8, i32 0, i32 8>
778   ret <8 x i32> %shuffle
779 }
780
781 define <8 x i32> @shuffle_v8i32_08084c4c(<8 x i32> %a, <8 x i32> %b) {
782 ; AVX1-LABEL: @shuffle_v8i32_08084c4c
783 ; AVX1:       # BB#0:
784 ; AVX1-NEXT:    vshufps {{.*}} # ymm0 = ymm0[0,0],ymm1[0,0],ymm0[4,4],ymm1[4,4]
785 ; AVX1-NEXT:    vshufps {{.*}} # ymm0 = ymm0[0,2,1,3,4,6,5,7]
786 ; AVX1-NEXT:    retq
787 ;
788 ; AVX2-LABEL: @shuffle_v8i32_08084c4c
789 ; AVX2:       # BB#0:
790 ; AVX2-NEXT:    vpshufd {{.*}} # ymm1 = ymm1[0,0,2,0,4,4,6,4]
791 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[0,1,0,1,4,5,4,5]
792 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
793 ; AVX2-NEXT:    retq
794   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 8, i32 0, i32 8, i32 4, i32 12, i32 4, i32 12>
795   ret <8 x i32> %shuffle
796 }
797
798 define <8 x i32> @shuffle_v8i32_8823cc67(<8 x i32> %a, <8 x i32> %b) {
799 ; AVX1-LABEL: @shuffle_v8i32_8823cc67
800 ; AVX1:       # BB#0:
801 ; AVX1-NEXT:    vshufps {{.*}} # ymm0 = ymm1[0,0],ymm0[2,3],ymm1[4,4],ymm0[6,7]
802 ; AVX1-NEXT:    retq
803 ;
804 ; AVX2-LABEL: @shuffle_v8i32_8823cc67
805 ; AVX2:       # BB#0:
806 ; AVX2-NEXT:    vpshufd {{.*}} # ymm1 = ymm1[0,0,2,3,4,4,6,7]
807 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm1[0,1],ymm0[2,3],ymm1[4,5],ymm0[6,7]
808 ; AVX2-NEXT:    retq
809   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 8, i32 8, i32 2, i32 3, i32 12, i32 12, i32 6, i32 7>
810   ret <8 x i32> %shuffle
811 }
812
813 define <8 x i32> @shuffle_v8i32_9832dc76(<8 x i32> %a, <8 x i32> %b) {
814 ; AVX1-LABEL: @shuffle_v8i32_9832dc76
815 ; AVX1:       # BB#0:
816 ; AVX1-NEXT:    vshufps {{.*}} # ymm0 = ymm1[1,0],ymm0[3,2],ymm1[5,4],ymm0[7,6]
817 ; AVX1-NEXT:    retq
818 ;
819 ; AVX2-LABEL: @shuffle_v8i32_9832dc76
820 ; AVX2:       # BB#0:
821 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[0,1,3,2,4,5,7,6]
822 ; AVX2-NEXT:    vpshufd {{.*}} # ymm1 = ymm1[1,0,2,3,5,4,6,7]
823 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm1[0,1],ymm0[2,3],ymm1[4,5],ymm0[6,7]
824 ; AVX2-NEXT:    retq
825   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 9, i32 8, i32 3, i32 2, i32 13, i32 12, i32 7, i32 6>
826   ret <8 x i32> %shuffle
827 }
828
829 define <8 x i32> @shuffle_v8i32_9810dc54(<8 x i32> %a, <8 x i32> %b) {
830 ; AVX1-LABEL: @shuffle_v8i32_9810dc54
831 ; AVX1:       # BB#0:
832 ; AVX1-NEXT:    vshufps {{.*}} # ymm0 = ymm1[1,0],ymm0[1,0],ymm1[5,4],ymm0[5,4]
833 ; AVX1-NEXT:    retq
834 ;
835 ; AVX2-LABEL: @shuffle_v8i32_9810dc54
836 ; AVX2:       # BB#0:
837 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[0,1,1,0,4,5,5,4]
838 ; AVX2-NEXT:    vpshufd {{.*}} # ymm1 = ymm1[1,0,2,3,5,4,6,7]
839 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm1[0,1],ymm0[2,3],ymm1[4,5],ymm0[6,7]
840 ; AVX2-NEXT:    retq
841   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 9, i32 8, i32 1, i32 0, i32 13, i32 12, i32 5, i32 4>
842   ret <8 x i32> %shuffle
843 }
844
845 define <8 x i32> @shuffle_v8i32_08194c5d(<8 x i32> %a, <8 x i32> %b) {
846 ; AVX1-LABEL: @shuffle_v8i32_08194c5d
847 ; AVX1:       # BB#0:
848 ; AVX1-NEXT:    vunpcklps {{.*}} # ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
849 ; AVX1-NEXT:    retq
850 ;
851 ; AVX2-LABEL: @shuffle_v8i32_08194c5d
852 ; AVX2:       # BB#0:
853 ; AVX2-NEXT:    vpunpckldq {{.*}} # ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
854 ; AVX2-NEXT:    retq
855   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 4, i32 12, i32 5, i32 13>
856   ret <8 x i32> %shuffle
857 }
858
859 define <8 x i32> @shuffle_v8i32_2a3b6e7f(<8 x i32> %a, <8 x i32> %b) {
860 ; AVX1-LABEL: @shuffle_v8i32_2a3b6e7f
861 ; AVX1:       # BB#0:
862 ; AVX1-NEXT:    vunpckhps {{.*}} # ymm0 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
863 ; AVX1-NEXT:    retq
864 ;
865 ; AVX2-LABEL: @shuffle_v8i32_2a3b6e7f
866 ; AVX2:       # BB#0:
867 ; AVX2-NEXT:    vpunpckhdq {{.*}} # ymm0 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
868 ; AVX2-NEXT:    retq
869   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 2, i32 10, i32 3, i32 11, i32 6, i32 14, i32 7, i32 15>
870   ret <8 x i32> %shuffle
871 }
872
873 define <8 x i32> @shuffle_v8i32_08192a3b(<8 x i32> %a, <8 x i32> %b) {
874 ; AVX1-LABEL: @shuffle_v8i32_08192a3b
875 ; AVX1:       # BB#0:
876 ; AVX1-NEXT:    vpermilps {{.*}} # xmm2 = xmm1[0,2,2,3]
877 ; AVX1-NEXT:    vpermilps {{.*}} # xmm3 = xmm0[2,1,3,3]
878 ; AVX1-NEXT:    vblendps {{.*}} # xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
879 ; AVX1-NEXT:    vpermilps {{.*}} # xmm1 = xmm1[0,0,2,1]
880 ; AVX1-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,1,1,3]
881 ; AVX1-NEXT:    vblendps {{.*}} # xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
882 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
883 ; AVX1-NEXT:    retq
884 ;
885 ; AVX2-LABEL: @shuffle_v8i32_08192a3b
886 ; AVX2:       # BB#0:
887 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm2 = <u,0,u,1,u,2,u,3>
888 ; AVX2-NEXT:    vpermd %ymm1, %ymm2, %ymm1
889 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm2 = <0,u,1,u,2,u,3,u>
890 ; AVX2-NEXT:    vpermd %ymm0, %ymm2, %ymm0
891 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
892 ; AVX2-NEXT:    retq
893   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
894   ret <8 x i32> %shuffle
895 }
896
897 define <8 x i32> @shuffle_v8i32_08991abb(<8 x i32> %a, <8 x i32> %b) {
898 ; AVX1-LABEL: @shuffle_v8i32_08991abb
899 ; AVX1:       # BB#0:
900 ; AVX1-NEXT:    vpermilps {{.*}} # xmm2 = xmm0[1,1,2,3]
901 ; AVX1-NEXT:    vpermilps {{.*}} # xmm3 = xmm1[0,2,3,3]
902 ; AVX1-NEXT:    vblendps {{.*}} # xmm2 = xmm2[0],xmm3[1,2,3]
903 ; AVX1-NEXT:    vunpcklps {{.*}} # xmm1 = xmm1[0,0,1,1]
904 ; AVX1-NEXT:    vblendps {{.*}} # xmm0 = xmm0[0],xmm1[1,2,3]
905 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
906 ; AVX1-NEXT:    retq
907 ;
908 ; AVX2-LABEL: @shuffle_v8i32_08991abb
909 ; AVX2:       # BB#0:
910 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm2 = <0,u,u,u,1,u,u,u>
911 ; AVX2-NEXT:    vpermd %ymm0, %ymm2, %ymm0
912 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm2 = <u,0,1,1,u,2,3,3>
913 ; AVX2-NEXT:    vpermd %ymm1, %ymm2, %ymm1
914 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
915 ; AVX2-NEXT:    retq
916   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 8, i32 9, i32 9, i32 1, i32 10, i32 11, i32 11>
917   ret <8 x i32> %shuffle
918 }
919
920 define <8 x i32> @shuffle_v8i32_091b2d3f(<8 x i32> %a, <8 x i32> %b) {
921 ; AVX1-LABEL: @shuffle_v8i32_091b2d3f
922 ; AVX1:       # BB#0:
923 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
924 ; AVX1-NEXT:    vpermilps {{.*}} # xmm3 = xmm0[2,1,3,3]
925 ; AVX1-NEXT:    vblendps {{.*}} # xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
926 ; AVX1-NEXT:    vpermilps {{.*}} # xmm0 = xmm0[0,1,1,3]
927 ; AVX1-NEXT:    vblendps {{.*}} # xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
928 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
929 ; AVX1-NEXT:    retq
930 ;
931 ; AVX2-LABEL: @shuffle_v8i32_091b2d3f
932 ; AVX2:       # BB#0:
933 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm2 = <0,u,1,u,2,u,3,u>
934 ; AVX2-NEXT:    vpermd %ymm0, %ymm2, %ymm0
935 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
936 ; AVX2-NEXT:    retq
937   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 9, i32 1, i32 11, i32 2, i32 13, i32 3, i32 15>
938   ret <8 x i32> %shuffle
939 }
940
941 define <8 x i32> @shuffle_v8i32_09ab1def(<8 x i32> %a, <8 x i32> %b) {
942 ; AVX1-LABEL: @shuffle_v8i32_09ab1def
943 ; AVX1:       # BB#0:
944 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
945 ; AVX1-NEXT:    vpermilps {{.*}} # xmm3 = xmm0[1,1,2,3]
946 ; AVX1-NEXT:    vblendps {{.*}} # xmm2 = xmm3[0],xmm2[1,2,3]
947 ; AVX1-NEXT:    vblendps {{.*}} # xmm0 = xmm0[0],xmm1[1,2,3]
948 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
949 ; AVX1-NEXT:    retq
950 ;
951 ; AVX2-LABEL: @shuffle_v8i32_09ab1def
952 ; AVX2:       # BB#0:
953 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm2 = <0,u,u,u,1,u,u,u>
954 ; AVX2-NEXT:    vpermd %ymm0, %ymm2, %ymm0
955 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
956 ; AVX2-NEXT:    retq
957   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 9, i32 10, i32 11, i32 1, i32 13, i32 14, i32 15>
958   ret <8 x i32> %shuffle
959 }
960
961 define <8 x i32> @shuffle_v8i32_00014445(<8 x i32> %a, <8 x i32> %b) {
962 ; AVX1-LABEL: @shuffle_v8i32_00014445
963 ; AVX1:       # BB#0:
964 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,0,1,4,4,4,5]
965 ; AVX1-NEXT:    retq
966 ;
967 ; AVX2-LABEL: @shuffle_v8i32_00014445
968 ; AVX2:       # BB#0:
969 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[0,0,0,1,4,4,4,5]
970 ; AVX2-NEXT:    retq
971   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 1, i32 4, i32 4, i32 4, i32 5>
972   ret <8 x i32> %shuffle
973 }
974
975 define <8 x i32> @shuffle_v8i32_00204464(<8 x i32> %a, <8 x i32> %b) {
976 ; AVX1-LABEL: @shuffle_v8i32_00204464
977 ; AVX1:       # BB#0:
978 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,2,0,4,4,6,4]
979 ; AVX1-NEXT:    retq
980 ;
981 ; AVX2-LABEL: @shuffle_v8i32_00204464
982 ; AVX2:       # BB#0:
983 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[0,0,2,0,4,4,6,4]
984 ; AVX2-NEXT:    retq
985   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 0, i32 4, i32 4, i32 6, i32 4>
986   ret <8 x i32> %shuffle
987 }
988
989 define <8 x i32> @shuffle_v8i32_03004744(<8 x i32> %a, <8 x i32> %b) {
990 ; AVX1-LABEL: @shuffle_v8i32_03004744
991 ; AVX1:       # BB#0:
992 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,3,0,0,4,7,4,4]
993 ; AVX1-NEXT:    retq
994 ;
995 ; AVX2-LABEL: @shuffle_v8i32_03004744
996 ; AVX2:       # BB#0:
997 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[0,3,0,0,4,7,4,4]
998 ; AVX2-NEXT:    retq
999   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 3, i32 0, i32 0, i32 4, i32 7, i32 4, i32 4>
1000   ret <8 x i32> %shuffle
1001 }
1002
1003 define <8 x i32> @shuffle_v8i32_10005444(<8 x i32> %a, <8 x i32> %b) {
1004 ; AVX1-LABEL: @shuffle_v8i32_10005444
1005 ; AVX1:       # BB#0:
1006 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,0,0,0,5,4,4,4]
1007 ; AVX1-NEXT:    retq
1008 ;
1009 ; AVX2-LABEL: @shuffle_v8i32_10005444
1010 ; AVX2:       # BB#0:
1011 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[1,0,0,0,5,4,4,4]
1012 ; AVX2-NEXT:    retq
1013   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 1, i32 0, i32 0, i32 0, i32 5, i32 4, i32 4, i32 4>
1014   ret <8 x i32> %shuffle
1015 }
1016
1017 define <8 x i32> @shuffle_v8i32_22006644(<8 x i32> %a, <8 x i32> %b) {
1018 ; AVX1-LABEL: @shuffle_v8i32_22006644
1019 ; AVX1:       # BB#0:
1020 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[2,2,0,0,6,6,4,4]
1021 ; AVX1-NEXT:    retq
1022 ;
1023 ; AVX2-LABEL: @shuffle_v8i32_22006644
1024 ; AVX2:       # BB#0:
1025 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[2,2,0,0,6,6,4,4]
1026 ; AVX2-NEXT:    retq
1027   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 2, i32 2, i32 0, i32 0, i32 6, i32 6, i32 4, i32 4>
1028   ret <8 x i32> %shuffle
1029 }
1030
1031 define <8 x i32> @shuffle_v8i32_33307774(<8 x i32> %a, <8 x i32> %b) {
1032 ; AVX1-LABEL: @shuffle_v8i32_33307774
1033 ; AVX1:       # BB#0:
1034 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[3,3,3,0,7,7,7,4]
1035 ; AVX1-NEXT:    retq
1036 ;
1037 ; AVX2-LABEL: @shuffle_v8i32_33307774
1038 ; AVX2:       # BB#0:
1039 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[3,3,3,0,7,7,7,4]
1040 ; AVX2-NEXT:    retq
1041   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 3, i32 3, i32 3, i32 0, i32 7, i32 7, i32 7, i32 4>
1042   ret <8 x i32> %shuffle
1043 }
1044
1045 define <8 x i32> @shuffle_v8i32_32107654(<8 x i32> %a, <8 x i32> %b) {
1046 ; AVX1-LABEL: @shuffle_v8i32_32107654
1047 ; AVX1:       # BB#0:
1048 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[3,2,1,0,7,6,5,4]
1049 ; AVX1-NEXT:    retq
1050 ;
1051 ; AVX2-LABEL: @shuffle_v8i32_32107654
1052 ; AVX2:       # BB#0:
1053 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[3,2,1,0,7,6,5,4]
1054 ; AVX2-NEXT:    retq
1055   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
1056   ret <8 x i32> %shuffle
1057 }
1058
1059 define <8 x i32> @shuffle_v8i32_00234467(<8 x i32> %a, <8 x i32> %b) {
1060 ; AVX1-LABEL: @shuffle_v8i32_00234467
1061 ; AVX1:       # BB#0:
1062 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,2,3,4,4,6,7]
1063 ; AVX1-NEXT:    retq
1064 ;
1065 ; AVX2-LABEL: @shuffle_v8i32_00234467
1066 ; AVX2:       # BB#0:
1067 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[0,0,2,3,4,4,6,7]
1068 ; AVX2-NEXT:    retq
1069   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 3, i32 4, i32 4, i32 6, i32 7>
1070   ret <8 x i32> %shuffle
1071 }
1072
1073 define <8 x i32> @shuffle_v8i32_00224466(<8 x i32> %a, <8 x i32> %b) {
1074 ; AVX1-LABEL: @shuffle_v8i32_00224466
1075 ; AVX1:       # BB#0:
1076 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,2,2,4,4,6,6]
1077 ; AVX1-NEXT:    retq
1078 ;
1079 ; AVX2-LABEL: @shuffle_v8i32_00224466
1080 ; AVX2:       # BB#0:
1081 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[0,0,2,2,4,4,6,6]
1082 ; AVX2-NEXT:    retq
1083   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>
1084   ret <8 x i32> %shuffle
1085 }
1086
1087 define <8 x i32> @shuffle_v8i32_10325476(<8 x i32> %a, <8 x i32> %b) {
1088 ; AVX1-LABEL: @shuffle_v8i32_10325476
1089 ; AVX1:       # BB#0:
1090 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,0,3,2,5,4,7,6]
1091 ; AVX1-NEXT:    retq
1092 ;
1093 ; AVX2-LABEL: @shuffle_v8i32_10325476
1094 ; AVX2:       # BB#0:
1095 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[1,0,3,2,5,4,7,6]
1096 ; AVX2-NEXT:    retq
1097   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
1098   ret <8 x i32> %shuffle
1099 }
1100
1101 define <8 x i32> @shuffle_v8i32_11335577(<8 x i32> %a, <8 x i32> %b) {
1102 ; AVX1-LABEL: @shuffle_v8i32_11335577
1103 ; AVX1:       # BB#0:
1104 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,1,3,3,5,5,7,7]
1105 ; AVX1-NEXT:    retq
1106 ;
1107 ; AVX2-LABEL: @shuffle_v8i32_11335577
1108 ; AVX2:       # BB#0:
1109 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[1,1,3,3,5,5,7,7]
1110 ; AVX2-NEXT:    retq
1111   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>
1112   ret <8 x i32> %shuffle
1113 }
1114
1115 define <8 x i32> @shuffle_v8i32_10235467(<8 x i32> %a, <8 x i32> %b) {
1116 ; AVX1-LABEL: @shuffle_v8i32_10235467
1117 ; AVX1:       # BB#0:
1118 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,0,2,3,5,4,6,7]
1119 ; AVX1-NEXT:    retq
1120 ;
1121 ; AVX2-LABEL: @shuffle_v8i32_10235467
1122 ; AVX2:       # BB#0:
1123 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[1,0,2,3,5,4,6,7]
1124 ; AVX2-NEXT:    retq
1125   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 1, i32 0, i32 2, i32 3, i32 5, i32 4, i32 6, i32 7>
1126   ret <8 x i32> %shuffle
1127 }
1128
1129 define <8 x i32> @shuffle_v8i32_10225466(<8 x i32> %a, <8 x i32> %b) {
1130 ; AVX1-LABEL: @shuffle_v8i32_10225466
1131 ; AVX1:       # BB#0:
1132 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,0,2,2,5,4,6,6]
1133 ; AVX1-NEXT:    retq
1134 ;
1135 ; AVX2-LABEL: @shuffle_v8i32_10225466
1136 ; AVX2:       # BB#0:
1137 ; AVX2-NEXT:    vpshufd {{.*}} # ymm0 = ymm0[1,0,2,2,5,4,6,6]
1138 ; AVX2-NEXT:    retq
1139   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 1, i32 0, i32 2, i32 2, i32 5, i32 4, i32 6, i32 6>
1140   ret <8 x i32> %shuffle
1141 }
1142
1143 define <8 x i32> @shuffle_v8i32_00015444(<8 x i32> %a, <8 x i32> %b) {
1144 ; AVX1-LABEL: @shuffle_v8i32_00015444
1145 ; AVX1:       # BB#0:
1146 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,0,1,5,4,4,4]
1147 ; AVX1-NEXT:    retq
1148 ;
1149 ; AVX2-LABEL: @shuffle_v8i32_00015444
1150 ; AVX2:       # BB#0:
1151 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,0,0,1,5,4,4,4]
1152 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1153 ; AVX2-NEXT:    retq
1154   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 1, i32 5, i32 4, i32 4, i32 4>
1155   ret <8 x i32> %shuffle
1156 }
1157
1158 define <8 x i32> @shuffle_v8i32_00204644(<8 x i32> %a, <8 x i32> %b) {
1159 ; AVX1-LABEL: @shuffle_v8i32_00204644
1160 ; AVX1:       # BB#0:
1161 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,2,0,4,6,4,4]
1162 ; AVX1-NEXT:    retq
1163 ;
1164 ; AVX2-LABEL: @shuffle_v8i32_00204644
1165 ; AVX2:       # BB#0:
1166 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,0,2,0,4,6,4,4]
1167 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1168 ; AVX2-NEXT:    retq
1169   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 0, i32 4, i32 6, i32 4, i32 4>
1170   ret <8 x i32> %shuffle
1171 }
1172
1173 define <8 x i32> @shuffle_v8i32_03004474(<8 x i32> %a, <8 x i32> %b) {
1174 ; AVX1-LABEL: @shuffle_v8i32_03004474
1175 ; AVX1:       # BB#0:
1176 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,3,0,0,4,4,7,4]
1177 ; AVX1-NEXT:    retq
1178 ;
1179 ; AVX2-LABEL: @shuffle_v8i32_03004474
1180 ; AVX2:       # BB#0:
1181 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,3,0,0,4,4,7,4]
1182 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1183 ; AVX2-NEXT:    retq
1184   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 3, i32 0, i32 0, i32 4, i32 4, i32 7, i32 4>
1185   ret <8 x i32> %shuffle
1186 }
1187
1188 define <8 x i32> @shuffle_v8i32_10004444(<8 x i32> %a, <8 x i32> %b) {
1189 ; AVX1-LABEL: @shuffle_v8i32_10004444
1190 ; AVX1:       # BB#0:
1191 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,0,0,0,4,4,4,4]
1192 ; AVX1-NEXT:    retq
1193 ;
1194 ; AVX2-LABEL: @shuffle_v8i32_10004444
1195 ; AVX2:       # BB#0:
1196 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [1,0,0,0,4,4,4,4]
1197 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1198 ; AVX2-NEXT:    retq
1199   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 1, i32 0, i32 0, i32 0, i32 4, i32 4, i32 4, i32 4>
1200   ret <8 x i32> %shuffle
1201 }
1202
1203 define <8 x i32> @shuffle_v8i32_22006446(<8 x i32> %a, <8 x i32> %b) {
1204 ; AVX1-LABEL: @shuffle_v8i32_22006446
1205 ; AVX1:       # BB#0:
1206 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[2,2,0,0,6,4,4,6]
1207 ; AVX1-NEXT:    retq
1208 ;
1209 ; AVX2-LABEL: @shuffle_v8i32_22006446
1210 ; AVX2:       # BB#0:
1211 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [2,2,0,0,6,4,4,6]
1212 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1213 ; AVX2-NEXT:    retq
1214   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 2, i32 2, i32 0, i32 0, i32 6, i32 4, i32 4, i32 6>
1215   ret <8 x i32> %shuffle
1216 }
1217
1218 define <8 x i32> @shuffle_v8i32_33307474(<8 x i32> %a, <8 x i32> %b) {
1219 ; AVX1-LABEL: @shuffle_v8i32_33307474
1220 ; AVX1:       # BB#0:
1221 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[3,3,3,0,7,4,7,4]
1222 ; AVX1-NEXT:    retq
1223 ;
1224 ; AVX2-LABEL: @shuffle_v8i32_33307474
1225 ; AVX2:       # BB#0:
1226 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [3,3,3,0,7,4,7,4]
1227 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1228 ; AVX2-NEXT:    retq
1229   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 3, i32 3, i32 3, i32 0, i32 7, i32 4, i32 7, i32 4>
1230   ret <8 x i32> %shuffle
1231 }
1232
1233 define <8 x i32> @shuffle_v8i32_32104567(<8 x i32> %a, <8 x i32> %b) {
1234 ; AVX1-LABEL: @shuffle_v8i32_32104567
1235 ; AVX1:       # BB#0:
1236 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[3,2,1,0,4,5,6,7]
1237 ; AVX1-NEXT:    retq
1238 ;
1239 ; AVX2-LABEL: @shuffle_v8i32_32104567
1240 ; AVX2:       # BB#0:
1241 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [3,2,1,0,4,5,6,7]
1242 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1243 ; AVX2-NEXT:    retq
1244   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 4, i32 5, i32 6, i32 7>
1245   ret <8 x i32> %shuffle
1246 }
1247
1248 define <8 x i32> @shuffle_v8i32_00236744(<8 x i32> %a, <8 x i32> %b) {
1249 ; AVX1-LABEL: @shuffle_v8i32_00236744
1250 ; AVX1:       # BB#0:
1251 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,2,3,6,7,4,4]
1252 ; AVX1-NEXT:    retq
1253 ;
1254 ; AVX2-LABEL: @shuffle_v8i32_00236744
1255 ; AVX2:       # BB#0:
1256 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,0,2,3,6,7,4,4]
1257 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1258 ; AVX2-NEXT:    retq
1259   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 3, i32 6, i32 7, i32 4, i32 4>
1260   ret <8 x i32> %shuffle
1261 }
1262
1263 define <8 x i32> @shuffle_v8i32_00226644(<8 x i32> %a, <8 x i32> %b) {
1264 ; AVX1-LABEL: @shuffle_v8i32_00226644
1265 ; AVX1:       # BB#0:
1266 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,2,2,6,6,4,4]
1267 ; AVX1-NEXT:    retq
1268 ;
1269 ; AVX2-LABEL: @shuffle_v8i32_00226644
1270 ; AVX2:       # BB#0:
1271 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,0,2,2,6,6,4,4]
1272 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1273 ; AVX2-NEXT:    retq
1274   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 6, i32 6, i32 4, i32 4>
1275   ret <8 x i32> %shuffle
1276 }
1277
1278 define <8 x i32> @shuffle_v8i32_10324567(<8 x i32> %a, <8 x i32> %b) {
1279 ; AVX1-LABEL: @shuffle_v8i32_10324567
1280 ; AVX1:       # BB#0:
1281 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,0,3,2,4,5,6,7]
1282 ; AVX1-NEXT:    retq
1283 ;
1284 ; AVX2-LABEL: @shuffle_v8i32_10324567
1285 ; AVX2:       # BB#0:
1286 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [1,0,3,2,4,5,6,7]
1287 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1288 ; AVX2-NEXT:    retq
1289   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 4, i32 5, i32 6, i32 7>
1290   ret <8 x i32> %shuffle
1291 }
1292
1293 define <8 x i32> @shuffle_v8i32_11334567(<8 x i32> %a, <8 x i32> %b) {
1294 ; AVX1-LABEL: @shuffle_v8i32_11334567
1295 ; AVX1:       # BB#0:
1296 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,1,3,3,4,5,6,7]
1297 ; AVX1-NEXT:    retq
1298 ;
1299 ; AVX2-LABEL: @shuffle_v8i32_11334567
1300 ; AVX2:       # BB#0:
1301 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [1,1,3,3,4,5,6,7]
1302 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1303 ; AVX2-NEXT:    retq
1304   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 4, i32 5, i32 6, i32 7>
1305   ret <8 x i32> %shuffle
1306 }
1307
1308 define <8 x i32> @shuffle_v8i32_01235467(<8 x i32> %a, <8 x i32> %b) {
1309 ; AVX1-LABEL: @shuffle_v8i32_01235467
1310 ; AVX1:       # BB#0:
1311 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,1,2,3,5,4,6,7]
1312 ; AVX1-NEXT:    retq
1313 ;
1314 ; AVX2-LABEL: @shuffle_v8i32_01235467
1315 ; AVX2:       # BB#0:
1316 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,1,2,3,5,4,6,7]
1317 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1318 ; AVX2-NEXT:    retq
1319   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 5, i32 4, i32 6, i32 7>
1320   ret <8 x i32> %shuffle
1321 }
1322
1323 define <8 x i32> @shuffle_v8i32_01235466(<8 x i32> %a, <8 x i32> %b) {
1324 ; AVX1-LABEL: @shuffle_v8i32_01235466
1325 ; AVX1:       # BB#0:
1326 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,1,2,3,5,4,6,6]
1327 ; AVX1-NEXT:    retq
1328 ;
1329 ; AVX2-LABEL: @shuffle_v8i32_01235466
1330 ; AVX2:       # BB#0:
1331 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = [0,1,2,3,5,4,6,6]
1332 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1333 ; AVX2-NEXT:    retq
1334   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 5, i32 4, i32 6, i32 6>
1335   ret <8 x i32> %shuffle
1336 }
1337
1338 define <8 x i32> @shuffle_v8i32_002u6u44(<8 x i32> %a, <8 x i32> %b) {
1339 ; AVX1-LABEL: @shuffle_v8i32_002u6u44
1340 ; AVX1:       # BB#0:
1341 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,2,u,6,u,4,4]
1342 ; AVX1-NEXT:    retq
1343 ;
1344 ; AVX2-LABEL: @shuffle_v8i32_002u6u44
1345 ; AVX2:       # BB#0:
1346 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = <0,0,2,u,6,u,4,4>
1347 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1348 ; AVX2-NEXT:    retq
1349   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 undef, i32 6, i32 undef, i32 4, i32 4>
1350   ret <8 x i32> %shuffle
1351 }
1352
1353 define <8 x i32> @shuffle_v8i32_00uu66uu(<8 x i32> %a, <8 x i32> %b) {
1354 ; AVX1-LABEL: @shuffle_v8i32_00uu66uu
1355 ; AVX1:       # BB#0:
1356 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,0,u,u,6,6,u,u]
1357 ; AVX1-NEXT:    retq
1358 ;
1359 ; AVX2-LABEL: @shuffle_v8i32_00uu66uu
1360 ; AVX2:       # BB#0:
1361 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = <0,0,u,u,6,6,u,u>
1362 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1363 ; AVX2-NEXT:    retq
1364   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 undef, i32 undef, i32 6, i32 6, i32 undef, i32 undef>
1365   ret <8 x i32> %shuffle
1366 }
1367
1368 define <8 x i32> @shuffle_v8i32_103245uu(<8 x i32> %a, <8 x i32> %b) {
1369 ; AVX1-LABEL: @shuffle_v8i32_103245uu
1370 ; AVX1:       # BB#0:
1371 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,0,3,2,4,5,u,u]
1372 ; AVX1-NEXT:    retq
1373 ;
1374 ; AVX2-LABEL: @shuffle_v8i32_103245uu
1375 ; AVX2:       # BB#0:
1376 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = <1,0,3,2,4,5,u,u>
1377 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1378 ; AVX2-NEXT:    retq
1379   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 4, i32 5, i32 undef, i32 undef>
1380   ret <8 x i32> %shuffle
1381 }
1382
1383 define <8 x i32> @shuffle_v8i32_1133uu67(<8 x i32> %a, <8 x i32> %b) {
1384 ; AVX1-LABEL: @shuffle_v8i32_1133uu67
1385 ; AVX1:       # BB#0:
1386 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[1,1,3,3,u,u,6,7]
1387 ; AVX1-NEXT:    retq
1388 ;
1389 ; AVX2-LABEL: @shuffle_v8i32_1133uu67
1390 ; AVX2:       # BB#0:
1391 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = <1,1,3,3,u,u,6,7>
1392 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1393 ; AVX2-NEXT:    retq
1394   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 undef, i32 undef, i32 6, i32 7>
1395   ret <8 x i32> %shuffle
1396 }
1397
1398 define <8 x i32> @shuffle_v8i32_0uu354uu(<8 x i32> %a, <8 x i32> %b) {
1399 ; AVX1-LABEL: @shuffle_v8i32_0uu354uu
1400 ; AVX1:       # BB#0:
1401 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[0,u,u,3,5,4,u,u]
1402 ; AVX1-NEXT:    retq
1403 ;
1404 ; AVX2-LABEL: @shuffle_v8i32_0uu354uu
1405 ; AVX2:       # BB#0:
1406 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = <0,u,u,3,5,4,u,u>
1407 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1408 ; AVX2-NEXT:    retq
1409   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 undef, i32 undef, i32 3, i32 5, i32 4, i32 undef, i32 undef>
1410   ret <8 x i32> %shuffle
1411 }
1412
1413 define <8 x i32> @shuffle_v8i32_uuu3uu66(<8 x i32> %a, <8 x i32> %b) {
1414 ; AVX1-LABEL: @shuffle_v8i32_uuu3uu66
1415 ; AVX1:       # BB#0:
1416 ; AVX1-NEXT:    vpermilps {{.*}} # ymm0 = ymm0[u,u,u,3,u,u,6,6]
1417 ; AVX1-NEXT:    retq
1418 ;
1419 ; AVX2-LABEL: @shuffle_v8i32_uuu3uu66
1420 ; AVX2:       # BB#0:
1421 ; AVX2-NEXT:    vmovdqa {{.*}} # ymm1 = <u,u,u,3,u,u,6,6>
1422 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1423 ; AVX2-NEXT:    retq
1424   %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 3, i32 undef, i32 undef, i32 6, i32 6>
1425   ret <8 x i32> %shuffle
1426 }