[x86] Remove the insanely over-aggressive unpack lowering strategy for
[oota-llvm.git] / test / CodeGen / X86 / vector-blend.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse2 | FileCheck %s --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+ssse3 | FileCheck %s --check-prefix=SSSE3
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
6
7 ; AVX128 tests:
8
9 define <4 x float> @vsel_float(<4 x float> %v1, <4 x float> %v2) {
10 ; SSE2-LABEL: vsel_float:
11 ; SSE2:       # BB#0: # %entry
12 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
13 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
14 ; SSE2-NEXT:    retq
15 ;
16 ; SSSE3-LABEL: vsel_float:
17 ; SSSE3:       # BB#0: # %entry
18 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
19 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
20 ; SSSE3-NEXT:    retq
21 ;
22 ; SSE41-LABEL: vsel_float:
23 ; SSE41:       # BB#0: # %entry
24 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
25 ; SSE41-NEXT:    retq
26 ;
27 ; AVX-LABEL: vsel_float:
28 ; AVX:       # BB#0: # %entry
29 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
30 ; AVX-NEXT:    retq
31 entry:
32   %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x float> %v1, <4 x float> %v2
33   ret <4 x float> %vsel
34 }
35
36 define <4 x float> @vsel_float2(<4 x float> %v1, <4 x float> %v2) {
37 ; SSE2-LABEL: vsel_float2:
38 ; SSE2:       # BB#0: # %entry
39 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
40 ; SSE2-NEXT:    movaps %xmm1, %xmm0
41 ; SSE2-NEXT:    retq
42 ;
43 ; SSSE3-LABEL: vsel_float2:
44 ; SSSE3:       # BB#0: # %entry
45 ; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
46 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
47 ; SSSE3-NEXT:    retq
48 ;
49 ; SSE41-LABEL: vsel_float2:
50 ; SSE41:       # BB#0: # %entry
51 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
52 ; SSE41-NEXT:    retq
53 ;
54 ; AVX-LABEL: vsel_float2:
55 ; AVX:       # BB#0: # %entry
56 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
57 ; AVX-NEXT:    retq
58 entry:
59   %vsel = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x float> %v1, <4 x float> %v2
60   ret <4 x float> %vsel
61 }
62
63 define <4 x i8> @vsel_4xi8(<4 x i8> %v1, <4 x i8> %v2) {
64 ; SSE2-LABEL: vsel_4xi8:
65 ; SSE2:       # BB#0: # %entry
66 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[3,0]
67 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
68 ; SSE2-NEXT:    retq
69 ;
70 ; SSSE3-LABEL: vsel_4xi8:
71 ; SSSE3:       # BB#0: # %entry
72 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[3,0]
73 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
74 ; SSSE3-NEXT:    retq
75 ;
76 ; SSE41-LABEL: vsel_4xi8:
77 ; SSE41:       # BB#0: # %entry
78 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
79 ; SSE41-NEXT:    retq
80 ;
81 ; AVX1-LABEL: vsel_4xi8:
82 ; AVX1:       # BB#0: # %entry
83 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
84 ; AVX1-NEXT:    retq
85 ;
86 ; AVX2-LABEL: vsel_4xi8:
87 ; AVX2:       # BB#0: # %entry
88 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]
89 ; AVX2-NEXT:    retq
90 entry:
91   %vsel = select <4 x i1> <i1 true, i1 true, i1 false, i1 true>, <4 x i8> %v1, <4 x i8> %v2
92   ret <4 x i8> %vsel
93 }
94
95 define <4 x i16> @vsel_4xi16(<4 x i16> %v1, <4 x i16> %v2) {
96 ; SSE2-LABEL: vsel_4xi16:
97 ; SSE2:       # BB#0: # %entry
98 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]
99 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]
100 ; SSE2-NEXT:    movaps %xmm1, %xmm0
101 ; SSE2-NEXT:    retq
102 ;
103 ; SSSE3-LABEL: vsel_4xi16:
104 ; SSSE3:       # BB#0: # %entry
105 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]
106 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]
107 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
108 ; SSSE3-NEXT:    retq
109 ;
110 ; SSE41-LABEL: vsel_4xi16:
111 ; SSE41:       # BB#0: # %entry
112 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
113 ; SSE41-NEXT:    retq
114 ;
115 ; AVX1-LABEL: vsel_4xi16:
116 ; AVX1:       # BB#0: # %entry
117 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
118 ; AVX1-NEXT:    retq
119 ;
120 ; AVX2-LABEL: vsel_4xi16:
121 ; AVX2:       # BB#0: # %entry
122 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
123 ; AVX2-NEXT:    retq
124 entry:
125   %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 true>, <4 x i16> %v1, <4 x i16> %v2
126   ret <4 x i16> %vsel
127 }
128
129 define <4 x i32> @vsel_i32(<4 x i32> %v1, <4 x i32> %v2) {
130 ; SSE2-LABEL: vsel_i32:
131 ; SSE2:       # BB#0: # %entry
132 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
133 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
134 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
135 ; SSE2-NEXT:    retq
136 ;
137 ; SSSE3-LABEL: vsel_i32:
138 ; SSSE3:       # BB#0: # %entry
139 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
140 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
141 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
142 ; SSSE3-NEXT:    retq
143 ;
144 ; SSE41-LABEL: vsel_i32:
145 ; SSE41:       # BB#0: # %entry
146 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
147 ; SSE41-NEXT:    retq
148 ;
149 ; AVX1-LABEL: vsel_i32:
150 ; AVX1:       # BB#0: # %entry
151 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
152 ; AVX1-NEXT:    retq
153 ;
154 ; AVX2-LABEL: vsel_i32:
155 ; AVX2:       # BB#0: # %entry
156 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
157 ; AVX2-NEXT:    retq
158 entry:
159   %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x i32> %v1, <4 x i32> %v2
160   ret <4 x i32> %vsel
161 }
162
163 define <2 x double> @vsel_double(<2 x double> %v1, <2 x double> %v2) {
164 ; SSE2-LABEL: vsel_double:
165 ; SSE2:       # BB#0: # %entry
166 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
167 ; SSE2-NEXT:    movapd %xmm1, %xmm0
168 ; SSE2-NEXT:    retq
169 ;
170 ; SSSE3-LABEL: vsel_double:
171 ; SSSE3:       # BB#0: # %entry
172 ; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
173 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
174 ; SSSE3-NEXT:    retq
175 ;
176 ; SSE41-LABEL: vsel_double:
177 ; SSE41:       # BB#0: # %entry
178 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
179 ; SSE41-NEXT:    retq
180 ;
181 ; AVX-LABEL: vsel_double:
182 ; AVX:       # BB#0: # %entry
183 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
184 ; AVX-NEXT:    retq
185 entry:
186   %vsel = select <2 x i1> <i1 true, i1 false>, <2 x double> %v1, <2 x double> %v2
187   ret <2 x double> %vsel
188 }
189
190 define <2 x i64> @vsel_i64(<2 x i64> %v1, <2 x i64> %v2) {
191 ; SSE2-LABEL: vsel_i64:
192 ; SSE2:       # BB#0: # %entry
193 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
194 ; SSE2-NEXT:    movapd %xmm1, %xmm0
195 ; SSE2-NEXT:    retq
196 ;
197 ; SSSE3-LABEL: vsel_i64:
198 ; SSSE3:       # BB#0: # %entry
199 ; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
200 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
201 ; SSSE3-NEXT:    retq
202 ;
203 ; SSE41-LABEL: vsel_i64:
204 ; SSE41:       # BB#0: # %entry
205 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
206 ; SSE41-NEXT:    retq
207 ;
208 ; AVX1-LABEL: vsel_i64:
209 ; AVX1:       # BB#0: # %entry
210 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
211 ; AVX1-NEXT:    retq
212 ;
213 ; AVX2-LABEL: vsel_i64:
214 ; AVX2:       # BB#0: # %entry
215 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
216 ; AVX2-NEXT:    retq
217 entry:
218   %vsel = select <2 x i1> <i1 true, i1 false>, <2 x i64> %v1, <2 x i64> %v2
219   ret <2 x i64> %vsel
220 }
221
222 define <8 x i16> @vsel_8xi16(<8 x i16> %v1, <8 x i16> %v2) {
223 ; SSE2-LABEL: vsel_8xi16:
224 ; SSE2:       # BB#0: # %entry
225 ; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [0,65535,65535,65535,0,65535,65535,65535]
226 ; SSE2-NEXT:    andps %xmm2, %xmm1
227 ; SSE2-NEXT:    andnps %xmm0, %xmm2
228 ; SSE2-NEXT:    orps %xmm1, %xmm2
229 ; SSE2-NEXT:    movaps %xmm2, %xmm0
230 ; SSE2-NEXT:    retq
231 ;
232 ; SSSE3-LABEL: vsel_8xi16:
233 ; SSSE3:       # BB#0: # %entry
234 ; SSSE3-NEXT:    movaps {{.*#+}} xmm2 = [0,65535,65535,65535,0,65535,65535,65535]
235 ; SSSE3-NEXT:    andps %xmm2, %xmm1
236 ; SSSE3-NEXT:    andnps %xmm0, %xmm2
237 ; SSSE3-NEXT:    orps %xmm1, %xmm2
238 ; SSSE3-NEXT:    movaps %xmm2, %xmm0
239 ; SSSE3-NEXT:    retq
240 ;
241 ; SSE41-LABEL: vsel_8xi16:
242 ; SSE41:       # BB#0: # %entry
243 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
244 ; SSE41-NEXT:    retq
245 ;
246 ; AVX-LABEL: vsel_8xi16:
247 ; AVX:       # BB#0: # %entry
248 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
249 ; AVX-NEXT:    retq
250 entry:
251   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x i16> %v1, <8 x i16> %v2
252   ret <8 x i16> %vsel
253 }
254
255 define <16 x i8> @vsel_i8(<16 x i8> %v1, <16 x i8> %v2) {
256 ; SSE2-LABEL: vsel_i8:
257 ; SSE2:       # BB#0: # %entry
258 ; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
259 ; SSE2-NEXT:    andps %xmm2, %xmm1
260 ; SSE2-NEXT:    andnps %xmm0, %xmm2
261 ; SSE2-NEXT:    orps %xmm1, %xmm2
262 ; SSE2-NEXT:    movaps %xmm2, %xmm0
263 ; SSE2-NEXT:    retq
264 ;
265 ; SSSE3-LABEL: vsel_i8:
266 ; SSSE3:       # BB#0: # %entry
267 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[12],zero,zero,zero
268 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = zero,xmm1[1,2,3],zero,xmm1[5,6,7],zero,xmm1[9,10,11],zero,xmm1[13,14,15]
269 ; SSSE3-NEXT:    por %xmm1, %xmm0
270 ; SSSE3-NEXT:    retq
271 ;
272 ; SSE41-LABEL: vsel_i8:
273 ; SSE41:       # BB#0: # %entry
274 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
275 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
276 ; SSE41-NEXT:    pblendvb %xmm2, %xmm1
277 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
278 ; SSE41-NEXT:    retq
279 ;
280 ; AVX-LABEL: vsel_i8:
281 ; AVX:       # BB#0: # %entry
282 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
283 ; AVX-NEXT:    vpblendvb %xmm2, %xmm0, %xmm1, %xmm0
284 ; AVX-NEXT:    retq
285 entry:
286   %vsel = select <16 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <16 x i8> %v1, <16 x i8> %v2
287   ret <16 x i8> %vsel
288 }
289
290
291 ; AVX256 tests:
292
293 define <8 x float> @vsel_float8(<8 x float> %v1, <8 x float> %v2) {
294 ; SSE2-LABEL: vsel_float8:
295 ; SSE2:       # BB#0: # %entry
296 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
297 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
298 ; SSE2-NEXT:    movaps %xmm2, %xmm0
299 ; SSE2-NEXT:    movaps %xmm3, %xmm1
300 ; SSE2-NEXT:    retq
301 ;
302 ; SSSE3-LABEL: vsel_float8:
303 ; SSSE3:       # BB#0: # %entry
304 ; SSSE3-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
305 ; SSSE3-NEXT:    movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
306 ; SSSE3-NEXT:    movaps %xmm2, %xmm0
307 ; SSSE3-NEXT:    movaps %xmm3, %xmm1
308 ; SSSE3-NEXT:    retq
309 ;
310 ; SSE41-LABEL: vsel_float8:
311 ; SSE41:       # BB#0: # %entry
312 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3]
313 ; SSE41-NEXT:    blendps {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3]
314 ; SSE41-NEXT:    retq
315 ;
316 ; AVX-LABEL: vsel_float8:
317 ; AVX:       # BB#0: # %entry
318 ; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
319 ; AVX-NEXT:    retq
320 entry:
321   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x float> %v1, <8 x float> %v2
322   ret <8 x float> %vsel
323 }
324
325 define <8 x i32> @vsel_i328(<8 x i32> %v1, <8 x i32> %v2) {
326 ; SSE2-LABEL: vsel_i328:
327 ; SSE2:       # BB#0: # %entry
328 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
329 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
330 ; SSE2-NEXT:    movaps %xmm2, %xmm0
331 ; SSE2-NEXT:    movaps %xmm3, %xmm1
332 ; SSE2-NEXT:    retq
333 ;
334 ; SSSE3-LABEL: vsel_i328:
335 ; SSSE3:       # BB#0: # %entry
336 ; SSSE3-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
337 ; SSSE3-NEXT:    movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
338 ; SSSE3-NEXT:    movaps %xmm2, %xmm0
339 ; SSSE3-NEXT:    movaps %xmm3, %xmm1
340 ; SSSE3-NEXT:    retq
341 ;
342 ; SSE41-LABEL: vsel_i328:
343 ; SSE41:       # BB#0: # %entry
344 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3,4,5,6,7]
345 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3,4,5,6,7]
346 ; SSE41-NEXT:    retq
347 ;
348 ; AVX1-LABEL: vsel_i328:
349 ; AVX1:       # BB#0: # %entry
350 ; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
351 ; AVX1-NEXT:    retq
352 ;
353 ; AVX2-LABEL: vsel_i328:
354 ; AVX2:       # BB#0: # %entry
355 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
356 ; AVX2-NEXT:    retq
357 entry:
358   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x i32> %v1, <8 x i32> %v2
359   ret <8 x i32> %vsel
360 }
361
362 define <8 x double> @vsel_double8(<8 x double> %v1, <8 x double> %v2) {
363 ; SSE2-LABEL: vsel_double8:
364 ; SSE2:       # BB#0: # %entry
365 ; SSE2-NEXT:    movsd {{.*#+}} xmm4 = xmm0[0],xmm4[1]
366 ; SSE2-NEXT:    movsd {{.*#+}} xmm6 = xmm2[0],xmm6[1]
367 ; SSE2-NEXT:    movapd %xmm4, %xmm0
368 ; SSE2-NEXT:    movaps %xmm5, %xmm1
369 ; SSE2-NEXT:    movapd %xmm6, %xmm2
370 ; SSE2-NEXT:    movaps %xmm7, %xmm3
371 ; SSE2-NEXT:    retq
372 ;
373 ; SSSE3-LABEL: vsel_double8:
374 ; SSSE3:       # BB#0: # %entry
375 ; SSSE3-NEXT:    movsd {{.*#+}} xmm4 = xmm0[0],xmm4[1]
376 ; SSSE3-NEXT:    movsd {{.*#+}} xmm6 = xmm2[0],xmm6[1]
377 ; SSSE3-NEXT:    movapd %xmm4, %xmm0
378 ; SSSE3-NEXT:    movaps %xmm5, %xmm1
379 ; SSSE3-NEXT:    movapd %xmm6, %xmm2
380 ; SSSE3-NEXT:    movaps %xmm7, %xmm3
381 ; SSSE3-NEXT:    retq
382 ;
383 ; SSE41-LABEL: vsel_double8:
384 ; SSE41:       # BB#0: # %entry
385 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm4[1]
386 ; SSE41-NEXT:    blendpd {{.*#+}} xmm2 = xmm2[0],xmm6[1]
387 ; SSE41-NEXT:    movaps %xmm5, %xmm1
388 ; SSE41-NEXT:    movaps %xmm7, %xmm3
389 ; SSE41-NEXT:    retq
390 ;
391 ; AVX-LABEL: vsel_double8:
392 ; AVX:       # BB#0: # %entry
393 ; AVX-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3]
394 ; AVX-NEXT:    vblendpd {{.*#+}} ymm1 = ymm1[0],ymm3[1,2,3]
395 ; AVX-NEXT:    retq
396 entry:
397   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x double> %v1, <8 x double> %v2
398   ret <8 x double> %vsel
399 }
400
401 define <8 x i64> @vsel_i648(<8 x i64> %v1, <8 x i64> %v2) {
402 ; SSE2-LABEL: vsel_i648:
403 ; SSE2:       # BB#0: # %entry
404 ; SSE2-NEXT:    movsd {{.*#+}} xmm4 = xmm0[0],xmm4[1]
405 ; SSE2-NEXT:    movsd {{.*#+}} xmm6 = xmm2[0],xmm6[1]
406 ; SSE2-NEXT:    movapd %xmm4, %xmm0
407 ; SSE2-NEXT:    movaps %xmm5, %xmm1
408 ; SSE2-NEXT:    movapd %xmm6, %xmm2
409 ; SSE2-NEXT:    movaps %xmm7, %xmm3
410 ; SSE2-NEXT:    retq
411 ;
412 ; SSSE3-LABEL: vsel_i648:
413 ; SSSE3:       # BB#0: # %entry
414 ; SSSE3-NEXT:    movsd {{.*#+}} xmm4 = xmm0[0],xmm4[1]
415 ; SSSE3-NEXT:    movsd {{.*#+}} xmm6 = xmm2[0],xmm6[1]
416 ; SSSE3-NEXT:    movapd %xmm4, %xmm0
417 ; SSSE3-NEXT:    movaps %xmm5, %xmm1
418 ; SSSE3-NEXT:    movapd %xmm6, %xmm2
419 ; SSSE3-NEXT:    movaps %xmm7, %xmm3
420 ; SSSE3-NEXT:    retq
421 ;
422 ; SSE41-LABEL: vsel_i648:
423 ; SSE41:       # BB#0: # %entry
424 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
425 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
426 ; SSE41-NEXT:    movaps %xmm5, %xmm1
427 ; SSE41-NEXT:    movaps %xmm7, %xmm3
428 ; SSE41-NEXT:    retq
429 ;
430 ; AVX1-LABEL: vsel_i648:
431 ; AVX1:       # BB#0: # %entry
432 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3]
433 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm1 = ymm1[0],ymm3[1,2,3]
434 ; AVX1-NEXT:    retq
435 ;
436 ; AVX2-LABEL: vsel_i648:
437 ; AVX2:       # BB#0: # %entry
438 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm2[2,3,4,5,6,7]
439 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0,1],ymm3[2,3,4,5,6,7]
440 ; AVX2-NEXT:    retq
441 entry:
442   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x i64> %v1, <8 x i64> %v2
443   ret <8 x i64> %vsel
444 }
445
446 define <4 x double> @vsel_double4(<4 x double> %v1, <4 x double> %v2) {
447 ; SSE2-LABEL: vsel_double4:
448 ; SSE2:       # BB#0: # %entry
449 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
450 ; SSE2-NEXT:    movsd {{.*#+}} xmm3 = xmm1[0],xmm3[1]
451 ; SSE2-NEXT:    movapd %xmm2, %xmm0
452 ; SSE2-NEXT:    movapd %xmm3, %xmm1
453 ; SSE2-NEXT:    retq
454 ;
455 ; SSSE3-LABEL: vsel_double4:
456 ; SSSE3:       # BB#0: # %entry
457 ; SSSE3-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
458 ; SSSE3-NEXT:    movsd {{.*#+}} xmm3 = xmm1[0],xmm3[1]
459 ; SSSE3-NEXT:    movapd %xmm2, %xmm0
460 ; SSSE3-NEXT:    movapd %xmm3, %xmm1
461 ; SSSE3-NEXT:    retq
462 ;
463 ; SSE41-LABEL: vsel_double4:
464 ; SSE41:       # BB#0: # %entry
465 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm2[1]
466 ; SSE41-NEXT:    blendpd {{.*#+}} xmm1 = xmm1[0],xmm3[1]
467 ; SSE41-NEXT:    retq
468 ;
469 ; AVX-LABEL: vsel_double4:
470 ; AVX:       # BB#0: # %entry
471 ; AVX-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
472 ; AVX-NEXT:    retq
473 entry:
474   %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x double> %v1, <4 x double> %v2
475   ret <4 x double> %vsel
476 }
477
478 define <2 x double> @testa(<2 x double> %x, <2 x double> %y) {
479 ; SSE2-LABEL: testa:
480 ; SSE2:       # BB#0: # %entry
481 ; SSE2-NEXT:    movapd %xmm1, %xmm2
482 ; SSE2-NEXT:    cmplepd %xmm0, %xmm2
483 ; SSE2-NEXT:    andpd %xmm2, %xmm0
484 ; SSE2-NEXT:    andnpd %xmm1, %xmm2
485 ; SSE2-NEXT:    orpd %xmm2, %xmm0
486 ; SSE2-NEXT:    retq
487 ;
488 ; SSSE3-LABEL: testa:
489 ; SSSE3:       # BB#0: # %entry
490 ; SSSE3-NEXT:    movapd %xmm1, %xmm2
491 ; SSSE3-NEXT:    cmplepd %xmm0, %xmm2
492 ; SSSE3-NEXT:    andpd %xmm2, %xmm0
493 ; SSSE3-NEXT:    andnpd %xmm1, %xmm2
494 ; SSSE3-NEXT:    orpd %xmm2, %xmm0
495 ; SSSE3-NEXT:    retq
496 ;
497 ; SSE41-LABEL: testa:
498 ; SSE41:       # BB#0: # %entry
499 ; SSE41-NEXT:    movapd %xmm0, %xmm2
500 ; SSE41-NEXT:    movapd %xmm1, %xmm0
501 ; SSE41-NEXT:    cmplepd %xmm2, %xmm0
502 ; SSE41-NEXT:    blendvpd %xmm2, %xmm1
503 ; SSE41-NEXT:    movapd %xmm1, %xmm0
504 ; SSE41-NEXT:    retq
505 ;
506 ; AVX-LABEL: testa:
507 ; AVX:       # BB#0: # %entry
508 ; AVX-NEXT:    vcmplepd %xmm0, %xmm1, %xmm2
509 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
510 ; AVX-NEXT:    retq
511 entry:
512   %max_is_x = fcmp oge <2 x double> %x, %y
513   %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
514   ret <2 x double> %max
515 }
516
517 define <2 x double> @testb(<2 x double> %x, <2 x double> %y) {
518 ; SSE2-LABEL: testb:
519 ; SSE2:       # BB#0: # %entry
520 ; SSE2-NEXT:    movapd %xmm1, %xmm2
521 ; SSE2-NEXT:    cmpnlepd %xmm0, %xmm2
522 ; SSE2-NEXT:    andpd %xmm2, %xmm0
523 ; SSE2-NEXT:    andnpd %xmm1, %xmm2
524 ; SSE2-NEXT:    orpd %xmm2, %xmm0
525 ; SSE2-NEXT:    retq
526 ;
527 ; SSSE3-LABEL: testb:
528 ; SSSE3:       # BB#0: # %entry
529 ; SSSE3-NEXT:    movapd %xmm1, %xmm2
530 ; SSSE3-NEXT:    cmpnlepd %xmm0, %xmm2
531 ; SSSE3-NEXT:    andpd %xmm2, %xmm0
532 ; SSSE3-NEXT:    andnpd %xmm1, %xmm2
533 ; SSSE3-NEXT:    orpd %xmm2, %xmm0
534 ; SSSE3-NEXT:    retq
535 ;
536 ; SSE41-LABEL: testb:
537 ; SSE41:       # BB#0: # %entry
538 ; SSE41-NEXT:    movapd %xmm0, %xmm2
539 ; SSE41-NEXT:    movapd %xmm1, %xmm0
540 ; SSE41-NEXT:    cmpnlepd %xmm2, %xmm0
541 ; SSE41-NEXT:    blendvpd %xmm2, %xmm1
542 ; SSE41-NEXT:    movapd %xmm1, %xmm0
543 ; SSE41-NEXT:    retq
544 ;
545 ; AVX-LABEL: testb:
546 ; AVX:       # BB#0: # %entry
547 ; AVX-NEXT:    vcmpnlepd %xmm0, %xmm1, %xmm2
548 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
549 ; AVX-NEXT:    retq
550 entry:
551   %min_is_x = fcmp ult <2 x double> %x, %y
552   %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
553   ret <2 x double> %min
554 }
555
556 ; If we can figure out a blend has a constant mask, we should emit the
557 ; blend instruction with an immediate mask
558 define <4 x double> @constant_blendvpd_avx(<4 x double> %xy, <4 x double> %ab) {
559 ; SSE2-LABEL: constant_blendvpd_avx:
560 ; SSE2:       # BB#0: # %entry
561 ; SSE2-NEXT:    movsd {{.*#+}} xmm3 = xmm1[0],xmm3[1]
562 ; SSE2-NEXT:    movaps %xmm2, %xmm0
563 ; SSE2-NEXT:    movapd %xmm3, %xmm1
564 ; SSE2-NEXT:    retq
565 ;
566 ; SSSE3-LABEL: constant_blendvpd_avx:
567 ; SSSE3:       # BB#0: # %entry
568 ; SSSE3-NEXT:    movsd {{.*#+}} xmm3 = xmm1[0],xmm3[1]
569 ; SSSE3-NEXT:    movaps %xmm2, %xmm0
570 ; SSSE3-NEXT:    movapd %xmm3, %xmm1
571 ; SSSE3-NEXT:    retq
572 ;
573 ; SSE41-LABEL: constant_blendvpd_avx:
574 ; SSE41:       # BB#0: # %entry
575 ; SSE41-NEXT:    blendpd {{.*#+}} xmm1 = xmm1[0],xmm3[1]
576 ; SSE41-NEXT:    movaps %xmm2, %xmm0
577 ; SSE41-NEXT:    retq
578 ;
579 ; AVX-LABEL: constant_blendvpd_avx:
580 ; AVX:       # BB#0: # %entry
581 ; AVX-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3]
582 ; AVX-NEXT:    retq
583 entry:
584   %select = select <4 x i1> <i1 false, i1 false, i1 true, i1 false>, <4 x double> %xy, <4 x double> %ab
585   ret <4 x double> %select
586 }
587
588 define <8 x float> @constant_blendvps_avx(<8 x float> %xyzw, <8 x float> %abcd) {
589 ; SSE2-LABEL: constant_blendvps_avx:
590 ; SSE2:       # BB#0: # %entry
591 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm2[2,0]
592 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,0]
593 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm3[2,0]
594 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[2,0]
595 ; SSE2-NEXT:    movaps %xmm2, %xmm0
596 ; SSE2-NEXT:    movaps %xmm3, %xmm1
597 ; SSE2-NEXT:    retq
598 ;
599 ; SSSE3-LABEL: constant_blendvps_avx:
600 ; SSSE3:       # BB#0: # %entry
601 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm2[2,0]
602 ; SSSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,0]
603 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm3[2,0]
604 ; SSSE3-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[2,0]
605 ; SSSE3-NEXT:    movaps %xmm2, %xmm0
606 ; SSSE3-NEXT:    movaps %xmm3, %xmm1
607 ; SSSE3-NEXT:    retq
608 ;
609 ; SSE41-LABEL: constant_blendvps_avx:
610 ; SSE41:       # BB#0: # %entry
611 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[3]
612 ; SSE41-NEXT:    blendps {{.*#+}} xmm1 = xmm3[0,1,2],xmm1[3]
613 ; SSE41-NEXT:    retq
614 ;
615 ; AVX-LABEL: constant_blendvps_avx:
616 ; AVX:       # BB#0: # %entry
617 ; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2],ymm0[3],ymm1[4,5,6],ymm0[7]
618 ; AVX-NEXT:    retq
619 entry:
620   %select = select <8 x i1> <i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true>, <8 x float> %xyzw, <8 x float> %abcd
621   ret <8 x float> %select
622 }
623
624 define <32 x i8> @constant_pblendvb_avx2(<32 x i8> %xyzw, <32 x i8> %abcd) {
625 ; SSE2-LABEL: constant_pblendvb_avx2:
626 ; SSE2:       # BB#0: # %entry
627 ; SSE2-NEXT:    movaps {{.*#+}} xmm4 = [255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255]
628 ; SSE2-NEXT:    movaps %xmm4, %xmm5
629 ; SSE2-NEXT:    andnps %xmm0, %xmm5
630 ; SSE2-NEXT:    andps %xmm4, %xmm2
631 ; SSE2-NEXT:    orps %xmm2, %xmm5
632 ; SSE2-NEXT:    andps %xmm4, %xmm3
633 ; SSE2-NEXT:    andnps %xmm1, %xmm4
634 ; SSE2-NEXT:    orps %xmm3, %xmm4
635 ; SSE2-NEXT:    movaps %xmm5, %xmm0
636 ; SSE2-NEXT:    movaps %xmm4, %xmm1
637 ; SSE2-NEXT:    retq
638 ;
639 ; SSSE3-LABEL: constant_pblendvb_avx2:
640 ; SSSE3:       # BB#0: # %entry
641 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [128,128,2,128,4,5,6,128,128,128,10,128,12,13,14,128]
642 ; SSSE3-NEXT:    pshufb %xmm4, %xmm0
643 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [0,1,128,3,128,128,128,7,8,9,128,11,128,128,128,15]
644 ; SSSE3-NEXT:    pshufb %xmm5, %xmm2
645 ; SSSE3-NEXT:    por %xmm2, %xmm0
646 ; SSSE3-NEXT:    pshufb %xmm4, %xmm1
647 ; SSSE3-NEXT:    pshufb %xmm5, %xmm3
648 ; SSSE3-NEXT:    por %xmm3, %xmm1
649 ; SSSE3-NEXT:    retq
650 ;
651 ; SSE41-LABEL: constant_pblendvb_avx2:
652 ; SSE41:       # BB#0: # %entry
653 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
654 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,0,255,0,255,255,255,0,0,0,255,0,255,255,255,0]
655 ; SSE41-NEXT:    pblendvb %xmm4, %xmm2
656 ; SSE41-NEXT:    pblendvb %xmm1, %xmm3
657 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
658 ; SSE41-NEXT:    movdqa %xmm3, %xmm1
659 ; SSE41-NEXT:    retq
660 ;
661 ; AVX1-LABEL: constant_pblendvb_avx2:
662 ; AVX1:       # BB#0: # %entry
663 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
664 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
665 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255]
666 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm2, %xmm3, %xmm2
667 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm1, %xmm0, %xmm0
668 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
669 ; AVX1-NEXT:    retq
670 ;
671 ; AVX2-LABEL: constant_pblendvb_avx2:
672 ; AVX2:       # BB#0: # %entry
673 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,0,255,0,255,255,255,0,0,0,255,0,255,255,255,0,0,0,255,0,255,255,255,0,0,0,255,0,255,255,255,0]
674 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
675 ; AVX2-NEXT:    retq
676 entry:
677   %select = select <32 x i1> <i1 false, i1 false, i1 true, i1 false, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 true, i1 true, i1 false>, <32 x i8> %xyzw, <32 x i8> %abcd
678   ret <32 x i8> %select
679 }
680
681 declare <8 x float> @llvm.x86.avx.blendv.ps.256(<8 x float>, <8 x float>, <8 x float>)
682 declare <4 x double> @llvm.x86.avx.blendv.pd.256(<4 x double>, <4 x double>, <4 x double>)
683
684 ;; 4 tests for shufflevectors that optimize to blend + immediate
685 define <4 x float> @blend_shufflevector_4xfloat(<4 x float> %a, <4 x float> %b) {
686 ; SSE2-LABEL: blend_shufflevector_4xfloat:
687 ; SSE2:       # BB#0: # %entry
688 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
689 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
690 ; SSE2-NEXT:    retq
691 ;
692 ; SSSE3-LABEL: blend_shufflevector_4xfloat:
693 ; SSSE3:       # BB#0: # %entry
694 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
695 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
696 ; SSSE3-NEXT:    retq
697 ;
698 ; SSE41-LABEL: blend_shufflevector_4xfloat:
699 ; SSE41:       # BB#0: # %entry
700 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
701 ; SSE41-NEXT:    retq
702 ;
703 ; AVX-LABEL: blend_shufflevector_4xfloat:
704 ; AVX:       # BB#0: # %entry
705 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
706 ; AVX-NEXT:    retq
707 entry:
708   %select = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
709   ret <4 x float> %select
710 }
711
712 define <8 x float> @blend_shufflevector_8xfloat(<8 x float> %a, <8 x float> %b) {
713 ; SSE2-LABEL: blend_shufflevector_8xfloat:
714 ; SSE2:       # BB#0: # %entry
715 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
716 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm3[3,0]
717 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[0,2]
718 ; SSE2-NEXT:    movaps %xmm2, %xmm0
719 ; SSE2-NEXT:    movaps %xmm3, %xmm1
720 ; SSE2-NEXT:    retq
721 ;
722 ; SSSE3-LABEL: blend_shufflevector_8xfloat:
723 ; SSSE3:       # BB#0: # %entry
724 ; SSSE3-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
725 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm3[3,0]
726 ; SSSE3-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[0,2]
727 ; SSSE3-NEXT:    movaps %xmm2, %xmm0
728 ; SSSE3-NEXT:    movaps %xmm3, %xmm1
729 ; SSSE3-NEXT:    retq
730 ;
731 ; SSE41-LABEL: blend_shufflevector_8xfloat:
732 ; SSE41:       # BB#0: # %entry
733 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3]
734 ; SSE41-NEXT:    blendps {{.*#+}} xmm1 = xmm3[0,1],xmm1[2],xmm3[3]
735 ; SSE41-NEXT:    retq
736 ;
737 ; AVX-LABEL: blend_shufflevector_8xfloat:
738 ; AVX:       # BB#0: # %entry
739 ; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5],ymm0[6],ymm1[7]
740 ; AVX-NEXT:    retq
741 entry:
742   %select = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 9, i32 10, i32 11, i32 12, i32 13, i32 6, i32 15>
743   ret <8 x float> %select
744 }
745
746 define <4 x double> @blend_shufflevector_4xdouble(<4 x double> %a, <4 x double> %b) {
747 ; SSE2-LABEL: blend_shufflevector_4xdouble:
748 ; SSE2:       # BB#0: # %entry
749 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
750 ; SSE2-NEXT:    movapd %xmm2, %xmm0
751 ; SSE2-NEXT:    retq
752 ;
753 ; SSSE3-LABEL: blend_shufflevector_4xdouble:
754 ; SSSE3:       # BB#0: # %entry
755 ; SSSE3-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
756 ; SSSE3-NEXT:    movapd %xmm2, %xmm0
757 ; SSSE3-NEXT:    retq
758 ;
759 ; SSE41-LABEL: blend_shufflevector_4xdouble:
760 ; SSE41:       # BB#0: # %entry
761 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm2[1]
762 ; SSE41-NEXT:    retq
763 ;
764 ; AVX-LABEL: blend_shufflevector_4xdouble:
765 ; AVX:       # BB#0: # %entry
766 ; AVX-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2,3]
767 ; AVX-NEXT:    retq
768 entry:
769   %select = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 3>
770   ret <4 x double> %select
771 }
772
773 define <4 x i64> @blend_shufflevector_4xi64(<4 x i64> %a, <4 x i64> %b) {
774 ; SSE2-LABEL: blend_shufflevector_4xi64:
775 ; SSE2:       # BB#0: # %entry
776 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
777 ; SSE2-NEXT:    movaps %xmm3, %xmm1
778 ; SSE2-NEXT:    retq
779 ;
780 ; SSSE3-LABEL: blend_shufflevector_4xi64:
781 ; SSSE3:       # BB#0: # %entry
782 ; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
783 ; SSSE3-NEXT:    movaps %xmm3, %xmm1
784 ; SSSE3-NEXT:    retq
785 ;
786 ; SSE41-LABEL: blend_shufflevector_4xi64:
787 ; SSE41:       # BB#0: # %entry
788 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]
789 ; SSE41-NEXT:    movaps %xmm3, %xmm1
790 ; SSE41-NEXT:    retq
791 ;
792 ; AVX1-LABEL: blend_shufflevector_4xi64:
793 ; AVX1:       # BB#0: # %entry
794 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2,3]
795 ; AVX1-NEXT:    retq
796 ;
797 ; AVX2-LABEL: blend_shufflevector_4xi64:
798 ; AVX2:       # BB#0: # %entry
799 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3],ymm1[4,5,6,7]
800 ; AVX2-NEXT:    retq
801 entry:
802   %select = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 7>
803   ret <4 x i64> %select
804 }