OSDN Git Service

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