[X86] Remove special validation for INT immediate operand from AsmParser. Instead...
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-128-v2.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE3
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+ssse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=knl -mattr=+avx512vl | FileCheck %s --check-prefix=AVX512VL
8
9 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
10 target triple = "x86_64-unknown-unknown"
11
12 define <2 x i64> @shuffle_v2i64_00(<2 x i64> %a, <2 x i64> %b) {
13 ; SSE-LABEL: shuffle_v2i64_00:
14 ; SSE:       # BB#0:
15 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
16 ; SSE-NEXT:    retq
17 ;
18 ; AVX1-LABEL: shuffle_v2i64_00:
19 ; AVX1:       # BB#0:
20 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
21 ; AVX1-NEXT:    retq
22 ;
23 ; AVX2-LABEL: shuffle_v2i64_00:
24 ; AVX2:       # BB#0:
25 ; AVX2-NEXT:    vpbroadcastq %xmm0, %xmm0
26 ; AVX2-NEXT:    retq
27   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 0>
28   ret <2 x i64> %shuffle
29 }
30 define <2 x i64> @shuffle_v2i64_10(<2 x i64> %a, <2 x i64> %b) {
31 ; SSE-LABEL: shuffle_v2i64_10:
32 ; SSE:       # BB#0:
33 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
34 ; SSE-NEXT:    retq
35 ;
36 ; AVX-LABEL: shuffle_v2i64_10:
37 ; AVX:       # BB#0:
38 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
39 ; AVX-NEXT:    retq
40   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 0>
41   ret <2 x i64> %shuffle
42 }
43 define <2 x i64> @shuffle_v2i64_11(<2 x i64> %a, <2 x i64> %b) {
44 ; SSE-LABEL: shuffle_v2i64_11:
45 ; SSE:       # BB#0:
46 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
47 ; SSE-NEXT:    retq
48 ;
49 ; AVX-LABEL: shuffle_v2i64_11:
50 ; AVX:       # BB#0:
51 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
52 ; AVX-NEXT:    retq
53   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 1>
54   ret <2 x i64> %shuffle
55 }
56 define <2 x i64> @shuffle_v2i64_22(<2 x i64> %a, <2 x i64> %b) {
57 ; SSE-LABEL: shuffle_v2i64_22:
58 ; SSE:       # BB#0:
59 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,1,0,1]
60 ; SSE-NEXT:    retq
61 ;
62 ; AVX1-LABEL: shuffle_v2i64_22:
63 ; AVX1:       # BB#0:
64 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[0,1,0,1]
65 ; AVX1-NEXT:    retq
66 ;
67 ; AVX2-LABEL: shuffle_v2i64_22:
68 ; AVX2:       # BB#0:
69 ; AVX2-NEXT:    vpbroadcastq %xmm1, %xmm0
70 ; AVX2-NEXT:    retq
71   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 2>
72   ret <2 x i64> %shuffle
73 }
74 define <2 x i64> @shuffle_v2i64_32(<2 x i64> %a, <2 x i64> %b) {
75 ; SSE-LABEL: shuffle_v2i64_32:
76 ; SSE:       # BB#0:
77 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
78 ; SSE-NEXT:    retq
79 ;
80 ; AVX-LABEL: shuffle_v2i64_32:
81 ; AVX:       # BB#0:
82 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
83 ; AVX-NEXT:    retq
84   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 2>
85   ret <2 x i64> %shuffle
86 }
87 define <2 x i64> @shuffle_v2i64_33(<2 x i64> %a, <2 x i64> %b) {
88 ; SSE-LABEL: shuffle_v2i64_33:
89 ; SSE:       # BB#0:
90 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
91 ; SSE-NEXT:    retq
92 ;
93 ; AVX-LABEL: shuffle_v2i64_33:
94 ; AVX:       # BB#0:
95 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
96 ; AVX-NEXT:    retq
97   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 3>
98   ret <2 x i64> %shuffle
99 }
100
101 define <2 x double> @shuffle_v2f64_00(<2 x double> %a, <2 x double> %b) {
102 ; SSE2-LABEL: shuffle_v2f64_00:
103 ; SSE2:       # BB#0:
104 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
105 ; SSE2-NEXT:    retq
106 ;
107 ; SSE3-LABEL: shuffle_v2f64_00:
108 ; SSE3:       # BB#0:
109 ; SSE3-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
110 ; SSE3-NEXT:    retq
111 ;
112 ; SSSE3-LABEL: shuffle_v2f64_00:
113 ; SSSE3:       # BB#0:
114 ; SSSE3-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
115 ; SSSE3-NEXT:    retq
116 ;
117 ; SSE41-LABEL: shuffle_v2f64_00:
118 ; SSE41:       # BB#0:
119 ; SSE41-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
120 ; SSE41-NEXT:    retq
121 ;
122 ; AVX-LABEL: shuffle_v2f64_00:
123 ; AVX:       # BB#0:
124 ; AVX-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
125 ; AVX-NEXT:    retq
126   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 0>
127   ret <2 x double> %shuffle
128 }
129 define <2 x double> @shuffle_v2f64_10(<2 x double> %a, <2 x double> %b) {
130 ; SSE-LABEL: shuffle_v2f64_10:
131 ; SSE:       # BB#0:
132 ; SSE-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
133 ; SSE-NEXT:    retq
134 ;
135 ; AVX-LABEL: shuffle_v2f64_10:
136 ; AVX:       # BB#0:
137 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
138 ; AVX-NEXT:    retq
139
140 ; AVX512VL-LABEL: shuffle_v2f64_10:
141 ; AVX512VL:       # BB#0:
142 ; AVX512VL-NEXT:    vpermilpd $1, %xmm0, %xmm0
143 ; AVX512VL-NEXT:    retq
144   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 0>
145   ret <2 x double> %shuffle
146 }
147 define <2 x double> @shuffle_v2f64_11(<2 x double> %a, <2 x double> %b) {
148 ; SSE-LABEL: shuffle_v2f64_11:
149 ; SSE:       # BB#0:
150 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
151 ; SSE-NEXT:    retq
152 ;
153 ; AVX-LABEL: shuffle_v2f64_11:
154 ; AVX:       # BB#0:
155 ; AVX-NEXT:    vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
156 ; AVX-NEXT:    retq
157   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 1>
158   ret <2 x double> %shuffle
159 }
160 define <2 x double> @shuffle_v2f64_22(<2 x double> %a, <2 x double> %b) {
161 ; SSE2-LABEL: shuffle_v2f64_22:
162 ; SSE2:       # BB#0:
163 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0,0]
164 ; SSE2-NEXT:    movaps %xmm1, %xmm0
165 ; SSE2-NEXT:    retq
166 ;
167 ; SSE3-LABEL: shuffle_v2f64_22:
168 ; SSE3:       # BB#0:
169 ; SSE3-NEXT:    movddup {{.*#+}} xmm0 = xmm1[0,0]
170 ; SSE3-NEXT:    retq
171 ;
172 ; SSSE3-LABEL: shuffle_v2f64_22:
173 ; SSSE3:       # BB#0:
174 ; SSSE3-NEXT:    movddup {{.*#+}} xmm0 = xmm1[0,0]
175 ; SSSE3-NEXT:    retq
176 ;
177 ; SSE41-LABEL: shuffle_v2f64_22:
178 ; SSE41:       # BB#0:
179 ; SSE41-NEXT:    movddup {{.*#+}} xmm0 = xmm1[0,0]
180 ; SSE41-NEXT:    retq
181 ;
182 ; AVX-LABEL: shuffle_v2f64_22:
183 ; AVX:       # BB#0:
184 ; AVX-NEXT:    vmovddup {{.*#+}} xmm0 = xmm1[0,0]
185 ; AVX-NEXT:    retq
186   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 2>
187   ret <2 x double> %shuffle
188 }
189 define <2 x double> @shuffle_v2f64_32(<2 x double> %a, <2 x double> %b) {
190 ; SSE-LABEL: shuffle_v2f64_32:
191 ; SSE:       # BB#0:
192 ; SSE-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1,0]
193 ; SSE-NEXT:    movapd %xmm1, %xmm0
194 ; SSE-NEXT:    retq
195 ;
196 ; AVX-LABEL: shuffle_v2f64_32:
197 ; AVX:       # BB#0:
198 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm1[1,0]
199 ; AVX-NEXT:    retq
200
201 ; AVX512VL-LABEL: shuffle_v2f64_32:
202 ; AVX512VL:       # BB#0:
203 ; AVX512VL-NEXT:    vpermilpd $1, %xmm1, %xmm0
204 ; AVX512VL-NEXT:    retq
205   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 3, i32 2>
206   ret <2 x double> %shuffle
207 }
208 define <2 x double> @shuffle_v2f64_33(<2 x double> %a, <2 x double> %b) {
209 ; SSE-LABEL: shuffle_v2f64_33:
210 ; SSE:       # BB#0:
211 ; SSE-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
212 ; SSE-NEXT:    movaps %xmm1, %xmm0
213 ; SSE-NEXT:    retq
214 ;
215 ; AVX-LABEL: shuffle_v2f64_33:
216 ; AVX:       # BB#0:
217 ; AVX-NEXT:    vmovhlps {{.*#+}} xmm0 = xmm1[1,1]
218 ; AVX-NEXT:    retq
219   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 3, i32 3>
220   ret <2 x double> %shuffle
221 }
222 define <2 x double> @shuffle_v2f64_03(<2 x double> %a, <2 x double> %b) {
223 ; SSE2-LABEL: shuffle_v2f64_03:
224 ; SSE2:       # BB#0:
225 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
226 ; SSE2-NEXT:    movapd %xmm1, %xmm0
227 ; SSE2-NEXT:    retq
228 ;
229 ; SSE3-LABEL: shuffle_v2f64_03:
230 ; SSE3:       # BB#0:
231 ; SSE3-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
232 ; SSE3-NEXT:    movapd %xmm1, %xmm0
233 ; SSE3-NEXT:    retq
234 ;
235 ; SSSE3-LABEL: shuffle_v2f64_03:
236 ; SSSE3:       # BB#0:
237 ; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
238 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
239 ; SSSE3-NEXT:    retq
240 ;
241 ; SSE41-LABEL: shuffle_v2f64_03:
242 ; SSE41:       # BB#0:
243 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
244 ; SSE41-NEXT:    retq
245 ;
246 ; AVX-LABEL: shuffle_v2f64_03:
247 ; AVX:       # BB#0:
248 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
249 ; AVX-NEXT:    retq
250   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 3>
251   ret <2 x double> %shuffle
252 }
253 define <2 x double> @shuffle_v2f64_21(<2 x double> %a, <2 x double> %b) {
254 ; SSE2-LABEL: shuffle_v2f64_21:
255 ; SSE2:       # BB#0:
256 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
257 ; SSE2-NEXT:    retq
258 ;
259 ; SSE3-LABEL: shuffle_v2f64_21:
260 ; SSE3:       # BB#0:
261 ; SSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
262 ; SSE3-NEXT:    retq
263 ;
264 ; SSSE3-LABEL: shuffle_v2f64_21:
265 ; SSSE3:       # BB#0:
266 ; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
267 ; SSSE3-NEXT:    retq
268 ;
269 ; SSE41-LABEL: shuffle_v2f64_21:
270 ; SSE41:       # BB#0:
271 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
272 ; SSE41-NEXT:    retq
273 ;
274 ; AVX-LABEL: shuffle_v2f64_21:
275 ; AVX:       # BB#0:
276 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
277 ; AVX-NEXT:    retq
278   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 1>
279   ret <2 x double> %shuffle
280 }
281
282
283 define <2 x i64> @shuffle_v2i64_02(<2 x i64> %a, <2 x i64> %b) {
284 ; SSE-LABEL: shuffle_v2i64_02:
285 ; SSE:       # BB#0:
286 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
287 ; SSE-NEXT:    retq
288 ;
289 ; AVX-LABEL: shuffle_v2i64_02:
290 ; AVX:       # BB#0:
291 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
292 ; AVX-NEXT:    retq
293   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
294   ret <2 x i64> %shuffle
295 }
296 define <2 x i64> @shuffle_v2i64_02_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
297 ; SSE-LABEL: shuffle_v2i64_02_copy:
298 ; SSE:       # BB#0:
299 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
300 ; SSE-NEXT:    movdqa %xmm1, %xmm0
301 ; SSE-NEXT:    retq
302 ;
303 ; AVX-LABEL: shuffle_v2i64_02_copy:
304 ; AVX:       # BB#0:
305 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm2[0]
306 ; AVX-NEXT:    retq
307   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
308   ret <2 x i64> %shuffle
309 }
310 define <2 x i64> @shuffle_v2i64_03(<2 x i64> %a, <2 x i64> %b) {
311 ; SSE2-LABEL: shuffle_v2i64_03:
312 ; SSE2:       # BB#0:
313 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
314 ; SSE2-NEXT:    movapd %xmm1, %xmm0
315 ; SSE2-NEXT:    retq
316 ;
317 ; SSE3-LABEL: shuffle_v2i64_03:
318 ; SSE3:       # BB#0:
319 ; SSE3-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
320 ; SSE3-NEXT:    movapd %xmm1, %xmm0
321 ; SSE3-NEXT:    retq
322 ;
323 ; SSSE3-LABEL: shuffle_v2i64_03:
324 ; SSSE3:       # BB#0:
325 ; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
326 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
327 ; SSSE3-NEXT:    retq
328 ;
329 ; SSE41-LABEL: shuffle_v2i64_03:
330 ; SSE41:       # BB#0:
331 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
332 ; SSE41-NEXT:    retq
333 ;
334 ; AVX1-LABEL: shuffle_v2i64_03:
335 ; AVX1:       # BB#0:
336 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
337 ; AVX1-NEXT:    retq
338 ;
339 ; AVX2-LABEL: shuffle_v2i64_03:
340 ; AVX2:       # BB#0:
341 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
342 ; AVX2-NEXT:    retq
343   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
344   ret <2 x i64> %shuffle
345 }
346 define <2 x i64> @shuffle_v2i64_03_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
347 ; SSE2-LABEL: shuffle_v2i64_03_copy:
348 ; SSE2:       # BB#0:
349 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]
350 ; SSE2-NEXT:    movapd %xmm2, %xmm0
351 ; SSE2-NEXT:    retq
352 ;
353 ; SSE3-LABEL: shuffle_v2i64_03_copy:
354 ; SSE3:       # BB#0:
355 ; SSE3-NEXT:    movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]
356 ; SSE3-NEXT:    movapd %xmm2, %xmm0
357 ; SSE3-NEXT:    retq
358 ;
359 ; SSSE3-LABEL: shuffle_v2i64_03_copy:
360 ; SSSE3:       # BB#0:
361 ; SSSE3-NEXT:    movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]
362 ; SSSE3-NEXT:    movapd %xmm2, %xmm0
363 ; SSSE3-NEXT:    retq
364 ;
365 ; SSE41-LABEL: shuffle_v2i64_03_copy:
366 ; SSE41:       # BB#0:
367 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
368 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
369 ; SSE41-NEXT:    retq
370 ;
371 ; AVX1-LABEL: shuffle_v2i64_03_copy:
372 ; AVX1:       # BB#0:
373 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm2[4,5,6,7]
374 ; AVX1-NEXT:    retq
375 ;
376 ; AVX2-LABEL: shuffle_v2i64_03_copy:
377 ; AVX2:       # BB#0:
378 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm2[2,3]
379 ; AVX2-NEXT:    retq
380   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
381   ret <2 x i64> %shuffle
382 }
383 define <2 x i64> @shuffle_v2i64_12(<2 x i64> %a, <2 x i64> %b) {
384 ; SSE2-LABEL: shuffle_v2i64_12:
385 ; SSE2:       # BB#0:
386 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
387 ; SSE2-NEXT:    retq
388 ;
389 ; SSE3-LABEL: shuffle_v2i64_12:
390 ; SSE3:       # BB#0:
391 ; SSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
392 ; SSE3-NEXT:    retq
393 ;
394 ; SSSE3-LABEL: shuffle_v2i64_12:
395 ; SSSE3:       # BB#0:
396 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
397 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
398 ; SSSE3-NEXT:    retq
399 ;
400 ; SSE41-LABEL: shuffle_v2i64_12:
401 ; SSE41:       # BB#0:
402 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
403 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
404 ; SSE41-NEXT:    retq
405 ;
406 ; AVX-LABEL: shuffle_v2i64_12:
407 ; AVX:       # BB#0:
408 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
409 ; AVX-NEXT:    retq
410   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2>
411   ret <2 x i64> %shuffle
412 }
413 define <2 x i64> @shuffle_v2i64_12_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
414 ; SSE2-LABEL: shuffle_v2i64_12_copy:
415 ; SSE2:       # BB#0:
416 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm2[0]
417 ; SSE2-NEXT:    movapd %xmm1, %xmm0
418 ; SSE2-NEXT:    retq
419 ;
420 ; SSE3-LABEL: shuffle_v2i64_12_copy:
421 ; SSE3:       # BB#0:
422 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm2[0]
423 ; SSE3-NEXT:    movapd %xmm1, %xmm0
424 ; SSE3-NEXT:    retq
425 ;
426 ; SSSE3-LABEL: shuffle_v2i64_12_copy:
427 ; SSSE3:       # BB#0:
428 ; SSSE3-NEXT:    palignr {{.*#+}} xmm2 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
429 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
430 ; SSSE3-NEXT:    retq
431 ;
432 ; SSE41-LABEL: shuffle_v2i64_12_copy:
433 ; SSE41:       # BB#0:
434 ; SSE41-NEXT:    palignr {{.*#+}} xmm2 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
435 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
436 ; SSE41-NEXT:    retq
437 ;
438 ; AVX-LABEL: shuffle_v2i64_12_copy:
439 ; AVX:       # BB#0:
440 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
441 ; AVX-NEXT:    retq
442   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2>
443   ret <2 x i64> %shuffle
444 }
445 define <2 x i64> @shuffle_v2i64_13(<2 x i64> %a, <2 x i64> %b) {
446 ; SSE-LABEL: shuffle_v2i64_13:
447 ; SSE:       # BB#0:
448 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
449 ; SSE-NEXT:    retq
450 ;
451 ; AVX-LABEL: shuffle_v2i64_13:
452 ; AVX:       # BB#0:
453 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
454 ; AVX-NEXT:    retq
455   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
456   ret <2 x i64> %shuffle
457 }
458 define <2 x i64> @shuffle_v2i64_13_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
459 ; SSE-LABEL: shuffle_v2i64_13_copy:
460 ; SSE:       # BB#0:
461 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm2[1]
462 ; SSE-NEXT:    movdqa %xmm1, %xmm0
463 ; SSE-NEXT:    retq
464 ;
465 ; AVX-LABEL: shuffle_v2i64_13_copy:
466 ; AVX:       # BB#0:
467 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm2[1]
468 ; AVX-NEXT:    retq
469   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
470   ret <2 x i64> %shuffle
471 }
472 define <2 x i64> @shuffle_v2i64_20(<2 x i64> %a, <2 x i64> %b) {
473 ; SSE-LABEL: shuffle_v2i64_20:
474 ; SSE:       # BB#0:
475 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
476 ; SSE-NEXT:    movdqa %xmm1, %xmm0
477 ; SSE-NEXT:    retq
478 ;
479 ; AVX-LABEL: shuffle_v2i64_20:
480 ; AVX:       # BB#0:
481 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
482 ; AVX-NEXT:    retq
483   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
484   ret <2 x i64> %shuffle
485 }
486 define <2 x i64> @shuffle_v2i64_20_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
487 ; SSE-LABEL: shuffle_v2i64_20_copy:
488 ; SSE:       # BB#0:
489 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
490 ; SSE-NEXT:    movdqa %xmm2, %xmm0
491 ; SSE-NEXT:    retq
492 ;
493 ; AVX-LABEL: shuffle_v2i64_20_copy:
494 ; AVX:       # BB#0:
495 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm1[0]
496 ; AVX-NEXT:    retq
497   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
498   ret <2 x i64> %shuffle
499 }
500 define <2 x i64> @shuffle_v2i64_21(<2 x i64> %a, <2 x i64> %b) {
501 ; SSE2-LABEL: shuffle_v2i64_21:
502 ; SSE2:       # BB#0:
503 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
504 ; SSE2-NEXT:    retq
505 ;
506 ; SSE3-LABEL: shuffle_v2i64_21:
507 ; SSE3:       # BB#0:
508 ; SSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
509 ; SSE3-NEXT:    retq
510 ;
511 ; SSSE3-LABEL: shuffle_v2i64_21:
512 ; SSSE3:       # BB#0:
513 ; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
514 ; SSSE3-NEXT:    retq
515 ;
516 ; SSE41-LABEL: shuffle_v2i64_21:
517 ; SSE41:       # BB#0:
518 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
519 ; SSE41-NEXT:    retq
520 ;
521 ; AVX1-LABEL: shuffle_v2i64_21:
522 ; AVX1:       # BB#0:
523 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
524 ; AVX1-NEXT:    retq
525 ;
526 ; AVX2-LABEL: shuffle_v2i64_21:
527 ; AVX2:       # BB#0:
528 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
529 ; AVX2-NEXT:    retq
530   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 1>
531   ret <2 x i64> %shuffle
532 }
533 define <2 x i64> @shuffle_v2i64_21_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
534 ; SSE2-LABEL: shuffle_v2i64_21_copy:
535 ; SSE2:       # BB#0:
536 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
537 ; SSE2-NEXT:    movapd %xmm1, %xmm0
538 ; SSE2-NEXT:    retq
539 ;
540 ; SSE3-LABEL: shuffle_v2i64_21_copy:
541 ; SSE3:       # BB#0:
542 ; SSE3-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
543 ; SSE3-NEXT:    movapd %xmm1, %xmm0
544 ; SSE3-NEXT:    retq
545 ;
546 ; SSSE3-LABEL: shuffle_v2i64_21_copy:
547 ; SSSE3:       # BB#0:
548 ; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
549 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
550 ; SSSE3-NEXT:    retq
551 ;
552 ; SSE41-LABEL: shuffle_v2i64_21_copy:
553 ; SSE41:       # BB#0:
554 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
555 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
556 ; SSE41-NEXT:    retq
557 ;
558 ; AVX1-LABEL: shuffle_v2i64_21_copy:
559 ; AVX1:       # BB#0:
560 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm1[4,5,6,7]
561 ; AVX1-NEXT:    retq
562 ;
563 ; AVX2-LABEL: shuffle_v2i64_21_copy:
564 ; AVX2:       # BB#0:
565 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm2[0,1],xmm1[2,3]
566 ; AVX2-NEXT:    retq
567   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 1>
568   ret <2 x i64> %shuffle
569 }
570 define <2 x i64> @shuffle_v2i64_30(<2 x i64> %a, <2 x i64> %b) {
571 ; SSE2-LABEL: shuffle_v2i64_30:
572 ; SSE2:       # BB#0:
573 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
574 ; SSE2-NEXT:    movapd %xmm1, %xmm0
575 ; SSE2-NEXT:    retq
576 ;
577 ; SSE3-LABEL: shuffle_v2i64_30:
578 ; SSE3:       # BB#0:
579 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
580 ; SSE3-NEXT:    movapd %xmm1, %xmm0
581 ; SSE3-NEXT:    retq
582 ;
583 ; SSSE3-LABEL: shuffle_v2i64_30:
584 ; SSSE3:       # BB#0:
585 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
586 ; SSSE3-NEXT:    retq
587 ;
588 ; SSE41-LABEL: shuffle_v2i64_30:
589 ; SSE41:       # BB#0:
590 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
591 ; SSE41-NEXT:    retq
592 ;
593 ; AVX-LABEL: shuffle_v2i64_30:
594 ; AVX:       # BB#0:
595 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
596 ; AVX-NEXT:    retq
597   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 0>
598   ret <2 x i64> %shuffle
599 }
600 define <2 x i64> @shuffle_v2i64_30_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
601 ; SSE2-LABEL: shuffle_v2i64_30_copy:
602 ; SSE2:       # BB#0:
603 ; SSE2-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[1],xmm1[0]
604 ; SSE2-NEXT:    movapd %xmm2, %xmm0
605 ; SSE2-NEXT:    retq
606 ;
607 ; SSE3-LABEL: shuffle_v2i64_30_copy:
608 ; SSE3:       # BB#0:
609 ; SSE3-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[1],xmm1[0]
610 ; SSE3-NEXT:    movapd %xmm2, %xmm0
611 ; SSE3-NEXT:    retq
612 ;
613 ; SSSE3-LABEL: shuffle_v2i64_30_copy:
614 ; SSSE3:       # BB#0:
615 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
616 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
617 ; SSSE3-NEXT:    retq
618 ;
619 ; SSE41-LABEL: shuffle_v2i64_30_copy:
620 ; SSE41:       # BB#0:
621 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
622 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
623 ; SSE41-NEXT:    retq
624 ;
625 ; AVX-LABEL: shuffle_v2i64_30_copy:
626 ; AVX:       # BB#0:
627 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
628 ; AVX-NEXT:    retq
629   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 0>
630   ret <2 x i64> %shuffle
631 }
632 define <2 x i64> @shuffle_v2i64_31(<2 x i64> %a, <2 x i64> %b) {
633 ; SSE-LABEL: shuffle_v2i64_31:
634 ; SSE:       # BB#0:
635 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm0[1]
636 ; SSE-NEXT:    movdqa %xmm1, %xmm0
637 ; SSE-NEXT:    retq
638 ;
639 ; AVX-LABEL: shuffle_v2i64_31:
640 ; AVX:       # BB#0:
641 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1]
642 ; AVX-NEXT:    retq
643   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>
644   ret <2 x i64> %shuffle
645 }
646 define <2 x i64> @shuffle_v2i64_31_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
647 ; SSE-LABEL: shuffle_v2i64_31_copy:
648 ; SSE:       # BB#0:
649 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm1[1]
650 ; SSE-NEXT:    movdqa %xmm2, %xmm0
651 ; SSE-NEXT:    retq
652 ;
653 ; AVX-LABEL: shuffle_v2i64_31_copy:
654 ; AVX:       # BB#0:
655 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm2[1],xmm1[1]
656 ; AVX-NEXT:    retq
657   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>
658   ret <2 x i64> %shuffle
659 }
660
661 define <2 x i64> @shuffle_v2i64_0z(<2 x i64> %a) {
662 ; SSE-LABEL: shuffle_v2i64_0z:
663 ; SSE:       # BB#0:
664 ; SSE-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
665 ; SSE-NEXT:    retq
666 ;
667 ; AVX-LABEL: shuffle_v2i64_0z:
668 ; AVX:       # BB#0:
669 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
670 ; AVX-NEXT:    retq
671   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>
672   ret <2 x i64> %shuffle
673 }
674
675 define <2 x i64> @shuffle_v2i64_1z(<2 x i64> %a) {
676 ; SSE-LABEL: shuffle_v2i64_1z:
677 ; SSE:       # BB#0:
678 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero
679 ; SSE-NEXT:    retq
680 ;
681 ; AVX-LABEL: shuffle_v2i64_1z:
682 ; AVX:       # BB#0:
683 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero
684 ; AVX-NEXT:    retq
685   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 1, i32 3>
686   ret <2 x i64> %shuffle
687 }
688
689 define <2 x i64> @shuffle_v2i64_z0(<2 x i64> %a) {
690 ; SSE-LABEL: shuffle_v2i64_z0:
691 ; SSE:       # BB#0:
692 ; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
693 ; SSE-NEXT:    retq
694 ;
695 ; AVX-LABEL: shuffle_v2i64_z0:
696 ; AVX:       # BB#0:
697 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
698 ; AVX-NEXT:    retq
699   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 2, i32 0>
700   ret <2 x i64> %shuffle
701 }
702
703 define <2 x i64> @shuffle_v2i64_z1(<2 x i64> %a) {
704 ; SSE2-LABEL: shuffle_v2i64_z1:
705 ; SSE2:       # BB#0:
706 ; SSE2-NEXT:    xorpd %xmm1, %xmm1
707 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
708 ; SSE2-NEXT:    retq
709 ;
710 ; SSE3-LABEL: shuffle_v2i64_z1:
711 ; SSE3:       # BB#0:
712 ; SSE3-NEXT:    xorpd %xmm1, %xmm1
713 ; SSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
714 ; SSE3-NEXT:    retq
715 ;
716 ; SSSE3-LABEL: shuffle_v2i64_z1:
717 ; SSSE3:       # BB#0:
718 ; SSSE3-NEXT:    xorpd %xmm1, %xmm1
719 ; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
720 ; SSSE3-NEXT:    retq
721 ;
722 ; SSE41-LABEL: shuffle_v2i64_z1:
723 ; SSE41:       # BB#0:
724 ; SSE41-NEXT:    pxor %xmm1, %xmm1
725 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
726 ; SSE41-NEXT:    retq
727 ;
728 ; AVX1-LABEL: shuffle_v2i64_z1:
729 ; AVX1:       # BB#0:
730 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
731 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
732 ; AVX1-NEXT:    retq
733 ;
734 ; AVX2-LABEL: shuffle_v2i64_z1:
735 ; AVX2:       # BB#0:
736 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
737 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
738 ; AVX2-NEXT:    retq
739   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 2, i32 1>
740   ret <2 x i64> %shuffle
741 }
742
743 define <2 x double> @shuffle_v2f64_0z(<2 x double> %a) {
744 ; SSE-LABEL: shuffle_v2f64_0z:
745 ; SSE:       # BB#0:
746 ; SSE-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
747 ; SSE-NEXT:    retq
748 ;
749 ; AVX-LABEL: shuffle_v2f64_0z:
750 ; AVX:       # BB#0:
751 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
752 ; AVX-NEXT:    retq
753   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>
754   ret <2 x double> %shuffle
755 }
756
757 define <2 x double> @shuffle_v2f64_1z(<2 x double> %a) {
758 ; SSE-LABEL: shuffle_v2f64_1z:
759 ; SSE:       # BB#0:
760 ; SSE-NEXT:    xorpd %xmm1, %xmm1
761 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
762 ; SSE-NEXT:    retq
763 ;
764 ; AVX-LABEL: shuffle_v2f64_1z:
765 ; AVX:       # BB#0:
766 ; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
767 ; AVX-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
768 ; AVX-NEXT:    retq
769   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 1, i32 3>
770   ret <2 x double> %shuffle
771 }
772
773 define <2 x double> @shuffle_v2f64_z0(<2 x double> %a) {
774 ; SSE-LABEL: shuffle_v2f64_z0:
775 ; SSE:       # BB#0:
776 ; SSE-NEXT:    xorpd %xmm1, %xmm1
777 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
778 ; SSE-NEXT:    movapd %xmm1, %xmm0
779 ; SSE-NEXT:    retq
780 ;
781 ; AVX-LABEL: shuffle_v2f64_z0:
782 ; AVX:       # BB#0:
783 ; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
784 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
785 ; AVX-NEXT:    retq
786   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 0>
787   ret <2 x double> %shuffle
788 }
789
790 define <2 x double> @shuffle_v2f64_z1(<2 x double> %a) {
791 ; SSE2-LABEL: shuffle_v2f64_z1:
792 ; SSE2:       # BB#0:
793 ; SSE2-NEXT:    xorpd %xmm1, %xmm1
794 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
795 ; SSE2-NEXT:    retq
796 ;
797 ; SSE3-LABEL: shuffle_v2f64_z1:
798 ; SSE3:       # BB#0:
799 ; SSE3-NEXT:    xorpd %xmm1, %xmm1
800 ; SSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
801 ; SSE3-NEXT:    retq
802 ;
803 ; SSSE3-LABEL: shuffle_v2f64_z1:
804 ; SSSE3:       # BB#0:
805 ; SSSE3-NEXT:    xorpd %xmm1, %xmm1
806 ; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
807 ; SSSE3-NEXT:    retq
808 ;
809 ; SSE41-LABEL: shuffle_v2f64_z1:
810 ; SSE41:       # BB#0:
811 ; SSE41-NEXT:    xorpd %xmm1, %xmm1
812 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
813 ; SSE41-NEXT:    retq
814 ;
815 ; AVX-LABEL: shuffle_v2f64_z1:
816 ; AVX:       # BB#0:
817 ; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
818 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
819 ; AVX-NEXT:    retq
820   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 1>
821   ret <2 x double> %shuffle
822 }
823
824 define <2 x double> @shuffle_v2f64_bitcast_1z(<2 x double> %a) {
825 ; SSE-LABEL: shuffle_v2f64_bitcast_1z:
826 ; SSE:       # BB#0:
827 ; SSE-NEXT:    xorpd %xmm1, %xmm1
828 ; SSE-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
829 ; SSE-NEXT:    retq
830 ;
831 ; AVX-LABEL: shuffle_v2f64_bitcast_1z:
832 ; AVX:       # BB#0:
833 ; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
834 ; AVX-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
835 ; AVX-NEXT:    retq
836   %shuffle64 = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 1>
837   %bitcast32 = bitcast <2 x double> %shuffle64 to <4 x float>
838   %shuffle32 = shufflevector <4 x float> %bitcast32, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
839   %bitcast64 = bitcast <4 x float> %shuffle32 to <2 x double>
840   ret <2 x double> %bitcast64
841 }
842
843 define <2 x i64> @insert_reg_and_zero_v2i64(i64 %a) {
844 ; SSE-LABEL: insert_reg_and_zero_v2i64:
845 ; SSE:       # BB#0:
846 ; SSE-NEXT:    movd %rdi, %xmm0
847 ; SSE-NEXT:    retq
848 ;
849 ; AVX-LABEL: insert_reg_and_zero_v2i64:
850 ; AVX:       # BB#0:
851 ; AVX-NEXT:    vmovq %rdi, %xmm0
852 ; AVX-NEXT:    retq
853   %v = insertelement <2 x i64> undef, i64 %a, i32 0
854   %shuffle = shufflevector <2 x i64> %v, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>
855   ret <2 x i64> %shuffle
856 }
857
858 define <2 x i64> @insert_mem_and_zero_v2i64(i64* %ptr) {
859 ; SSE-LABEL: insert_mem_and_zero_v2i64:
860 ; SSE:       # BB#0:
861 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
862 ; SSE-NEXT:    retq
863 ;
864 ; AVX-LABEL: insert_mem_and_zero_v2i64:
865 ; AVX:       # BB#0:
866 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
867 ; AVX-NEXT:    retq
868   %a = load i64, i64* %ptr
869   %v = insertelement <2 x i64> undef, i64 %a, i32 0
870   %shuffle = shufflevector <2 x i64> %v, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>
871   ret <2 x i64> %shuffle
872 }
873
874 define <2 x double> @insert_reg_and_zero_v2f64(double %a) {
875 ; SSE-LABEL: insert_reg_and_zero_v2f64:
876 ; SSE:       # BB#0:
877 ; SSE-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
878 ; SSE-NEXT:    retq
879 ;
880 ; AVX-LABEL: insert_reg_and_zero_v2f64:
881 ; AVX:       # BB#0:
882 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
883 ; AVX-NEXT:    retq
884   %v = insertelement <2 x double> undef, double %a, i32 0
885   %shuffle = shufflevector <2 x double> %v, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>
886   ret <2 x double> %shuffle
887 }
888
889 define <2 x double> @insert_mem_and_zero_v2f64(double* %ptr) {
890 ; SSE-LABEL: insert_mem_and_zero_v2f64:
891 ; SSE:       # BB#0:
892 ; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
893 ; SSE-NEXT:    retq
894 ;
895 ; AVX-LABEL: insert_mem_and_zero_v2f64:
896 ; AVX:       # BB#0:
897 ; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
898 ; AVX-NEXT:    retq
899   %a = load double, double* %ptr
900   %v = insertelement <2 x double> undef, double %a, i32 0
901   %shuffle = shufflevector <2 x double> %v, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>
902   ret <2 x double> %shuffle
903 }
904
905 define <2 x i64> @insert_reg_lo_v2i64(i64 %a, <2 x i64> %b) {
906 ; SSE2-LABEL: insert_reg_lo_v2i64:
907 ; SSE2:       # BB#0:
908 ; SSE2-NEXT:    movd %rdi, %xmm1
909 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
910 ; SSE2-NEXT:    retq
911 ;
912 ; SSE3-LABEL: insert_reg_lo_v2i64:
913 ; SSE3:       # BB#0:
914 ; SSE3-NEXT:    movd %rdi, %xmm1
915 ; SSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
916 ; SSE3-NEXT:    retq
917 ;
918 ; SSSE3-LABEL: insert_reg_lo_v2i64:
919 ; SSSE3:       # BB#0:
920 ; SSSE3-NEXT:    movd %rdi, %xmm1
921 ; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
922 ; SSSE3-NEXT:    retq
923 ;
924 ; SSE41-LABEL: insert_reg_lo_v2i64:
925 ; SSE41:       # BB#0:
926 ; SSE41-NEXT:    movd %rdi, %xmm1
927 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
928 ; SSE41-NEXT:    retq
929 ;
930 ; AVX1-LABEL: insert_reg_lo_v2i64:
931 ; AVX1:       # BB#0:
932 ; AVX1-NEXT:    vmovq %rdi, %xmm1
933 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
934 ; AVX1-NEXT:    retq
935 ;
936 ; AVX2-LABEL: insert_reg_lo_v2i64:
937 ; AVX2:       # BB#0:
938 ; AVX2-NEXT:    vmovq %rdi, %xmm1
939 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
940 ; AVX2-NEXT:    retq
941   %v = insertelement <2 x i64> undef, i64 %a, i32 0
942   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
943   ret <2 x i64> %shuffle
944 }
945
946 define <2 x i64> @insert_mem_lo_v2i64(i64* %ptr, <2 x i64> %b) {
947 ; SSE2-LABEL: insert_mem_lo_v2i64:
948 ; SSE2:       # BB#0:
949 ; SSE2-NEXT:    movlpd (%rdi), %xmm0
950 ; SSE2-NEXT:    retq
951 ;
952 ; SSE3-LABEL: insert_mem_lo_v2i64:
953 ; SSE3:       # BB#0:
954 ; SSE3-NEXT:    movlpd (%rdi), %xmm0
955 ; SSE3-NEXT:    retq
956 ;
957 ; SSSE3-LABEL: insert_mem_lo_v2i64:
958 ; SSSE3:       # BB#0:
959 ; SSSE3-NEXT:    movlpd (%rdi), %xmm0
960 ; SSSE3-NEXT:    retq
961 ;
962 ; SSE41-LABEL: insert_mem_lo_v2i64:
963 ; SSE41:       # BB#0:
964 ; SSE41-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
965 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
966 ; SSE41-NEXT:    retq
967 ;
968 ; AVX1-LABEL: insert_mem_lo_v2i64:
969 ; AVX1:       # BB#0:
970 ; AVX1-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
971 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
972 ; AVX1-NEXT:    retq
973 ;
974 ; AVX2-LABEL: insert_mem_lo_v2i64:
975 ; AVX2:       # BB#0:
976 ; AVX2-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
977 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
978 ; AVX2-NEXT:    retq
979   %a = load i64, i64* %ptr
980   %v = insertelement <2 x i64> undef, i64 %a, i32 0
981   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
982   ret <2 x i64> %shuffle
983 }
984
985 define <2 x i64> @insert_reg_hi_v2i64(i64 %a, <2 x i64> %b) {
986 ; SSE-LABEL: insert_reg_hi_v2i64:
987 ; SSE:       # BB#0:
988 ; SSE-NEXT:    movd %rdi, %xmm1
989 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
990 ; SSE-NEXT:    retq
991 ;
992 ; AVX-LABEL: insert_reg_hi_v2i64:
993 ; AVX:       # BB#0:
994 ; AVX-NEXT:    vmovq %rdi, %xmm1
995 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
996 ; AVX-NEXT:    retq
997   %v = insertelement <2 x i64> undef, i64 %a, i32 0
998   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
999   ret <2 x i64> %shuffle
1000 }
1001
1002 define <2 x i64> @insert_mem_hi_v2i64(i64* %ptr, <2 x i64> %b) {
1003 ; SSE-LABEL: insert_mem_hi_v2i64:
1004 ; SSE:       # BB#0:
1005 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1006 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1007 ; SSE-NEXT:    retq
1008 ;
1009 ; AVX-LABEL: insert_mem_hi_v2i64:
1010 ; AVX:       # BB#0:
1011 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1012 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1013 ; AVX-NEXT:    retq
1014   %a = load i64, i64* %ptr
1015   %v = insertelement <2 x i64> undef, i64 %a, i32 0
1016   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
1017   ret <2 x i64> %shuffle
1018 }
1019
1020 define <2 x double> @insert_reg_lo_v2f64(double %a, <2 x double> %b) {
1021 ; SSE-LABEL: insert_reg_lo_v2f64:
1022 ; SSE:       # BB#0:
1023 ; SSE-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1024 ; SSE-NEXT:    movapd %xmm1, %xmm0
1025 ; SSE-NEXT:    retq
1026 ;
1027 ; AVX-LABEL: insert_reg_lo_v2f64:
1028 ; AVX:       # BB#0:
1029 ; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1030 ; AVX-NEXT:    retq
1031   %v = insertelement <2 x double> undef, double %a, i32 0
1032   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 0, i32 3>
1033   ret <2 x double> %shuffle
1034 }
1035
1036 define <2 x double> @insert_mem_lo_v2f64(double* %ptr, <2 x double> %b) {
1037 ; SSE-LABEL: insert_mem_lo_v2f64:
1038 ; SSE:       # BB#0:
1039 ; SSE-NEXT:    movlpd (%rdi), %xmm0
1040 ; SSE-NEXT:    retq
1041 ;
1042 ; AVX-LABEL: insert_mem_lo_v2f64:
1043 ; AVX:       # BB#0:
1044 ; AVX-NEXT:    vmovlpd (%rdi), %xmm0, %xmm0
1045 ; AVX-NEXT:    retq
1046   %a = load double, double* %ptr
1047   %v = insertelement <2 x double> undef, double %a, i32 0
1048   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 0, i32 3>
1049   ret <2 x double> %shuffle
1050 }
1051
1052 define <2 x double> @insert_reg_hi_v2f64(double %a, <2 x double> %b) {
1053 ; SSE-LABEL: insert_reg_hi_v2f64:
1054 ; SSE:       # BB#0:
1055 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1056 ; SSE-NEXT:    movapd %xmm1, %xmm0
1057 ; SSE-NEXT:    retq
1058 ;
1059 ; AVX-LABEL: insert_reg_hi_v2f64:
1060 ; AVX:       # BB#0:
1061 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1062 ; AVX-NEXT:    retq
1063   %v = insertelement <2 x double> undef, double %a, i32 0
1064   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 2, i32 0>
1065   ret <2 x double> %shuffle
1066 }
1067
1068 define <2 x double> @insert_mem_hi_v2f64(double* %ptr, <2 x double> %b) {
1069 ; SSE-LABEL: insert_mem_hi_v2f64:
1070 ; SSE:       # BB#0:
1071 ; SSE-NEXT:    movhpd (%rdi), %xmm0
1072 ; SSE-NEXT:    retq
1073 ;
1074 ; AVX-LABEL: insert_mem_hi_v2f64:
1075 ; AVX:       # BB#0:
1076 ; AVX-NEXT:    vmovhpd (%rdi), %xmm0, %xmm0
1077 ; AVX-NEXT:    retq
1078   %a = load double, double* %ptr
1079   %v = insertelement <2 x double> undef, double %a, i32 0
1080   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 2, i32 0>
1081   ret <2 x double> %shuffle
1082 }
1083
1084 define <2 x double> @insert_dup_reg_v2f64(double %a) {
1085 ; FIXME: We should match movddup for SSE3 and higher here.
1086 ;
1087 ; SSE2-LABEL: insert_dup_reg_v2f64:
1088 ; SSE2:       # BB#0:
1089 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
1090 ; SSE2-NEXT:    retq
1091 ;
1092 ; SSE3-LABEL: insert_dup_reg_v2f64:
1093 ; SSE3:       # BB#0:
1094 ; SSE3-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
1095 ; SSE3-NEXT:    retq
1096 ;
1097 ; SSSE3-LABEL: insert_dup_reg_v2f64:
1098 ; SSSE3:       # BB#0:
1099 ; SSSE3-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
1100 ; SSSE3-NEXT:    retq
1101 ;
1102 ; SSE41-LABEL: insert_dup_reg_v2f64:
1103 ; SSE41:       # BB#0:
1104 ; SSE41-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
1105 ; SSE41-NEXT:    retq
1106 ;
1107 ; AVX-LABEL: insert_dup_reg_v2f64:
1108 ; AVX:       # BB#0:
1109 ; AVX-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
1110 ; AVX-NEXT:    retq
1111   %v = insertelement <2 x double> undef, double %a, i32 0
1112   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
1113   ret <2 x double> %shuffle
1114 }
1115 define <2 x double> @insert_dup_mem_v2f64(double* %ptr) {
1116 ; SSE2-LABEL: insert_dup_mem_v2f64:
1117 ; SSE2:       # BB#0:
1118 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1119 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
1120 ; SSE2-NEXT:    retq
1121 ;
1122 ; SSE3-LABEL: insert_dup_mem_v2f64:
1123 ; SSE3:       # BB#0:
1124 ; SSE3-NEXT:    movddup {{.*#+}} xmm0 = mem[0,0]
1125 ; SSE3-NEXT:    retq
1126 ;
1127 ; SSSE3-LABEL: insert_dup_mem_v2f64:
1128 ; SSSE3:       # BB#0:
1129 ; SSSE3-NEXT:    movddup {{.*#+}} xmm0 = mem[0,0]
1130 ; SSSE3-NEXT:    retq
1131 ;
1132 ; SSE41-LABEL: insert_dup_mem_v2f64:
1133 ; SSE41:       # BB#0:
1134 ; SSE41-NEXT:    movddup {{.*#+}} xmm0 = mem[0,0]
1135 ; SSE41-NEXT:    retq
1136 ;
1137 ; AVX-LABEL: insert_dup_mem_v2f64:
1138 ; AVX:       # BB#0:
1139 ; AVX-NEXT:    vmovddup {{.*#+}} xmm0 = mem[0,0]
1140 ; AVX-NEXT:    retq
1141   %a = load double, double* %ptr
1142   %v = insertelement <2 x double> undef, double %a, i32 0
1143   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
1144   ret <2 x double> %shuffle
1145 }
1146
1147 define <2 x i64> @insert_dup_mem_v2i64(i64* %ptr) {
1148 ; SSE-LABEL: insert_dup_mem_v2i64:
1149 ; SSE:       # BB#0:
1150 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1151 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1152 ; SSE-NEXT:    retq
1153 ;
1154 ; AVX1-LABEL: insert_dup_mem_v2i64:
1155 ; AVX1:       # BB#0:
1156 ; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
1157 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1158 ; AVX1-NEXT:    retq
1159 ;
1160 ; AVX2-LABEL: insert_dup_mem_v2i64:
1161 ; AVX2:       # BB#0:
1162 ; AVX2-NEXT:    vpbroadcastq (%rdi), %xmm0
1163 ; AVX2-NEXT:    retq
1164   %tmp = load i64, i64* %ptr, align 1
1165   %tmp1 = insertelement <2 x i64> undef, i64 %tmp, i32 0
1166   %tmp2 = shufflevector <2 x i64> %tmp1, <2 x i64> undef, <2 x i32> zeroinitializer
1167   ret <2 x i64> %tmp2
1168 }
1169
1170 define <2 x double> @shuffle_mem_v2f64_10(<2 x double>* %ptr) {
1171 ; SSE-LABEL: shuffle_mem_v2f64_10:
1172 ; SSE:       # BB#0:
1173 ; SSE-NEXT:    movapd (%rdi), %xmm0
1174 ; SSE-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
1175 ; SSE-NEXT:    retq
1176 ;
1177 ; AVX-LABEL: shuffle_mem_v2f64_10:
1178 ; AVX:       # BB#0:
1179 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = mem[1,0]
1180 ; AVX-NEXT:    retq
1181
1182 ; AVX512VL-LABEL: shuffle_mem_v2f64_10:
1183 ; AVX512VL:       # BB#0:
1184 ; AVX512VL-NEXT:    vpermilpd $1, (%rdi), %xmm0
1185 ; AVX512VL-NEXT:    retq
1186   %a = load <2 x double>, <2 x double>* %ptr
1187   %shuffle = shufflevector <2 x double> %a, <2 x double> undef, <2 x i32> <i32 1, i32 0>
1188   ret <2 x double> %shuffle
1189 }