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