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