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