[x86] Teach the x86 vector shuffle lowering to detect mergable 128-bit
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-512-v8.ll
1 ; RUN: llc < %s -mcpu=x86-64 -mattr=+avx512f -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512F
2 ; RUN: llc < %s -mcpu=x86-64 -mattr=+avx512bw -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
3
4 target triple = "x86_64-unknown-unknown"
5
6 define <8 x double> @shuffle_v8f64_00000000(<8 x double> %a, <8 x double> %b) {
7 ; ALL-LABEL: shuffle_v8f64_00000000:
8 ; ALL:       # BB#0:
9 ; ALL-NEXT:    vbroadcastsd %xmm0, %zmm0 
10 ; ALL-NEXT:    retq
11   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
12   ret <8 x double> %shuffle
13 }
14
15 define <8 x double> @shuffle_v8f64_00000010(<8 x double> %a, <8 x double> %b) {
16 ; ALL-LABEL: shuffle_v8f64_00000010:
17 ; ALL:       # BB#0:
18 ; ALL-NEXT:    vbroadcastsd %xmm0, %ymm1
19 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,1,0]
20 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
21 ; ALL-NEXT:    retq
22   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0>
23   ret <8 x double> %shuffle
24 }
25
26 define <8 x double> @shuffle_v8f64_00000200(<8 x double> %a, <8 x double> %b) {
27 ; ALL-LABEL: shuffle_v8f64_00000200:
28 ; ALL:       # BB#0:
29 ; ALL-NEXT:    vbroadcastsd %xmm0, %ymm1
30 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,0,0]
31 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
32 ; ALL-NEXT:    retq
33   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 2, i32 0, i32 0>
34   ret <8 x double> %shuffle
35 }
36
37 define <8 x double> @shuffle_v8f64_00003000(<8 x double> %a, <8 x double> %b) {
38 ; ALL-LABEL: shuffle_v8f64_00003000:
39 ; ALL:       # BB#0:
40 ; ALL-NEXT:    vbroadcastsd %xmm0, %ymm1
41 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[3,0,0,0]
42 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
43 ; ALL-NEXT:    retq
44   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 3, i32 0, i32 0, i32 0>
45   ret <8 x double> %shuffle
46 }
47
48 define <8 x double> @shuffle_v8f64_00040000(<8 x double> %a, <8 x double> %b) {
49 ; ALL-LABEL: shuffle_v8f64_00040000:
50 ; ALL:       # BB#0:
51 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1 
52 ; ALL-NEXT:    vbroadcastsd %xmm1, %ymm1
53 ; ALL-NEXT:    vbroadcastsd %xmm0, %ymm0
54 ; ALL-NEXT:    vblendpd {{.*#+}} ymm1 = ymm0[0,1,2],ymm1[3]
55 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
56 ; ALL-NEXT:    retq
57   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 4, i32 0, i32 0, i32 0, i32 0>
58   ret <8 x double> %shuffle
59 }
60
61 define <8 x double> @shuffle_v8f64_00500000(<8 x double> %a, <8 x double> %b) {
62 ; ALL-LABEL: shuffle_v8f64_00500000:
63 ; ALL:       # BB#0:
64 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1 
65 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,1,1,3]
66 ; ALL-NEXT:    vbroadcastsd %xmm0, %ymm0
67 ; ALL-NEXT:    vblendpd {{.*#+}} ymm1 = ymm0[0,1],ymm1[2],ymm0[3]
68 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
69 ; ALL-NEXT:    retq
70   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 5, i32 0, i32 0, i32 0, i32 0, i32 0>
71   ret <8 x double> %shuffle
72 }
73
74 define <8 x double> @shuffle_v8f64_06000000(<8 x double> %a, <8 x double> %b) {
75 ; ALL-LABEL: shuffle_v8f64_06000000:
76 ; ALL:       # BB#0:
77 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1 
78 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,2,2,3]
79 ; ALL-NEXT:    vbroadcastsd %xmm0, %ymm0
80 ; ALL-NEXT:    vblendpd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2,3]
81 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
82 ; ALL-NEXT:    retq
83   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 6, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
84   ret <8 x double> %shuffle
85 }
86
87 define <8 x double> @shuffle_v8f64_70000000(<8 x double> %a, <8 x double> %b) {
88 ; ALL-LABEL: shuffle_v8f64_70000000:
89 ; ALL:       # BB#0:
90 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1 
91 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[3,1,2,3]
92 ; ALL-NEXT:    vbroadcastsd %xmm0, %ymm0
93 ; ALL-NEXT:    vblendpd {{.*#+}} ymm1 = ymm1[0],ymm0[1,2,3]
94 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
95 ; ALL-NEXT:    retq
96   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 7, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
97   ret <8 x double> %shuffle
98 }
99
100 define <8 x double> @shuffle_v8f64_01014545(<8 x double> %a, <8 x double> %b) {
101 ; ALL-LABEL: shuffle_v8f64_01014545:
102 ; ALL:       # BB#0:
103 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1 
104 ; ALL-NEXT:    vinsertf128 $1, %xmm1, %ymm1, %ymm1
105 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
106 ; ALL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
107 ; ALL-NEXT:    retq
108   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5>
109   ret <8 x double> %shuffle
110 }
111
112 define <8 x double> @shuffle_v8f64_00112233(<8 x double> %a, <8 x double> %b) {
113 ; ALL-LABEL: shuffle_v8f64_00112233:
114 ; ALL:       # BB#0:
115 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,0,1,1]
116 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,2,3,3]
117 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
118 ; ALL-NEXT:    retq
119   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 1, i32 1, i32 2, i32 2, i32 3, i32 3>
120   ret <8 x double> %shuffle
121 }
122
123 define <8 x double> @shuffle_v8f64_00001111(<8 x double> %a, <8 x double> %b) {
124 ; ALL-LABEL: shuffle_v8f64_00001111:
125 ; ALL:       # BB#0:
126 ; ALL-NEXT:    vbroadcastsd %xmm0, %ymm1
127 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,1,1,1]
128 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
129 ; ALL-NEXT:    retq
130   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>
131   ret <8 x double> %shuffle
132 }
133
134 define <8 x double> @shuffle_v8f64_81a3c5e7(<8 x double> %a, <8 x double> %b) {
135 ; ALL-LABEL: shuffle_v8f64_81a3c5e7:
136 ; ALL:       # BB#0:
137 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm2 
138 ; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm3 
139 ; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3]
140 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3]
141 ; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
142 ; ALL-NEXT:    retq
143   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7>
144   ret <8 x double> %shuffle
145 }
146
147 define <8 x double> @shuffle_v8f64_08080808(<8 x double> %a, <8 x double> %b) {
148 ; ALL-LABEL: shuffle_v8f64_08080808:
149 ; ALL:       # BB#0:
150 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
151 ; ALL-NEXT:    vbroadcastsd %xmm1, %ymm1
152 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
153 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm0, %zmm0
154 ; ALL-NEXT:    retq
155   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 8, i32 0, i32 8, i32 0, i32 8, i32 0, i32 8>
156   ret <8 x double> %shuffle
157 }
158
159 define <8 x double> @shuffle_v8f64_08084c4c(<8 x double> %a, <8 x double> %b) {
160 ; ALL-LABEL: shuffle_v8f64_08084c4c:
161 ; ALL:       # BB#0:
162 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm2 
163 ; ALL-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
164 ; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm3 
165 ; ALL-NEXT:    vbroadcastsd %xmm3, %ymm3
166 ; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm2[0],ymm3[1],ymm2[2],ymm3[3]
167 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
168 ; ALL-NEXT:    vbroadcastsd %xmm1, %ymm1
169 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
170 ; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
171 ; ALL-NEXT:    retq
172   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 8, i32 0, i32 8, i32 4, i32 12, i32 4, i32 12>
173   ret <8 x double> %shuffle
174 }
175
176 define <8 x double> @shuffle_v8f64_8823cc67(<8 x double> %a, <8 x double> %b) {
177 ; ALL-LABEL: shuffle_v8f64_8823cc67:
178 ; ALL:       # BB#0:
179 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm2 
180 ; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm3 
181 ; ALL-NEXT:    vbroadcastsd %xmm3, %ymm3
182 ; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0,1],ymm2[2,3]
183 ; ALL-NEXT:    vbroadcastsd %xmm1, %ymm1
184 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3]
185 ; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
186 ; ALL-NEXT:    retq
187   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 8, i32 8, i32 2, i32 3, i32 12, i32 12, i32 6, i32 7>
188   ret <8 x double> %shuffle
189 }
190
191 define <8 x double> @shuffle_v8f64_9832dc76(<8 x double> %a, <8 x double> %b) {
192 ; ALL-LABEL: shuffle_v8f64_9832dc76:
193 ; ALL:       # BB#0:
194 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm2 
195 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm2 = ymm2[0,0,3,2]
196 ; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm3 
197 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm3 = ymm3[1,0,2,2]
198 ; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0,1],ymm2[2,3]
199 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[0,0,3,2]
200 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm1[1,0,2,2]
201 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3]
202 ; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
203 ; ALL-NEXT:    retq
204   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 9, i32 8, i32 3, i32 2, i32 13, i32 12, i32 7, i32 6>
205   ret <8 x double> %shuffle
206 }
207
208 define <8 x double> @shuffle_v8f64_9810dc54(<8 x double> %a, <8 x double> %b) {
209 ; ALL-LABEL: shuffle_v8f64_9810dc54:
210 ; ALL:       # BB#0:
211 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm2
212 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm2 = ymm2[1,0,3,2]
213 ; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm1
214 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0
215 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
216 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
217 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm2, %zmm0
218 ; ALL-NEXT:    retq
219   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 9, i32 8, i32 1, i32 0, i32 13, i32 12, i32 5, i32 4>
220   ret <8 x double> %shuffle
221 }
222
223 define <8 x double> @shuffle_v8f64_08194c5d(<8 x double> %a, <8 x double> %b) {
224 ; ALL-LABEL: shuffle_v8f64_08194c5d:
225 ; ALL:       # BB#0:
226 ; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm2 
227 ; ALL-NEXT:    vpermpd {{.*#+}} ymm2 = ymm2[0,0,2,1]
228 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm3 
229 ; ALL-NEXT:    vpermpd {{.*#+}} ymm3 = ymm3[0,1,1,3]
230 ; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3]
231 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,0,2,1]
232 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,1,1,3]
233 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
234 ; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
235 ; ALL-NEXT:    retq
236   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 4, i32 12, i32 5, i32 13>
237   ret <8 x double> %shuffle
238 }
239
240 define <8 x double> @shuffle_v8f64_2a3b6e7f(<8 x double> %a, <8 x double> %b) {
241 ; ALL-LABEL: shuffle_v8f64_2a3b6e7f:
242 ; ALL:       # BB#0:
243 ; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm2 
244 ; ALL-NEXT:    vpermpd {{.*#+}} ymm2 = ymm2[0,2,2,3]
245 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm3 
246 ; ALL-NEXT:    vpermpd {{.*#+}} ymm3 = ymm3[2,1,3,3]
247 ; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3]
248 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,2,2,3]
249 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,1,3,3]
250 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
251 ; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
252 ; ALL-NEXT:    retq
253   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 2, i32 10, i32 3, i32 11, i32 6, i32 14, i32 7, i32 15>
254   ret <8 x double> %shuffle
255 }
256
257 define <8 x double> @shuffle_v8f64_08192a3b(<8 x double> %a, <8 x double> %b) {
258 ; ALL-LABEL: shuffle_v8f64_08192a3b:
259 ; ALL:       # BB#0:
260 ; ALL-NEXT:    vpermpd {{.*#+}} ymm2 = ymm1[0,2,2,3]
261 ; ALL-NEXT:    vpermpd {{.*#+}} ymm3 = ymm0[2,1,3,3]
262 ; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3]
263 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,0,2,1]
264 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,1,1,3]
265 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
266 ; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
267 ; ALL-NEXT:    retq
268   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
269   ret <8 x double> %shuffle
270 }
271
272 define <8 x double> @shuffle_v8f64_08991abb(<8 x double> %a, <8 x double> %b) {
273 ; ALL-LABEL: shuffle_v8f64_08991abb:
274 ; ALL:       # BB#0:
275 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm2 = ymm0[1,0,2,2]
276 ; ALL-NEXT:    vpermpd {{.*#+}} ymm3 = ymm1[0,2,3,3]
277 ; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm2[0],ymm3[1,2,3]
278 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,0,1,1]
279 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3]
280 ; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
281 ; ALL-NEXT:    retq
282   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 8, i32 9, i32 9, i32 1, i32 10, i32 11, i32 11>
283   ret <8 x double> %shuffle
284 }
285
286 define <8 x double> @shuffle_v8f64_091b2d3f(<8 x double> %a, <8 x double> %b) {
287 ; ALL-LABEL: shuffle_v8f64_091b2d3f:
288 ; ALL:       # BB#0:
289 ; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm2 
290 ; ALL-NEXT:    vpermpd {{.*#+}} ymm3 = ymm0[2,1,3,3]
291 ; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3]
292 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,1,1,3]
293 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
294 ; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
295 ; ALL-NEXT:    retq
296   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 9, i32 1, i32 11, i32 2, i32 13, i32 3, i32 15>
297   ret <8 x double> %shuffle
298 }
299
300 define <8 x double> @shuffle_v8f64_09ab1def(<8 x double> %a, <8 x double> %b) {
301 ; ALL-LABEL: shuffle_v8f64_09ab1def:
302 ; ALL:       # BB#0:
303 ; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm2 
304 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm3 = ymm0[1,0,2,2]
305 ; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm3[0],ymm2[1,2,3]
306 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3]
307 ; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
308 ; ALL-NEXT:    retq
309   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 9, i32 10, i32 11, i32 1, i32 13, i32 14, i32 15>
310   ret <8 x double> %shuffle
311 }
312
313 define <8 x double> @shuffle_v8f64_00014445(<8 x double> %a, <8 x double> %b) {
314 ; ALL-LABEL: shuffle_v8f64_00014445:
315 ; ALL:       # BB#0:
316 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,0,0,1]
317 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
318 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,0,1]
319 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
320 ; ALL-NEXT:    retq
321   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 1, i32 4, i32 4, i32 4, i32 5>
322   ret <8 x double> %shuffle
323 }
324
325 define <8 x double> @shuffle_v8f64_00204464(<8 x double> %a, <8 x double> %b) {
326 ; ALL-LABEL: shuffle_v8f64_00204464:
327 ; ALL:       # BB#0:
328 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,0,2,0]
329 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
330 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,2,0]
331 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
332 ; ALL-NEXT:    retq
333   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 0, i32 4, i32 4, i32 6, i32 4>
334   ret <8 x double> %shuffle
335 }
336
337 define <8 x double> @shuffle_v8f64_03004744(<8 x double> %a, <8 x double> %b) {
338 ; ALL-LABEL: shuffle_v8f64_03004744:
339 ; ALL:       # BB#0:
340 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,3,0,0]
341 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
342 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,3,0,0]
343 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
344 ; ALL-NEXT:    retq
345   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 3, i32 0, i32 0, i32 4, i32 7, i32 4, i32 4>
346   ret <8 x double> %shuffle
347 }
348
349 define <8 x double> @shuffle_v8f64_10005444(<8 x double> %a, <8 x double> %b) {
350 ; ALL-LABEL: shuffle_v8f64_10005444:
351 ; ALL:       # BB#0:
352 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[1,0,0,0]
353 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
354 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,0,0,0]
355 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
356 ; ALL-NEXT:    retq
357   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 0, i32 0, i32 0, i32 5, i32 4, i32 4, i32 4>
358   ret <8 x double> %shuffle
359 }
360
361 define <8 x double> @shuffle_v8f64_22006644(<8 x double> %a, <8 x double> %b) {
362 ; ALL-LABEL: shuffle_v8f64_22006644:
363 ; ALL:       # BB#0:
364 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[2,2,0,0]
365 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
366 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,2,0,0]
367 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
368 ; ALL-NEXT:    retq
369   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 2, i32 2, i32 0, i32 0, i32 6, i32 6, i32 4, i32 4>
370   ret <8 x double> %shuffle
371 }
372
373 define <8 x double> @shuffle_v8f64_33307774(<8 x double> %a, <8 x double> %b) {
374 ; ALL-LABEL: shuffle_v8f64_33307774:
375 ; ALL:       # BB#0:
376 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[3,3,3,0]
377 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
378 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[3,3,3,0]
379 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
380 ; ALL-NEXT:    retq
381   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 3, i32 3, i32 3, i32 0, i32 7, i32 7, i32 7, i32 4>
382   ret <8 x double> %shuffle
383 }
384
385 define <8 x double> @shuffle_v8f64_32107654(<8 x double> %a, <8 x double> %b) {
386 ; ALL-LABEL: shuffle_v8f64_32107654:
387 ; ALL:       # BB#0:
388 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[3,2,1,0]
389 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
390 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[3,2,1,0]
391 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
392 ; ALL-NEXT:    retq
393   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
394   ret <8 x double> %shuffle
395 }
396
397 define <8 x double> @shuffle_v8f64_00234467(<8 x double> %a, <8 x double> %b) {
398 ; ALL-LABEL: shuffle_v8f64_00234467:
399 ; ALL:       # BB#0:
400 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[0,0,2,3]
401 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
402 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[0,0,2,3]
403 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
404 ; ALL-NEXT:    retq
405   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 3, i32 4, i32 4, i32 6, i32 7>
406   ret <8 x double> %shuffle
407 }
408
409 define <8 x double> @shuffle_v8f64_00224466(<8 x double> %a, <8 x double> %b) {
410 ; ALL-LABEL: shuffle_v8f64_00224466:
411 ; ALL:       # BB#0:
412 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[0,0,2,2]
413 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
414 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[0,0,2,2]
415 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
416 ; ALL-NEXT:    retq
417   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>
418   ret <8 x double> %shuffle
419 }
420
421 define <8 x double> @shuffle_v8f64_10325476(<8 x double> %a, <8 x double> %b) {
422 ; ALL-LABEL: shuffle_v8f64_10325476:
423 ; ALL:       # BB#0:
424 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,0,3,2]
425 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
426 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
427 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
428 ; ALL-NEXT:    retq
429   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
430   ret <8 x double> %shuffle
431 }
432
433 define <8 x double> @shuffle_v8f64_11335577(<8 x double> %a, <8 x double> %b) {
434 ; ALL-LABEL: shuffle_v8f64_11335577:
435 ; ALL:       # BB#0:
436 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,1,3,3]
437 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
438 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,1,3,3]
439 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
440 ; ALL-NEXT:    retq
441   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>
442   ret <8 x double> %shuffle
443 }
444
445 define <8 x double> @shuffle_v8f64_10235467(<8 x double> %a, <8 x double> %b) {
446 ; ALL-LABEL: shuffle_v8f64_10235467:
447 ; ALL:       # BB#0:
448 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,0,2,3]
449 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
450 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,2,3]
451 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
452 ; ALL-NEXT:    retq
453   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 0, i32 2, i32 3, i32 5, i32 4, i32 6, i32 7>
454   ret <8 x double> %shuffle
455 }
456
457 define <8 x double> @shuffle_v8f64_10225466(<8 x double> %a, <8 x double> %b) {
458 ; ALL-LABEL: shuffle_v8f64_10225466:
459 ; ALL:       # BB#0:
460 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,0,2,2]
461 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
462 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,2,2]
463 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
464 ; ALL-NEXT:    retq
465   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 0, i32 2, i32 2, i32 5, i32 4, i32 6, i32 6>
466   ret <8 x double> %shuffle
467 }
468
469 define <8 x double> @shuffle_v8f64_00015444(<8 x double> %a, <8 x double> %b) {
470 ; ALL-LABEL: shuffle_v8f64_00015444:
471 ; ALL:       # BB#0:
472 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,0,0,1]
473 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
474 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,0,0,0]
475 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
476 ; ALL-NEXT:    retq
477   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 1, i32 5, i32 4, i32 4, i32 4>
478   ret <8 x double> %shuffle
479 }
480
481 define <8 x double> @shuffle_v8f64_00204644(<8 x double> %a, <8 x double> %b) {
482 ; ALL-LABEL: shuffle_v8f64_00204644:
483 ; ALL:       # BB#0:
484 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,0,2,0]
485 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
486 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,0,0]
487 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
488 ; ALL-NEXT:    retq
489   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 0, i32 4, i32 6, i32 4, i32 4>
490   ret <8 x double> %shuffle
491 }
492
493 define <8 x double> @shuffle_v8f64_03004474(<8 x double> %a, <8 x double> %b) {
494 ; ALL-LABEL: shuffle_v8f64_03004474:
495 ; ALL:       # BB#0:
496 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[0,3,0,0]
497 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
498 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,3,0]
499 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
500 ; ALL-NEXT:    retq
501   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 3, i32 0, i32 0, i32 4, i32 4, i32 7, i32 4>
502   ret <8 x double> %shuffle
503 }
504
505 define <8 x double> @shuffle_v8f64_10004444(<8 x double> %a, <8 x double> %b) {
506 ; ALL-LABEL: shuffle_v8f64_10004444:
507 ; ALL:       # BB#0:
508 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[1,0,0,0]
509 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
510 ; ALL-NEXT:    vbroadcastsd %xmm0, %ymm0
511 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
512 ; ALL-NEXT:    retq
513   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 0, i32 0, i32 0, i32 4, i32 4, i32 4, i32 4>
514   ret <8 x double> %shuffle
515 }
516
517 define <8 x double> @shuffle_v8f64_22006446(<8 x double> %a, <8 x double> %b) {
518 ; ALL-LABEL: shuffle_v8f64_22006446:
519 ; ALL:       # BB#0:
520 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[2,2,0,0]
521 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
522 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,0,0,2]
523 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
524 ; ALL-NEXT:    retq
525   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 2, i32 2, i32 0, i32 0, i32 6, i32 4, i32 4, i32 6>
526   ret <8 x double> %shuffle
527 }
528
529 define <8 x double> @shuffle_v8f64_33307474(<8 x double> %a, <8 x double> %b) {
530 ; ALL-LABEL: shuffle_v8f64_33307474:
531 ; ALL:       # BB#0:
532 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[3,3,3,0]
533 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
534 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[3,0,3,0]
535 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
536 ; ALL-NEXT:    retq
537   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 3, i32 3, i32 3, i32 0, i32 7, i32 4, i32 7, i32 4>
538   ret <8 x double> %shuffle
539 }
540
541 define <8 x double> @shuffle_v8f64_32104567(<8 x double> %a, <8 x double> %b) {
542 ; ALL-LABEL: shuffle_v8f64_32104567:
543 ; ALL:       # BB#0:
544 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm0[3,2,1,0]
545 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
546 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
547 ; ALL-NEXT:    retq
548   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 4, i32 5, i32 6, i32 7>
549   ret <8 x double> %shuffle
550 }
551
552 define <8 x double> @shuffle_v8f64_00236744(<8 x double> %a, <8 x double> %b) {
553 ; ALL-LABEL: shuffle_v8f64_00236744:
554 ; ALL:       # BB#0:
555 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[0,0,2,3]
556 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
557 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,3,0,0]
558 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
559 ; ALL-NEXT:    retq
560   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 3, i32 6, i32 7, i32 4, i32 4>
561   ret <8 x double> %shuffle
562 }
563
564 define <8 x double> @shuffle_v8f64_00226644(<8 x double> %a, <8 x double> %b) {
565 ; ALL-LABEL: shuffle_v8f64_00226644:
566 ; ALL:       # BB#0:
567 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[0,0,2,2]
568 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
569 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,2,0,0]
570 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
571 ; ALL-NEXT:    retq
572   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 6, i32 6, i32 4, i32 4>
573   ret <8 x double> %shuffle
574 }
575
576 define <8 x double> @shuffle_v8f64_10324567(<8 x double> %a, <8 x double> %b) {
577 ; ALL-LABEL: shuffle_v8f64_10324567:
578 ; ALL:       # BB#0:
579 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,0,3,2]
580 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
581 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
582 ; ALL-NEXT:    retq
583   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 4, i32 5, i32 6, i32 7>
584   ret <8 x double> %shuffle
585 }
586
587 define <8 x double> @shuffle_v8f64_11334567(<8 x double> %a, <8 x double> %b) {
588 ; ALL-LABEL: shuffle_v8f64_11334567:
589 ; ALL:       # BB#0:
590 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,1,3,3]
591 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
592 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
593 ; ALL-NEXT:    retq
594   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 4, i32 5, i32 6, i32 7>
595   ret <8 x double> %shuffle
596 }
597
598 define <8 x double> @shuffle_v8f64_01235467(<8 x double> %a, <8 x double> %b) {
599 ; ALL-LABEL: shuffle_v8f64_01235467:
600 ; ALL:       # BB#0:
601 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1 
602 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm1[1,0,2,3]
603 ; ALL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
604 ; ALL-NEXT:    retq
605   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 5, i32 4, i32 6, i32 7>
606   ret <8 x double> %shuffle
607 }
608
609 define <8 x double> @shuffle_v8f64_01235466(<8 x double> %a, <8 x double> %b) {
610 ; ALL-LABEL: shuffle_v8f64_01235466:
611 ; ALL:       # BB#0:
612 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1 
613 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm1[1,0,2,2]
614 ; ALL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
615 ; ALL-NEXT:    retq
616   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 5, i32 4, i32 6, i32 6>
617   ret <8 x double> %shuffle
618 }
619
620 define <8 x double> @shuffle_v8f64_002u6u44(<8 x double> %a, <8 x double> %b) {
621 ; ALL-LABEL: shuffle_v8f64_002u6u44:
622 ; ALL:       # BB#0:
623 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[0,0,2,2]
624 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
625 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,1,0,0]
626 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
627 ; ALL-NEXT:    retq
628   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 undef, i32 6, i32 undef, i32 4, i32 4>
629   ret <8 x double> %shuffle
630 }
631
632 define <8 x double> @shuffle_v8f64_00uu66uu(<8 x double> %a, <8 x double> %b) {
633 ; ALL-LABEL: shuffle_v8f64_00uu66uu:
634 ; ALL:       # BB#0:
635 ; ALL-NEXT:    vbroadcastsd %xmm0, %ymm1
636 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
637 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,2,2,3]
638 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
639 ; ALL-NEXT:    retq
640   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 0, i32 undef, i32 undef, i32 6, i32 6, i32 undef, i32 undef>
641   ret <8 x double> %shuffle
642 }
643
644 define <8 x double> @shuffle_v8f64_103245uu(<8 x double> %a, <8 x double> %b) {
645 ; ALL-LABEL: shuffle_v8f64_103245uu:
646 ; ALL:       # BB#0:
647 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,0,3,2]
648 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
649 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
650 ; ALL-NEXT:    retq
651   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 4, i32 5, i32 undef, i32 undef>
652   ret <8 x double> %shuffle
653 }
654
655 define <8 x double> @shuffle_v8f64_1133uu67(<8 x double> %a, <8 x double> %b) {
656 ; ALL-LABEL: shuffle_v8f64_1133uu67:
657 ; ALL:       # BB#0:
658 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm0[1,1,3,3]
659 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0 
660 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
661 ; ALL-NEXT:    retq
662   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 undef, i32 undef, i32 6, i32 7>
663   ret <8 x double> %shuffle
664 }
665
666 define <8 x double> @shuffle_v8f64_0uu354uu(<8 x double> %a, <8 x double> %b) {
667 ; ALL-LABEL: shuffle_v8f64_0uu354uu:
668 ; ALL:       # BB#0:
669 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1 
670 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm1[1,0,2,2]
671 ; ALL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
672 ; ALL-NEXT:    retq
673   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 0, i32 undef, i32 undef, i32 3, i32 5, i32 4, i32 undef, i32 undef>
674   ret <8 x double> %shuffle
675 }
676
677 define <8 x double> @shuffle_v8f64_uuu3uu66(<8 x double> %a, <8 x double> %b) {
678 ; ALL-LABEL: shuffle_v8f64_uuu3uu66:
679 ; ALL:       # BB#0:
680 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1 
681 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm1[0,0,2,2]
682 ; ALL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
683 ; ALL-NEXT:    retq
684   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 3, i32 undef, i32 undef, i32 6, i32 6>
685   ret <8 x double> %shuffle
686 }
687
688 define <8 x double> @shuffle_v8f64_c348cda0(<8 x double> %a, <8 x double> %b) {
689 ; ALL-LABEL: shuffle_v8f64_c348cda0:
690 ; ALL:       # BB#0:
691 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm2 
692 ; ALL-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[0,1],ymm2[0,1]
693 ; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm3 
694 ; ALL-NEXT:    vbroadcastsd %xmm1, %ymm4
695 ; ALL-NEXT:    vblendpd {{.*#+}} ymm4 = ymm3[0,1,2],ymm4[3]
696 ; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm4[0],ymm2[1,2],ymm4[3]
697 ; ALL-NEXT:    vblendpd {{.*#+}} ymm1 = ymm3[0,1],ymm1[2],ymm3[3]
698 ; ALL-NEXT:    vbroadcastsd %xmm0, %ymm0
699 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0,1,2],ymm0[3]
700 ; ALL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm2, %zmm0
701 ; ALL-NEXT:    retq
702   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 12, i32 3, i32 4, i32 8, i32 12, i32 13, i32 10, i32 0>
703   ret <8 x double> %shuffle
704 }
705
706 define <8 x double> @shuffle_v8f64_f511235a(<8 x double> %a, <8 x double> %b) {
707 ; ALL-LABEL: shuffle_v8f64_f511235a:
708 ; ALL:       # BB#0:
709 ; ALL-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,0,1]
710 ; ALL-NEXT:    vextractf64x4 $1, %zmm0, %ymm3 
711 ; ALL-NEXT:    vpermpd {{.*#+}} ymm4 = ymm3[0,1,1,3]
712 ; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm2[0,1],ymm4[2],ymm2[3]
713 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm4 = ymm1[0,0,2,2]
714 ; ALL-NEXT:    vblendpd {{.*#+}} ymm2 = ymm2[0,1,2],ymm4[3]
715 ; ALL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,1,1,1]
716 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm3[1],ymm0[2,3]
717 ; ALL-NEXT:    vextractf64x4 $1, %zmm1, %ymm1 
718 ; ALL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[3,1,2,3]
719 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3]
720 ; ALL-NEXT:    vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
721 ; ALL-NEXT:    retq
722   %shuffle = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 15, i32 5, i32 1, i32 1, i32 2, i32 3, i32 5, i32 10>
723   ret <8 x double> %shuffle
724 }
725
726 define <8 x i64> @shuffle_v8i64_00000000(<8 x i64> %a, <8 x i64> %b) {
727 ; ALL-LABEL: shuffle_v8i64_00000000:
728 ; ALL:       # BB#0:
729 ; ALL-NEXT:    vpbroadcastq %xmm0, %zmm0
730 ; ALL-NEXT:    retq
731   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
732   ret <8 x i64> %shuffle
733 }
734
735 define <8 x i64> @shuffle_v8i64_00000010(<8 x i64> %a, <8 x i64> %b) {
736 ; ALL-LABEL: shuffle_v8i64_00000010:
737 ; ALL:       # BB#0:
738 ; ALL-NEXT:    vpbroadcastq %xmm0, %ymm1
739 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,1,0]
740 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
741 ; ALL-NEXT:    retq
742   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0>
743   ret <8 x i64> %shuffle
744 }
745
746 define <8 x i64> @shuffle_v8i64_00000200(<8 x i64> %a, <8 x i64> %b) {
747 ; ALL-LABEL: shuffle_v8i64_00000200:
748 ; ALL:       # BB#0:
749 ; ALL-NEXT:    vpbroadcastq %xmm0, %ymm1
750 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,0,0]
751 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
752 ; ALL-NEXT:    retq
753   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 2, i32 0, i32 0>
754   ret <8 x i64> %shuffle
755 }
756
757 define <8 x i64> @shuffle_v8i64_00003000(<8 x i64> %a, <8 x i64> %b) {
758 ; ALL-LABEL: shuffle_v8i64_00003000:
759 ; ALL:       # BB#0:
760 ; ALL-NEXT:    vpbroadcastq %xmm0, %ymm1
761 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[3,0,0,0]
762 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
763 ; ALL-NEXT:    retq
764   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 3, i32 0, i32 0, i32 0>
765   ret <8 x i64> %shuffle
766 }
767
768 define <8 x i64> @shuffle_v8i64_00040000(<8 x i64> %a, <8 x i64> %b) {
769 ; ALL-LABEL: shuffle_v8i64_00040000:
770 ; ALL:       # BB#0:
771 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1 
772 ; ALL-NEXT:    vpbroadcastq %xmm1, %ymm1
773 ; ALL-NEXT:    vpbroadcastq %xmm0, %ymm0
774 ; ALL-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3,4,5],ymm1[6,7]
775 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
776 ; ALL-NEXT:    retq
777   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 4, i32 0, i32 0, i32 0, i32 0>
778   ret <8 x i64> %shuffle
779 }
780
781 define <8 x i64> @shuffle_v8i64_00500000(<8 x i64> %a, <8 x i64> %b) {
782 ; ALL-LABEL: shuffle_v8i64_00500000:
783 ; ALL:       # BB#0:
784 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1 
785 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3]
786 ; ALL-NEXT:    vpbroadcastq %xmm0, %ymm0
787 ; ALL-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5],ymm0[6,7]
788 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
789 ; ALL-NEXT:    retq
790   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 5, i32 0, i32 0, i32 0, i32 0, i32 0>
791   ret <8 x i64> %shuffle
792 }
793
794 define <8 x i64> @shuffle_v8i64_06000000(<8 x i64> %a, <8 x i64> %b) {
795 ; ALL-LABEL: shuffle_v8i64_06000000:
796 ; ALL:       # BB#0:
797 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1 
798 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
799 ; ALL-NEXT:    vpbroadcastq %xmm0, %ymm0
800 ; ALL-NEXT:    vpblendd {{.*#+}} ymm1 = ymm0[0,1],ymm1[2,3],ymm0[4,5,6,7]
801 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
802 ; ALL-NEXT:    retq
803   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 6, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
804   ret <8 x i64> %shuffle
805 }
806
807 define <8 x i64> @shuffle_v8i64_70000000(<8 x i64> %a, <8 x i64> %b) {
808 ; ALL-LABEL: shuffle_v8i64_70000000:
809 ; ALL:       # BB#0:
810 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1 
811 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[3,1,2,3]
812 ; ALL-NEXT:    vpbroadcastq %xmm0, %ymm0
813 ; ALL-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0,1],ymm0[2,3,4,5,6,7]
814 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
815 ; ALL-NEXT:    retq
816   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 7, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
817   ret <8 x i64> %shuffle
818 }
819
820 define <8 x i64> @shuffle_v8i64_01014545(<8 x i64> %a, <8 x i64> %b) {
821 ; ALL-LABEL: shuffle_v8i64_01014545:
822 ; ALL:       # BB#0:
823 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1 
824 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm1, %ymm1
825 ; ALL-NEXT:    vinserti128 $1, %xmm0, %ymm0, %ymm0
826 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
827 ; ALL-NEXT:    retq
828   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5>
829   ret <8 x i64> %shuffle
830 }
831
832 define <8 x i64> @shuffle_v8i64_00112233(<8 x i64> %a, <8 x i64> %b) {
833 ; ALL-LABEL: shuffle_v8i64_00112233:
834 ; ALL:       # BB#0:
835 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[0,0,1,1]
836 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,2,3,3]
837 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
838 ; ALL-NEXT:    retq
839   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 1, i32 1, i32 2, i32 2, i32 3, i32 3>
840   ret <8 x i64> %shuffle
841 }
842
843 define <8 x i64> @shuffle_v8i64_00001111(<8 x i64> %a, <8 x i64> %b) {
844 ; ALL-LABEL: shuffle_v8i64_00001111:
845 ; ALL:       # BB#0:
846 ; ALL-NEXT:    vpbroadcastq %xmm0, %ymm1
847 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[1,1,1,1]
848 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
849 ; ALL-NEXT:    retq
850   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>
851   ret <8 x i64> %shuffle
852 }
853
854 define <8 x i64> @shuffle_v8i64_81a3c5e7(<8 x i64> %a, <8 x i64> %b) {
855 ; ALL-LABEL: shuffle_v8i64_81a3c5e7:
856 ; ALL:       # BB#0:
857 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2 
858 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm3 
859 ; ALL-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0,1],ymm2[2,3],ymm3[4,5],ymm2[6,7]
860 ; ALL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3],ymm1[4,5],ymm0[6,7]
861 ; ALL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
862 ; ALL-NEXT:    retq
863   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7>
864   ret <8 x i64> %shuffle
865 }
866
867 define <8 x i64> @shuffle_v8i64_08080808(<8 x i64> %a, <8 x i64> %b) {
868 ; ALL-LABEL: shuffle_v8i64_08080808:
869 ; ALL:       # BB#0:
870 ; ALL-NEXT:    vinserti128 $1, %xmm0, %ymm0, %ymm0
871 ; ALL-NEXT:    vpbroadcastq %xmm1, %ymm1
872 ; ALL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
873 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
874 ; ALL-NEXT:    retq
875   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 8, i32 0, i32 8, i32 0, i32 8, i32 0, i32 8>
876   ret <8 x i64> %shuffle
877 }
878
879 define <8 x i64> @shuffle_v8i64_08084c4c(<8 x i64> %a, <8 x i64> %b) {
880 ; ALL-LABEL: shuffle_v8i64_08084c4c:
881 ; ALL:       # BB#0:
882 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2 
883 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm2, %ymm2
884 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm3 
885 ; ALL-NEXT:    vpbroadcastq %xmm3, %ymm3
886 ; ALL-NEXT:    vpblendd {{.*#+}} ymm2 = ymm2[0,1],ymm3[2,3],ymm2[4,5],ymm3[6,7]
887 ; ALL-NEXT:    vinserti128 $1, %xmm0, %ymm0, %ymm0
888 ; ALL-NEXT:    vpbroadcastq %xmm1, %ymm1
889 ; ALL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
890 ; ALL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
891 ; ALL-NEXT:    retq
892   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 8, i32 0, i32 8, i32 4, i32 12, i32 4, i32 12>
893   ret <8 x i64> %shuffle
894 }
895
896 define <8 x i64> @shuffle_v8i64_8823cc67(<8 x i64> %a, <8 x i64> %b) {
897 ; ALL-LABEL: shuffle_v8i64_8823cc67:
898 ; ALL:       # BB#0:
899 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2 
900 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm3 
901 ; ALL-NEXT:    vpbroadcastq %xmm3, %ymm3
902 ; ALL-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0,1,2,3],ymm2[4,5,6,7]
903 ; ALL-NEXT:    vpbroadcastq %xmm1, %ymm1
904 ; ALL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
905 ; ALL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
906 ; ALL-NEXT:    retq
907   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 8, i32 8, i32 2, i32 3, i32 12, i32 12, i32 6, i32 7>
908   ret <8 x i64> %shuffle
909 }
910
911 define <8 x i64> @shuffle_v8i64_9832dc76(<8 x i64> %a, <8 x i64> %b) {
912 ; ALL-LABEL: shuffle_v8i64_9832dc76:
913 ; ALL:       # BB#0:
914 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2 
915 ; ALL-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[2,3,0,1,6,7,4,5]
916 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm3 
917 ; ALL-NEXT:    vpshufd {{.*#+}} ymm3 = ymm3[2,3,0,1,6,7,4,5]
918 ; ALL-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0,1,2,3],ymm2[4,5,6,7]
919 ; ALL-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
920 ; ALL-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[2,3,0,1,6,7,4,5]
921 ; ALL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
922 ; ALL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
923 ; ALL-NEXT:    retq
924   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 9, i32 8, i32 3, i32 2, i32 13, i32 12, i32 7, i32 6>
925   ret <8 x i64> %shuffle
926 }
927
928 define <8 x i64> @shuffle_v8i64_9810dc54(<8 x i64> %a, <8 x i64> %b) {
929 ; ALL-LABEL: shuffle_v8i64_9810dc54:
930 ; ALL:       # BB#0:
931 ; ALL-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm2
932 ; ALL-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[2,3,0,1,6,7,4,5]
933 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
934 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0
935 ; ALL-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
936 ; ALL-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
937 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm2, %zmm0
938 ; ALL-NEXT:    retq
939   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 9, i32 8, i32 1, i32 0, i32 13, i32 12, i32 5, i32 4>
940   ret <8 x i64> %shuffle
941 }
942
943 define <8 x i64> @shuffle_v8i64_08194c5d(<8 x i64> %a, <8 x i64> %b) {
944 ; ALL-LABEL: shuffle_v8i64_08194c5d:
945 ; ALL:       # BB#0:
946 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm2 
947 ; ALL-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,0,2,1]
948 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm3 
949 ; ALL-NEXT:    vpermq {{.*#+}} ymm3 = ymm3[0,1,1,3]
950 ; ALL-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0,1],ymm2[2,3],ymm3[4,5],ymm2[6,7]
951 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,0,2,1]
952 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,1,3]
953 ; ALL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
954 ; ALL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
955 ; ALL-NEXT:    retq
956   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 4, i32 12, i32 5, i32 13>
957   ret <8 x i64> %shuffle
958 }
959
960 define <8 x i64> @shuffle_v8i64_2a3b6e7f(<8 x i64> %a, <8 x i64> %b) {
961 ; ALL-LABEL: shuffle_v8i64_2a3b6e7f:
962 ; ALL:       # BB#0:
963 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm2 
964 ; ALL-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
965 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm3 
966 ; ALL-NEXT:    vpermq {{.*#+}} ymm3 = ymm3[2,1,3,3]
967 ; ALL-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0,1],ymm2[2,3],ymm3[4,5],ymm2[6,7]
968 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
969 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,1,3,3]
970 ; ALL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
971 ; ALL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
972 ; ALL-NEXT:    retq
973   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 2, i32 10, i32 3, i32 11, i32 6, i32 14, i32 7, i32 15>
974   ret <8 x i64> %shuffle
975 }
976
977 define <8 x i64> @shuffle_v8i64_08192a3b(<8 x i64> %a, <8 x i64> %b) {
978 ; ALL-LABEL: shuffle_v8i64_08192a3b:
979 ; ALL:       # BB#0:
980 ; ALL-NEXT:    vpermq {{.*#+}} ymm2 = ymm1[0,2,2,3]
981 ; ALL-NEXT:    vpermq {{.*#+}} ymm3 = ymm0[2,1,3,3]
982 ; ALL-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0,1],ymm2[2,3],ymm3[4,5],ymm2[6,7]
983 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,0,2,1]
984 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,1,3]
985 ; ALL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
986 ; ALL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
987 ; ALL-NEXT:    retq
988   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
989   ret <8 x i64> %shuffle
990 }
991
992 define <8 x i64> @shuffle_v8i64_08991abb(<8 x i64> %a, <8 x i64> %b) {
993 ; ALL-LABEL: shuffle_v8i64_08991abb:
994 ; ALL:       # BB#0:
995 ; ALL-NEXT:    vpshufd {{.*#+}} ymm2 = ymm0[2,3,2,3,6,7,6,7]
996 ; ALL-NEXT:    vpermq {{.*#+}} ymm3 = ymm1[0,2,3,3]
997 ; ALL-NEXT:    vpblendd {{.*#+}} ymm2 = ymm2[0,1],ymm3[2,3,4,5,6,7]
998 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,0,1,1]
999 ; ALL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3,4,5,6,7]
1000 ; ALL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
1001 ; ALL-NEXT:    retq
1002   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 8, i32 9, i32 9, i32 1, i32 10, i32 11, i32 11>
1003   ret <8 x i64> %shuffle
1004 }
1005
1006 define <8 x i64> @shuffle_v8i64_091b2d3f(<8 x i64> %a, <8 x i64> %b) {
1007 ; ALL-LABEL: shuffle_v8i64_091b2d3f:
1008 ; ALL:       # BB#0:
1009 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm2 
1010 ; ALL-NEXT:    vpermq {{.*#+}} ymm3 = ymm0[2,1,3,3]
1011 ; ALL-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0,1],ymm2[2,3],ymm3[4,5],ymm2[6,7]
1012 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,1,3]
1013 ; ALL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
1014 ; ALL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
1015 ; ALL-NEXT:    retq
1016   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 9, i32 1, i32 11, i32 2, i32 13, i32 3, i32 15>
1017   ret <8 x i64> %shuffle
1018 }
1019
1020 define <8 x i64> @shuffle_v8i64_09ab1def(<8 x i64> %a, <8 x i64> %b) {
1021 ; ALL-LABEL: shuffle_v8i64_09ab1def:
1022 ; ALL:       # BB#0:
1023 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm2 
1024 ; ALL-NEXT:    vpshufd {{.*#+}} ymm3 = ymm0[2,3,2,3,6,7,6,7]
1025 ; ALL-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0,1],ymm2[2,3,4,5,6,7]
1026 ; ALL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3,4,5,6,7]
1027 ; ALL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
1028 ; ALL-NEXT:    retq
1029   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 9, i32 10, i32 11, i32 1, i32 13, i32 14, i32 15>
1030   ret <8 x i64> %shuffle
1031 }
1032
1033 define <8 x i64> @shuffle_v8i64_00014445(<8 x i64> %a, <8 x i64> %b) {
1034 ; ALL-LABEL: shuffle_v8i64_00014445:
1035 ; ALL:       # BB#0:
1036 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[0,0,0,1]
1037 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1038 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,0,1]
1039 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1040 ; ALL-NEXT:    retq
1041   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 1, i32 4, i32 4, i32 4, i32 5>
1042   ret <8 x i64> %shuffle
1043 }
1044
1045 define <8 x i64> @shuffle_v8i64_00204464(<8 x i64> %a, <8 x i64> %b) {
1046 ; ALL-LABEL: shuffle_v8i64_00204464:
1047 ; ALL:       # BB#0:
1048 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[0,0,2,0]
1049 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1050 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,2,0]
1051 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1052 ; ALL-NEXT:    retq
1053   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 0, i32 4, i32 4, i32 6, i32 4>
1054   ret <8 x i64> %shuffle
1055 }
1056
1057 define <8 x i64> @shuffle_v8i64_03004744(<8 x i64> %a, <8 x i64> %b) {
1058 ; ALL-LABEL: shuffle_v8i64_03004744:
1059 ; ALL:       # BB#0:
1060 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[0,3,0,0]
1061 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1062 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,0,0]
1063 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1064 ; ALL-NEXT:    retq
1065   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 3, i32 0, i32 0, i32 4, i32 7, i32 4, i32 4>
1066   ret <8 x i64> %shuffle
1067 }
1068
1069 define <8 x i64> @shuffle_v8i64_10005444(<8 x i64> %a, <8 x i64> %b) {
1070 ; ALL-LABEL: shuffle_v8i64_10005444:
1071 ; ALL:       # BB#0:
1072 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[1,0,0,0]
1073 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1074 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[1,0,0,0]
1075 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1076 ; ALL-NEXT:    retq
1077   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 1, i32 0, i32 0, i32 0, i32 5, i32 4, i32 4, i32 4>
1078   ret <8 x i64> %shuffle
1079 }
1080
1081 define <8 x i64> @shuffle_v8i64_22006644(<8 x i64> %a, <8 x i64> %b) {
1082 ; ALL-LABEL: shuffle_v8i64_22006644:
1083 ; ALL:       # BB#0:
1084 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[2,2,0,0]
1085 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1086 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,2,0,0]
1087 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1088 ; ALL-NEXT:    retq
1089   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 2, i32 2, i32 0, i32 0, i32 6, i32 6, i32 4, i32 4>
1090   ret <8 x i64> %shuffle
1091 }
1092
1093 define <8 x i64> @shuffle_v8i64_33307774(<8 x i64> %a, <8 x i64> %b) {
1094 ; ALL-LABEL: shuffle_v8i64_33307774:
1095 ; ALL:       # BB#0:
1096 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[3,3,3,0]
1097 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1098 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[3,3,3,0]
1099 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1100 ; ALL-NEXT:    retq
1101   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 3, i32 3, i32 3, i32 0, i32 7, i32 7, i32 7, i32 4>
1102   ret <8 x i64> %shuffle
1103 }
1104
1105 define <8 x i64> @shuffle_v8i64_32107654(<8 x i64> %a, <8 x i64> %b) {
1106 ; ALL-LABEL: shuffle_v8i64_32107654:
1107 ; ALL:       # BB#0:
1108 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[3,2,1,0]
1109 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1110 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[3,2,1,0]
1111 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1112 ; ALL-NEXT:    retq
1113   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
1114   ret <8 x i64> %shuffle
1115 }
1116
1117 define <8 x i64> @shuffle_v8i64_00234467(<8 x i64> %a, <8 x i64> %b) {
1118 ; ALL-LABEL: shuffle_v8i64_00234467:
1119 ; ALL:       # BB#0:
1120 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[0,0,2,3]
1121 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1122 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,2,3]
1123 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1124 ; ALL-NEXT:    retq
1125   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 3, i32 4, i32 4, i32 6, i32 7>
1126   ret <8 x i64> %shuffle
1127 }
1128
1129 define <8 x i64> @shuffle_v8i64_00224466(<8 x i64> %a, <8 x i64> %b) {
1130 ; ALL-LABEL: shuffle_v8i64_00224466:
1131 ; ALL:       # BB#0:
1132 ; ALL-NEXT:    vpshufd {{.*#+}} ymm1 = ymm0[0,1,0,1,4,5,4,5]
1133 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1134 ; ALL-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[0,1,0,1,4,5,4,5]
1135 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1136 ; ALL-NEXT:    retq
1137   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>
1138   ret <8 x i64> %shuffle
1139 }
1140
1141 define <8 x i64> @shuffle_v8i64_10325476(<8 x i64> %a, <8 x i64> %b) {
1142 ; ALL-LABEL: shuffle_v8i64_10325476:
1143 ; ALL:       # BB#0:
1144 ; ALL-NEXT:    vpshufd {{.*#+}} ymm1 = ymm0[2,3,0,1,6,7,4,5]
1145 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1146 ; ALL-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
1147 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1148 ; ALL-NEXT:    retq
1149   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
1150   ret <8 x i64> %shuffle
1151 }
1152
1153 define <8 x i64> @shuffle_v8i64_11335577(<8 x i64> %a, <8 x i64> %b) {
1154 ; ALL-LABEL: shuffle_v8i64_11335577:
1155 ; ALL:       # BB#0:
1156 ; ALL-NEXT:    vpshufd {{.*#+}} ymm1 = ymm0[2,3,2,3,6,7,6,7]
1157 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1158 ; ALL-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,2,3,6,7,6,7]
1159 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1160 ; ALL-NEXT:    retq
1161   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>
1162   ret <8 x i64> %shuffle
1163 }
1164
1165 define <8 x i64> @shuffle_v8i64_10235467(<8 x i64> %a, <8 x i64> %b) {
1166 ; ALL-LABEL: shuffle_v8i64_10235467:
1167 ; ALL:       # BB#0:
1168 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[1,0,2,3]
1169 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1170 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[1,0,2,3]
1171 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1172 ; ALL-NEXT:    retq
1173   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 1, i32 0, i32 2, i32 3, i32 5, i32 4, i32 6, i32 7>
1174   ret <8 x i64> %shuffle
1175 }
1176
1177 define <8 x i64> @shuffle_v8i64_10225466(<8 x i64> %a, <8 x i64> %b) {
1178 ; ALL-LABEL: shuffle_v8i64_10225466:
1179 ; ALL:       # BB#0:
1180 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[1,0,2,2]
1181 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1182 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[1,0,2,2]
1183 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1184 ; ALL-NEXT:    retq
1185   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 1, i32 0, i32 2, i32 2, i32 5, i32 4, i32 6, i32 6>
1186   ret <8 x i64> %shuffle
1187 }
1188
1189 define <8 x i64> @shuffle_v8i64_00015444(<8 x i64> %a, <8 x i64> %b) {
1190 ; ALL-LABEL: shuffle_v8i64_00015444:
1191 ; ALL:       # BB#0:
1192 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[0,0,0,1]
1193 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1194 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[1,0,0,0]
1195 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1196 ; ALL-NEXT:    retq
1197   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 0, i32 1, i32 5, i32 4, i32 4, i32 4>
1198   ret <8 x i64> %shuffle
1199 }
1200
1201 define <8 x i64> @shuffle_v8i64_00204644(<8 x i64> %a, <8 x i64> %b) {
1202 ; ALL-LABEL: shuffle_v8i64_00204644:
1203 ; ALL:       # BB#0:
1204 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[0,0,2,0]
1205 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1206 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,0,0]
1207 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1208 ; ALL-NEXT:    retq
1209   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 0, i32 4, i32 6, i32 4, i32 4>
1210   ret <8 x i64> %shuffle
1211 }
1212
1213 define <8 x i64> @shuffle_v8i64_03004474(<8 x i64> %a, <8 x i64> %b) {
1214 ; ALL-LABEL: shuffle_v8i64_03004474:
1215 ; ALL:       # BB#0:
1216 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[0,3,0,0]
1217 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1218 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,3,0]
1219 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1220 ; ALL-NEXT:    retq
1221   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 3, i32 0, i32 0, i32 4, i32 4, i32 7, i32 4>
1222   ret <8 x i64> %shuffle
1223 }
1224
1225 define <8 x i64> @shuffle_v8i64_10004444(<8 x i64> %a, <8 x i64> %b) {
1226 ; ALL-LABEL: shuffle_v8i64_10004444:
1227 ; ALL:       # BB#0:
1228 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[1,0,0,0]
1229 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1230 ; ALL-NEXT:    vpbroadcastq %xmm0, %ymm0
1231 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1232 ; ALL-NEXT:    retq
1233   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 1, i32 0, i32 0, i32 0, i32 4, i32 4, i32 4, i32 4>
1234   ret <8 x i64> %shuffle
1235 }
1236
1237 define <8 x i64> @shuffle_v8i64_22006446(<8 x i64> %a, <8 x i64> %b) {
1238 ; ALL-LABEL: shuffle_v8i64_22006446:
1239 ; ALL:       # BB#0:
1240 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[2,2,0,0]
1241 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1242 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,0,0,2]
1243 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1244 ; ALL-NEXT:    retq
1245   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 2, i32 2, i32 0, i32 0, i32 6, i32 4, i32 4, i32 6>
1246   ret <8 x i64> %shuffle
1247 }
1248
1249 define <8 x i64> @shuffle_v8i64_33307474(<8 x i64> %a, <8 x i64> %b) {
1250 ; ALL-LABEL: shuffle_v8i64_33307474:
1251 ; ALL:       # BB#0:
1252 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[3,3,3,0]
1253 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1254 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[3,0,3,0]
1255 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1256 ; ALL-NEXT:    retq
1257   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 3, i32 3, i32 3, i32 0, i32 7, i32 4, i32 7, i32 4>
1258   ret <8 x i64> %shuffle
1259 }
1260
1261 define <8 x i64> @shuffle_v8i64_32104567(<8 x i64> %a, <8 x i64> %b) {
1262 ; ALL-LABEL: shuffle_v8i64_32104567:
1263 ; ALL:       # BB#0:
1264 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[3,2,1,0]
1265 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1266 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1267 ; ALL-NEXT:    retq
1268   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 4, i32 5, i32 6, i32 7>
1269   ret <8 x i64> %shuffle
1270 }
1271
1272 define <8 x i64> @shuffle_v8i64_00236744(<8 x i64> %a, <8 x i64> %b) {
1273 ; ALL-LABEL: shuffle_v8i64_00236744:
1274 ; ALL:       # BB#0:
1275 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm0[0,0,2,3]
1276 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1277 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,3,0,0]
1278 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1279 ; ALL-NEXT:    retq
1280   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 3, i32 6, i32 7, i32 4, i32 4>
1281   ret <8 x i64> %shuffle
1282 }
1283
1284 define <8 x i64> @shuffle_v8i64_00226644(<8 x i64> %a, <8 x i64> %b) {
1285 ; ALL-LABEL: shuffle_v8i64_00226644:
1286 ; ALL:       # BB#0:
1287 ; ALL-NEXT:    vpshufd {{.*#+}} ymm1 = ymm0[0,1,0,1,4,5,4,5]
1288 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1289 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,2,0,0]
1290 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1291 ; ALL-NEXT:    retq
1292   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 6, i32 6, i32 4, i32 4>
1293   ret <8 x i64> %shuffle
1294 }
1295
1296 define <8 x i64> @shuffle_v8i64_10324567(<8 x i64> %a, <8 x i64> %b) {
1297 ; ALL-LABEL: shuffle_v8i64_10324567:
1298 ; ALL:       # BB#0:
1299 ; ALL-NEXT:    vpshufd {{.*#+}} ymm1 = ymm0[2,3,0,1,6,7,4,5]
1300 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1301 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1302 ; ALL-NEXT:    retq
1303   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 4, i32 5, i32 6, i32 7>
1304   ret <8 x i64> %shuffle
1305 }
1306
1307 define <8 x i64> @shuffle_v8i64_11334567(<8 x i64> %a, <8 x i64> %b) {
1308 ; ALL-LABEL: shuffle_v8i64_11334567:
1309 ; ALL:       # BB#0:
1310 ; ALL-NEXT:    vpshufd {{.*#+}} ymm1 = ymm0[2,3,2,3,6,7,6,7]
1311 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1312 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1313 ; ALL-NEXT:    retq
1314   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 4, i32 5, i32 6, i32 7>
1315   ret <8 x i64> %shuffle
1316 }
1317
1318 define <8 x i64> @shuffle_v8i64_01235467(<8 x i64> %a, <8 x i64> %b) {
1319 ; ALL-LABEL: shuffle_v8i64_01235467:
1320 ; ALL:       # BB#0:
1321 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1 
1322 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[1,0,2,3]
1323 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1324 ; ALL-NEXT:    retq
1325   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 5, i32 4, i32 6, i32 7>
1326   ret <8 x i64> %shuffle
1327 }
1328
1329 define <8 x i64> @shuffle_v8i64_01235466(<8 x i64> %a, <8 x i64> %b) {
1330 ; ALL-LABEL: shuffle_v8i64_01235466:
1331 ; ALL:       # BB#0:
1332 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1 
1333 ; ALL-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[1,0,2,2]
1334 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1335 ; ALL-NEXT:    retq
1336   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 5, i32 4, i32 6, i32 6>
1337   ret <8 x i64> %shuffle
1338 }
1339
1340 define <8 x i64> @shuffle_v8i64_002u6u44(<8 x i64> %a, <8 x i64> %b) {
1341 ; ALL-LABEL: shuffle_v8i64_002u6u44:
1342 ; ALL:       # BB#0:
1343 ; ALL-NEXT:    vpshufd {{.*#+}} ymm1 = ymm0[0,1,0,1,4,5,4,5]
1344 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1345 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,1,0,0]
1346 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1347 ; ALL-NEXT:    retq
1348   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 undef, i32 6, i32 undef, i32 4, i32 4>
1349   ret <8 x i64> %shuffle
1350 }
1351
1352 define <8 x i64> @shuffle_v8i64_00uu66uu(<8 x i64> %a, <8 x i64> %b) {
1353 ; ALL-LABEL: shuffle_v8i64_00uu66uu:
1354 ; ALL:       # BB#0:
1355 ; ALL-NEXT:    vpbroadcastq %xmm0, %ymm1
1356 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1357 ; ALL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,2,2,3]
1358 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1359 ; ALL-NEXT:    retq
1360   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 0, i32 undef, i32 undef, i32 6, i32 6, i32 undef, i32 undef>
1361   ret <8 x i64> %shuffle
1362 }
1363
1364 define <8 x i64> @shuffle_v8i64_103245uu(<8 x i64> %a, <8 x i64> %b) {
1365 ; ALL-LABEL: shuffle_v8i64_103245uu:
1366 ; ALL:       # BB#0:
1367 ; ALL-NEXT:    vpshufd {{.*#+}} ymm1 = ymm0[2,3,0,1,6,7,4,5]
1368 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1369 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1370 ; ALL-NEXT:    retq
1371   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 4, i32 5, i32 undef, i32 undef>
1372   ret <8 x i64> %shuffle
1373 }
1374
1375 define <8 x i64> @shuffle_v8i64_1133uu67(<8 x i64> %a, <8 x i64> %b) {
1376 ; ALL-LABEL: shuffle_v8i64_1133uu67:
1377 ; ALL:       # BB#0:
1378 ; ALL-NEXT:    vpshufd {{.*#+}} ymm1 = ymm0[2,3,2,3,6,7,6,7]
1379 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1380 ; ALL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1381 ; ALL-NEXT:    retq
1382   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 undef, i32 undef, i32 6, i32 7>
1383   ret <8 x i64> %shuffle
1384 }
1385
1386 define <8 x i64> @shuffle_v8i64_0uu354uu(<8 x i64> %a, <8 x i64> %b) {
1387 ; ALL-LABEL: shuffle_v8i64_0uu354uu:
1388 ; ALL:       # BB#0:
1389 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1 
1390 ; ALL-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[2,3,0,1,6,7,4,5]
1391 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1392 ; ALL-NEXT:    retq
1393   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 0, i32 undef, i32 undef, i32 3, i32 5, i32 4, i32 undef, i32 undef>
1394   ret <8 x i64> %shuffle
1395 }
1396
1397 define <8 x i64> @shuffle_v8i64_uuu3uu66(<8 x i64> %a, <8 x i64> %b) {
1398 ; ALL-LABEL: shuffle_v8i64_uuu3uu66:
1399 ; ALL:       # BB#0:
1400 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1 
1401 ; ALL-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[0,1,0,1,4,5,4,5]
1402 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1403 ; ALL-NEXT:    retq
1404   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 3, i32 undef, i32 undef, i32 6, i32 6>
1405   ret <8 x i64> %shuffle
1406 }
1407
1408 define <8 x i64> @shuffle_v8i64_6caa87e5(<8 x i64> %a, <8 x i64> %b) {
1409 ; ALL-LABEL: shuffle_v8i64_6caa87e5:
1410 ; ALL:       # BB#0:
1411 ; ALL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
1412 ; ALL-NEXT:    vperm2i128 {{.*#+}} ymm2 = ymm0[0,1,0,1]
1413 ; ALL-NEXT:    vextracti64x4 $1, %zmm1, %ymm3 
1414 ; ALL-NEXT:    vpblendd {{.*#+}} ymm4 = ymm1[0,1,2,3],ymm3[4,5],ymm1[6,7]
1415 ; ALL-NEXT:    vpblendd {{.*#+}} ymm2 = ymm4[0,1],ymm2[2,3],ymm4[4,5],ymm2[6,7]
1416 ; ALL-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm0[2,3,0,1]
1417 ; ALL-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[0,1,0,1,4,5,4,5]
1418 ; ALL-NEXT:    vpbroadcastq %xmm3, %ymm3
1419 ; ALL-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0,1],ymm3[2,3],ymm1[4,5,6,7]
1420 ; ALL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3,4,5,6,7]
1421 ; ALL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
1422 ; ALL-NEXT:    retq
1423   %shuffle = shufflevector <8 x i64> %a, <8 x i64> %b, <8 x i32> <i32 6, i32 12, i32 10, i32 10, i32 8, i32 7, i32 14, i32 5>
1424   ret <8 x i64> %shuffle
1425 }