1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
10 define <4 x float> @vsel_float(<4 x float> %v1, <4 x float> %v2) {
11 ; SSE2-LABEL: vsel_float:
12 ; SSE2: # %bb.0: # %entry
13 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
14 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
17 ; SSSE3-LABEL: vsel_float:
18 ; SSSE3: # %bb.0: # %entry
19 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
20 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
23 ; SSE41-LABEL: vsel_float:
24 ; SSE41: # %bb.0: # %entry
25 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
28 ; AVX-LABEL: vsel_float:
29 ; AVX: # %bb.0: # %entry
30 ; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
33 %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x float> %v1, <4 x float> %v2
37 define <4 x float> @vsel_float2(<4 x float> %v1, <4 x float> %v2) {
38 ; SSE2-LABEL: vsel_float2:
39 ; SSE2: # %bb.0: # %entry
40 ; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
41 ; SSE2-NEXT: movaps %xmm1, %xmm0
44 ; SSSE3-LABEL: vsel_float2:
45 ; SSSE3: # %bb.0: # %entry
46 ; SSSE3-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
47 ; SSSE3-NEXT: movaps %xmm1, %xmm0
50 ; SSE41-LABEL: vsel_float2:
51 ; SSE41: # %bb.0: # %entry
52 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
55 ; AVX-LABEL: vsel_float2:
56 ; AVX: # %bb.0: # %entry
57 ; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
60 %vsel = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x float> %v1, <4 x float> %v2
64 define <4 x i8> @vsel_4xi8(<4 x i8> %v1, <4 x i8> %v2) {
65 ; SSE2-LABEL: vsel_4xi8:
66 ; SSE2: # %bb.0: # %entry
67 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[3,0]
68 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
71 ; SSSE3-LABEL: vsel_4xi8:
72 ; SSSE3: # %bb.0: # %entry
73 ; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[3,0]
74 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
77 ; SSE41-LABEL: vsel_4xi8:
78 ; SSE41: # %bb.0: # %entry
79 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]
82 ; AVX-LABEL: vsel_4xi8:
83 ; AVX: # %bb.0: # %entry
84 ; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]
87 %vsel = select <4 x i1> <i1 true, i1 true, i1 false, i1 true>, <4 x i8> %v1, <4 x i8> %v2
91 define <4 x i16> @vsel_4xi16(<4 x i16> %v1, <4 x i16> %v2) {
92 ; SSE2-LABEL: vsel_4xi16:
93 ; SSE2: # %bb.0: # %entry
94 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]
95 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]
96 ; SSE2-NEXT: movaps %xmm1, %xmm0
99 ; SSSE3-LABEL: vsel_4xi16:
100 ; SSSE3: # %bb.0: # %entry
101 ; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]
102 ; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]
103 ; SSSE3-NEXT: movaps %xmm1, %xmm0
106 ; SSE41-LABEL: vsel_4xi16:
107 ; SSE41: # %bb.0: # %entry
108 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
111 ; AVX-LABEL: vsel_4xi16:
112 ; AVX: # %bb.0: # %entry
113 ; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
116 %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 true>, <4 x i16> %v1, <4 x i16> %v2
120 define <4 x i32> @vsel_i32(<4 x i32> %v1, <4 x i32> %v2) {
121 ; SSE2-LABEL: vsel_i32:
122 ; SSE2: # %bb.0: # %entry
123 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
124 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
125 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
128 ; SSSE3-LABEL: vsel_i32:
129 ; SSSE3: # %bb.0: # %entry
130 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
131 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
132 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
135 ; SSE41-LABEL: vsel_i32:
136 ; SSE41: # %bb.0: # %entry
137 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
140 ; AVX-LABEL: vsel_i32:
141 ; AVX: # %bb.0: # %entry
142 ; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
145 %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x i32> %v1, <4 x i32> %v2
149 define <2 x double> @vsel_double(<2 x double> %v1, <2 x double> %v2) {
150 ; SSE2-LABEL: vsel_double:
151 ; SSE2: # %bb.0: # %entry
152 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
155 ; SSSE3-LABEL: vsel_double:
156 ; SSSE3: # %bb.0: # %entry
157 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
160 ; SSE41-LABEL: vsel_double:
161 ; SSE41: # %bb.0: # %entry
162 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
165 ; AVX-LABEL: vsel_double:
166 ; AVX: # %bb.0: # %entry
167 ; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
170 %vsel = select <2 x i1> <i1 true, i1 false>, <2 x double> %v1, <2 x double> %v2
171 ret <2 x double> %vsel
174 define <2 x i64> @vsel_i64(<2 x i64> %v1, <2 x i64> %v2) {
175 ; SSE2-LABEL: vsel_i64:
176 ; SSE2: # %bb.0: # %entry
177 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
180 ; SSSE3-LABEL: vsel_i64:
181 ; SSSE3: # %bb.0: # %entry
182 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
185 ; SSE41-LABEL: vsel_i64:
186 ; SSE41: # %bb.0: # %entry
187 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
190 ; AVX-LABEL: vsel_i64:
191 ; AVX: # %bb.0: # %entry
192 ; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
195 %vsel = select <2 x i1> <i1 true, i1 false>, <2 x i64> %v1, <2 x i64> %v2
199 define <8 x i16> @vsel_8xi16(<8 x i16> %v1, <8 x i16> %v2) {
200 ; SSE2-LABEL: vsel_8xi16:
201 ; SSE2: # %bb.0: # %entry
202 ; SSE2-NEXT: movaps {{.*#+}} xmm2 = [0,65535,65535,65535,0,65535,65535,65535]
203 ; SSE2-NEXT: andps %xmm2, %xmm1
204 ; SSE2-NEXT: andnps %xmm0, %xmm2
205 ; SSE2-NEXT: orps %xmm1, %xmm2
206 ; SSE2-NEXT: movaps %xmm2, %xmm0
209 ; SSSE3-LABEL: vsel_8xi16:
210 ; SSSE3: # %bb.0: # %entry
211 ; SSSE3-NEXT: movaps {{.*#+}} xmm2 = [0,65535,65535,65535,0,65535,65535,65535]
212 ; SSSE3-NEXT: andps %xmm2, %xmm1
213 ; SSSE3-NEXT: andnps %xmm0, %xmm2
214 ; SSSE3-NEXT: orps %xmm1, %xmm2
215 ; SSSE3-NEXT: movaps %xmm2, %xmm0
218 ; SSE41-LABEL: vsel_8xi16:
219 ; SSE41: # %bb.0: # %entry
220 ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
223 ; AVX-LABEL: vsel_8xi16:
224 ; AVX: # %bb.0: # %entry
225 ; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
228 %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
232 define <16 x i8> @vsel_i8(<16 x i8> %v1, <16 x i8> %v2) {
233 ; SSE2-LABEL: vsel_i8:
234 ; SSE2: # %bb.0: # %entry
235 ; SSE2-NEXT: movaps {{.*#+}} xmm2 = [0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
236 ; SSE2-NEXT: andps %xmm2, %xmm1
237 ; SSE2-NEXT: andnps %xmm0, %xmm2
238 ; SSE2-NEXT: orps %xmm1, %xmm2
239 ; SSE2-NEXT: movaps %xmm2, %xmm0
242 ; SSSE3-LABEL: vsel_i8:
243 ; SSSE3: # %bb.0: # %entry
244 ; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[12],zero,zero,zero
245 ; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = zero,xmm1[1,2,3],zero,xmm1[5,6,7],zero,xmm1[9,10,11],zero,xmm1[13,14,15]
246 ; SSSE3-NEXT: por %xmm1, %xmm0
249 ; SSE41-LABEL: vsel_i8:
250 ; SSE41: # %bb.0: # %entry
251 ; SSE41-NEXT: movdqa %xmm0, %xmm2
252 ; SSE41-NEXT: movaps {{.*#+}} xmm0 = [0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
253 ; SSE41-NEXT: pblendvb %xmm0, %xmm1, %xmm2
254 ; SSE41-NEXT: movdqa %xmm2, %xmm0
257 ; AVX-LABEL: vsel_i8:
258 ; AVX: # %bb.0: # %entry
259 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
260 ; AVX-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
263 %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
270 define <8 x float> @vsel_float8(<8 x float> %v1, <8 x float> %v2) {
271 ; SSE2-LABEL: vsel_float8:
272 ; SSE2: # %bb.0: # %entry
273 ; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
274 ; SSE2-NEXT: movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
275 ; SSE2-NEXT: movaps %xmm2, %xmm0
276 ; SSE2-NEXT: movaps %xmm3, %xmm1
279 ; SSSE3-LABEL: vsel_float8:
280 ; SSSE3: # %bb.0: # %entry
281 ; SSSE3-NEXT: movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
282 ; SSSE3-NEXT: movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
283 ; SSSE3-NEXT: movaps %xmm2, %xmm0
284 ; SSSE3-NEXT: movaps %xmm3, %xmm1
287 ; SSE41-LABEL: vsel_float8:
288 ; SSE41: # %bb.0: # %entry
289 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3]
290 ; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3]
293 ; AVX-LABEL: vsel_float8:
294 ; AVX: # %bb.0: # %entry
295 ; AVX-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
298 %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
299 ret <8 x float> %vsel
302 define <8 x i32> @vsel_i328(<8 x i32> %v1, <8 x i32> %v2) {
303 ; SSE2-LABEL: vsel_i328:
304 ; SSE2: # %bb.0: # %entry
305 ; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
306 ; SSE2-NEXT: movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
307 ; SSE2-NEXT: movaps %xmm2, %xmm0
308 ; SSE2-NEXT: movaps %xmm3, %xmm1
311 ; SSSE3-LABEL: vsel_i328:
312 ; SSSE3: # %bb.0: # %entry
313 ; SSSE3-NEXT: movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
314 ; SSSE3-NEXT: movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
315 ; SSSE3-NEXT: movaps %xmm2, %xmm0
316 ; SSSE3-NEXT: movaps %xmm3, %xmm1
319 ; SSE41-LABEL: vsel_i328:
320 ; SSE41: # %bb.0: # %entry
321 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3]
322 ; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3]
325 ; AVX-LABEL: vsel_i328:
326 ; AVX: # %bb.0: # %entry
327 ; AVX-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
330 %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
334 define <8 x double> @vsel_double8(<8 x double> %v1, <8 x double> %v2) {
335 ; SSE2-LABEL: vsel_double8:
336 ; SSE2: # %bb.0: # %entry
337 ; SSE2-NEXT: movaps %xmm7, %xmm3
338 ; SSE2-NEXT: movaps %xmm5, %xmm1
339 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3]
340 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,1],xmm6[2,3]
343 ; SSSE3-LABEL: vsel_double8:
344 ; SSSE3: # %bb.0: # %entry
345 ; SSSE3-NEXT: movaps %xmm7, %xmm3
346 ; SSSE3-NEXT: movaps %xmm5, %xmm1
347 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3]
348 ; SSSE3-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,1],xmm6[2,3]
351 ; SSE41-LABEL: vsel_double8:
352 ; SSE41: # %bb.0: # %entry
353 ; SSE41-NEXT: movaps %xmm7, %xmm3
354 ; SSE41-NEXT: movaps %xmm5, %xmm1
355 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3]
356 ; SSE41-NEXT: blendps {{.*#+}} xmm2 = xmm2[0,1],xmm6[2,3]
359 ; AVX-LABEL: vsel_double8:
360 ; AVX: # %bb.0: # %entry
361 ; AVX-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm2[2,3,4,5,6,7]
362 ; AVX-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0,1],ymm3[2,3,4,5,6,7]
365 %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
366 ret <8 x double> %vsel
369 define <8 x i64> @vsel_i648(<8 x i64> %v1, <8 x i64> %v2) {
370 ; SSE2-LABEL: vsel_i648:
371 ; SSE2: # %bb.0: # %entry
372 ; SSE2-NEXT: movaps %xmm7, %xmm3
373 ; SSE2-NEXT: movaps %xmm5, %xmm1
374 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3]
375 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,1],xmm6[2,3]
378 ; SSSE3-LABEL: vsel_i648:
379 ; SSSE3: # %bb.0: # %entry
380 ; SSSE3-NEXT: movaps %xmm7, %xmm3
381 ; SSSE3-NEXT: movaps %xmm5, %xmm1
382 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3]
383 ; SSSE3-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,1],xmm6[2,3]
386 ; SSE41-LABEL: vsel_i648:
387 ; SSE41: # %bb.0: # %entry
388 ; SSE41-NEXT: movaps %xmm7, %xmm3
389 ; SSE41-NEXT: movaps %xmm5, %xmm1
390 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3]
391 ; SSE41-NEXT: blendps {{.*#+}} xmm2 = xmm2[0,1],xmm6[2,3]
394 ; AVX-LABEL: vsel_i648:
395 ; AVX: # %bb.0: # %entry
396 ; AVX-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm2[2,3,4,5,6,7]
397 ; AVX-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0,1],ymm3[2,3,4,5,6,7]
400 %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
404 define <4 x double> @vsel_double4(<4 x double> %v1, <4 x double> %v2) {
405 ; SSE2-LABEL: vsel_double4:
406 ; SSE2: # %bb.0: # %entry
407 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]
408 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3]
411 ; SSSE3-LABEL: vsel_double4:
412 ; SSSE3: # %bb.0: # %entry
413 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]
414 ; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3]
417 ; SSE41-LABEL: vsel_double4:
418 ; SSE41: # %bb.0: # %entry
419 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]
420 ; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3]
423 ; AVX-LABEL: vsel_double4:
424 ; AVX: # %bb.0: # %entry
425 ; AVX-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
428 %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x double> %v1, <4 x double> %v2
429 ret <4 x double> %vsel
432 define <2 x double> @testa(<2 x double> %x, <2 x double> %y) {
434 ; SSE2: # %bb.0: # %entry
435 ; SSE2-NEXT: movapd %xmm1, %xmm2
436 ; SSE2-NEXT: cmplepd %xmm0, %xmm2
437 ; SSE2-NEXT: andpd %xmm2, %xmm0
438 ; SSE2-NEXT: andnpd %xmm1, %xmm2
439 ; SSE2-NEXT: orpd %xmm2, %xmm0
442 ; SSSE3-LABEL: testa:
443 ; SSSE3: # %bb.0: # %entry
444 ; SSSE3-NEXT: movapd %xmm1, %xmm2
445 ; SSSE3-NEXT: cmplepd %xmm0, %xmm2
446 ; SSSE3-NEXT: andpd %xmm2, %xmm0
447 ; SSSE3-NEXT: andnpd %xmm1, %xmm2
448 ; SSSE3-NEXT: orpd %xmm2, %xmm0
451 ; SSE41-LABEL: testa:
452 ; SSE41: # %bb.0: # %entry
453 ; SSE41-NEXT: movapd %xmm0, %xmm2
454 ; SSE41-NEXT: movapd %xmm1, %xmm0
455 ; SSE41-NEXT: cmplepd %xmm2, %xmm0
456 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
457 ; SSE41-NEXT: movapd %xmm1, %xmm0
461 ; AVX: # %bb.0: # %entry
462 ; AVX-NEXT: vcmplepd %xmm0, %xmm1, %xmm2
463 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
466 %max_is_x = fcmp oge <2 x double> %x, %y
467 %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
468 ret <2 x double> %max
471 define <2 x double> @testb(<2 x double> %x, <2 x double> %y) {
473 ; SSE2: # %bb.0: # %entry
474 ; SSE2-NEXT: movapd %xmm1, %xmm2
475 ; SSE2-NEXT: cmpnlepd %xmm0, %xmm2
476 ; SSE2-NEXT: andpd %xmm2, %xmm0
477 ; SSE2-NEXT: andnpd %xmm1, %xmm2
478 ; SSE2-NEXT: orpd %xmm2, %xmm0
481 ; SSSE3-LABEL: testb:
482 ; SSSE3: # %bb.0: # %entry
483 ; SSSE3-NEXT: movapd %xmm1, %xmm2
484 ; SSSE3-NEXT: cmpnlepd %xmm0, %xmm2
485 ; SSSE3-NEXT: andpd %xmm2, %xmm0
486 ; SSSE3-NEXT: andnpd %xmm1, %xmm2
487 ; SSSE3-NEXT: orpd %xmm2, %xmm0
490 ; SSE41-LABEL: testb:
491 ; SSE41: # %bb.0: # %entry
492 ; SSE41-NEXT: movapd %xmm0, %xmm2
493 ; SSE41-NEXT: movapd %xmm1, %xmm0
494 ; SSE41-NEXT: cmpnlepd %xmm2, %xmm0
495 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
496 ; SSE41-NEXT: movapd %xmm1, %xmm0
500 ; AVX: # %bb.0: # %entry
501 ; AVX-NEXT: vcmpnlepd %xmm0, %xmm1, %xmm2
502 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
505 %min_is_x = fcmp ult <2 x double> %x, %y
506 %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
507 ret <2 x double> %min
510 ; If we can figure out a blend has a constant mask, we should emit the
511 ; blend instruction with an immediate mask
512 define <4 x double> @constant_blendvpd_avx(<4 x double> %xy, <4 x double> %ab) {
513 ; SSE2-LABEL: constant_blendvpd_avx:
514 ; SSE2: # %bb.0: # %entry
515 ; SSE2-NEXT: movaps %xmm2, %xmm0
516 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3]
519 ; SSSE3-LABEL: constant_blendvpd_avx:
520 ; SSSE3: # %bb.0: # %entry
521 ; SSSE3-NEXT: movaps %xmm2, %xmm0
522 ; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3]
525 ; SSE41-LABEL: constant_blendvpd_avx:
526 ; SSE41: # %bb.0: # %entry
527 ; SSE41-NEXT: movaps %xmm2, %xmm0
528 ; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3]
531 ; AVX-LABEL: constant_blendvpd_avx:
532 ; AVX: # %bb.0: # %entry
533 ; AVX-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5],ymm1[6,7]
536 %select = select <4 x i1> <i1 false, i1 false, i1 true, i1 false>, <4 x double> %xy, <4 x double> %ab
537 ret <4 x double> %select
540 define <8 x float> @constant_blendvps_avx(<8 x float> %xyzw, <8 x float> %abcd) {
541 ; SSE2-LABEL: constant_blendvps_avx:
542 ; SSE2: # %bb.0: # %entry
543 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm2[2,0]
544 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,0]
545 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,0],xmm3[2,0]
546 ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[2,0]
547 ; SSE2-NEXT: movaps %xmm2, %xmm0
548 ; SSE2-NEXT: movaps %xmm3, %xmm1
551 ; SSSE3-LABEL: constant_blendvps_avx:
552 ; SSSE3: # %bb.0: # %entry
553 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm2[2,0]
554 ; SSSE3-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,0]
555 ; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,0],xmm3[2,0]
556 ; SSSE3-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[2,0]
557 ; SSSE3-NEXT: movaps %xmm2, %xmm0
558 ; SSSE3-NEXT: movaps %xmm3, %xmm1
561 ; SSE41-LABEL: constant_blendvps_avx:
562 ; SSE41: # %bb.0: # %entry
563 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[3]
564 ; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm3[0,1,2],xmm1[3]
567 ; AVX-LABEL: constant_blendvps_avx:
568 ; AVX: # %bb.0: # %entry
569 ; AVX-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0,1,2],ymm0[3],ymm1[4,5,6],ymm0[7]
572 %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
573 ret <8 x float> %select
576 define <32 x i8> @constant_pblendvb_avx2(<32 x i8> %xyzw, <32 x i8> %abcd) {
577 ; SSE2-LABEL: constant_pblendvb_avx2:
578 ; SSE2: # %bb.0: # %entry
579 ; SSE2-NEXT: movaps {{.*#+}} xmm4 = [255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255]
580 ; SSE2-NEXT: movaps %xmm4, %xmm5
581 ; SSE2-NEXT: andnps %xmm0, %xmm5
582 ; SSE2-NEXT: andps %xmm4, %xmm2
583 ; SSE2-NEXT: orps %xmm2, %xmm5
584 ; SSE2-NEXT: andps %xmm4, %xmm3
585 ; SSE2-NEXT: andnps %xmm1, %xmm4
586 ; SSE2-NEXT: orps %xmm3, %xmm4
587 ; SSE2-NEXT: movaps %xmm5, %xmm0
588 ; SSE2-NEXT: movaps %xmm4, %xmm1
591 ; SSSE3-LABEL: constant_pblendvb_avx2:
592 ; SSSE3: # %bb.0: # %entry
593 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [128,128,2,128,4,5,6,128,128,128,10,128,12,13,14,128]
594 ; SSSE3-NEXT: pshufb %xmm4, %xmm0
595 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [0,1,128,3,128,128,128,7,8,9,128,11,128,128,128,15]
596 ; SSSE3-NEXT: pshufb %xmm5, %xmm2
597 ; SSSE3-NEXT: por %xmm2, %xmm0
598 ; SSSE3-NEXT: pshufb %xmm4, %xmm1
599 ; SSSE3-NEXT: pshufb %xmm5, %xmm3
600 ; SSSE3-NEXT: por %xmm3, %xmm1
603 ; SSE41-LABEL: constant_pblendvb_avx2:
604 ; SSE41: # %bb.0: # %entry
605 ; SSE41-NEXT: movdqa %xmm0, %xmm4
606 ; SSE41-NEXT: movaps {{.*#+}} xmm0 = [255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255]
607 ; SSE41-NEXT: pblendvb %xmm0, %xmm2, %xmm4
608 ; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm1
609 ; SSE41-NEXT: movdqa %xmm4, %xmm0
612 ; AVX1-LABEL: constant_pblendvb_avx2:
613 ; AVX1: # %bb.0: # %entry
614 ; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [-5.4861292804117373E+303,-5.4861292804117373E+303,-5.4861292804117373E+303,-5.4861292804117373E+303]
615 ; AVX1-NEXT: vandnps %ymm0, %ymm2, %ymm0
616 ; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1
617 ; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0
620 ; AVX2-LABEL: constant_pblendvb_avx2:
621 ; AVX2: # %bb.0: # %entry
622 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255]
623 ; AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
626 %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
627 ret <32 x i8> %select
630 declare <8 x float> @llvm.x86.avx.blendv.ps.256(<8 x float>, <8 x float>, <8 x float>)
631 declare <4 x double> @llvm.x86.avx.blendv.pd.256(<4 x double>, <4 x double>, <4 x double>)
633 ;; 4 tests for shufflevectors that optimize to blend + immediate
634 define <4 x float> @blend_shufflevector_4xfloat(<4 x float> %a, <4 x float> %b) {
635 ; SSE2-LABEL: blend_shufflevector_4xfloat:
636 ; SSE2: # %bb.0: # %entry
637 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
638 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
641 ; SSSE3-LABEL: blend_shufflevector_4xfloat:
642 ; SSSE3: # %bb.0: # %entry
643 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
644 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
647 ; SSE41-LABEL: blend_shufflevector_4xfloat:
648 ; SSE41: # %bb.0: # %entry
649 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
652 ; AVX-LABEL: blend_shufflevector_4xfloat:
653 ; AVX: # %bb.0: # %entry
654 ; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
657 %select = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
658 ret <4 x float> %select
661 define <8 x float> @blend_shufflevector_8xfloat(<8 x float> %a, <8 x float> %b) {
662 ; SSE2-LABEL: blend_shufflevector_8xfloat:
663 ; SSE2: # %bb.0: # %entry
664 ; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
665 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm3[3,0]
666 ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[0,2]
667 ; SSE2-NEXT: movaps %xmm2, %xmm0
668 ; SSE2-NEXT: movaps %xmm3, %xmm1
671 ; SSSE3-LABEL: blend_shufflevector_8xfloat:
672 ; SSSE3: # %bb.0: # %entry
673 ; SSSE3-NEXT: movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
674 ; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm3[3,0]
675 ; SSSE3-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[0,2]
676 ; SSSE3-NEXT: movaps %xmm2, %xmm0
677 ; SSSE3-NEXT: movaps %xmm3, %xmm1
680 ; SSE41-LABEL: blend_shufflevector_8xfloat:
681 ; SSE41: # %bb.0: # %entry
682 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3]
683 ; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm3[0,1],xmm1[2],xmm3[3]
686 ; AVX-LABEL: blend_shufflevector_8xfloat:
687 ; AVX: # %bb.0: # %entry
688 ; AVX-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5],ymm0[6],ymm1[7]
691 %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>
692 ret <8 x float> %select
695 define <4 x double> @blend_shufflevector_4xdouble(<4 x double> %a, <4 x double> %b) {
696 ; SSE2-LABEL: blend_shufflevector_4xdouble:
697 ; SSE2: # %bb.0: # %entry
698 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]
701 ; SSSE3-LABEL: blend_shufflevector_4xdouble:
702 ; SSSE3: # %bb.0: # %entry
703 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]
706 ; SSE41-LABEL: blend_shufflevector_4xdouble:
707 ; SSE41: # %bb.0: # %entry
708 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]
711 ; AVX-LABEL: blend_shufflevector_4xdouble:
712 ; AVX: # %bb.0: # %entry
713 ; AVX-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5,6,7]
716 %select = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 3>
717 ret <4 x double> %select
720 define <4 x i64> @blend_shufflevector_4xi64(<4 x i64> %a, <4 x i64> %b) {
721 ; SSE2-LABEL: blend_shufflevector_4xi64:
722 ; SSE2: # %bb.0: # %entry
723 ; SSE2-NEXT: movaps %xmm3, %xmm1
724 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
727 ; SSSE3-LABEL: blend_shufflevector_4xi64:
728 ; SSSE3: # %bb.0: # %entry
729 ; SSSE3-NEXT: movaps %xmm3, %xmm1
730 ; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
733 ; SSE41-LABEL: blend_shufflevector_4xi64:
734 ; SSE41: # %bb.0: # %entry
735 ; SSE41-NEXT: movaps %xmm3, %xmm1
736 ; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3]
739 ; AVX-LABEL: blend_shufflevector_4xi64:
740 ; AVX: # %bb.0: # %entry
741 ; AVX-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3],ymm1[4,5,6,7]
744 %select = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 7>
745 ret <4 x i64> %select
748 define <4 x i32> @blend_logic_v4i32(<4 x i32> %b, <4 x i32> %a, <4 x i32> %c) {
749 ; SSE2-LABEL: blend_logic_v4i32:
750 ; SSE2: # %bb.0: # %entry
751 ; SSE2-NEXT: psrad $31, %xmm0
752 ; SSE2-NEXT: pand %xmm0, %xmm1
753 ; SSE2-NEXT: pandn %xmm2, %xmm0
754 ; SSE2-NEXT: por %xmm1, %xmm0
757 ; SSSE3-LABEL: blend_logic_v4i32:
758 ; SSSE3: # %bb.0: # %entry
759 ; SSSE3-NEXT: psrad $31, %xmm0
760 ; SSSE3-NEXT: pand %xmm0, %xmm1
761 ; SSSE3-NEXT: pandn %xmm2, %xmm0
762 ; SSSE3-NEXT: por %xmm1, %xmm0
765 ; SSE41-LABEL: blend_logic_v4i32:
766 ; SSE41: # %bb.0: # %entry
767 ; SSE41-NEXT: psrad $31, %xmm0
768 ; SSE41-NEXT: pblendvb %xmm0, %xmm1, %xmm2
769 ; SSE41-NEXT: movdqa %xmm2, %xmm0
772 ; AVX-LABEL: blend_logic_v4i32:
773 ; AVX: # %bb.0: # %entry
774 ; AVX-NEXT: vpsrad $31, %xmm0, %xmm0
775 ; AVX-NEXT: vpblendvb %xmm0, %xmm1, %xmm2, %xmm0
778 %b.lobit = ashr <4 x i32> %b, <i32 31, i32 31, i32 31, i32 31>
779 %sub = sub nsw <4 x i32> zeroinitializer, %a
780 %0 = xor <4 x i32> %b.lobit, <i32 -1, i32 -1, i32 -1, i32 -1>
781 %1 = and <4 x i32> %c, %0
782 %2 = and <4 x i32> %a, %b.lobit
783 %cond = or <4 x i32> %1, %2
787 define <8 x i32> @blend_logic_v8i32(<8 x i32> %b, <8 x i32> %a, <8 x i32> %c) {
788 ; SSE2-LABEL: blend_logic_v8i32:
789 ; SSE2: # %bb.0: # %entry
790 ; SSE2-NEXT: psrad $31, %xmm0
791 ; SSE2-NEXT: psrad $31, %xmm1
792 ; SSE2-NEXT: pand %xmm1, %xmm3
793 ; SSE2-NEXT: pandn %xmm5, %xmm1
794 ; SSE2-NEXT: por %xmm3, %xmm1
795 ; SSE2-NEXT: pand %xmm0, %xmm2
796 ; SSE2-NEXT: pandn %xmm4, %xmm0
797 ; SSE2-NEXT: por %xmm2, %xmm0
800 ; SSSE3-LABEL: blend_logic_v8i32:
801 ; SSSE3: # %bb.0: # %entry
802 ; SSSE3-NEXT: psrad $31, %xmm0
803 ; SSSE3-NEXT: psrad $31, %xmm1
804 ; SSSE3-NEXT: pand %xmm1, %xmm3
805 ; SSSE3-NEXT: pandn %xmm5, %xmm1
806 ; SSSE3-NEXT: por %xmm3, %xmm1
807 ; SSSE3-NEXT: pand %xmm0, %xmm2
808 ; SSSE3-NEXT: pandn %xmm4, %xmm0
809 ; SSSE3-NEXT: por %xmm2, %xmm0
812 ; SSE41-LABEL: blend_logic_v8i32:
813 ; SSE41: # %bb.0: # %entry
814 ; SSE41-NEXT: psrad $31, %xmm1
815 ; SSE41-NEXT: psrad $31, %xmm0
816 ; SSE41-NEXT: pblendvb %xmm0, %xmm2, %xmm4
817 ; SSE41-NEXT: movdqa %xmm1, %xmm0
818 ; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm5
819 ; SSE41-NEXT: movdqa %xmm4, %xmm0
820 ; SSE41-NEXT: movdqa %xmm5, %xmm1
823 ; AVX1-LABEL: blend_logic_v8i32:
824 ; AVX1: # %bb.0: # %entry
825 ; AVX1-NEXT: vpsrad $31, %xmm0, %xmm3
826 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
827 ; AVX1-NEXT: vpsrad $31, %xmm0, %xmm0
828 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0
829 ; AVX1-NEXT: vandnps %ymm2, %ymm0, %ymm2
830 ; AVX1-NEXT: vandps %ymm0, %ymm1, %ymm0
831 ; AVX1-NEXT: vorps %ymm0, %ymm2, %ymm0
834 ; AVX2-LABEL: blend_logic_v8i32:
835 ; AVX2: # %bb.0: # %entry
836 ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
837 ; AVX2-NEXT: vpblendvb %ymm0, %ymm1, %ymm2, %ymm0
840 %b.lobit = ashr <8 x i32> %b, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
841 %sub = sub nsw <8 x i32> zeroinitializer, %a
842 %0 = xor <8 x i32> %b.lobit, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
843 %1 = and <8 x i32> %c, %0
844 %2 = and <8 x i32> %a, %b.lobit
845 %cond = or <8 x i32> %1, %2
849 define <4 x i32> @blend_neg_logic_v4i32(<4 x i32> %a, <4 x i32> %b) {
850 ; SSE-LABEL: blend_neg_logic_v4i32:
851 ; SSE: # %bb.0: # %entry
852 ; SSE-NEXT: psrad $31, %xmm1
853 ; SSE-NEXT: pxor %xmm1, %xmm0
854 ; SSE-NEXT: psubd %xmm1, %xmm0
857 ; AVX-LABEL: blend_neg_logic_v4i32:
858 ; AVX: # %bb.0: # %entry
859 ; AVX-NEXT: vpsrad $31, %xmm1, %xmm1
860 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
861 ; AVX-NEXT: vpsubd %xmm1, %xmm0, %xmm0
864 %b.lobit = ashr <4 x i32> %b, <i32 31, i32 31, i32 31, i32 31>
865 %sub = sub nsw <4 x i32> zeroinitializer, %a
866 %0 = xor <4 x i32> %b.lobit, <i32 -1, i32 -1, i32 -1, i32 -1>
867 %1 = and <4 x i32> %a, %0
868 %2 = and <4 x i32> %b.lobit, %sub
869 %cond = or <4 x i32> %1, %2
873 define <8 x i32> @blend_neg_logic_v8i32(<8 x i32> %a, <8 x i32> %b) {
874 ; SSE-LABEL: blend_neg_logic_v8i32:
875 ; SSE: # %bb.0: # %entry
876 ; SSE-NEXT: psrad $31, %xmm3
877 ; SSE-NEXT: psrad $31, %xmm2
878 ; SSE-NEXT: pxor %xmm2, %xmm0
879 ; SSE-NEXT: psubd %xmm2, %xmm0
880 ; SSE-NEXT: pxor %xmm3, %xmm1
881 ; SSE-NEXT: psubd %xmm3, %xmm1
884 ; AVX1-LABEL: blend_neg_logic_v8i32:
885 ; AVX1: # %bb.0: # %entry
886 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2
887 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
888 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm1
889 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
890 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
891 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
892 ; AVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2
893 ; AVX1-NEXT: vpsubd %xmm0, %xmm3, %xmm3
894 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
895 ; AVX1-NEXT: vandnps %ymm0, %ymm1, %ymm0
896 ; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1
897 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
900 ; AVX2-LABEL: blend_neg_logic_v8i32:
901 ; AVX2: # %bb.0: # %entry
902 ; AVX2-NEXT: vpsrad $31, %ymm1, %ymm1
903 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
904 ; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0
907 %b.lobit = ashr <8 x i32> %b, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
908 %sub = sub nsw <8 x i32> zeroinitializer, %a
909 %0 = xor <8 x i32> %b.lobit, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
910 %1 = and <8 x i32> %a, %0
911 %2 = and <8 x i32> %b.lobit, %sub
912 %cond = or <8 x i32> %1, %2
916 define <4 x i32> @blend_neg_logic_v4i32_2(<4 x i32> %v, <4 x i32> %c) {
917 ; SSE2-LABEL: blend_neg_logic_v4i32_2:
918 ; SSE2: # %bb.0: # %entry
919 ; SSE2-NEXT: psrad $31, %xmm1
920 ; SSE2-NEXT: pxor %xmm1, %xmm0
921 ; SSE2-NEXT: psubd %xmm0, %xmm1
922 ; SSE2-NEXT: movdqa %xmm1, %xmm0
925 ; SSSE3-LABEL: blend_neg_logic_v4i32_2:
926 ; SSSE3: # %bb.0: # %entry
927 ; SSSE3-NEXT: psrad $31, %xmm1
928 ; SSSE3-NEXT: pxor %xmm1, %xmm0
929 ; SSSE3-NEXT: psubd %xmm0, %xmm1
930 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
933 ; SSE41-LABEL: blend_neg_logic_v4i32_2:
934 ; SSE41: # %bb.0: # %entry
935 ; SSE41-NEXT: movdqa %xmm0, %xmm2
936 ; SSE41-NEXT: pxor %xmm3, %xmm3
937 ; SSE41-NEXT: psubd %xmm0, %xmm3
938 ; SSE41-NEXT: movaps %xmm1, %xmm0
939 ; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm3
940 ; SSE41-NEXT: movaps %xmm3, %xmm0
943 ; AVX-LABEL: blend_neg_logic_v4i32_2:
944 ; AVX: # %bb.0: # %entry
945 ; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2
946 ; AVX-NEXT: vpsubd %xmm0, %xmm2, %xmm2
947 ; AVX-NEXT: vblendvps %xmm1, %xmm0, %xmm2, %xmm0
950 %0 = ashr <4 x i32> %c, <i32 31, i32 31, i32 31, i32 31>
951 %1 = trunc <4 x i32> %0 to <4 x i1>
952 %2 = sub nsw <4 x i32> zeroinitializer, %v
953 %3 = select <4 x i1> %1, <4 x i32> %v, <4 x i32> %2