AVX512: Implemented DAG lowering for shuff62x2/shufi62x2 instructions ( shuffle packe...
[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=AVX512F
2 ; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX512F-32
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 ; AVX512F-LABEL: shuffle_v8f64_00000000:
8 ; AVX512F:       # BB#0:
9 ; AVX512F-NEXT:    vbroadcastsd %xmm0, %zmm0
10 ; AVX512F-NEXT:    retq
11 ;
12 ; AVX512F-32-LABEL: shuffle_v8f64_00000000:
13 ; AVX512F-32:       # BB#0:
14 ; AVX512F-32-NEXT:    vbroadcastsd %xmm0, %zmm0
15 ; AVX512F-32-NEXT:    retl
16   %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>
17   ret <8 x double> %shuffle
18 }
19
20 define <8 x double> @shuffle_v8f64_00000010(<8 x double> %a, <8 x double> %b) {
21 ; AVX512F-LABEL: shuffle_v8f64_00000010:
22 ; AVX512F:       # BB#0:
23 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,1,0]
24 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
25 ; AVX512F-NEXT:    retq
26 ;
27 ; AVX512F-32-LABEL: shuffle_v8f64_00000010:
28 ; AVX512F-32:       # BB#0:
29 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0]
30 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
31 ; AVX512F-32-NEXT:    retl
32   %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>
33   ret <8 x double> %shuffle
34 }
35
36 define <8 x double> @shuffle_v8f64_00000200(<8 x double> %a, <8 x double> %b) {
37 ; AVX512F-LABEL: shuffle_v8f64_00000200:
38 ; AVX512F:       # BB#0:
39 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,2,0,0]
40 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
41 ; AVX512F-NEXT:    retq
42 ;
43 ; AVX512F-32-LABEL: shuffle_v8f64_00000200:
44 ; AVX512F-32:       # BB#0:
45 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0]
46 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
47 ; AVX512F-32-NEXT:    retl
48   %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>
49   ret <8 x double> %shuffle
50 }
51
52 define <8 x double> @shuffle_v8f64_00003000(<8 x double> %a, <8 x double> %b) {
53 ; AVX512F-LABEL: shuffle_v8f64_00003000:
54 ; AVX512F:       # BB#0:
55 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,3,0,0,0]
56 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
57 ; AVX512F-NEXT:    retq
58 ;
59 ; AVX512F-32-LABEL: shuffle_v8f64_00003000:
60 ; AVX512F-32:       # BB#0:
61 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0]
62 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
63 ; AVX512F-32-NEXT:    retl
64   %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>
65   ret <8 x double> %shuffle
66 }
67
68 define <8 x double> @shuffle_v8f64_00040000(<8 x double> %a, <8 x double> %b) {
69 ; AVX512F-LABEL: shuffle_v8f64_00040000:
70 ; AVX512F:       # BB#0:
71 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,4,0,0,0,0]
72 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
73 ; AVX512F-NEXT:    retq
74 ;
75 ; AVX512F-32-LABEL: shuffle_v8f64_00040000:
76 ; AVX512F-32:       # BB#0:
77 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0]
78 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
79 ; AVX512F-32-NEXT:    retl
80   %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>
81   ret <8 x double> %shuffle
82 }
83
84 define <8 x double> @shuffle_v8f64_00500000(<8 x double> %a, <8 x double> %b) {
85 ; AVX512F-LABEL: shuffle_v8f64_00500000:
86 ; AVX512F:       # BB#0:
87 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,5,0,0,0,0,0]
88 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
89 ; AVX512F-NEXT:    retq
90 ;
91 ; AVX512F-32-LABEL: shuffle_v8f64_00500000:
92 ; AVX512F-32:       # BB#0:
93 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0]
94 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
95 ; AVX512F-32-NEXT:    retl
96   %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>
97   ret <8 x double> %shuffle
98 }
99
100 define <8 x double> @shuffle_v8f64_06000000(<8 x double> %a, <8 x double> %b) {
101 ; AVX512F-LABEL: shuffle_v8f64_06000000:
102 ; AVX512F:       # BB#0:
103 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,6,0,0,0,0,0,0]
104 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
105 ; AVX512F-NEXT:    retq
106 ;
107 ; AVX512F-32-LABEL: shuffle_v8f64_06000000:
108 ; AVX512F-32:       # BB#0:
109 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0]
110 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
111 ; AVX512F-32-NEXT:    retl
112   %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>
113   ret <8 x double> %shuffle
114 }
115
116 define <8 x double> @shuffle_v8f64_70000000(<8 x double> %a, <8 x double> %b) {
117 ; AVX512F-LABEL: shuffle_v8f64_70000000:
118 ; AVX512F:       # BB#0:
119 ; AVX512F-NEXT:    vpxord %zmm1, %zmm1, %zmm1
120 ; AVX512F-NEXT:    movl $7, %eax
121 ; AVX512F-NEXT:    vpinsrq $0, %rax, %xmm1, %xmm2
122 ; AVX512F-NEXT:    vinserti32x4 $0, %xmm2, %zmm1, %zmm1
123 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
124 ; AVX512F-NEXT:    retq
125 ;
126 ; AVX512F-32-LABEL: shuffle_v8f64_70000000:
127 ; AVX512F-32:       # BB#0:
128 ; AVX512F-32-NEXT:    vpxor %xmm1, %xmm1, %xmm1
129 ; AVX512F-32-NEXT:    movl $7, %eax
130 ; AVX512F-32-NEXT:    vpinsrd $0, %eax, %xmm1, %xmm1
131 ; AVX512F-32-NEXT:    vpxord %zmm2, %zmm2, %zmm2
132 ; AVX512F-32-NEXT:    vinserti32x4 $0, %xmm1, %zmm2, %zmm1
133 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
134 ; AVX512F-32-NEXT:    retl
135   %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>
136   ret <8 x double> %shuffle
137 }
138
139 define <8 x double> @shuffle_v8f64_01014545(<8 x double> %a, <8 x double> %b) {
140 ; AVX512F-LABEL: shuffle_v8f64_01014545:
141 ; AVX512F:       # BB#0:
142 ; AVX512F-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,4,5,4,5]
143 ; AVX512F-NEXT:    retq
144 ;
145 ; AVX512F-32-LABEL: shuffle_v8f64_01014545:
146 ; AVX512F-32:       # BB#0:
147 ; AVX512F-32-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,4,5,4,5]
148 ; AVX512F-32-NEXT:    retl
149   %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>
150   ret <8 x double> %shuffle
151 }
152
153 define <8 x double> @shuffle_v8f64_00112233(<8 x double> %a, <8 x double> %b) {
154 ; AVX512F-LABEL: shuffle_v8f64_00112233:
155 ; AVX512F:       # BB#0:
156 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,1,1,2,2,3,3]
157 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
158 ; AVX512F-NEXT:    retq
159 ;
160 ; AVX512F-32-LABEL: shuffle_v8f64_00112233:
161 ; AVX512F-32:       # BB#0:
162 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,1,0,1,0,2,0,2,0,3,0,3,0]
163 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
164 ; AVX512F-32-NEXT:    retl
165   %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>
166   ret <8 x double> %shuffle
167 }
168
169 define <8 x double> @shuffle_v8f64_00001111(<8 x double> %a, <8 x double> %b) {
170 ; AVX512F-LABEL: shuffle_v8f64_00001111:
171 ; AVX512F:       # BB#0:
172 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,1,1,1,1]
173 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
174 ; AVX512F-NEXT:    retq
175 ;
176 ; AVX512F-32-LABEL: shuffle_v8f64_00001111:
177 ; AVX512F-32:       # BB#0:
178 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0]
179 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
180 ; AVX512F-32-NEXT:    retl
181   %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>
182   ret <8 x double> %shuffle
183 }
184
185 define <8 x double> @shuffle_v8f64_81a3c5e7(<8 x double> %a, <8 x double> %b) {
186 ;
187 ; AVX512F-LABEL: shuffle_v8f64_81a3c5e7:
188 ; AVX512F:       # BB#0:
189 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,9,2,11,4,13,6,15]
190 ; AVX512F-NEXT:    vpermt2pd %zmm0, %zmm2, %zmm1
191 ; AVX512F-NEXT:    vmovaps %zmm1, %zmm0
192 ; AVX512F-NEXT:    retq
193 ;
194 ; AVX512F-32-LABEL: shuffle_v8f64_81a3c5e7:
195 ; AVX512F-32:       # BB#0:
196 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,9,0,2,0,11,0,4,0,13,0,6,0,15,0]
197 ; AVX512F-32-NEXT:    vpermt2pd %zmm0, %zmm2, %zmm1
198 ; AVX512F-32-NEXT:    vmovaps %zmm1, %zmm0
199 ; AVX512F-32-NEXT:    retl
200   %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>
201   ret <8 x double> %shuffle
202 }
203
204 define <8 x double> @shuffle_v8f64_08080808(<8 x double> %a, <8 x double> %b) {
205 ;
206 ; AVX512F-LABEL: shuffle_v8f64_08080808:
207 ; AVX512F:       # BB#0:
208 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,8,0,8,0,8,0,8]
209 ; AVX512F-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0
210 ; AVX512F-NEXT:    retq
211 ;
212 ; AVX512F-32-LABEL: shuffle_v8f64_08080808:
213 ; AVX512F-32:       # BB#0:
214 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,8,0,0,0,8,0,0,0,8,0,0,0,8,0]
215 ; AVX512F-32-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0
216 ; AVX512F-32-NEXT:    retl
217   %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>
218   ret <8 x double> %shuffle
219 }
220
221 define <8 x double> @shuffle_v8f64_08084c4c(<8 x double> %a, <8 x double> %b) {
222 ;
223 ; AVX512F-LABEL: shuffle_v8f64_08084c4c:
224 ; AVX512F:       # BB#0:
225 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,8,0,8,4,12,4,12]
226 ; AVX512F-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0
227 ; AVX512F-NEXT:    retq
228 ;
229 ; AVX512F-32-LABEL: shuffle_v8f64_08084c4c:
230 ; AVX512F-32:       # BB#0:
231 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,8,0,0,0,8,0,4,0,12,0,4,0,12,0]
232 ; AVX512F-32-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0
233 ; AVX512F-32-NEXT:    retl
234   %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>
235   ret <8 x double> %shuffle
236 }
237
238 define <8 x double> @shuffle_v8f64_8823cc67(<8 x double> %a, <8 x double> %b) {
239 ;
240 ; AVX512F-LABEL: shuffle_v8f64_8823cc67:
241 ; AVX512F:       # BB#0:
242 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,10,11,4,4,14,15]
243 ; AVX512F-NEXT:    vpermt2pd %zmm0, %zmm2, %zmm1
244 ; AVX512F-NEXT:    vmovaps %zmm1, %zmm0
245 ; AVX512F-NEXT:    retq
246 ;
247 ; AVX512F-32-LABEL: shuffle_v8f64_8823cc67:
248 ; AVX512F-32:       # BB#0:
249 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,0,0,10,0,11,0,4,0,4,0,14,0,15,0]
250 ; AVX512F-32-NEXT:    vpermt2pd %zmm0, %zmm2, %zmm1
251 ; AVX512F-32-NEXT:    vmovaps %zmm1, %zmm0
252 ; AVX512F-32-NEXT:    retl
253   %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>
254   ret <8 x double> %shuffle
255 }
256
257 define <8 x double> @shuffle_v8f64_9832dc76(<8 x double> %a, <8 x double> %b) {
258 ;
259 ; AVX512F-LABEL: shuffle_v8f64_9832dc76:
260 ; AVX512F:       # BB#0:
261 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [1,0,11,10,5,4,15,14]
262 ; AVX512F-NEXT:    vpermt2pd %zmm0, %zmm2, %zmm1
263 ; AVX512F-NEXT:    vmovaps %zmm1, %zmm0
264 ; AVX512F-NEXT:    retq
265 ;
266 ; AVX512F-32-LABEL: shuffle_v8f64_9832dc76:
267 ; AVX512F-32:       # BB#0:
268 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [1,0,0,0,11,0,10,0,5,0,4,0,15,0,14,0]
269 ; AVX512F-32-NEXT:    vpermt2pd %zmm0, %zmm2, %zmm1
270 ; AVX512F-32-NEXT:    vmovaps %zmm1, %zmm0
271 ; AVX512F-32-NEXT:    retl
272   %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>
273   ret <8 x double> %shuffle
274 }
275
276 define <8 x double> @shuffle_v8f64_9810dc54(<8 x double> %a, <8 x double> %b) {
277 ;
278 ; AVX512F-LABEL: shuffle_v8f64_9810dc54:
279 ; AVX512F:       # BB#0:
280 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [1,0,9,8,5,4,13,12]
281 ; AVX512F-NEXT:    vpermt2pd %zmm0, %zmm2, %zmm1
282 ; AVX512F-NEXT:    vmovaps %zmm1, %zmm0
283 ; AVX512F-NEXT:    retq
284 ;
285 ; AVX512F-32-LABEL: shuffle_v8f64_9810dc54:
286 ; AVX512F-32:       # BB#0:
287 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [1,0,0,0,9,0,8,0,5,0,4,0,13,0,12,0]
288 ; AVX512F-32-NEXT:    vpermt2pd %zmm0, %zmm2, %zmm1
289 ; AVX512F-32-NEXT:    vmovaps %zmm1, %zmm0
290 ; AVX512F-32-NEXT:    retl
291   %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>
292   ret <8 x double> %shuffle
293 }
294
295 define <8 x double> @shuffle_v8f64_08194c5d(<8 x double> %a, <8 x double> %b) {
296 ;
297 ; AVX512F-LABEL: shuffle_v8f64_08194c5d:
298 ; AVX512F:       # BB#0:
299 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,8,1,9,4,12,5,13]
300 ; AVX512F-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0
301 ; AVX512F-NEXT:    retq
302 ;
303 ; AVX512F-32-LABEL: shuffle_v8f64_08194c5d:
304 ; AVX512F-32:       # BB#0:
305 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,8,0,1,0,9,0,4,0,12,0,5,0,13,0]
306 ; AVX512F-32-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0
307 ; AVX512F-32-NEXT:    retl
308   %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>
309   ret <8 x double> %shuffle
310 }
311
312 define <8 x double> @shuffle_v8f64_2a3b6e7f(<8 x double> %a, <8 x double> %b) {
313 ;
314 ; AVX512F-LABEL: shuffle_v8f64_2a3b6e7f:
315 ; AVX512F:       # BB#0:
316 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [2,10,3,11,6,14,7,15]
317 ; AVX512F-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0
318 ; AVX512F-NEXT:    retq
319 ;
320 ; AVX512F-32-LABEL: shuffle_v8f64_2a3b6e7f:
321 ; AVX512F-32:       # BB#0:
322 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [2,0,10,0,3,0,11,0,6,0,14,0,7,0,15,0]
323 ; AVX512F-32-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0
324 ; AVX512F-32-NEXT:    retl
325   %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>
326   ret <8 x double> %shuffle
327 }
328
329 define <8 x double> @shuffle_v8f64_08192a3b(<8 x double> %a, <8 x double> %b) {
330 ;
331 ; AVX512F-LABEL: shuffle_v8f64_08192a3b:
332 ; AVX512F:       # BB#0:
333 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,8,1,9,2,10,3,11]
334 ; AVX512F-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0
335 ; AVX512F-NEXT:    retq
336 ;
337 ; AVX512F-32-LABEL: shuffle_v8f64_08192a3b:
338 ; AVX512F-32:       # BB#0:
339 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,8,0,1,0,9,0,2,0,10,0,3,0,11,0]
340 ; AVX512F-32-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0
341 ; AVX512F-32-NEXT:    retl
342   %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>
343   ret <8 x double> %shuffle
344 }
345
346 define <8 x double> @shuffle_v8f64_08991abb(<8 x double> %a, <8 x double> %b) {
347 ;
348 ; AVX512F-LABEL: shuffle_v8f64_08991abb:
349 ; AVX512F:       # BB#0:
350 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [8,0,1,1,9,2,3,3]
351 ; AVX512F-NEXT:    vpermt2pd %zmm0, %zmm2, %zmm1
352 ; AVX512F-NEXT:    vmovaps %zmm1, %zmm0
353 ; AVX512F-NEXT:    retq
354 ;
355 ; AVX512F-32-LABEL: shuffle_v8f64_08991abb:
356 ; AVX512F-32:       # BB#0:
357 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [8,0,0,0,1,0,1,0,9,0,2,0,3,0,3,0]
358 ; AVX512F-32-NEXT:    vpermt2pd %zmm0, %zmm2, %zmm1
359 ; AVX512F-32-NEXT:    vmovaps %zmm1, %zmm0
360 ; AVX512F-32-NEXT:    retl
361   %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>
362   ret <8 x double> %shuffle
363 }
364
365 define <8 x double> @shuffle_v8f64_091b2d3f(<8 x double> %a, <8 x double> %b) {
366 ;
367 ; AVX512F-LABEL: shuffle_v8f64_091b2d3f:
368 ; AVX512F:       # BB#0:
369 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,9,1,11,2,13,3,15]
370 ; AVX512F-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0
371 ; AVX512F-NEXT:    retq
372 ;
373 ; AVX512F-32-LABEL: shuffle_v8f64_091b2d3f:
374 ; AVX512F-32:       # BB#0:
375 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,9,0,1,0,11,0,2,0,13,0,3,0,15,0]
376 ; AVX512F-32-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0
377 ; AVX512F-32-NEXT:    retl
378   %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>
379   ret <8 x double> %shuffle
380 }
381
382 define <8 x double> @shuffle_v8f64_09ab1def(<8 x double> %a, <8 x double> %b) {
383 ;
384 ; AVX512F-LABEL: shuffle_v8f64_09ab1def:
385 ; AVX512F:       # BB#0:
386 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [8,1,2,3,9,5,6,7]
387 ; AVX512F-NEXT:    vpermt2pd %zmm0, %zmm2, %zmm1
388 ; AVX512F-NEXT:    vmovaps %zmm1, %zmm0
389 ; AVX512F-NEXT:    retq
390 ;
391 ; AVX512F-32-LABEL: shuffle_v8f64_09ab1def:
392 ; AVX512F-32:       # BB#0:
393 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [8,0,1,0,2,0,3,0,9,0,5,0,6,0,7,0]
394 ; AVX512F-32-NEXT:    vpermt2pd %zmm0, %zmm2, %zmm1
395 ; AVX512F-32-NEXT:    vmovaps %zmm1, %zmm0
396 ; AVX512F-32-NEXT:    retl
397   %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>
398   ret <8 x double> %shuffle
399 }
400
401 define <8 x double> @shuffle_v8f64_00014445(<8 x double> %a, <8 x double> %b) {
402 ;
403 ; AVX512F-LABEL: shuffle_v8f64_00014445:
404 ; AVX512F:       # BB#0:
405 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,1,4,4,4,5]
406 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
407 ; AVX512F-NEXT:    retq
408 ;
409 ; AVX512F-32-LABEL: shuffle_v8f64_00014445:
410 ; AVX512F-32:       # BB#0:
411 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,1,0,4,0,4,0,4,0,5,0]
412 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
413 ; AVX512F-32-NEXT:    retl
414   %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>
415   ret <8 x double> %shuffle
416 }
417
418 define <8 x double> @shuffle_v8f64_00204464(<8 x double> %a, <8 x double> %b) {
419 ;
420 ; AVX512F-LABEL: shuffle_v8f64_00204464:
421 ; AVX512F:       # BB#0:
422 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,2,0,4,4,6,4]
423 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
424 ; AVX512F-NEXT:    retq
425 ;
426 ; AVX512F-32-LABEL: shuffle_v8f64_00204464:
427 ; AVX512F-32:       # BB#0:
428 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,2,0,0,0,4,0,4,0,6,0,4,0]
429 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
430 ; AVX512F-32-NEXT:    retl
431   %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>
432   ret <8 x double> %shuffle
433 }
434
435 define <8 x double> @shuffle_v8f64_03004744(<8 x double> %a, <8 x double> %b) {
436 ;
437 ; AVX512F-LABEL: shuffle_v8f64_03004744:
438 ; AVX512F:       # BB#0:
439 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,3,0,0,4,7,4,4]
440 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
441 ; AVX512F-NEXT:    retq
442 ;
443 ; AVX512F-32-LABEL: shuffle_v8f64_03004744:
444 ; AVX512F-32:       # BB#0:
445 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,3,0,0,0,0,0,4,0,7,0,4,0,4,0]
446 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
447 ; AVX512F-32-NEXT:    retl
448   %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>
449   ret <8 x double> %shuffle
450 }
451
452 define <8 x double> @shuffle_v8f64_10005444(<8 x double> %a, <8 x double> %b) {
453 ;
454 ; AVX512F-LABEL: shuffle_v8f64_10005444:
455 ; AVX512F:       # BB#0:
456 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,5,4,4,4]
457 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
458 ; AVX512F-NEXT:    retq
459 ;
460 ; AVX512F-32-LABEL: shuffle_v8f64_10005444:
461 ; AVX512F-32:       # BB#0:
462 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,0,0,0,0,5,0,4,0,4,0,4,0]
463 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
464 ; AVX512F-32-NEXT:    retl
465   %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>
466   ret <8 x double> %shuffle
467 }
468
469 define <8 x double> @shuffle_v8f64_22006644(<8 x double> %a, <8 x double> %b) {
470 ;
471 ; AVX512F-LABEL: shuffle_v8f64_22006644:
472 ; AVX512F:       # BB#0:
473 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [2,2,0,0,6,6,4,4]
474 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
475 ; AVX512F-NEXT:    retq
476 ;
477 ; AVX512F-32-LABEL: shuffle_v8f64_22006644:
478 ; AVX512F-32:       # BB#0:
479 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [2,0,2,0,0,0,0,0,6,0,6,0,4,0,4,0]
480 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
481 ; AVX512F-32-NEXT:    retl
482   %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>
483   ret <8 x double> %shuffle
484 }
485
486 define <8 x double> @shuffle_v8f64_33307774(<8 x double> %a, <8 x double> %b) {
487 ;
488 ; AVX512F-LABEL: shuffle_v8f64_33307774:
489 ; AVX512F:       # BB#0:
490 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,3,3,0,7,7,7,4]
491 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
492 ; AVX512F-NEXT:    retq
493 ;
494 ; AVX512F-32-LABEL: shuffle_v8f64_33307774:
495 ; AVX512F-32:       # BB#0:
496 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,0,3,0,3,0,0,0,7,0,7,0,7,0,4,0]
497 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
498 ; AVX512F-32-NEXT:    retl
499   %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>
500   ret <8 x double> %shuffle
501 }
502
503 define <8 x double> @shuffle_v8f64_32107654(<8 x double> %a, <8 x double> %b) {
504 ;
505 ; AVX512F-LABEL: shuffle_v8f64_32107654:
506 ; AVX512F:       # BB#0:
507 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,2,1,0,7,6,5,4]
508 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
509 ; AVX512F-NEXT:    retq
510 ;
511 ; AVX512F-32-LABEL: shuffle_v8f64_32107654:
512 ; AVX512F-32:       # BB#0:
513 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,0,2,0,1,0,0,0,7,0,6,0,5,0,4,0]
514 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
515 ; AVX512F-32-NEXT:    retl
516   %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>
517   ret <8 x double> %shuffle
518 }
519
520 define <8 x double> @shuffle_v8f64_00234467(<8 x double> %a, <8 x double> %b) {
521 ;
522 ; AVX512F-LABEL: shuffle_v8f64_00234467:
523 ; AVX512F:       # BB#0:
524 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,2,3,4,4,6,7]
525 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
526 ; AVX512F-NEXT:    retq
527 ;
528 ; AVX512F-32-LABEL: shuffle_v8f64_00234467:
529 ; AVX512F-32:       # BB#0:
530 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,2,0,3,0,4,0,4,0,6,0,7,0]
531 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
532 ; AVX512F-32-NEXT:    retl
533   %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>
534   ret <8 x double> %shuffle
535 }
536
537 define <8 x double> @shuffle_v8f64_00224466(<8 x double> %a, <8 x double> %b) {
538 ;
539 ; AVX512F-LABEL: shuffle_v8f64_00224466:
540 ; AVX512F:       # BB#0:
541 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,2,2,4,4,6,6]
542 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
543 ; AVX512F-NEXT:    retq
544 ;
545 ; AVX512F-32-LABEL: shuffle_v8f64_00224466:
546 ; AVX512F-32:       # BB#0:
547 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,2,0,2,0,4,0,4,0,6,0,6,0]
548 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
549 ; AVX512F-32-NEXT:    retl
550   %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>
551   ret <8 x double> %shuffle
552 }
553
554 define <8 x double> @shuffle_v8f64_10325476(<8 x double> %a, <8 x double> %b) {
555 ;
556 ; AVX512F-LABEL: shuffle_v8f64_10325476:
557 ; AVX512F:       # BB#0:
558 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,3,2,5,4,7,6]
559 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
560 ; AVX512F-NEXT:    retq
561 ;
562 ; AVX512F-32-LABEL: shuffle_v8f64_10325476:
563 ; AVX512F-32:       # BB#0:
564 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,3,0,2,0,5,0,4,0,7,0,6,0]
565 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
566 ; AVX512F-32-NEXT:    retl
567   %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>
568   ret <8 x double> %shuffle
569 }
570
571 define <8 x double> @shuffle_v8f64_11335577(<8 x double> %a, <8 x double> %b) {
572 ;
573 ; AVX512F-LABEL: shuffle_v8f64_11335577:
574 ; AVX512F:       # BB#0:
575 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,1,3,3,5,5,7,7]
576 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
577 ; AVX512F-NEXT:    retq
578 ;
579 ; AVX512F-32-LABEL: shuffle_v8f64_11335577:
580 ; AVX512F-32:       # BB#0:
581 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,1,0,3,0,3,0,5,0,5,0,7,0,7,0]
582 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
583 ; AVX512F-32-NEXT:    retl
584   %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>
585   ret <8 x double> %shuffle
586 }
587
588 define <8 x double> @shuffle_v8f64_10235467(<8 x double> %a, <8 x double> %b) {
589 ;
590 ; AVX512F-LABEL: shuffle_v8f64_10235467:
591 ; AVX512F:       # BB#0:
592 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,2,3,5,4,6,7]
593 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
594 ; AVX512F-NEXT:    retq
595 ;
596 ; AVX512F-32-LABEL: shuffle_v8f64_10235467:
597 ; AVX512F-32:       # BB#0:
598 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,2,0,3,0,5,0,4,0,6,0,7,0]
599 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
600 ; AVX512F-32-NEXT:    retl
601   %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>
602   ret <8 x double> %shuffle
603 }
604
605 define <8 x double> @shuffle_v8f64_10225466(<8 x double> %a, <8 x double> %b) {
606 ;
607 ; AVX512F-LABEL: shuffle_v8f64_10225466:
608 ; AVX512F:       # BB#0:
609 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,2,2,5,4,6,6]
610 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
611 ; AVX512F-NEXT:    retq
612 ;
613 ; AVX512F-32-LABEL: shuffle_v8f64_10225466:
614 ; AVX512F-32:       # BB#0:
615 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,2,0,2,0,5,0,4,0,6,0,6,0]
616 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
617 ; AVX512F-32-NEXT:    retl
618   %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>
619   ret <8 x double> %shuffle
620 }
621
622 define <8 x double> @shuffle_v8f64_00015444(<8 x double> %a, <8 x double> %b) {
623 ;
624 ; AVX512F-LABEL: shuffle_v8f64_00015444:
625 ; AVX512F:       # BB#0:
626 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,1,5,4,4,4]
627 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
628 ; AVX512F-NEXT:    retq
629 ;
630 ; AVX512F-32-LABEL: shuffle_v8f64_00015444:
631 ; AVX512F-32:       # BB#0:
632 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,1,0,5,0,4,0,4,0,4,0]
633 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
634 ; AVX512F-32-NEXT:    retl
635   %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>
636   ret <8 x double> %shuffle
637 }
638
639 define <8 x double> @shuffle_v8f64_00204644(<8 x double> %a, <8 x double> %b) {
640 ;
641 ; AVX512F-LABEL: shuffle_v8f64_00204644:
642 ; AVX512F:       # BB#0:
643 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,2,0,4,6,4,4]
644 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
645 ; AVX512F-NEXT:    retq
646 ;
647 ; AVX512F-32-LABEL: shuffle_v8f64_00204644:
648 ; AVX512F-32:       # BB#0:
649 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,2,0,0,0,4,0,6,0,4,0,4,0]
650 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
651 ; AVX512F-32-NEXT:    retl
652   %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>
653   ret <8 x double> %shuffle
654 }
655
656 define <8 x double> @shuffle_v8f64_03004474(<8 x double> %a, <8 x double> %b) {
657 ;
658 ; AVX512F-LABEL: shuffle_v8f64_03004474:
659 ; AVX512F:       # BB#0:
660 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,3,0,0,4,4,7,4]
661 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
662 ; AVX512F-NEXT:    retq
663 ;
664 ; AVX512F-32-LABEL: shuffle_v8f64_03004474:
665 ; AVX512F-32:       # BB#0:
666 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,3,0,0,0,0,0,4,0,4,0,7,0,4,0]
667 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
668 ; AVX512F-32-NEXT:    retl
669   %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>
670   ret <8 x double> %shuffle
671 }
672
673 define <8 x double> @shuffle_v8f64_10004444(<8 x double> %a, <8 x double> %b) {
674 ;
675 ; AVX512F-LABEL: shuffle_v8f64_10004444:
676 ; AVX512F:       # BB#0:
677 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,4,4,4,4]
678 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
679 ; AVX512F-NEXT:    retq
680 ;
681 ; AVX512F-32-LABEL: shuffle_v8f64_10004444:
682 ; AVX512F-32:       # BB#0:
683 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,0,0,0,0,4,0,4,0,4,0,4,0]
684 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
685 ; AVX512F-32-NEXT:    retl
686   %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>
687   ret <8 x double> %shuffle
688 }
689
690 define <8 x double> @shuffle_v8f64_22006446(<8 x double> %a, <8 x double> %b) {
691 ;
692 ; AVX512F-LABEL: shuffle_v8f64_22006446:
693 ; AVX512F:       # BB#0:
694 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [2,2,0,0,6,4,4,6]
695 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
696 ; AVX512F-NEXT:    retq
697 ;
698 ; AVX512F-32-LABEL: shuffle_v8f64_22006446:
699 ; AVX512F-32:       # BB#0:
700 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [2,0,2,0,0,0,0,0,6,0,4,0,4,0,6,0]
701 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
702 ; AVX512F-32-NEXT:    retl
703   %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>
704   ret <8 x double> %shuffle
705 }
706
707 define <8 x double> @shuffle_v8f64_33307474(<8 x double> %a, <8 x double> %b) {
708 ;
709 ; AVX512F-LABEL: shuffle_v8f64_33307474:
710 ; AVX512F:       # BB#0:
711 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,3,3,0,7,4,7,4]
712 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
713 ; AVX512F-NEXT:    retq
714 ;
715 ; AVX512F-32-LABEL: shuffle_v8f64_33307474:
716 ; AVX512F-32:       # BB#0:
717 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,0,3,0,3,0,0,0,7,0,4,0,7,0,4,0]
718 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
719 ; AVX512F-32-NEXT:    retl
720   %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>
721   ret <8 x double> %shuffle
722 }
723
724 define <8 x double> @shuffle_v8f64_32104567(<8 x double> %a, <8 x double> %b) {
725 ;
726 ; AVX512F-LABEL: shuffle_v8f64_32104567:
727 ; AVX512F:       # BB#0:
728 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,2,1,0,4,5,6,7]
729 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
730 ; AVX512F-NEXT:    retq
731 ;
732 ; AVX512F-32-LABEL: shuffle_v8f64_32104567:
733 ; AVX512F-32:       # BB#0:
734 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,0,2,0,1,0,0,0,4,0,5,0,6,0,7,0]
735 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
736 ; AVX512F-32-NEXT:    retl
737   %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>
738   ret <8 x double> %shuffle
739 }
740
741 define <8 x double> @shuffle_v8f64_00236744(<8 x double> %a, <8 x double> %b) {
742 ;
743 ; AVX512F-LABEL: shuffle_v8f64_00236744:
744 ; AVX512F:       # BB#0:
745 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,2,3,6,7,4,4]
746 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
747 ; AVX512F-NEXT:    retq
748 ;
749 ; AVX512F-32-LABEL: shuffle_v8f64_00236744:
750 ; AVX512F-32:       # BB#0:
751 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,2,0,3,0,6,0,7,0,4,0,4,0]
752 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
753 ; AVX512F-32-NEXT:    retl
754   %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>
755   ret <8 x double> %shuffle
756 }
757
758 define <8 x double> @shuffle_v8f64_00226644(<8 x double> %a, <8 x double> %b) {
759 ;
760 ; AVX512F-LABEL: shuffle_v8f64_00226644:
761 ; AVX512F:       # BB#0:
762 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,2,2,6,6,4,4]
763 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
764 ; AVX512F-NEXT:    retq
765 ;
766 ; AVX512F-32-LABEL: shuffle_v8f64_00226644:
767 ; AVX512F-32:       # BB#0:
768 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,2,0,2,0,6,0,6,0,4,0,4,0]
769 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
770 ; AVX512F-32-NEXT:    retl
771   %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>
772   ret <8 x double> %shuffle
773 }
774
775 define <8 x double> @shuffle_v8f64_10324567(<8 x double> %a, <8 x double> %b) {
776 ;
777 ; AVX512F-LABEL: shuffle_v8f64_10324567:
778 ; AVX512F:       # BB#0:
779 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,3,2,4,5,6,7]
780 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
781 ; AVX512F-NEXT:    retq
782 ;
783 ; AVX512F-32-LABEL: shuffle_v8f64_10324567:
784 ; AVX512F-32:       # BB#0:
785 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,3,0,2,0,4,0,5,0,6,0,7,0]
786 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
787 ; AVX512F-32-NEXT:    retl
788   %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>
789   ret <8 x double> %shuffle
790 }
791
792 define <8 x double> @shuffle_v8f64_11334567(<8 x double> %a, <8 x double> %b) {
793 ;
794 ; AVX512F-LABEL: shuffle_v8f64_11334567:
795 ; AVX512F:       # BB#0:
796 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,1,3,3,4,5,6,7]
797 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
798 ; AVX512F-NEXT:    retq
799 ;
800 ; AVX512F-32-LABEL: shuffle_v8f64_11334567:
801 ; AVX512F-32:       # BB#0:
802 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,1,0,3,0,3,0,4,0,5,0,6,0,7,0]
803 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
804 ; AVX512F-32-NEXT:    retl
805   %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>
806   ret <8 x double> %shuffle
807 }
808
809 define <8 x double> @shuffle_v8f64_01235467(<8 x double> %a, <8 x double> %b) {
810 ;
811 ; AVX512F-LABEL: shuffle_v8f64_01235467:
812 ; AVX512F:       # BB#0:
813 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,1,2,3,5,4,6,7]
814 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
815 ; AVX512F-NEXT:    retq
816 ;
817 ; AVX512F-32-LABEL: shuffle_v8f64_01235467:
818 ; AVX512F-32:       # BB#0:
819 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,1,0,2,0,3,0,5,0,4,0,6,0,7,0]
820 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
821 ; AVX512F-32-NEXT:    retl
822   %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>
823   ret <8 x double> %shuffle
824 }
825
826 define <8 x double> @shuffle_v8f64_01235466(<8 x double> %a, <8 x double> %b) {
827 ;
828 ; AVX512F-LABEL: shuffle_v8f64_01235466:
829 ; AVX512F:       # BB#0:
830 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,1,2,3,5,4,6,6]
831 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
832 ; AVX512F-NEXT:    retq
833 ;
834 ; AVX512F-32-LABEL: shuffle_v8f64_01235466:
835 ; AVX512F-32:       # BB#0:
836 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,1,0,2,0,3,0,5,0,4,0,6,0,6,0]
837 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
838 ; AVX512F-32-NEXT:    retl
839   %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>
840   ret <8 x double> %shuffle
841 }
842
843 define <8 x double> @shuffle_v8f64_002u6u44(<8 x double> %a, <8 x double> %b) {
844 ;
845 ; AVX512F-LABEL: shuffle_v8f64_002u6u44:
846 ; AVX512F:       # BB#0:
847 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <0,0,2,u,6,u,4,4>
848 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
849 ; AVX512F-NEXT:    retq
850 ;
851 ; AVX512F-32-LABEL: shuffle_v8f64_002u6u44:
852 ; AVX512F-32:       # BB#0:
853 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <0,0,0,0,2,0,u,u,6,0,u,u,4,0,4,0>
854 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
855 ; AVX512F-32-NEXT:    retl
856   %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>
857   ret <8 x double> %shuffle
858 }
859
860 define <8 x double> @shuffle_v8f64_00uu66uu(<8 x double> %a, <8 x double> %b) {
861 ;
862 ; AVX512F-LABEL: shuffle_v8f64_00uu66uu:
863 ; AVX512F:       # BB#0:
864 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <0,0,u,u,6,6,u,u>
865 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
866 ; AVX512F-NEXT:    retq
867 ;
868 ; AVX512F-32-LABEL: shuffle_v8f64_00uu66uu:
869 ; AVX512F-32:       # BB#0:
870 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <0,0,0,0,u,u,u,u,6,0,6,0,u,u,u,u>
871 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
872 ; AVX512F-32-NEXT:    retl
873   %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>
874   ret <8 x double> %shuffle
875 }
876
877 define <8 x double> @shuffle_v8f64_103245uu(<8 x double> %a, <8 x double> %b) {
878 ;
879 ; AVX512F-LABEL: shuffle_v8f64_103245uu:
880 ; AVX512F:       # BB#0:
881 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <1,0,3,2,4,5,u,u>
882 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
883 ; AVX512F-NEXT:    retq
884 ;
885 ; AVX512F-32-LABEL: shuffle_v8f64_103245uu:
886 ; AVX512F-32:       # BB#0:
887 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <1,0,0,0,3,0,2,0,4,0,5,0,u,u,u,u>
888 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
889 ; AVX512F-32-NEXT:    retl
890   %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>
891   ret <8 x double> %shuffle
892 }
893
894 define <8 x double> @shuffle_v8f64_1133uu67(<8 x double> %a, <8 x double> %b) {
895 ;
896 ; AVX512F-LABEL: shuffle_v8f64_1133uu67:
897 ; AVX512F:       # BB#0:
898 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <1,1,3,3,u,u,6,7>
899 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
900 ; AVX512F-NEXT:    retq
901 ;
902 ; AVX512F-32-LABEL: shuffle_v8f64_1133uu67:
903 ; AVX512F-32:       # BB#0:
904 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <1,0,1,0,3,0,3,0,u,u,u,u,6,0,7,0>
905 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
906 ; AVX512F-32-NEXT:    retl
907   %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>
908   ret <8 x double> %shuffle
909 }
910
911 define <8 x double> @shuffle_v8f64_0uu354uu(<8 x double> %a, <8 x double> %b) {
912 ;
913 ; AVX512F-LABEL: shuffle_v8f64_0uu354uu:
914 ; AVX512F:       # BB#0:
915 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <0,u,u,3,5,4,u,u>
916 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
917 ; AVX512F-NEXT:    retq
918 ;
919 ; AVX512F-32-LABEL: shuffle_v8f64_0uu354uu:
920 ; AVX512F-32:       # BB#0:
921 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <0,0,u,u,u,u,3,0,5,0,4,0,u,u,u,u>
922 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
923 ; AVX512F-32-NEXT:    retl
924   %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>
925   ret <8 x double> %shuffle
926 }
927
928 define <8 x double> @shuffle_v8f64_uuu3uu66(<8 x double> %a, <8 x double> %b) {
929 ;
930 ; AVX512F-LABEL: shuffle_v8f64_uuu3uu66:
931 ; AVX512F:       # BB#0:
932 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <u,u,u,3,u,u,6,6>
933 ; AVX512F-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
934 ; AVX512F-NEXT:    retq
935 ;
936 ; AVX512F-32-LABEL: shuffle_v8f64_uuu3uu66:
937 ; AVX512F-32:       # BB#0:
938 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <u,u,u,u,u,u,3,0,u,u,u,u,6,0,6,0>
939 ; AVX512F-32-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
940 ; AVX512F-32-NEXT:    retl
941   %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>
942   ret <8 x double> %shuffle
943 }
944
945 define <8 x double> @shuffle_v8f64_c348cda0(<8 x double> %a, <8 x double> %b) {
946 ;
947 ; AVX512F-LABEL: shuffle_v8f64_c348cda0:
948 ; AVX512F:       # BB#0:
949 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [4,11,12,0,4,5,2,8]
950 ; AVX512F-NEXT:    vpermt2pd %zmm0, %zmm2, %zmm1
951 ; AVX512F-NEXT:    vmovaps %zmm1, %zmm0
952 ; AVX512F-NEXT:    retq
953 ;
954 ; AVX512F-32-LABEL: shuffle_v8f64_c348cda0:
955 ; AVX512F-32:       # BB#0:
956 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [4,0,11,0,12,0,0,0,4,0,5,0,2,0,8,0]
957 ; AVX512F-32-NEXT:    vpermt2pd %zmm0, %zmm2, %zmm1
958 ; AVX512F-32-NEXT:    vmovaps %zmm1, %zmm0
959 ; AVX512F-32-NEXT:    retl
960   %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>
961   ret <8 x double> %shuffle
962 }
963
964 define <8 x double> @shuffle_v8f64_f511235a(<8 x double> %a, <8 x double> %b) {
965 ;
966 ; AVX512F-LABEL: shuffle_v8f64_f511235a:
967 ; AVX512F:       # BB#0:
968 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [15,5,1,1,2,3,5,10]
969 ; AVX512F-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0
970 ; AVX512F-NEXT:    retq
971 ;
972 ; AVX512F-32-LABEL: shuffle_v8f64_f511235a:
973 ; AVX512F-32:       # BB#0:
974 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [15,0,5,0,1,0,1,0,2,0,3,0,5,0,10,0]
975 ; AVX512F-32-NEXT:    vpermt2pd %zmm1, %zmm2, %zmm0
976 ; AVX512F-32-NEXT:    retl
977   %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>
978   ret <8 x double> %shuffle
979 }
980
981 define <8 x i64> @shuffle_v8i64_00000000(<8 x i64> %a, <8 x i64> %b) {
982 ;
983 ; AVX512F-LABEL: shuffle_v8i64_00000000:
984 ; AVX512F:       # BB#0:
985 ; AVX512F-NEXT:    vpbroadcastq %xmm0, %zmm0
986 ; AVX512F-NEXT:    retq
987 ;
988 ; AVX512F-32-LABEL: shuffle_v8i64_00000000:
989 ; AVX512F-32:       # BB#0:
990 ; AVX512F-32-NEXT:    vpbroadcastq %xmm0, %zmm0
991 ; AVX512F-32-NEXT:    retl
992   %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>
993   ret <8 x i64> %shuffle
994 }
995
996 define <8 x i64> @shuffle_v8i64_00000010(<8 x i64> %a, <8 x i64> %b) {
997 ;
998 ; AVX512F-LABEL: shuffle_v8i64_00000010:
999 ; AVX512F:       # BB#0:
1000 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,1,0]
1001 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1002 ; AVX512F-NEXT:    retq
1003 ;
1004 ; AVX512F-32-LABEL: shuffle_v8i64_00000010:
1005 ; AVX512F-32:       # BB#0:
1006 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0]
1007 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1008 ; AVX512F-32-NEXT:    retl
1009   %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>
1010   ret <8 x i64> %shuffle
1011 }
1012
1013 define <8 x i64> @shuffle_v8i64_00000200(<8 x i64> %a, <8 x i64> %b) {
1014 ;
1015 ; AVX512F-LABEL: shuffle_v8i64_00000200:
1016 ; AVX512F:       # BB#0:
1017 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,2,0,0]
1018 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1019 ; AVX512F-NEXT:    retq
1020 ;
1021 ; AVX512F-32-LABEL: shuffle_v8i64_00000200:
1022 ; AVX512F-32:       # BB#0:
1023 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0]
1024 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1025 ; AVX512F-32-NEXT:    retl
1026   %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>
1027   ret <8 x i64> %shuffle
1028 }
1029
1030 define <8 x i64> @shuffle_v8i64_00003000(<8 x i64> %a, <8 x i64> %b) {
1031 ;
1032 ; AVX512F-LABEL: shuffle_v8i64_00003000:
1033 ; AVX512F:       # BB#0:
1034 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,3,0,0,0]
1035 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1036 ; AVX512F-NEXT:    retq
1037 ;
1038 ; AVX512F-32-LABEL: shuffle_v8i64_00003000:
1039 ; AVX512F-32:       # BB#0:
1040 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0]
1041 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1042 ; AVX512F-32-NEXT:    retl
1043   %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>
1044   ret <8 x i64> %shuffle
1045 }
1046
1047 define <8 x i64> @shuffle_v8i64_00040000(<8 x i64> %a, <8 x i64> %b) {
1048 ;
1049 ; AVX512F-LABEL: shuffle_v8i64_00040000:
1050 ; AVX512F:       # BB#0:
1051 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,4,0,0,0,0]
1052 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1053 ; AVX512F-NEXT:    retq
1054 ;
1055 ; AVX512F-32-LABEL: shuffle_v8i64_00040000:
1056 ; AVX512F-32:       # BB#0:
1057 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0]
1058 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1059 ; AVX512F-32-NEXT:    retl
1060   %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>
1061   ret <8 x i64> %shuffle
1062 }
1063
1064 define <8 x i64> @shuffle_v8i64_00500000(<8 x i64> %a, <8 x i64> %b) {
1065 ;
1066 ; AVX512F-LABEL: shuffle_v8i64_00500000:
1067 ; AVX512F:       # BB#0:
1068 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,5,0,0,0,0,0]
1069 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1070 ; AVX512F-NEXT:    retq
1071 ;
1072 ; AVX512F-32-LABEL: shuffle_v8i64_00500000:
1073 ; AVX512F-32:       # BB#0:
1074 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0]
1075 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1076 ; AVX512F-32-NEXT:    retl
1077   %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>
1078   ret <8 x i64> %shuffle
1079 }
1080
1081 define <8 x i64> @shuffle_v8i64_06000000(<8 x i64> %a, <8 x i64> %b) {
1082 ;
1083 ; AVX512F-LABEL: shuffle_v8i64_06000000:
1084 ; AVX512F:       # BB#0:
1085 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,6,0,0,0,0,0,0]
1086 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1087 ; AVX512F-NEXT:    retq
1088 ;
1089 ; AVX512F-32-LABEL: shuffle_v8i64_06000000:
1090 ; AVX512F-32:       # BB#0:
1091 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0]
1092 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1093 ; AVX512F-32-NEXT:    retl
1094   %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>
1095   ret <8 x i64> %shuffle
1096 }
1097
1098 define <8 x i64> @shuffle_v8i64_70000000(<8 x i64> %a, <8 x i64> %b) {
1099 ;
1100 ; AVX512F-LABEL: shuffle_v8i64_70000000:
1101 ; AVX512F:       # BB#0:
1102 ; AVX512F-NEXT:    vpxord %zmm1, %zmm1, %zmm1
1103 ; AVX512F-NEXT:    movl $7, %eax
1104 ; AVX512F-NEXT:    vpinsrq $0, %rax, %xmm1, %xmm2
1105 ; AVX512F-NEXT:    vinserti32x4 $0, %xmm2, %zmm1, %zmm1
1106 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1107 ; AVX512F-NEXT:    retq
1108 ;
1109 ; AVX512F-32-LABEL: shuffle_v8i64_70000000:
1110 ; AVX512F-32:       # BB#0:
1111 ; AVX512F-32-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1112 ; AVX512F-32-NEXT:    movl $7, %eax
1113 ; AVX512F-32-NEXT:    vpinsrd $0, %eax, %xmm1, %xmm1
1114 ; AVX512F-32-NEXT:    vpxord %zmm2, %zmm2, %zmm2
1115 ; AVX512F-32-NEXT:    vinserti32x4 $0, %xmm1, %zmm2, %zmm1
1116 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1117 ; AVX512F-32-NEXT:    retl
1118   %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>
1119   ret <8 x i64> %shuffle
1120 }
1121
1122 define <8 x i64> @shuffle_v8i64_01014545(<8 x i64> %a, <8 x i64> %b) {
1123 ; AVX512F-LABEL: shuffle_v8i64_01014545:
1124 ; AVX512F:       # BB#0:
1125 ; AVX512F-NEXT:    vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,4,5,4,5]
1126 ; AVX512F-NEXT:    retq
1127 ;
1128 ; AVX512F-32-LABEL: shuffle_v8i64_01014545:
1129 ; AVX512F-32:       # BB#0:
1130 ; AVX512F-32-NEXT:    vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,4,5,4,5]
1131 ; AVX512F-32-NEXT:    retl
1132
1133   %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>
1134   ret <8 x i64> %shuffle
1135 }
1136
1137 define <8 x i64> @shuffle_v8i64_00112233(<8 x i64> %a, <8 x i64> %b) {
1138 ;
1139 ; AVX512F-LABEL: shuffle_v8i64_00112233:
1140 ; AVX512F:       # BB#0:
1141 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,1,1,2,2,3,3]
1142 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1143 ; AVX512F-NEXT:    retq
1144 ;
1145 ; AVX512F-32-LABEL: shuffle_v8i64_00112233:
1146 ; AVX512F-32:       # BB#0:
1147 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,1,0,1,0,2,0,2,0,3,0,3,0]
1148 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1149 ; AVX512F-32-NEXT:    retl
1150   %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>
1151   ret <8 x i64> %shuffle
1152 }
1153
1154 define <8 x i64> @shuffle_v8i64_00001111(<8 x i64> %a, <8 x i64> %b) {
1155 ;
1156 ; AVX512F-LABEL: shuffle_v8i64_00001111:
1157 ; AVX512F:       # BB#0:
1158 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,1,1,1,1]
1159 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1160 ; AVX512F-NEXT:    retq
1161 ;
1162 ; AVX512F-32-LABEL: shuffle_v8i64_00001111:
1163 ; AVX512F-32:       # BB#0:
1164 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0]
1165 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1166 ; AVX512F-32-NEXT:    retl
1167   %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>
1168   ret <8 x i64> %shuffle
1169 }
1170
1171 define <8 x i64> @shuffle_v8i64_81a3c5e7(<8 x i64> %a, <8 x i64> %b) {
1172 ;
1173 ; AVX512F-LABEL: shuffle_v8i64_81a3c5e7:
1174 ; AVX512F:       # BB#0:
1175 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,9,2,11,4,13,6,15]
1176 ; AVX512F-NEXT:    vpermt2q %zmm0, %zmm2, %zmm1
1177 ; AVX512F-NEXT:    vmovaps %zmm1, %zmm0
1178 ; AVX512F-NEXT:    retq
1179 ;
1180 ; AVX512F-32-LABEL: shuffle_v8i64_81a3c5e7:
1181 ; AVX512F-32:       # BB#0:
1182 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,9,0,2,0,11,0,4,0,13,0,6,0,15,0]
1183 ; AVX512F-32-NEXT:    vpermt2q %zmm0, %zmm2, %zmm1
1184 ; AVX512F-32-NEXT:    vmovaps %zmm1, %zmm0
1185 ; AVX512F-32-NEXT:    retl
1186   %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>
1187   ret <8 x i64> %shuffle
1188 }
1189
1190 define <8 x i64> @shuffle_v8i64_08080808(<8 x i64> %a, <8 x i64> %b) {
1191 ;
1192 ; AVX512F-LABEL: shuffle_v8i64_08080808:
1193 ; AVX512F:       # BB#0:
1194 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,8,0,8,0,8,0,8]
1195 ; AVX512F-NEXT:    vpermt2q %zmm1, %zmm2, %zmm0
1196 ; AVX512F-NEXT:    retq
1197 ;
1198 ; AVX512F-32-LABEL: shuffle_v8i64_08080808:
1199 ; AVX512F-32:       # BB#0:
1200 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,8,0,0,0,8,0,0,0,8,0,0,0,8,0]
1201 ; AVX512F-32-NEXT:    vpermt2q %zmm1, %zmm2, %zmm0
1202 ; AVX512F-32-NEXT:    retl
1203   %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>
1204   ret <8 x i64> %shuffle
1205 }
1206
1207 define <8 x i64> @shuffle_v8i64_08084c4c(<8 x i64> %a, <8 x i64> %b) {
1208 ;
1209 ; AVX512F-LABEL: shuffle_v8i64_08084c4c:
1210 ; AVX512F:       # BB#0:
1211 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,8,0,8,4,12,4,12]
1212 ; AVX512F-NEXT:    vpermt2q %zmm1, %zmm2, %zmm0
1213 ; AVX512F-NEXT:    retq
1214 ;
1215 ; AVX512F-32-LABEL: shuffle_v8i64_08084c4c:
1216 ; AVX512F-32:       # BB#0:
1217 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,8,0,0,0,8,0,4,0,12,0,4,0,12,0]
1218 ; AVX512F-32-NEXT:    vpermt2q %zmm1, %zmm2, %zmm0
1219 ; AVX512F-32-NEXT:    retl
1220   %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>
1221   ret <8 x i64> %shuffle
1222 }
1223
1224 define <8 x i64> @shuffle_v8i64_8823cc67(<8 x i64> %a, <8 x i64> %b) {
1225 ;
1226 ; AVX512F-LABEL: shuffle_v8i64_8823cc67:
1227 ; AVX512F:       # BB#0:
1228 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,10,11,4,4,14,15]
1229 ; AVX512F-NEXT:    vpermt2q %zmm0, %zmm2, %zmm1
1230 ; AVX512F-NEXT:    vmovaps %zmm1, %zmm0
1231 ; AVX512F-NEXT:    retq
1232 ;
1233 ; AVX512F-32-LABEL: shuffle_v8i64_8823cc67:
1234 ; AVX512F-32:       # BB#0:
1235 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,0,0,10,0,11,0,4,0,4,0,14,0,15,0]
1236 ; AVX512F-32-NEXT:    vpermt2q %zmm0, %zmm2, %zmm1
1237 ; AVX512F-32-NEXT:    vmovaps %zmm1, %zmm0
1238 ; AVX512F-32-NEXT:    retl
1239   %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>
1240   ret <8 x i64> %shuffle
1241 }
1242
1243 define <8 x i64> @shuffle_v8i64_9832dc76(<8 x i64> %a, <8 x i64> %b) {
1244 ;
1245 ; AVX512F-LABEL: shuffle_v8i64_9832dc76:
1246 ; AVX512F:       # BB#0:
1247 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [1,0,11,10,5,4,15,14]
1248 ; AVX512F-NEXT:    vpermt2q %zmm0, %zmm2, %zmm1
1249 ; AVX512F-NEXT:    vmovaps %zmm1, %zmm0
1250 ; AVX512F-NEXT:    retq
1251 ;
1252 ; AVX512F-32-LABEL: shuffle_v8i64_9832dc76:
1253 ; AVX512F-32:       # BB#0:
1254 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [1,0,0,0,11,0,10,0,5,0,4,0,15,0,14,0]
1255 ; AVX512F-32-NEXT:    vpermt2q %zmm0, %zmm2, %zmm1
1256 ; AVX512F-32-NEXT:    vmovaps %zmm1, %zmm0
1257 ; AVX512F-32-NEXT:    retl
1258   %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>
1259   ret <8 x i64> %shuffle
1260 }
1261
1262 define <8 x i64> @shuffle_v8i64_9810dc54(<8 x i64> %a, <8 x i64> %b) {
1263 ;
1264 ; AVX512F-LABEL: shuffle_v8i64_9810dc54:
1265 ; AVX512F:       # BB#0:
1266 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [1,0,9,8,5,4,13,12]
1267 ; AVX512F-NEXT:    vpermt2q %zmm0, %zmm2, %zmm1
1268 ; AVX512F-NEXT:    vmovaps %zmm1, %zmm0
1269 ; AVX512F-NEXT:    retq
1270 ;
1271 ; AVX512F-32-LABEL: shuffle_v8i64_9810dc54:
1272 ; AVX512F-32:       # BB#0:
1273 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [1,0,0,0,9,0,8,0,5,0,4,0,13,0,12,0]
1274 ; AVX512F-32-NEXT:    vpermt2q %zmm0, %zmm2, %zmm1
1275 ; AVX512F-32-NEXT:    vmovaps %zmm1, %zmm0
1276 ; AVX512F-32-NEXT:    retl
1277   %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>
1278   ret <8 x i64> %shuffle
1279 }
1280
1281 define <8 x i64> @shuffle_v8i64_08194c5d(<8 x i64> %a, <8 x i64> %b) {
1282 ;
1283 ; AVX512F-LABEL: shuffle_v8i64_08194c5d:
1284 ; AVX512F:       # BB#0:
1285 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,8,1,9,4,12,5,13]
1286 ; AVX512F-NEXT:    vpermt2q %zmm1, %zmm2, %zmm0
1287 ; AVX512F-NEXT:    retq
1288 ;
1289 ; AVX512F-32-LABEL: shuffle_v8i64_08194c5d:
1290 ; AVX512F-32:       # BB#0:
1291 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,8,0,1,0,9,0,4,0,12,0,5,0,13,0]
1292 ; AVX512F-32-NEXT:    vpermt2q %zmm1, %zmm2, %zmm0
1293 ; AVX512F-32-NEXT:    retl
1294   %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>
1295   ret <8 x i64> %shuffle
1296 }
1297
1298 define <8 x i64> @shuffle_v8i64_2a3b6e7f(<8 x i64> %a, <8 x i64> %b) {
1299 ;
1300 ; AVX512F-LABEL: shuffle_v8i64_2a3b6e7f:
1301 ; AVX512F:       # BB#0:
1302 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [2,10,3,11,6,14,7,15]
1303 ; AVX512F-NEXT:    vpermt2q %zmm1, %zmm2, %zmm0
1304 ; AVX512F-NEXT:    retq
1305 ;
1306 ; AVX512F-32-LABEL: shuffle_v8i64_2a3b6e7f:
1307 ; AVX512F-32:       # BB#0:
1308 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [2,0,10,0,3,0,11,0,6,0,14,0,7,0,15,0]
1309 ; AVX512F-32-NEXT:    vpermt2q %zmm1, %zmm2, %zmm0
1310 ; AVX512F-32-NEXT:    retl
1311   %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>
1312   ret <8 x i64> %shuffle
1313 }
1314
1315 define <8 x i64> @shuffle_v8i64_08192a3b(<8 x i64> %a, <8 x i64> %b) {
1316 ;
1317 ; AVX512F-LABEL: shuffle_v8i64_08192a3b:
1318 ; AVX512F:       # BB#0:
1319 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,8,1,9,2,10,3,11]
1320 ; AVX512F-NEXT:    vpermt2q %zmm1, %zmm2, %zmm0
1321 ; AVX512F-NEXT:    retq
1322 ;
1323 ; AVX512F-32-LABEL: shuffle_v8i64_08192a3b:
1324 ; AVX512F-32:       # BB#0:
1325 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,8,0,1,0,9,0,2,0,10,0,3,0,11,0]
1326 ; AVX512F-32-NEXT:    vpermt2q %zmm1, %zmm2, %zmm0
1327 ; AVX512F-32-NEXT:    retl
1328   %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>
1329   ret <8 x i64> %shuffle
1330 }
1331
1332 define <8 x i64> @shuffle_v8i64_08991abb(<8 x i64> %a, <8 x i64> %b) {
1333 ;
1334 ; AVX512F-LABEL: shuffle_v8i64_08991abb:
1335 ; AVX512F:       # BB#0:
1336 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [8,0,1,1,9,2,3,3]
1337 ; AVX512F-NEXT:    vpermt2q %zmm0, %zmm2, %zmm1
1338 ; AVX512F-NEXT:    vmovaps %zmm1, %zmm0
1339 ; AVX512F-NEXT:    retq
1340 ;
1341 ; AVX512F-32-LABEL: shuffle_v8i64_08991abb:
1342 ; AVX512F-32:       # BB#0:
1343 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [8,0,0,0,1,0,1,0,9,0,2,0,3,0,3,0]
1344 ; AVX512F-32-NEXT:    vpermt2q %zmm0, %zmm2, %zmm1
1345 ; AVX512F-32-NEXT:    vmovaps %zmm1, %zmm0
1346 ; AVX512F-32-NEXT:    retl
1347   %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>
1348   ret <8 x i64> %shuffle
1349 }
1350
1351 define <8 x i64> @shuffle_v8i64_091b2d3f(<8 x i64> %a, <8 x i64> %b) {
1352 ;
1353 ; AVX512F-LABEL: shuffle_v8i64_091b2d3f:
1354 ; AVX512F:       # BB#0:
1355 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,9,1,11,2,13,3,15]
1356 ; AVX512F-NEXT:    vpermt2q %zmm1, %zmm2, %zmm0
1357 ; AVX512F-NEXT:    retq
1358 ;
1359 ; AVX512F-32-LABEL: shuffle_v8i64_091b2d3f:
1360 ; AVX512F-32:       # BB#0:
1361 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,0,9,0,1,0,11,0,2,0,13,0,3,0,15,0]
1362 ; AVX512F-32-NEXT:    vpermt2q %zmm1, %zmm2, %zmm0
1363 ; AVX512F-32-NEXT:    retl
1364   %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>
1365   ret <8 x i64> %shuffle
1366 }
1367
1368 define <8 x i64> @shuffle_v8i64_09ab1def(<8 x i64> %a, <8 x i64> %b) {
1369 ;
1370 ; AVX512F-LABEL: shuffle_v8i64_09ab1def:
1371 ; AVX512F:       # BB#0:
1372 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [8,1,2,3,9,5,6,7]
1373 ; AVX512F-NEXT:    vpermt2q %zmm0, %zmm2, %zmm1
1374 ; AVX512F-NEXT:    vmovaps %zmm1, %zmm0
1375 ; AVX512F-NEXT:    retq
1376 ;
1377 ; AVX512F-32-LABEL: shuffle_v8i64_09ab1def:
1378 ; AVX512F-32:       # BB#0:
1379 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [8,0,1,0,2,0,3,0,9,0,5,0,6,0,7,0]
1380 ; AVX512F-32-NEXT:    vpermt2q %zmm0, %zmm2, %zmm1
1381 ; AVX512F-32-NEXT:    vmovaps %zmm1, %zmm0
1382 ; AVX512F-32-NEXT:    retl
1383   %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>
1384   ret <8 x i64> %shuffle
1385 }
1386
1387 define <8 x i64> @shuffle_v8i64_00014445(<8 x i64> %a, <8 x i64> %b) {
1388 ;
1389 ; AVX512F-LABEL: shuffle_v8i64_00014445:
1390 ; AVX512F:       # BB#0:
1391 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,1,4,4,4,5]
1392 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1393 ; AVX512F-NEXT:    retq
1394 ;
1395 ; AVX512F-32-LABEL: shuffle_v8i64_00014445:
1396 ; AVX512F-32:       # BB#0:
1397 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,1,0,4,0,4,0,4,0,5,0]
1398 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1399 ; AVX512F-32-NEXT:    retl
1400   %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>
1401   ret <8 x i64> %shuffle
1402 }
1403
1404 define <8 x i64> @shuffle_v8i64_00204464(<8 x i64> %a, <8 x i64> %b) {
1405 ;
1406 ; AVX512F-LABEL: shuffle_v8i64_00204464:
1407 ; AVX512F:       # BB#0:
1408 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,2,0,4,4,6,4]
1409 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1410 ; AVX512F-NEXT:    retq
1411 ;
1412 ; AVX512F-32-LABEL: shuffle_v8i64_00204464:
1413 ; AVX512F-32:       # BB#0:
1414 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,2,0,0,0,4,0,4,0,6,0,4,0]
1415 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1416 ; AVX512F-32-NEXT:    retl
1417   %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>
1418   ret <8 x i64> %shuffle
1419 }
1420
1421 define <8 x i64> @shuffle_v8i64_03004744(<8 x i64> %a, <8 x i64> %b) {
1422 ;
1423 ; AVX512F-LABEL: shuffle_v8i64_03004744:
1424 ; AVX512F:       # BB#0:
1425 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,3,0,0,4,7,4,4]
1426 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1427 ; AVX512F-NEXT:    retq
1428 ;
1429 ; AVX512F-32-LABEL: shuffle_v8i64_03004744:
1430 ; AVX512F-32:       # BB#0:
1431 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,3,0,0,0,0,0,4,0,7,0,4,0,4,0]
1432 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1433 ; AVX512F-32-NEXT:    retl
1434   %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>
1435   ret <8 x i64> %shuffle
1436 }
1437
1438 define <8 x i64> @shuffle_v8i64_10005444(<8 x i64> %a, <8 x i64> %b) {
1439 ;
1440 ; AVX512F-LABEL: shuffle_v8i64_10005444:
1441 ; AVX512F:       # BB#0:
1442 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,5,4,4,4]
1443 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1444 ; AVX512F-NEXT:    retq
1445 ;
1446 ; AVX512F-32-LABEL: shuffle_v8i64_10005444:
1447 ; AVX512F-32:       # BB#0:
1448 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,0,0,0,0,5,0,4,0,4,0,4,0]
1449 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1450 ; AVX512F-32-NEXT:    retl
1451   %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>
1452   ret <8 x i64> %shuffle
1453 }
1454
1455 define <8 x i64> @shuffle_v8i64_22006644(<8 x i64> %a, <8 x i64> %b) {
1456 ;
1457 ; AVX512F-LABEL: shuffle_v8i64_22006644:
1458 ; AVX512F:       # BB#0:
1459 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [2,2,0,0,6,6,4,4]
1460 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1461 ; AVX512F-NEXT:    retq
1462 ;
1463 ; AVX512F-32-LABEL: shuffle_v8i64_22006644:
1464 ; AVX512F-32:       # BB#0:
1465 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [2,0,2,0,0,0,0,0,6,0,6,0,4,0,4,0]
1466 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1467 ; AVX512F-32-NEXT:    retl
1468   %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>
1469   ret <8 x i64> %shuffle
1470 }
1471
1472 define <8 x i64> @shuffle_v8i64_33307774(<8 x i64> %a, <8 x i64> %b) {
1473 ;
1474 ; AVX512F-LABEL: shuffle_v8i64_33307774:
1475 ; AVX512F:       # BB#0:
1476 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,3,3,0,7,7,7,4]
1477 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1478 ; AVX512F-NEXT:    retq
1479 ;
1480 ; AVX512F-32-LABEL: shuffle_v8i64_33307774:
1481 ; AVX512F-32:       # BB#0:
1482 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,0,3,0,3,0,0,0,7,0,7,0,7,0,4,0]
1483 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1484 ; AVX512F-32-NEXT:    retl
1485   %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>
1486   ret <8 x i64> %shuffle
1487 }
1488
1489 define <8 x i64> @shuffle_v8i64_32107654(<8 x i64> %a, <8 x i64> %b) {
1490 ;
1491 ; AVX512F-LABEL: shuffle_v8i64_32107654:
1492 ; AVX512F:       # BB#0:
1493 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,2,1,0,7,6,5,4]
1494 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1495 ; AVX512F-NEXT:    retq
1496 ;
1497 ; AVX512F-32-LABEL: shuffle_v8i64_32107654:
1498 ; AVX512F-32:       # BB#0:
1499 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,0,2,0,1,0,0,0,7,0,6,0,5,0,4,0]
1500 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1501 ; AVX512F-32-NEXT:    retl
1502   %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>
1503   ret <8 x i64> %shuffle
1504 }
1505
1506 define <8 x i64> @shuffle_v8i64_00234467(<8 x i64> %a, <8 x i64> %b) {
1507 ;
1508 ; AVX512F-LABEL: shuffle_v8i64_00234467:
1509 ; AVX512F:       # BB#0:
1510 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,2,3,4,4,6,7]
1511 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1512 ; AVX512F-NEXT:    retq
1513 ;
1514 ; AVX512F-32-LABEL: shuffle_v8i64_00234467:
1515 ; AVX512F-32:       # BB#0:
1516 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,2,0,3,0,4,0,4,0,6,0,7,0]
1517 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1518 ; AVX512F-32-NEXT:    retl
1519   %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>
1520   ret <8 x i64> %shuffle
1521 }
1522
1523 define <8 x i64> @shuffle_v8i64_00224466(<8 x i64> %a, <8 x i64> %b) {
1524 ;
1525 ; AVX512F-LABEL: shuffle_v8i64_00224466:
1526 ; AVX512F:       # BB#0:
1527 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,2,2,4,4,6,6]
1528 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1529 ; AVX512F-NEXT:    retq
1530 ;
1531 ; AVX512F-32-LABEL: shuffle_v8i64_00224466:
1532 ; AVX512F-32:       # BB#0:
1533 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,2,0,2,0,4,0,4,0,6,0,6,0]
1534 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1535 ; AVX512F-32-NEXT:    retl
1536   %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>
1537   ret <8 x i64> %shuffle
1538 }
1539
1540 define <8 x i64> @shuffle_v8i64_10325476(<8 x i64> %a, <8 x i64> %b) {
1541 ;
1542 ; AVX512F-LABEL: shuffle_v8i64_10325476:
1543 ; AVX512F:       # BB#0:
1544 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,3,2,5,4,7,6]
1545 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1546 ; AVX512F-NEXT:    retq
1547 ;
1548 ; AVX512F-32-LABEL: shuffle_v8i64_10325476:
1549 ; AVX512F-32:       # BB#0:
1550 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,3,0,2,0,5,0,4,0,7,0,6,0]
1551 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1552 ; AVX512F-32-NEXT:    retl
1553   %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>
1554   ret <8 x i64> %shuffle
1555 }
1556
1557 define <8 x i64> @shuffle_v8i64_11335577(<8 x i64> %a, <8 x i64> %b) {
1558 ;
1559 ; AVX512F-LABEL: shuffle_v8i64_11335577:
1560 ; AVX512F:       # BB#0:
1561 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,1,3,3,5,5,7,7]
1562 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1563 ; AVX512F-NEXT:    retq
1564 ;
1565 ; AVX512F-32-LABEL: shuffle_v8i64_11335577:
1566 ; AVX512F-32:       # BB#0:
1567 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,1,0,3,0,3,0,5,0,5,0,7,0,7,0]
1568 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1569 ; AVX512F-32-NEXT:    retl
1570   %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>
1571   ret <8 x i64> %shuffle
1572 }
1573
1574 define <8 x i64> @shuffle_v8i64_10235467(<8 x i64> %a, <8 x i64> %b) {
1575 ;
1576 ; AVX512F-LABEL: shuffle_v8i64_10235467:
1577 ; AVX512F:       # BB#0:
1578 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,2,3,5,4,6,7]
1579 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1580 ; AVX512F-NEXT:    retq
1581 ;
1582 ; AVX512F-32-LABEL: shuffle_v8i64_10235467:
1583 ; AVX512F-32:       # BB#0:
1584 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,2,0,3,0,5,0,4,0,6,0,7,0]
1585 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1586 ; AVX512F-32-NEXT:    retl
1587   %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>
1588   ret <8 x i64> %shuffle
1589 }
1590
1591 define <8 x i64> @shuffle_v8i64_10225466(<8 x i64> %a, <8 x i64> %b) {
1592 ;
1593 ; AVX512F-LABEL: shuffle_v8i64_10225466:
1594 ; AVX512F:       # BB#0:
1595 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,2,2,5,4,6,6]
1596 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1597 ; AVX512F-NEXT:    retq
1598 ;
1599 ; AVX512F-32-LABEL: shuffle_v8i64_10225466:
1600 ; AVX512F-32:       # BB#0:
1601 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,2,0,2,0,5,0,4,0,6,0,6,0]
1602 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1603 ; AVX512F-32-NEXT:    retl
1604   %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>
1605   ret <8 x i64> %shuffle
1606 }
1607
1608 define <8 x i64> @shuffle_v8i64_00015444(<8 x i64> %a, <8 x i64> %b) {
1609 ;
1610 ; AVX512F-LABEL: shuffle_v8i64_00015444:
1611 ; AVX512F:       # BB#0:
1612 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,1,5,4,4,4]
1613 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1614 ; AVX512F-NEXT:    retq
1615 ;
1616 ; AVX512F-32-LABEL: shuffle_v8i64_00015444:
1617 ; AVX512F-32:       # BB#0:
1618 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,1,0,5,0,4,0,4,0,4,0]
1619 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1620 ; AVX512F-32-NEXT:    retl
1621   %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>
1622   ret <8 x i64> %shuffle
1623 }
1624
1625 define <8 x i64> @shuffle_v8i64_00204644(<8 x i64> %a, <8 x i64> %b) {
1626 ;
1627 ; AVX512F-LABEL: shuffle_v8i64_00204644:
1628 ; AVX512F:       # BB#0:
1629 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,2,0,4,6,4,4]
1630 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1631 ; AVX512F-NEXT:    retq
1632 ;
1633 ; AVX512F-32-LABEL: shuffle_v8i64_00204644:
1634 ; AVX512F-32:       # BB#0:
1635 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,2,0,0,0,4,0,6,0,4,0,4,0]
1636 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1637 ; AVX512F-32-NEXT:    retl
1638   %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>
1639   ret <8 x i64> %shuffle
1640 }
1641
1642 define <8 x i64> @shuffle_v8i64_03004474(<8 x i64> %a, <8 x i64> %b) {
1643 ;
1644 ; AVX512F-LABEL: shuffle_v8i64_03004474:
1645 ; AVX512F:       # BB#0:
1646 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,3,0,0,4,4,7,4]
1647 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1648 ; AVX512F-NEXT:    retq
1649 ;
1650 ; AVX512F-32-LABEL: shuffle_v8i64_03004474:
1651 ; AVX512F-32:       # BB#0:
1652 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,3,0,0,0,0,0,4,0,4,0,7,0,4,0]
1653 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1654 ; AVX512F-32-NEXT:    retl
1655   %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>
1656   ret <8 x i64> %shuffle
1657 }
1658
1659 define <8 x i64> @shuffle_v8i64_10004444(<8 x i64> %a, <8 x i64> %b) {
1660 ;
1661 ; AVX512F-LABEL: shuffle_v8i64_10004444:
1662 ; AVX512F:       # BB#0:
1663 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,4,4,4,4]
1664 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1665 ; AVX512F-NEXT:    retq
1666 ;
1667 ; AVX512F-32-LABEL: shuffle_v8i64_10004444:
1668 ; AVX512F-32:       # BB#0:
1669 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,0,0,0,0,4,0,4,0,4,0,4,0]
1670 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1671 ; AVX512F-32-NEXT:    retl
1672   %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>
1673   ret <8 x i64> %shuffle
1674 }
1675
1676 define <8 x i64> @shuffle_v8i64_22006446(<8 x i64> %a, <8 x i64> %b) {
1677 ;
1678 ; AVX512F-LABEL: shuffle_v8i64_22006446:
1679 ; AVX512F:       # BB#0:
1680 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [2,2,0,0,6,4,4,6]
1681 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1682 ; AVX512F-NEXT:    retq
1683 ;
1684 ; AVX512F-32-LABEL: shuffle_v8i64_22006446:
1685 ; AVX512F-32:       # BB#0:
1686 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [2,0,2,0,0,0,0,0,6,0,4,0,4,0,6,0]
1687 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1688 ; AVX512F-32-NEXT:    retl
1689   %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>
1690   ret <8 x i64> %shuffle
1691 }
1692
1693 define <8 x i64> @shuffle_v8i64_33307474(<8 x i64> %a, <8 x i64> %b) {
1694 ;
1695 ; AVX512F-LABEL: shuffle_v8i64_33307474:
1696 ; AVX512F:       # BB#0:
1697 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,3,3,0,7,4,7,4]
1698 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1699 ; AVX512F-NEXT:    retq
1700 ;
1701 ; AVX512F-32-LABEL: shuffle_v8i64_33307474:
1702 ; AVX512F-32:       # BB#0:
1703 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,0,3,0,3,0,0,0,7,0,4,0,7,0,4,0]
1704 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1705 ; AVX512F-32-NEXT:    retl
1706   %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>
1707   ret <8 x i64> %shuffle
1708 }
1709
1710 define <8 x i64> @shuffle_v8i64_32104567(<8 x i64> %a, <8 x i64> %b) {
1711 ;
1712 ; AVX512F-LABEL: shuffle_v8i64_32104567:
1713 ; AVX512F:       # BB#0:
1714 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,2,1,0,4,5,6,7]
1715 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1716 ; AVX512F-NEXT:    retq
1717 ;
1718 ; AVX512F-32-LABEL: shuffle_v8i64_32104567:
1719 ; AVX512F-32:       # BB#0:
1720 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [3,0,2,0,1,0,0,0,4,0,5,0,6,0,7,0]
1721 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1722 ; AVX512F-32-NEXT:    retl
1723   %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>
1724   ret <8 x i64> %shuffle
1725 }
1726
1727 define <8 x i64> @shuffle_v8i64_00236744(<8 x i64> %a, <8 x i64> %b) {
1728 ;
1729 ; AVX512F-LABEL: shuffle_v8i64_00236744:
1730 ; AVX512F:       # BB#0:
1731 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,2,3,6,7,4,4]
1732 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1733 ; AVX512F-NEXT:    retq
1734 ;
1735 ; AVX512F-32-LABEL: shuffle_v8i64_00236744:
1736 ; AVX512F-32:       # BB#0:
1737 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,2,0,3,0,6,0,7,0,4,0,4,0]
1738 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1739 ; AVX512F-32-NEXT:    retl
1740   %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>
1741   ret <8 x i64> %shuffle
1742 }
1743
1744 define <8 x i64> @shuffle_v8i64_00226644(<8 x i64> %a, <8 x i64> %b) {
1745 ;
1746 ; AVX512F-LABEL: shuffle_v8i64_00226644:
1747 ; AVX512F:       # BB#0:
1748 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,2,2,6,6,4,4]
1749 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1750 ; AVX512F-NEXT:    retq
1751 ;
1752 ; AVX512F-32-LABEL: shuffle_v8i64_00226644:
1753 ; AVX512F-32:       # BB#0:
1754 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,2,0,2,0,6,0,6,0,4,0,4,0]
1755 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1756 ; AVX512F-32-NEXT:    retl
1757   %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>
1758   ret <8 x i64> %shuffle
1759 }
1760
1761 define <8 x i64> @shuffle_v8i64_10324567(<8 x i64> %a, <8 x i64> %b) {
1762 ;
1763 ; AVX512F-LABEL: shuffle_v8i64_10324567:
1764 ; AVX512F:       # BB#0:
1765 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,3,2,4,5,6,7]
1766 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1767 ; AVX512F-NEXT:    retq
1768 ;
1769 ; AVX512F-32-LABEL: shuffle_v8i64_10324567:
1770 ; AVX512F-32:       # BB#0:
1771 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,0,0,3,0,2,0,4,0,5,0,6,0,7,0]
1772 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1773 ; AVX512F-32-NEXT:    retl
1774   %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>
1775   ret <8 x i64> %shuffle
1776 }
1777
1778 define <8 x i64> @shuffle_v8i64_11334567(<8 x i64> %a, <8 x i64> %b) {
1779 ;
1780 ; AVX512F-LABEL: shuffle_v8i64_11334567:
1781 ; AVX512F:       # BB#0:
1782 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,1,3,3,4,5,6,7]
1783 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1784 ; AVX512F-NEXT:    retq
1785 ;
1786 ; AVX512F-32-LABEL: shuffle_v8i64_11334567:
1787 ; AVX512F-32:       # BB#0:
1788 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [1,0,1,0,3,0,3,0,4,0,5,0,6,0,7,0]
1789 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1790 ; AVX512F-32-NEXT:    retl
1791   %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>
1792   ret <8 x i64> %shuffle
1793 }
1794
1795 define <8 x i64> @shuffle_v8i64_01235467(<8 x i64> %a, <8 x i64> %b) {
1796 ;
1797 ; AVX512F-LABEL: shuffle_v8i64_01235467:
1798 ; AVX512F:       # BB#0:
1799 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,1,2,3,5,4,6,7]
1800 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1801 ; AVX512F-NEXT:    retq
1802 ;
1803 ; AVX512F-32-LABEL: shuffle_v8i64_01235467:
1804 ; AVX512F-32:       # BB#0:
1805 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,1,0,2,0,3,0,5,0,4,0,6,0,7,0]
1806 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1807 ; AVX512F-32-NEXT:    retl
1808   %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>
1809   ret <8 x i64> %shuffle
1810 }
1811
1812 define <8 x i64> @shuffle_v8i64_01235466(<8 x i64> %a, <8 x i64> %b) {
1813 ;
1814 ; AVX512F-LABEL: shuffle_v8i64_01235466:
1815 ; AVX512F:       # BB#0:
1816 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,1,2,3,5,4,6,6]
1817 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1818 ; AVX512F-NEXT:    retq
1819 ;
1820 ; AVX512F-32-LABEL: shuffle_v8i64_01235466:
1821 ; AVX512F-32:       # BB#0:
1822 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,0,1,0,2,0,3,0,5,0,4,0,6,0,6,0]
1823 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1824 ; AVX512F-32-NEXT:    retl
1825   %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>
1826   ret <8 x i64> %shuffle
1827 }
1828
1829 define <8 x i64> @shuffle_v8i64_002u6u44(<8 x i64> %a, <8 x i64> %b) {
1830 ;
1831 ; AVX512F-LABEL: shuffle_v8i64_002u6u44:
1832 ; AVX512F:       # BB#0:
1833 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <0,0,2,u,6,u,4,4>
1834 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1835 ; AVX512F-NEXT:    retq
1836 ;
1837 ; AVX512F-32-LABEL: shuffle_v8i64_002u6u44:
1838 ; AVX512F-32:       # BB#0:
1839 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <0,0,0,0,2,0,u,u,6,0,u,u,4,0,4,0>
1840 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1841 ; AVX512F-32-NEXT:    retl
1842   %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>
1843   ret <8 x i64> %shuffle
1844 }
1845
1846 define <8 x i64> @shuffle_v8i64_00uu66uu(<8 x i64> %a, <8 x i64> %b) {
1847 ;
1848 ; AVX512F-LABEL: shuffle_v8i64_00uu66uu:
1849 ; AVX512F:       # BB#0:
1850 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <0,0,u,u,6,6,u,u>
1851 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1852 ; AVX512F-NEXT:    retq
1853 ;
1854 ; AVX512F-32-LABEL: shuffle_v8i64_00uu66uu:
1855 ; AVX512F-32:       # BB#0:
1856 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <0,0,0,0,u,u,u,u,6,0,6,0,u,u,u,u>
1857 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1858 ; AVX512F-32-NEXT:    retl
1859   %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>
1860   ret <8 x i64> %shuffle
1861 }
1862
1863 define <8 x i64> @shuffle_v8i64_103245uu(<8 x i64> %a, <8 x i64> %b) {
1864 ;
1865 ; AVX512F-LABEL: shuffle_v8i64_103245uu:
1866 ; AVX512F:       # BB#0:
1867 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <1,0,3,2,4,5,u,u>
1868 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1869 ; AVX512F-NEXT:    retq
1870 ;
1871 ; AVX512F-32-LABEL: shuffle_v8i64_103245uu:
1872 ; AVX512F-32:       # BB#0:
1873 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <1,0,0,0,3,0,2,0,4,0,5,0,u,u,u,u>
1874 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1875 ; AVX512F-32-NEXT:    retl
1876   %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>
1877   ret <8 x i64> %shuffle
1878 }
1879
1880 define <8 x i64> @shuffle_v8i64_1133uu67(<8 x i64> %a, <8 x i64> %b) {
1881 ;
1882 ; AVX512F-LABEL: shuffle_v8i64_1133uu67:
1883 ; AVX512F:       # BB#0:
1884 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <1,1,3,3,u,u,6,7>
1885 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1886 ; AVX512F-NEXT:    retq
1887 ;
1888 ; AVX512F-32-LABEL: shuffle_v8i64_1133uu67:
1889 ; AVX512F-32:       # BB#0:
1890 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <1,0,1,0,3,0,3,0,u,u,u,u,6,0,7,0>
1891 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1892 ; AVX512F-32-NEXT:    retl
1893   %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>
1894   ret <8 x i64> %shuffle
1895 }
1896
1897 define <8 x i64> @shuffle_v8i64_0uu354uu(<8 x i64> %a, <8 x i64> %b) {
1898 ;
1899 ; AVX512F-LABEL: shuffle_v8i64_0uu354uu:
1900 ; AVX512F:       # BB#0:
1901 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <0,u,u,3,5,4,u,u>
1902 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1903 ; AVX512F-NEXT:    retq
1904 ;
1905 ; AVX512F-32-LABEL: shuffle_v8i64_0uu354uu:
1906 ; AVX512F-32:       # BB#0:
1907 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <0,0,u,u,u,u,3,0,5,0,4,0,u,u,u,u>
1908 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1909 ; AVX512F-32-NEXT:    retl
1910   %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>
1911   ret <8 x i64> %shuffle
1912 }
1913
1914 define <8 x i64> @shuffle_v8i64_uuu3uu66(<8 x i64> %a, <8 x i64> %b) {
1915 ;
1916 ; AVX512F-LABEL: shuffle_v8i64_uuu3uu66:
1917 ; AVX512F:       # BB#0:
1918 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <u,u,u,3,u,u,6,6>
1919 ; AVX512F-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1920 ; AVX512F-NEXT:    retq
1921 ;
1922 ; AVX512F-32-LABEL: shuffle_v8i64_uuu3uu66:
1923 ; AVX512F-32:       # BB#0:
1924 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm1 = <u,u,u,u,u,u,3,0,u,u,u,u,6,0,6,0>
1925 ; AVX512F-32-NEXT:    vpermq %zmm0, %zmm1, %zmm0
1926 ; AVX512F-32-NEXT:    retl
1927   %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>
1928   ret <8 x i64> %shuffle
1929 }
1930
1931 define <8 x i64> @shuffle_v8i64_6caa87e5(<8 x i64> %a, <8 x i64> %b) {
1932 ;
1933 ; AVX512F-LABEL: shuffle_v8i64_6caa87e5:
1934 ; AVX512F:       # BB#0:
1935 ; AVX512F-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [14,4,2,2,0,15,6,13]
1936 ; AVX512F-NEXT:    vpermt2q %zmm0, %zmm2, %zmm1
1937 ; AVX512F-NEXT:    vmovaps %zmm1, %zmm0
1938 ; AVX512F-NEXT:    retq
1939 ;
1940 ; AVX512F-32-LABEL: shuffle_v8i64_6caa87e5:
1941 ; AVX512F-32:       # BB#0:
1942 ; AVX512F-32-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [14,0,4,0,2,0,2,0,0,0,15,0,6,0,13,0]
1943 ; AVX512F-32-NEXT:    vpermt2q %zmm0, %zmm2, %zmm1
1944 ; AVX512F-32-NEXT:    vmovaps %zmm1, %zmm0
1945 ; AVX512F-32-NEXT:    retl
1946   %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>
1947   ret <8 x i64> %shuffle
1948 }
1949
1950 define <8 x double> @shuffle_v8f64_082a4c6e(<8 x double> %a, <8 x double> %b) {
1951 ;
1952 ; AVX512F-LABEL: shuffle_v8f64_082a4c6e:
1953 ; AVX512F:       # BB#0:
1954 ; AVX512F-NEXT:    vunpcklpd {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[2],zmm1[2],zmm0[4],zmm1[4],zmm0[6],zmm1[6]
1955 ; AVX512F-NEXT:    retq
1956 ;
1957 ; AVX512F-32-LABEL: shuffle_v8f64_082a4c6e:
1958 ; AVX512F-32:       # BB#0:
1959 ; AVX512F-32-NEXT:    vunpcklpd {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[2],zmm1[2],zmm0[4],zmm1[4],zmm0[6],zmm1[6]
1960 ; AVX512F-32-NEXT:    retl
1961   %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>
1962   ret <8 x double> %shuffle
1963 }
1964
1965 define <8 x i64> @shuffle_v8i64_082a4c6e(<8 x i64> %a, <8 x i64> %b) {
1966 ;
1967 ; AVX512F-LABEL: shuffle_v8i64_082a4c6e:
1968 ; AVX512F:       # BB#0:
1969 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[2],zmm1[2],zmm0[4],zmm1[4],zmm0[6],zmm1[6]
1970 ; AVX512F-NEXT:    retq
1971 ;
1972 ; AVX512F-32-LABEL: shuffle_v8i64_082a4c6e:
1973 ; AVX512F-32:       # BB#0:
1974 ; AVX512F-32-NEXT:    vpunpcklqdq {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[2],zmm1[2],zmm0[4],zmm1[4],zmm0[6],zmm1[6]
1975 ; AVX512F-32-NEXT:    retl
1976   %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>
1977   ret <8 x i64> %shuffle
1978 }
1979
1980 define <8 x double> @shuffle_v8f64_193b5d7f(<8 x double> %a, <8 x double> %b) {
1981 ;
1982 ; AVX512F-LABEL: shuffle_v8f64_193b5d7f:
1983 ; AVX512F:       # BB#0:
1984 ; AVX512F-NEXT:    vunpckhpd {{.*#+}} zmm0 = zmm0[1],zmm1[1],zmm0[3],zmm1[3],zmm0[5],zmm1[5],zmm0[7],zmm1[7]
1985 ; AVX512F-NEXT:    retq
1986 ;
1987 ; AVX512F-32-LABEL: shuffle_v8f64_193b5d7f:
1988 ; AVX512F-32:       # BB#0:
1989 ; AVX512F-32-NEXT:    vunpckhpd {{.*#+}} zmm0 = zmm0[1],zmm1[1],zmm0[3],zmm1[3],zmm0[5],zmm1[5],zmm0[7],zmm1[7]
1990 ; AVX512F-32-NEXT:    retl
1991   %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>
1992   ret <8 x double> %shuffle
1993 }
1994
1995 define <8 x i64> @shuffle_v8i64_193b5d7f(<8 x i64> %a, <8 x i64> %b) {
1996 ;
1997 ; AVX512F-LABEL: shuffle_v8i64_193b5d7f:
1998 ; AVX512F:       # BB#0:
1999 ; AVX512F-NEXT:    vpunpckhqdq {{.*#+}} zmm0 = zmm0[1],zmm1[1],zmm0[3],zmm1[3],zmm0[5],zmm1[5],zmm0[7],zmm1[7]
2000 ; AVX512F-NEXT:    retq
2001 ;
2002 ; AVX512F-32-LABEL: shuffle_v8i64_193b5d7f:
2003 ; AVX512F-32:       # BB#0:
2004 ; AVX512F-32-NEXT:    vpunpckhqdq {{.*#+}} zmm0 = zmm0[1],zmm1[1],zmm0[3],zmm1[3],zmm0[5],zmm1[5],zmm0[7],zmm1[7]
2005 ; AVX512F-32-NEXT:    retl
2006   %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>
2007   ret <8 x i64> %shuffle
2008 }
2009
2010 define <8 x double> @test_vshuff64x2_512(<8 x double> %x, <8 x double> %x1) nounwind {
2011 ; AVX512F-LABEL: test_vshuff64x2_512:
2012 ; AVX512F:       # BB#0:
2013 ; AVX512F-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,4,5],zmm1[2,3,0,1]
2014 ; AVX512F-NEXT:    retq
2015 ;
2016 ; AVX512F-32-LABEL: test_vshuff64x2_512:
2017 ; AVX512F-32:       # BB#0:
2018 ; AVX512F-32-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,4,5],zmm1[2,3,0,1]
2019 ; AVX512F-32-NEXT:    retl
2020   %res = shufflevector <8 x double> %x, <8 x double> %x1, <8 x i32> <i32 0, i32 1, i32 4, i32 5, i32 10, i32 11, i32 8, i32 9>
2021   ret <8 x double> %res
2022 }
2023
2024 define <8 x double> @test_vshuff64x2_512_maskz(<8 x double> %x, <8 x double> %x1, <8 x i1> %mask) nounwind {
2025 ; AVX512F-LABEL: test_vshuff64x2_512_maskz:
2026 ; AVX512F:       # BB#0:
2027 ; AVX512F-NEXT:    vpmovsxwq %xmm2, %zmm2
2028 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2
2029 ; AVX512F-NEXT:    vptestmq %zmm2, %zmm2, %k1
2030 ; AVX512F-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,4,5],zmm1[2,3,0,1]
2031 ; AVX512F-NEXT:    retq
2032 ;
2033 ; AVX512F-32-LABEL: test_vshuff64x2_512_maskz:
2034 ; AVX512F-32:       # BB#0:
2035 ; AVX512F-32-NEXT:    vpmovsxwq %xmm2, %zmm2
2036 ; AVX512F-32-NEXT:    vpandq .LCPI118_0, %zmm2, %zmm2
2037 ; AVX512F-32-NEXT:    vptestmq %zmm2, %zmm2, %k1
2038 ; AVX512F-32-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,4,5],zmm1[2,3,0,1]
2039 ; AVX512F-32-NEXT:    retl
2040   %y = shufflevector <8 x double> %x, <8 x double> %x1, <8 x i32> <i32 0, i32 1, i32 4, i32 5, i32 10, i32 11, i32 8, i32 9>
2041   %res = select <8 x i1> %mask, <8 x double> %y, <8 x double> zeroinitializer
2042   ret <8 x double> %res
2043 }
2044
2045 define <8 x i64> @test_vshufi64x2_512_mask(<8 x i64> %x, <8 x i64> %x1, <8 x i1> %mask) nounwind {
2046 ; AVX512F-LABEL: test_vshufi64x2_512_mask:
2047 ; AVX512F:       # BB#0:
2048 ; AVX512F-NEXT:    vpmovsxwq %xmm2, %zmm2
2049 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2
2050 ; AVX512F-NEXT:    vptestmq %zmm2, %zmm2, %k1
2051 ; AVX512F-NEXT:    vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,4,5],zmm1[2,3,0,1]
2052 ; AVX512F-NEXT:    retq
2053 ;
2054 ; AVX512F-32-LABEL: test_vshufi64x2_512_mask:
2055 ; AVX512F-32:       # BB#0:
2056 ; AVX512F-32-NEXT:    vpmovsxwq %xmm2, %zmm2
2057 ; AVX512F-32-NEXT:    vpandq .LCPI119_0, %zmm2, %zmm2
2058 ; AVX512F-32-NEXT:    vptestmq %zmm2, %zmm2, %k1
2059 ; AVX512F-32-NEXT:    vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,4,5],zmm1[2,3,0,1]
2060 ; AVX512F-32-NEXT:    retl
2061   %y = shufflevector <8 x i64> %x, <8 x i64> %x1, <8 x i32> <i32 0, i32 1, i32 4, i32 5, i32 10, i32 11, i32 8, i32 9>
2062   %res = select <8 x i1> %mask, <8 x i64> %y, <8 x i64> %x
2063   ret <8 x i64> %res
2064 }
2065
2066 define <8 x double> @test_vshuff64x2_512_mem(<8 x double> %x, <8 x double> *%ptr) nounwind {
2067 ; AVX512F-LABEL: test_vshuff64x2_512_mem:
2068 ; AVX512F:       # BB#0:
2069 ; AVX512F-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,4,5],mem[2,3,0,1]
2070 ; AVX512F-NEXT:    retq
2071 ;
2072 ; AVX512F-32-LABEL: test_vshuff64x2_512_mem:
2073 ; AVX512F-32:       # BB#0:
2074 ; AVX512F-32-NEXT:    movl {{[0-9]+}}(%esp), %eax
2075 ; AVX512F-32-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,4,5],mem[2,3,0,1]
2076 ; AVX512F-32-NEXT:    retl
2077   %x1   = load <8 x double>,<8 x double> *%ptr,align 1
2078   %res = shufflevector <8 x double> %x, <8 x double> %x1, <8 x i32> <i32 0, i32 1, i32 4, i32 5, i32 10, i32 11, i32 8, i32 9>
2079   ret <8 x double> %res
2080 }
2081
2082 define <8 x double> @test_vshuff64x2_512_mem_mask(<8 x double> %x, <8 x double> *%ptr, <8 x i1> %mask) nounwind {
2083 ; AVX512F-LABEL: test_vshuff64x2_512_mem_mask:
2084 ; AVX512F:       # BB#0:
2085 ; AVX512F-NEXT:    vpmovsxwq %xmm1, %zmm1
2086 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm1, %zmm1
2087 ; AVX512F-NEXT:    vptestmq %zmm1, %zmm1, %k1
2088 ; AVX512F-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,4,5],mem[2,3,0,1]
2089 ; AVX512F-NEXT:    retq
2090 ;
2091 ; AVX512F-32-LABEL: test_vshuff64x2_512_mem_mask:
2092 ; AVX512F-32:       # BB#0:
2093 ; AVX512F-32-NEXT:    vpmovsxwq %xmm1, %zmm1
2094 ; AVX512F-32-NEXT:    vpandq .LCPI121_0, %zmm1, %zmm1
2095 ; AVX512F-32-NEXT:    vptestmq %zmm1, %zmm1, %k1
2096 ; AVX512F-32-NEXT:    movl {{[0-9]+}}(%esp), %eax
2097 ; AVX512F-32-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,4,5],mem[2,3,0,1]
2098 ; AVX512F-32-NEXT:    retl
2099   %x1 = load <8 x double>,<8 x double> *%ptr,align 1
2100   %y = shufflevector <8 x double> %x, <8 x double> %x1, <8 x i32> <i32 0, i32 1, i32 4, i32 5, i32 10, i32 11, i32 8, i32 9>
2101   %res = select <8 x i1> %mask, <8 x double> %y, <8 x double> %x
2102   ret <8 x double> %res
2103 }
2104
2105 define <8 x double> @test_vshuff64x2_512_mem_maskz(<8 x double> %x, <8 x double> *%ptr, <8 x i1> %mask) nounwind {
2106 ; AVX512F-LABEL: test_vshuff64x2_512_mem_maskz:
2107 ; AVX512F:       # BB#0:
2108 ; AVX512F-NEXT:    vpmovsxwq %xmm1, %zmm1
2109 ; AVX512F-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm1, %zmm1
2110 ; AVX512F-NEXT:    vptestmq %zmm1, %zmm1, %k1
2111 ; AVX512F-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,4,5],mem[2,3,0,1]
2112 ; AVX512F-NEXT:    retq
2113 ;
2114 ; AVX512F-32-LABEL: test_vshuff64x2_512_mem_maskz:
2115 ; AVX512F-32:       # BB#0:
2116 ; AVX512F-32-NEXT:    vpmovsxwq %xmm1, %zmm1
2117 ; AVX512F-32-NEXT:    vpandq .LCPI122_0, %zmm1, %zmm1
2118 ; AVX512F-32-NEXT:    vptestmq %zmm1, %zmm1, %k1
2119 ; AVX512F-32-NEXT:    movl {{[0-9]+}}(%esp), %eax
2120 ; AVX512F-32-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,4,5],mem[2,3,0,1]
2121 ; AVX512F-32-NEXT:    retl
2122   %x1 = load <8 x double>,<8 x double> *%ptr,align 1
2123   %y = shufflevector <8 x double> %x, <8 x double> %x1, <8 x i32> <i32 0, i32 1, i32 4, i32 5, i32 10, i32 11, i32 8, i32 9>
2124   %res = select <8 x i1> %mask, <8 x double> %y, <8 x double> zeroinitializer
2125   ret <8 x double> %res
2126 }
2127
2128 define <16 x float> @test_vshuff32x4_512(<16 x float> %x, <16 x float> %x1) nounwind {
2129 ; AVX512F-LABEL: test_vshuff32x4_512:
2130 ; AVX512F:       # BB#0:
2131 ; AVX512F-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,2,3],zmm1[2,3,0,1]
2132 ; AVX512F-NEXT:    retq
2133 ;
2134 ; AVX512F-32-LABEL: test_vshuff32x4_512:
2135 ; AVX512F-32:       # BB#0:
2136 ; AVX512F-32-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,2,3],zmm1[2,3,0,1]
2137 ; AVX512F-32-NEXT:    retl
2138   %res = shufflevector <16 x float> %x, <16 x float> %x1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 20, i32 21, i32 22, i32 23, i32 16, i32 17, i32 18, i32 19>
2139   ret <16 x float> %res
2140 }