[x86] Fix a large collection of bugs that crept in as I fleshed out the
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-256-v4.ll
1 ; RUN: llc < %s -mcpu=x86-64 -mattr=+avx -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
2 ; RUN: llc < %s -mcpu=x86-64 -mattr=+avx2 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
3
4 target triple = "x86_64-unknown-unknown"
5
6 define <4 x double> @shuffle_v4f64_0001(<4 x double> %a, <4 x double> %b) {
7 ; AVX1-LABEL: @shuffle_v4f64_0001
8 ; AVX1:       # BB#0:
9 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm1 = xmm0[0,0]
10 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
11 ; AVX1-NEXT:    retq
12 ;
13 ; AVX2-LABEL: @shuffle_v4f64_0001
14 ; AVX2:       # BB#0:
15 ; AVX2-NEXT:    vpermpd {{.*}} # ymm0 = ymm0[0,0,0,1]
16 ; AVX2-NEXT:    retq
17   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
18   ret <4 x double> %shuffle
19 }
20
21 define <4 x double> @shuffle_v4f64_0020(<4 x double> %a, <4 x double> %b) {
22 ; AVX1-LABEL: @shuffle_v4f64_0020
23 ; AVX1:       # BB#0:
24 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
25 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm1 = xmm1[0],xmm0[0]
26 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm0 = xmm0[0,0]
27 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
28 ; AVX1-NEXT:    retq
29 ;
30 ; AVX2-LABEL: @shuffle_v4f64_0020
31 ; AVX2:       # BB#0:
32 ; AVX2-NEXT:    vpermpd {{.*}} # ymm0 = ymm0[0,0,2,0]
33 ; AVX2-NEXT:    retq
34   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
35   ret <4 x double> %shuffle
36 }
37
38 define <4 x double> @shuffle_v4f64_0300(<4 x double> %a, <4 x double> %b) {
39 ; AVX1-LABEL: @shuffle_v4f64_0300
40 ; AVX1:       # BB#0:
41 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm1 = ymm0[2,3,0,1]
42 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm1 = ymm1[0,1,2,2]
43 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3]
44 ; AVX1-NEXT:    retq
45 ;
46 ; AVX2-LABEL: @shuffle_v4f64_0300
47 ; AVX2:       # BB#0:
48 ; AVX2-NEXT:    vpermpd {{.*}} # ymm0 = ymm0[0,3,0,0]
49 ; AVX2-NEXT:    retq
50   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
51   ret <4 x double> %shuffle
52 }
53
54 define <4 x double> @shuffle_v4f64_1000(<4 x double> %a, <4 x double> %b) {
55 ; AVX1-LABEL: @shuffle_v4f64_1000
56 ; AVX1:       # BB#0:
57 ; AVX1-NEXT:    vpermilpd {{.*}} # xmm1 = xmm0[1,0]
58 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm0 = xmm0[0,0]
59 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
60 ; AVX1-NEXT:    retq
61 ;
62 ; AVX2-LABEL: @shuffle_v4f64_1000
63 ; AVX2:       # BB#0:
64 ; AVX2-NEXT:    vpermpd {{.*}} # ymm0 = ymm0[1,0,0,0]
65 ; AVX2-NEXT:    retq
66   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
67   ret <4 x double> %shuffle
68 }
69
70 define <4 x double> @shuffle_v4f64_2200(<4 x double> %a, <4 x double> %b) {
71 ; AVX1-LABEL: @shuffle_v4f64_2200
72 ; AVX1:       # BB#0:
73 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm0 = ymm0[2,3,0,1]
74 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,2,2]
75 ; AVX1-NEXT:    retq
76 ;
77 ; AVX2-LABEL: @shuffle_v4f64_2200
78 ; AVX2:       # BB#0:
79 ; AVX2-NEXT:    vpermpd {{.*}} # ymm0 = ymm0[2,2,0,0]
80 ; AVX2-NEXT:    retq
81   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
82   ret <4 x double> %shuffle
83 }
84
85 define <4 x double> @shuffle_v4f64_3330(<4 x double> %a, <4 x double> %b) {
86 ; AVX1-LABEL: @shuffle_v4f64_3330
87 ; AVX1:       # BB#0:
88 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm1 = ymm0[2,3,0,1]
89 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm1 = ymm1[1,1,2,2]
90 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,3,2]
91 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm1[0,1],ymm0[2],ymm1[3]
92 ; AVX1-NEXT:    retq
93 ;
94 ; AVX2-LABEL: @shuffle_v4f64_3330
95 ; AVX2:       # BB#0:
96 ; AVX2-NEXT:    vpermpd {{.*}} # ymm0 = ymm0[3,3,3,0]
97 ; AVX2-NEXT:    retq
98   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
99   ret <4 x double> %shuffle
100 }
101
102 define <4 x double> @shuffle_v4f64_3210(<4 x double> %a, <4 x double> %b) {
103 ; AVX1-LABEL: @shuffle_v4f64_3210
104 ; AVX1:       # BB#0:
105 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm0 = ymm0[2,3,0,1]
106 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,0,3,2]
107 ; AVX1-NEXT:    retq
108 ;
109 ; AVX2-LABEL: @shuffle_v4f64_3210
110 ; AVX2:       # BB#0:
111 ; AVX2-NEXT:    vpermpd {{.*}} # ymm0 = ymm0[3,2,1,0]
112 ; AVX2-NEXT:    retq
113   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
114   ret <4 x double> %shuffle
115 }
116
117 define <4 x double> @shuffle_v4f64_0023(<4 x double> %a, <4 x double> %b) {
118 ; ALL-LABEL: @shuffle_v4f64_0023
119 ; ALL:       # BB#0:
120 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,2,3]
121 ; ALL-NEXT:    retq
122   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 3>
123   ret <4 x double> %shuffle
124 }
125
126 define <4 x double> @shuffle_v4f64_0022(<4 x double> %a, <4 x double> %b) {
127 ; ALL-LABEL: @shuffle_v4f64_0022
128 ; ALL:       # BB#0:
129 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,2,2]
130 ; ALL-NEXT:    retq
131   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 2>
132   ret <4 x double> %shuffle
133 }
134
135 define <4 x double> @shuffle_v4f64_1032(<4 x double> %a, <4 x double> %b) {
136 ; ALL-LABEL: @shuffle_v4f64_1032
137 ; ALL:       # BB#0:
138 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,0,3,2]
139 ; ALL-NEXT:    retq
140   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
141   ret <4 x double> %shuffle
142 }
143
144 define <4 x double> @shuffle_v4f64_1133(<4 x double> %a, <4 x double> %b) {
145 ; ALL-LABEL: @shuffle_v4f64_1133
146 ; ALL:       # BB#0:
147 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,1,3,3]
148 ; ALL-NEXT:    retq
149   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 1, i32 3, i32 3>
150   ret <4 x double> %shuffle
151 }
152
153 define <4 x double> @shuffle_v4f64_1023(<4 x double> %a, <4 x double> %b) {
154 ; ALL-LABEL: @shuffle_v4f64_1023
155 ; ALL:       # BB#0:
156 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,0,2,3]
157 ; ALL-NEXT:    retq
158   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 2, i32 3>
159   ret <4 x double> %shuffle
160 }
161
162 define <4 x double> @shuffle_v4f64_1022(<4 x double> %a, <4 x double> %b) {
163 ; ALL-LABEL: @shuffle_v4f64_1022
164 ; ALL:       # BB#0:
165 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,0,2,2]
166 ; ALL-NEXT:    retq
167   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 2, i32 2>
168   ret <4 x double> %shuffle
169 }
170
171 define <4 x double> @shuffle_v4f64_0423(<4 x double> %a, <4 x double> %b) {
172 ; ALL-LABEL: @shuffle_v4f64_0423
173 ; ALL:       # BB#0:
174 ; ALL-NEXT:    vpermilpd {{.*}} # ymm1 = ymm1[0,0,2,2]
175 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1],ymm0[2,3]
176 ; ALL-NEXT:    retq
177   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 3>
178   ret <4 x double> %shuffle
179 }
180
181 define <4 x double> @shuffle_v4f64_0462(<4 x double> %a, <4 x double> %b) {
182 ; ALL-LABEL: @shuffle_v4f64_0462
183 ; ALL:       # BB#0:
184 ; ALL-NEXT:    vpermilpd {{.*}} # ymm1 = ymm1[0,0,2,2]
185 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,2,2]
186 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2],ymm0[3]
187 ; ALL-NEXT:    retq
188   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 4, i32 6, i32 2>
189   ret <4 x double> %shuffle
190 }
191
192 define <4 x double> @shuffle_v4f64_0426(<4 x double> %a, <4 x double> %b) {
193 ; ALL-LABEL: @shuffle_v4f64_0426
194 ; ALL:       # BB#0:
195 ; ALL-NEXT:    vunpcklpd {{.*}} # ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
196 ; ALL-NEXT:    retq
197   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
198   ret <4 x double> %shuffle
199 }
200
201 define <4 x double> @shuffle_v4f64_1537(<4 x double> %a, <4 x double> %b) {
202 ; ALL-LABEL: @shuffle_v4f64_1537
203 ; ALL:       # BB#0:
204 ; ALL-NEXT:    vunpckhpd {{.*}} # ymm0 = ymm0[1],ymm1[1],ymm0[3],ymm1[3]
205 ; ALL-NEXT:    retq
206   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
207   ret <4 x double> %shuffle
208 }
209
210 define <4 x double> @shuffle_v4f64_4062(<4 x double> %a, <4 x double> %b) {
211 ; ALL-LABEL: @shuffle_v4f64_4062
212 ; ALL:       # BB#0:
213 ; ALL-NEXT:    vunpcklpd {{.*}} # ymm0 = ymm1[0],ymm0[0],ymm1[2],ymm0[2]
214 ; ALL-NEXT:    retq
215   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 4, i32 0, i32 6, i32 2>
216   ret <4 x double> %shuffle
217 }
218
219 define <4 x double> @shuffle_v4f64_5173(<4 x double> %a, <4 x double> %b) {
220 ; ALL-LABEL: @shuffle_v4f64_5173
221 ; ALL:       # BB#0:
222 ; ALL-NEXT:    vunpckhpd {{.*}} # ymm0 = ymm1[1],ymm0[1],ymm1[3],ymm0[3]
223 ; ALL-NEXT:    retq
224   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 5, i32 1, i32 7, i32 3>
225   ret <4 x double> %shuffle
226 }
227
228 define <4 x double> @shuffle_v4f64_5163(<4 x double> %a, <4 x double> %b) {
229 ; ALL-LABEL: @shuffle_v4f64_5163
230 ; ALL:       # BB#0:
231 ; ALL-NEXT:    vshufpd {{.*}} # ymm0 = ymm1[1],ymm0[1],ymm1[2],ymm0[3]
232 ; ALL-NEXT:    retq
233   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 5, i32 1, i32 6, i32 3>
234   ret <4 x double> %shuffle
235 }
236
237 define <4 x double> @shuffle_v4f64_0527(<4 x double> %a, <4 x double> %b) {
238 ; ALL-LABEL: @shuffle_v4f64_0527
239 ; ALL:       # BB#0:
240 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
241 ; ALL-NEXT:    retq
242   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
243   ret <4 x double> %shuffle
244 }
245
246 define <4 x double> @shuffle_v4f64_4163(<4 x double> %a, <4 x double> %b) {
247 ; ALL-LABEL: @shuffle_v4f64_4163
248 ; ALL:       # BB#0:
249 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3]
250 ; ALL-NEXT:    retq
251   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
252   ret <4 x double> %shuffle
253 }
254
255 define <4 x double> @shuffle_v4f64_0145(<4 x double> %a, <4 x double> %b) {
256 ; AVX1-LABEL: @shuffle_v4f64_0145
257 ; AVX1:       # BB#0:
258 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
259 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0,1],ymm1[2,3]
260 ; AVX1-NEXT:    retq
261 ;
262 ; AVX2-LABEL: @shuffle_v4f64_0145
263 ; AVX2:       # BB#0:
264 ; AVX2-NEXT:    vpermpd {{.*}} # ymm1 = ymm1[0,1,0,1]
265 ; AVX2-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0,1],ymm1[2,3]
266 ; AVX2-NEXT:    retq
267   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
268   ret <4 x double> %shuffle
269 }
270
271 define <4 x double> @shuffle_v4f64_4501(<4 x double> %a, <4 x double> %b) {
272 ; AVX1-LABEL: @shuffle_v4f64_4501
273 ; AVX1:       # BB#0:
274 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
275 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm1[0,1],ymm0[2,3]
276 ; AVX1-NEXT:    retq
277 ;
278 ; AVX2-LABEL: @shuffle_v4f64_4501
279 ; AVX2:       # BB#0:
280 ; AVX2-NEXT:    vpermpd {{.*}} # ymm0 = ymm0[0,1,0,1]
281 ; AVX2-NEXT:    vblendpd {{.*}} # ymm0 = ymm1[0,1],ymm0[2,3]
282 ; AVX2-NEXT:    retq
283   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
284   ret <4 x double> %shuffle
285 }
286
287 define <4 x double> @shuffle_v4f64_0167(<4 x double> %a, <4 x double> %b) {
288 ; ALL-LABEL: @shuffle_v4f64_0167
289 ; ALL:       # BB#0:
290 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0,1],ymm1[2,3]
291 ; ALL-NEXT:    retq
292   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
293   ret <4 x double> %shuffle
294 }
295
296 define <4 x i64> @shuffle_v4i64_0001(<4 x i64> %a, <4 x i64> %b) {
297 ; AVX1-LABEL: @shuffle_v4i64_0001
298 ; AVX1:       # BB#0:
299 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm1 = xmm0[0,0]
300 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
301 ; AVX1-NEXT:    retq
302 ;
303 ; AVX2-LABEL: @shuffle_v4i64_0001
304 ; AVX2:       # BB#0:
305 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,0,0,1]
306 ; AVX2-NEXT:    retq
307   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
308   ret <4 x i64> %shuffle
309 }
310
311 define <4 x i64> @shuffle_v4i64_0020(<4 x i64> %a, <4 x i64> %b) {
312 ; AVX1-LABEL: @shuffle_v4i64_0020
313 ; AVX1:       # BB#0:
314 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
315 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm1 = xmm1[0],xmm0[0]
316 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm0 = xmm0[0,0]
317 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
318 ; AVX1-NEXT:    retq
319 ;
320 ; AVX2-LABEL: @shuffle_v4i64_0020
321 ; AVX2:       # BB#0:
322 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,0,2,0]
323 ; AVX2-NEXT:    retq
324   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
325   ret <4 x i64> %shuffle
326 }
327
328 define <4 x i64> @shuffle_v4i64_0112(<4 x i64> %a, <4 x i64> %b) {
329 ; AVX1-LABEL: @shuffle_v4i64_0112
330 ; AVX1:       # BB#0:
331 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
332 ; AVX1-NEXT:    vshufpd {{.*}} # xmm1 = xmm0[1],xmm1[0]
333 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
334 ; AVX1-NEXT:    retq
335 ;
336 ; AVX2-LABEL: @shuffle_v4i64_0112
337 ; AVX2:       # BB#0:
338 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,1,1,2]
339 ; AVX2-NEXT:    retq
340   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 1, i32 2>
341   ret <4 x i64> %shuffle
342 }
343
344 define <4 x i64> @shuffle_v4i64_0300(<4 x i64> %a, <4 x i64> %b) {
345 ; AVX1-LABEL: @shuffle_v4i64_0300
346 ; AVX1:       # BB#0:
347 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm1 = ymm0[2,3,0,1]
348 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm1 = ymm1[0,1,2,2]
349 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3]
350 ; AVX1-NEXT:    retq
351 ;
352 ; AVX2-LABEL: @shuffle_v4i64_0300
353 ; AVX2:       # BB#0:
354 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,3,0,0]
355 ; AVX2-NEXT:    retq
356   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
357   ret <4 x i64> %shuffle
358 }
359
360 define <4 x i64> @shuffle_v4i64_1000(<4 x i64> %a, <4 x i64> %b) {
361 ; AVX1-LABEL: @shuffle_v4i64_1000
362 ; AVX1:       # BB#0:
363 ; AVX1-NEXT:    vpermilpd {{.*}} # xmm1 = xmm0[1,0]
364 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm0 = xmm0[0,0]
365 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
366 ; AVX1-NEXT:    retq
367 ;
368 ; AVX2-LABEL: @shuffle_v4i64_1000
369 ; AVX2:       # BB#0:
370 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[1,0,0,0]
371 ; AVX2-NEXT:    retq
372   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
373   ret <4 x i64> %shuffle
374 }
375
376 define <4 x i64> @shuffle_v4i64_2200(<4 x i64> %a, <4 x i64> %b) {
377 ; AVX1-LABEL: @shuffle_v4i64_2200
378 ; AVX1:       # BB#0:
379 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm0 = ymm0[2,3,0,1]
380 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,2,2]
381 ; AVX1-NEXT:    retq
382 ;
383 ; AVX2-LABEL: @shuffle_v4i64_2200
384 ; AVX2:       # BB#0:
385 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[2,2,0,0]
386 ; AVX2-NEXT:    retq
387   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
388   ret <4 x i64> %shuffle
389 }
390
391 define <4 x i64> @shuffle_v4i64_3330(<4 x i64> %a, <4 x i64> %b) {
392 ; AVX1-LABEL: @shuffle_v4i64_3330
393 ; AVX1:       # BB#0:
394 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm1 = ymm0[2,3,0,1]
395 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm1 = ymm1[1,1,2,2]
396 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,3,2]
397 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm1[0,1],ymm0[2],ymm1[3]
398 ; AVX1-NEXT:    retq
399 ;
400 ; AVX2-LABEL: @shuffle_v4i64_3330
401 ; AVX2:       # BB#0:
402 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[3,3,3,0]
403 ; AVX2-NEXT:    retq
404   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
405   ret <4 x i64> %shuffle
406 }
407
408 define <4 x i64> @shuffle_v4i64_3210(<4 x i64> %a, <4 x i64> %b) {
409 ; AVX1-LABEL: @shuffle_v4i64_3210
410 ; AVX1:       # BB#0:
411 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm0 = ymm0[2,3,0,1]
412 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,0,3,2]
413 ; AVX1-NEXT:    retq
414 ;
415 ; AVX2-LABEL: @shuffle_v4i64_3210
416 ; AVX2:       # BB#0:
417 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[3,2,1,0]
418 ; AVX2-NEXT:    retq
419   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
420   ret <4 x i64> %shuffle
421 }
422
423 define <4 x i64> @shuffle_v4i64_0124(<4 x i64> %a, <4 x i64> %b) {
424 ; AVX1-LABEL: @shuffle_v4i64_0124
425 ; AVX1:       # BB#0:
426 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm1 = xmm1[0,0]
427 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
428 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0,1,2],ymm1[3]
429 ; AVX1-NEXT:    retq
430 ;
431 ; AVX2-LABEL: @shuffle_v4i64_0124
432 ; AVX2:       # BB#0:
433 ; AVX2-NEXT:    vpermq {{.*}} # ymm1 = ymm1[0,1,2,0]
434 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1,2,3,4,5],ymm1[6,7]
435 ; AVX2-NEXT:    retq
436   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 4>
437   ret <4 x i64> %shuffle
438 }
439
440 define <4 x i64> @shuffle_v4i64_0142(<4 x i64> %a, <4 x i64> %b) {
441 ; AVX1-LABEL: @shuffle_v4i64_0142
442 ; AVX1:       # BB#0:
443 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
444 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,1,2,2]
445 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0,1],ymm1[2],ymm0[3]
446 ; AVX1-NEXT:    retq
447 ;
448 ; AVX2-LABEL: @shuffle_v4i64_0142
449 ; AVX2:       # BB#0:
450 ; AVX2-NEXT:    vpermq {{.*}} # ymm1 = ymm1[0,1,0,3]
451 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,1,2,2]
452 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1,2,3],ymm1[4,5],ymm0[6,7]
453 ; AVX2-NEXT:    retq
454   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 2>
455   ret <4 x i64> %shuffle
456 }
457
458 define <4 x i64> @shuffle_v4i64_0412(<4 x i64> %a, <4 x i64> %b) {
459 ; AVX1-LABEL: @shuffle_v4i64_0412
460 ; AVX1:       # BB#0:
461 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
462 ; AVX1-NEXT:    vshufpd {{.*}} # xmm2 = xmm0[1],xmm2[0]
463 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
464 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm1 = ymm1[0,0,2,2]
465 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1],ymm0[2,3]
466 ; AVX1-NEXT:    retq
467 ;
468 ; AVX2-LABEL: @shuffle_v4i64_0412
469 ; AVX2:       # BB#0:
470 ; AVX2-NEXT:    vpshufd {{.*}} # ymm1 = ymm1[0,1,0,1,4,5,4,5]
471 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,1,1,2]
472 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5,6,7]
473 ; AVX2-NEXT:    retq
474   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 2>
475   ret <4 x i64> %shuffle
476 }
477
478 define <4 x i64> @shuffle_v4i64_4012(<4 x i64> %a, <4 x i64> %b) {
479 ; AVX1-LABEL: @shuffle_v4i64_4012
480 ; AVX1:       # BB#0:
481 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
482 ; AVX1-NEXT:    vshufpd {{.*}} # xmm2 = xmm0[1],xmm2[0]
483 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm0 = xmm0[0,0]
484 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
485 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm1[0],ymm0[1,2,3]
486 ; AVX1-NEXT:    retq
487 ;
488 ; AVX2-LABEL: @shuffle_v4i64_4012
489 ; AVX2:       # BB#0:
490 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,0,1,2]
491 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm1[0,1],ymm0[2,3,4,5,6,7]
492 ; AVX2-NEXT:    retq
493   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
494   ret <4 x i64> %shuffle
495 }
496
497 define <4 x i64> @shuffle_v4i64_0145(<4 x i64> %a, <4 x i64> %b) {
498 ; AVX1-LABEL: @shuffle_v4i64_0145
499 ; AVX1:       # BB#0:
500 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
501 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0,1],ymm1[2,3]
502 ; AVX1-NEXT:    retq
503 ;
504 ; AVX2-LABEL: @shuffle_v4i64_0145
505 ; AVX2:       # BB#0:
506 ; AVX2-NEXT:    vpermq {{.*}} # ymm1 = ymm1[0,1,0,1]
507 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
508 ; AVX2-NEXT:    retq
509   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
510   ret <4 x i64> %shuffle
511 }
512
513 define <4 x i64> @shuffle_v4i64_0451(<4 x i64> %a, <4 x i64> %b) {
514 ; AVX1-LABEL: @shuffle_v4i64_0451
515 ; AVX1:       # BB#0:
516 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
517 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm2 = xmm1[0,0]
518 ; AVX1-NEXT:    vpermilpd {{.*}} # xmm1 = xmm1[1,0]
519 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
520 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2],ymm0[3]
521 ; AVX1-NEXT:    retq
522 ;
523 ; AVX2-LABEL: @shuffle_v4i64_0451
524 ; AVX2:       # BB#0:
525 ; AVX2-NEXT:    vpermq {{.*}} # ymm1 = ymm1[0,0,1,3]
526 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,1,2,1]
527 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1],ymm1[2,3,4,5],ymm0[6,7]
528 ; AVX2-NEXT:    retq
529   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 4, i32 5, i32 1>
530   ret <4 x i64> %shuffle
531 }
532
533 define <4 x i64> @shuffle_v4i64_4501(<4 x i64> %a, <4 x i64> %b) {
534 ; AVX1-LABEL: @shuffle_v4i64_4501
535 ; AVX1:       # BB#0:
536 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
537 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm1[0,1],ymm0[2,3]
538 ; AVX1-NEXT:    retq
539 ;
540 ; AVX2-LABEL: @shuffle_v4i64_4501
541 ; AVX2:       # BB#0:
542 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,1,0,1]
543 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
544 ; AVX2-NEXT:    retq
545   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
546   ret <4 x i64> %shuffle
547 }
548
549 define <4 x i64> @shuffle_v4i64_4015(<4 x i64> %a, <4 x i64> %b) {
550 ; AVX1-LABEL: @shuffle_v4i64_4015
551 ; AVX1:       # BB#0:
552 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm1, %ymm1
553 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm2 = xmm0[0,0]
554 ; AVX1-NEXT:    vpermilpd {{.*}} # xmm0 = xmm0[1,0]
555 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
556 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm1[0],ymm0[1,2],ymm1[3]
557 ; AVX1-NEXT:    retq
558 ;
559 ; AVX2-LABEL: @shuffle_v4i64_4015
560 ; AVX2:       # BB#0:
561 ; AVX2-NEXT:    vpermq {{.*}} # ymm1 = ymm1[0,1,2,1]
562 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,0,1,3]
563 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm1[0,1],ymm0[2,3,4,5],ymm1[6,7]
564 ; AVX2-NEXT:    retq
565   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 5>
566   ret <4 x i64> %shuffle
567 }
568
569 define <4 x i64> @shuffle_v4i64_2u35(<4 x i64> %a, <4 x i64> %b) {
570 ; AVX1-LABEL: @shuffle_v4i64_2u35
571 ; AVX1:       # BB#0:
572 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
573 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
574 ; AVX1-NEXT:    vpermilpd {{.*}} # xmm2 = xmm0[1,0]
575 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
576 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0,1,2],ymm1[3]
577 ; AVX1-NEXT:    retq
578 ;
579 ; AVX2-LABEL: @shuffle_v4i64_2u35
580 ; AVX2:       # BB#0:
581 ; AVX2-NEXT:    vpermq {{.*}} # ymm1 = ymm1[0,1,2,1]
582 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[2,1,3,3]
583 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1,2,3,4,5],ymm1[6,7]
584 ; AVX2-NEXT:    retq
585   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 2, i32 undef, i32 3, i32 5>
586   ret <4 x i64> %shuffle
587 }
588
589 define <4 x i64> @shuffle_v4i64_1251(<4 x i64> %a, <4 x i64> %b) {
590 ; AVX1-LABEL: @shuffle_v4i64_1251
591 ; AVX1:       # BB#0:
592 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm2 = ymm0[2,3,0,1]
593 ; AVX1-NEXT:    vshufpd {{.*}} # ymm0 = ymm0[1],ymm2[0],ymm0[2],ymm2[3]
594 ; AVX1-NEXT:    vpermilpd {{.*}} # xmm1 = xmm1[1,0]
595 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
596 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0,1],ymm1[2],ymm0[3]
597 ; AVX1-NEXT:    retq
598 ;
599 ; AVX2-LABEL: @shuffle_v4i64_1251
600 ; AVX2:       # BB#0:
601 ; AVX2-NEXT:    vpermq {{.*}} # ymm1 = ymm1[0,1,1,3]
602 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[1,2,2,1]
603 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1,2,3],ymm1[4,5],ymm0[6,7]
604 ; AVX2-NEXT:    retq
605   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 2, i32 5, i32 1>
606   ret <4 x i64> %shuffle
607 }
608
609 define <4 x i64> @stress_test1(<4 x i64> %a, <4 x i64> %b) {
610 ; AVX1-LABEL: @stress_test1
611 ; AVX1:       # BB#0:
612 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm0 = ymm1[2,3,0,1]
613 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm2 = ymm0[1,0,3,2]
614 ; AVX1-NEXT:    vblendpd {{.*}} # ymm1 = ymm2[0],ymm1[1],ymm2[2,3]
615 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
616 ; AVX1-NEXT:    vpermilpd {{.*}} # xmm1 = xmm1[1,0]
617 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,1,3,2]
618 ; AVX1-NEXT:    vpermilpd {{.*}} # xmm2 = xmm1[1,0]
619 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
620 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,0,2,2]
621 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3]
622 ; AVX1-NEXT:    retq
623 ;
624 ; AVX2-LABEL: @stress_test1
625 ; AVX2:       # BB#0:
626 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm1[3,1,1,0]
627 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[3,1,2,3]
628 ; AVX2-NEXT:    vpermq {{.*}} # ymm1 = ymm1[3,3,1,3]
629 ; AVX2-NEXT:    vpshufd {{.*}} # ymm1 = ymm1[2,3,2,3,6,7,6,7]
630 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,1,1,0]
631 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm1[0,1],ymm0[2,3,4,5,6,7]
632 ; AVX2-NEXT:    retq
633   %c = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> <i32 3, i32 1, i32 1, i32 0>
634   %d = shufflevector <4 x i64> %c, <4 x i64> undef, <4 x i32> <i32 3, i32 undef, i32 2, i32 undef>
635   %e = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> <i32 3, i32 3, i32 1, i32 undef>
636   %f = shufflevector <4 x i64> %d, <4 x i64> %e, <4 x i32> <i32 5, i32 1, i32 1, i32 0>
637
638   ret <4 x i64> %f
639 }
640
641 define <4 x i64> @insert_reg_and_zero_v4i64(i64 %a) {
642 ; AVX1-LABEL: @insert_reg_and_zero_v4i64
643 ; AVX1:       # BB#0:
644 ; AVX1-NEXT:    vmovq %rdi, %xmm0
645 ; AVX1-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
646 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3]
647 ; AVX1-NEXT:    retq
648 ;
649 ; AVX2-LABEL: @insert_reg_and_zero_v4i64
650 ; AVX2:       # BB#0:
651 ; AVX2-NEXT:    vmovq %rdi, %xmm0
652 ; AVX2-NEXT:    vpxor %ymm1, %ymm1, %ymm1
653 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1],ymm1[2,3,4,5,6,7]
654 ; AVX2-NEXT:    retq
655   %v = insertelement <4 x i64> undef, i64 %a, i64 0
656   %shuffle = shufflevector <4 x i64> %v, <4 x i64> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
657   ret <4 x i64> %shuffle
658 }
659
660 define <4 x i64> @insert_mem_and_zero_v4i64(i64* %ptr) {
661 ; AVX1-LABEL: @insert_mem_and_zero_v4i64
662 ; AVX1:       # BB#0:
663 ; AVX1-NEXT:    vmovq (%rdi), %xmm0
664 ; AVX1-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
665 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3]
666 ; AVX1-NEXT:    retq
667 ;
668 ; AVX2-LABEL: @insert_mem_and_zero_v4i64
669 ; AVX2:       # BB#0:
670 ; AVX2-NEXT:    vmovq (%rdi), %xmm0
671 ; AVX2-NEXT:    vpxor %ymm1, %ymm1, %ymm1
672 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1],ymm1[2,3,4,5,6,7]
673 ; AVX2-NEXT:    retq
674   %a = load i64* %ptr
675   %v = insertelement <4 x i64> undef, i64 %a, i64 0
676   %shuffle = shufflevector <4 x i64> %v, <4 x i64> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
677   ret <4 x i64> %shuffle
678 }
679
680 define <4 x double> @insert_reg_and_zero_v4f64(double %a) {
681 ; ALL-LABEL: @insert_reg_and_zero_v4f64
682 ; ALL:       # BB#0:
683 ; ALL:         vxorpd %ymm1, %ymm1, %ymm1
684 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3]
685 ; ALL-NEXT:    retq
686   %v = insertelement <4 x double> undef, double %a, i32 0
687   %shuffle = shufflevector <4 x double> %v, <4 x double> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
688   ret <4 x double> %shuffle
689 }
690
691 define <4 x double> @insert_mem_and_zero_v4f64(double* %ptr) {
692 ; ALL-LABEL: @insert_mem_and_zero_v4f64
693 ; ALL:       # BB#0:
694 ; ALL-NEXT:    vmovsd (%rdi), %xmm0
695 ; ALL-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
696 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3]
697 ; ALL-NEXT:    retq
698   %a = load double* %ptr
699   %v = insertelement <4 x double> undef, double %a, i32 0
700   %shuffle = shufflevector <4 x double> %v, <4 x double> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
701   ret <4 x double> %shuffle
702 }