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