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