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