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