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