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