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