OSDN Git Service

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