xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/vector-blend.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse2 | FileCheck %s --check-prefix=SSE2
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+ssse3 | FileCheck %s --check-prefix=SSSE3
4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE41
5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
6*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; AVX128 tests:
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vsel_float(<4 x float> %v1, <4 x float> %v2) {
11*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: vsel_float:
12*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
13*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
14*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
15*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
16*9880d681SAndroid Build Coastguard Worker;
17*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: vsel_float:
18*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
19*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
20*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
21*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
22*9880d681SAndroid Build Coastguard Worker;
23*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: vsel_float:
24*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
25*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
26*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
27*9880d681SAndroid Build Coastguard Worker;
28*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vsel_float:
29*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
30*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
31*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
32*9880d681SAndroid Build Coastguard Workerentry:
33*9880d681SAndroid Build Coastguard Worker  %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x float> %v1, <4 x float> %v2
34*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %vsel
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vsel_float2(<4 x float> %v1, <4 x float> %v2) {
38*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: vsel_float2:
39*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
40*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
41*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm1, %xmm0
42*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
43*9880d681SAndroid Build Coastguard Worker;
44*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: vsel_float2:
45*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
46*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
47*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm1, %xmm0
48*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
49*9880d681SAndroid Build Coastguard Worker;
50*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: vsel_float2:
51*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
52*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
53*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
54*9880d681SAndroid Build Coastguard Worker;
55*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vsel_float2:
56*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
57*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
58*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
59*9880d681SAndroid Build Coastguard Workerentry:
60*9880d681SAndroid Build Coastguard Worker  %vsel = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x float> %v1, <4 x float> %v2
61*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %vsel
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @vsel_4xi8(<4 x i8> %v1, <4 x i8> %v2) {
65*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: vsel_4xi8:
66*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
67*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[3,0]
68*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
69*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
70*9880d681SAndroid Build Coastguard Worker;
71*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: vsel_4xi8:
72*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
73*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[3,0]
74*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
75*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
76*9880d681SAndroid Build Coastguard Worker;
77*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: vsel_4xi8:
78*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
79*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
80*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
81*9880d681SAndroid Build Coastguard Worker;
82*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: vsel_4xi8:
83*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0: # %entry
84*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
85*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
86*9880d681SAndroid Build Coastguard Worker;
87*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: vsel_4xi8:
88*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0: # %entry
89*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]
90*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
91*9880d681SAndroid Build Coastguard Workerentry:
92*9880d681SAndroid Build Coastguard Worker  %vsel = select <4 x i1> <i1 true, i1 true, i1 false, i1 true>, <4 x i8> %v1, <4 x i8> %v2
93*9880d681SAndroid Build Coastguard Worker  ret <4 x i8> %vsel
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @vsel_4xi16(<4 x i16> %v1, <4 x i16> %v2) {
97*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: vsel_4xi16:
98*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
99*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]
100*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]
101*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm1, %xmm0
102*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
103*9880d681SAndroid Build Coastguard Worker;
104*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: vsel_4xi16:
105*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
106*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]
107*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]
108*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm1, %xmm0
109*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
110*9880d681SAndroid Build Coastguard Worker;
111*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: vsel_4xi16:
112*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
113*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
114*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
115*9880d681SAndroid Build Coastguard Worker;
116*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: vsel_4xi16:
117*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0: # %entry
118*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
119*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
120*9880d681SAndroid Build Coastguard Worker;
121*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: vsel_4xi16:
122*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0: # %entry
123*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
124*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
125*9880d681SAndroid Build Coastguard Workerentry:
126*9880d681SAndroid Build Coastguard Worker  %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 true>, <4 x i16> %v1, <4 x i16> %v2
127*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %vsel
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vsel_i32(<4 x i32> %v1, <4 x i32> %v2) {
131*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: vsel_i32:
132*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
133*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
134*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
135*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
136*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
137*9880d681SAndroid Build Coastguard Worker;
138*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: vsel_i32:
139*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
140*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
141*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
142*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
143*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
144*9880d681SAndroid Build Coastguard Worker;
145*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: vsel_i32:
146*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
147*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
148*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
149*9880d681SAndroid Build Coastguard Worker;
150*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: vsel_i32:
151*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0: # %entry
152*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
153*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
154*9880d681SAndroid Build Coastguard Worker;
155*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: vsel_i32:
156*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0: # %entry
157*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
158*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
159*9880d681SAndroid Build Coastguard Workerentry:
160*9880d681SAndroid Build Coastguard Worker  %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x i32> %v1, <4 x i32> %v2
161*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vsel
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @vsel_double(<2 x double> %v1, <2 x double> %v2) {
165*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: vsel_double:
166*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
167*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
168*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm1, %xmm0
169*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
170*9880d681SAndroid Build Coastguard Worker;
171*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: vsel_double:
172*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
173*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
174*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm1, %xmm0
175*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
176*9880d681SAndroid Build Coastguard Worker;
177*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: vsel_double:
178*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
179*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
180*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
181*9880d681SAndroid Build Coastguard Worker;
182*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vsel_double:
183*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
184*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
185*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
186*9880d681SAndroid Build Coastguard Workerentry:
187*9880d681SAndroid Build Coastguard Worker  %vsel = select <2 x i1> <i1 true, i1 false>, <2 x double> %v1, <2 x double> %v2
188*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %vsel
189*9880d681SAndroid Build Coastguard Worker}
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @vsel_i64(<2 x i64> %v1, <2 x i64> %v2) {
192*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: vsel_i64:
193*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
194*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
195*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm1, %xmm0
196*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
197*9880d681SAndroid Build Coastguard Worker;
198*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: vsel_i64:
199*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
200*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
201*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm1, %xmm0
202*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
203*9880d681SAndroid Build Coastguard Worker;
204*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: vsel_i64:
205*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
206*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
207*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
208*9880d681SAndroid Build Coastguard Worker;
209*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: vsel_i64:
210*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0: # %entry
211*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
212*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
213*9880d681SAndroid Build Coastguard Worker;
214*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: vsel_i64:
215*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0: # %entry
216*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
217*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
218*9880d681SAndroid Build Coastguard Workerentry:
219*9880d681SAndroid Build Coastguard Worker  %vsel = select <2 x i1> <i1 true, i1 false>, <2 x i64> %v1, <2 x i64> %v2
220*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vsel
221*9880d681SAndroid Build Coastguard Worker}
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @vsel_8xi16(<8 x i16> %v1, <8 x i16> %v2) {
224*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: vsel_8xi16:
225*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
226*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [0,65535,65535,65535,0,65535,65535,65535]
227*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    andps %xmm2, %xmm1
228*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    andnps %xmm0, %xmm2
229*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    orps %xmm1, %xmm2
230*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm2, %xmm0
231*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
232*9880d681SAndroid Build Coastguard Worker;
233*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: vsel_8xi16:
234*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
235*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps {{.*#+}} xmm2 = [0,65535,65535,65535,0,65535,65535,65535]
236*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    andps %xmm2, %xmm1
237*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    andnps %xmm0, %xmm2
238*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    orps %xmm1, %xmm2
239*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm2, %xmm0
240*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
241*9880d681SAndroid Build Coastguard Worker;
242*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: vsel_8xi16:
243*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
244*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
245*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
246*9880d681SAndroid Build Coastguard Worker;
247*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vsel_8xi16:
248*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
249*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
250*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
251*9880d681SAndroid Build Coastguard Workerentry:
252*9880d681SAndroid Build Coastguard Worker  %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
253*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %vsel
254*9880d681SAndroid Build Coastguard Worker}
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @vsel_i8(<16 x i8> %v1, <16 x i8> %v2) {
257*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: vsel_i8:
258*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
259*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
260*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    andps %xmm2, %xmm1
261*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    andnps %xmm0, %xmm2
262*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    orps %xmm1, %xmm2
263*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm2, %xmm0
264*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
265*9880d681SAndroid Build Coastguard Worker;
266*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: vsel_i8:
267*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
268*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[12],zero,zero,zero
269*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = zero,xmm1[1,2,3],zero,xmm1[5,6,7],zero,xmm1[9,10,11],zero,xmm1[13,14,15]
270*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    por %xmm1, %xmm0
271*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
272*9880d681SAndroid Build Coastguard Worker;
273*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: vsel_i8:
274*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
275*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm2
276*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
277*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm2, %xmm1
278*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm0
279*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
280*9880d681SAndroid Build Coastguard Worker;
281*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vsel_i8:
282*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
283*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
284*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendvb %xmm2, %xmm0, %xmm1, %xmm0
285*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
286*9880d681SAndroid Build Coastguard Workerentry:
287*9880d681SAndroid Build Coastguard Worker  %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
288*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %vsel
289*9880d681SAndroid Build Coastguard Worker}
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Worker; AVX256 tests:
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @vsel_float8(<8 x float> %v1, <8 x float> %v2) {
295*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: vsel_float8:
296*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
297*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
298*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
299*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm2, %xmm0
300*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm3, %xmm1
301*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
302*9880d681SAndroid Build Coastguard Worker;
303*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: vsel_float8:
304*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
305*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
306*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
307*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm2, %xmm0
308*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm3, %xmm1
309*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
310*9880d681SAndroid Build Coastguard Worker;
311*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: vsel_float8:
312*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
313*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3]
314*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3]
315*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
316*9880d681SAndroid Build Coastguard Worker;
317*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vsel_float8:
318*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
319*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
320*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
321*9880d681SAndroid Build Coastguard Workerentry:
322*9880d681SAndroid Build Coastguard Worker  %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
323*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %vsel
324*9880d681SAndroid Build Coastguard Worker}
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @vsel_i328(<8 x i32> %v1, <8 x i32> %v2) {
327*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: vsel_i328:
328*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
329*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
330*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
331*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm2, %xmm0
332*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm3, %xmm1
333*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
334*9880d681SAndroid Build Coastguard Worker;
335*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: vsel_i328:
336*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
337*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
338*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
339*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm2, %xmm0
340*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm3, %xmm1
341*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
342*9880d681SAndroid Build Coastguard Worker;
343*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: vsel_i328:
344*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
345*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3,4,5,6,7]
346*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3,4,5,6,7]
347*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
348*9880d681SAndroid Build Coastguard Worker;
349*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: vsel_i328:
350*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0: # %entry
351*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
352*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
353*9880d681SAndroid Build Coastguard Worker;
354*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: vsel_i328:
355*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0: # %entry
356*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
357*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
358*9880d681SAndroid Build Coastguard Workerentry:
359*9880d681SAndroid Build Coastguard Worker  %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
360*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %vsel
361*9880d681SAndroid Build Coastguard Worker}
362*9880d681SAndroid Build Coastguard Worker
363*9880d681SAndroid Build Coastguard Workerdefine <8 x double> @vsel_double8(<8 x double> %v1, <8 x double> %v2) {
364*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: vsel_double8:
365*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
366*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm4 = xmm0[0],xmm4[1]
367*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm6 = xmm2[0],xmm6[1]
368*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm4, %xmm0
369*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm5, %xmm1
370*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm6, %xmm2
371*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm7, %xmm3
372*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
373*9880d681SAndroid Build Coastguard Worker;
374*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: vsel_double8:
375*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
376*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm4 = xmm0[0],xmm4[1]
377*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm6 = xmm2[0],xmm6[1]
378*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm4, %xmm0
379*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm5, %xmm1
380*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm6, %xmm2
381*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm7, %xmm3
382*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
383*9880d681SAndroid Build Coastguard Worker;
384*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: vsel_double8:
385*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
386*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm4[1]
387*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm2 = xmm2[0],xmm6[1]
388*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movaps %xmm5, %xmm1
389*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movaps %xmm7, %xmm3
390*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
391*9880d681SAndroid Build Coastguard Worker;
392*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vsel_double8:
393*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
394*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3]
395*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendpd {{.*#+}} ymm1 = ymm1[0],ymm3[1,2,3]
396*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
397*9880d681SAndroid Build Coastguard Workerentry:
398*9880d681SAndroid Build Coastguard Worker  %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
399*9880d681SAndroid Build Coastguard Worker  ret <8 x double> %vsel
400*9880d681SAndroid Build Coastguard Worker}
401*9880d681SAndroid Build Coastguard Worker
402*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @vsel_i648(<8 x i64> %v1, <8 x i64> %v2) {
403*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: vsel_i648:
404*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
405*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm4 = xmm0[0],xmm4[1]
406*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm6 = xmm2[0],xmm6[1]
407*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm4, %xmm0
408*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm5, %xmm1
409*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm6, %xmm2
410*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm7, %xmm3
411*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
412*9880d681SAndroid Build Coastguard Worker;
413*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: vsel_i648:
414*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
415*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm4 = xmm0[0],xmm4[1]
416*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm6 = xmm2[0],xmm6[1]
417*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm4, %xmm0
418*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm5, %xmm1
419*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm6, %xmm2
420*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm7, %xmm3
421*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
422*9880d681SAndroid Build Coastguard Worker;
423*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: vsel_i648:
424*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
425*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
426*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
427*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movaps %xmm5, %xmm1
428*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movaps %xmm7, %xmm3
429*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
430*9880d681SAndroid Build Coastguard Worker;
431*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: vsel_i648:
432*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0: # %entry
433*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3]
434*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vblendpd {{.*#+}} ymm1 = ymm1[0],ymm3[1,2,3]
435*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
436*9880d681SAndroid Build Coastguard Worker;
437*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: vsel_i648:
438*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0: # %entry
439*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm2[2,3,4,5,6,7]
440*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0,1],ymm3[2,3,4,5,6,7]
441*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
442*9880d681SAndroid Build Coastguard Workerentry:
443*9880d681SAndroid Build Coastguard Worker  %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
444*9880d681SAndroid Build Coastguard Worker  ret <8 x i64> %vsel
445*9880d681SAndroid Build Coastguard Worker}
446*9880d681SAndroid Build Coastguard Worker
447*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @vsel_double4(<4 x double> %v1, <4 x double> %v2) {
448*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: vsel_double4:
449*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
450*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
451*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm3 = xmm1[0],xmm3[1]
452*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm2, %xmm0
453*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm3, %xmm1
454*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
455*9880d681SAndroid Build Coastguard Worker;
456*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: vsel_double4:
457*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
458*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
459*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm3 = xmm1[0],xmm3[1]
460*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm2, %xmm0
461*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm3, %xmm1
462*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
463*9880d681SAndroid Build Coastguard Worker;
464*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: vsel_double4:
465*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
466*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm2[1]
467*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm1 = xmm1[0],xmm3[1]
468*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
469*9880d681SAndroid Build Coastguard Worker;
470*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vsel_double4:
471*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
472*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
473*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
474*9880d681SAndroid Build Coastguard Workerentry:
475*9880d681SAndroid Build Coastguard Worker  %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x double> %v1, <4 x double> %v2
476*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %vsel
477*9880d681SAndroid Build Coastguard Worker}
478*9880d681SAndroid Build Coastguard Worker
479*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @testa(<2 x double> %x, <2 x double> %y) {
480*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: testa:
481*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
482*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm1, %xmm2
483*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    cmplepd %xmm0, %xmm2
484*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    andpd %xmm2, %xmm0
485*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    andnpd %xmm1, %xmm2
486*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    orpd %xmm2, %xmm0
487*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
488*9880d681SAndroid Build Coastguard Worker;
489*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: testa:
490*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
491*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm1, %xmm2
492*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    cmplepd %xmm0, %xmm2
493*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    andpd %xmm2, %xmm0
494*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    andnpd %xmm1, %xmm2
495*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    orpd %xmm2, %xmm0
496*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
497*9880d681SAndroid Build Coastguard Worker;
498*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: testa:
499*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
500*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movapd %xmm0, %xmm2
501*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movapd %xmm1, %xmm0
502*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    cmplepd %xmm2, %xmm0
503*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendvpd %xmm2, %xmm1
504*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movapd %xmm1, %xmm0
505*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
506*9880d681SAndroid Build Coastguard Worker;
507*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: testa:
508*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
509*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vcmplepd %xmm0, %xmm1, %xmm2
510*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
511*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
512*9880d681SAndroid Build Coastguard Workerentry:
513*9880d681SAndroid Build Coastguard Worker  %max_is_x = fcmp oge <2 x double> %x, %y
514*9880d681SAndroid Build Coastguard Worker  %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
515*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %max
516*9880d681SAndroid Build Coastguard Worker}
517*9880d681SAndroid Build Coastguard Worker
518*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @testb(<2 x double> %x, <2 x double> %y) {
519*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: testb:
520*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
521*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm1, %xmm2
522*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    cmpnlepd %xmm0, %xmm2
523*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    andpd %xmm2, %xmm0
524*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    andnpd %xmm1, %xmm2
525*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    orpd %xmm2, %xmm0
526*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
527*9880d681SAndroid Build Coastguard Worker;
528*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: testb:
529*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
530*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm1, %xmm2
531*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    cmpnlepd %xmm0, %xmm2
532*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    andpd %xmm2, %xmm0
533*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    andnpd %xmm1, %xmm2
534*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    orpd %xmm2, %xmm0
535*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
536*9880d681SAndroid Build Coastguard Worker;
537*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: testb:
538*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
539*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movapd %xmm0, %xmm2
540*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movapd %xmm1, %xmm0
541*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    cmpnlepd %xmm2, %xmm0
542*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendvpd %xmm2, %xmm1
543*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movapd %xmm1, %xmm0
544*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
545*9880d681SAndroid Build Coastguard Worker;
546*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: testb:
547*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
548*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vcmpnlepd %xmm0, %xmm1, %xmm2
549*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
550*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
551*9880d681SAndroid Build Coastguard Workerentry:
552*9880d681SAndroid Build Coastguard Worker  %min_is_x = fcmp ult <2 x double> %x, %y
553*9880d681SAndroid Build Coastguard Worker  %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
554*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %min
555*9880d681SAndroid Build Coastguard Worker}
556*9880d681SAndroid Build Coastguard Worker
557*9880d681SAndroid Build Coastguard Worker; If we can figure out a blend has a constant mask, we should emit the
558*9880d681SAndroid Build Coastguard Worker; blend instruction with an immediate mask
559*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @constant_blendvpd_avx(<4 x double> %xy, <4 x double> %ab) {
560*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: constant_blendvpd_avx:
561*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
562*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm3 = xmm1[0],xmm3[1]
563*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm2, %xmm0
564*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm3, %xmm1
565*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
566*9880d681SAndroid Build Coastguard Worker;
567*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: constant_blendvpd_avx:
568*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
569*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm3 = xmm1[0],xmm3[1]
570*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm2, %xmm0
571*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm3, %xmm1
572*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
573*9880d681SAndroid Build Coastguard Worker;
574*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: constant_blendvpd_avx:
575*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
576*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm1 = xmm1[0],xmm3[1]
577*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movaps %xmm2, %xmm0
578*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
579*9880d681SAndroid Build Coastguard Worker;
580*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: constant_blendvpd_avx:
581*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
582*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3]
583*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
584*9880d681SAndroid Build Coastguard Workerentry:
585*9880d681SAndroid Build Coastguard Worker  %select = select <4 x i1> <i1 false, i1 false, i1 true, i1 false>, <4 x double> %xy, <4 x double> %ab
586*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %select
587*9880d681SAndroid Build Coastguard Worker}
588*9880d681SAndroid Build Coastguard Worker
589*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @constant_blendvps_avx(<8 x float> %xyzw, <8 x float> %abcd) {
590*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: constant_blendvps_avx:
591*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
592*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm2[2,0]
593*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,0]
594*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm3[2,0]
595*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[2,0]
596*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm2, %xmm0
597*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm3, %xmm1
598*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
599*9880d681SAndroid Build Coastguard Worker;
600*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: constant_blendvps_avx:
601*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
602*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm2[2,0]
603*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,0]
604*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm3[2,0]
605*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[2,0]
606*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm2, %xmm0
607*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm3, %xmm1
608*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
609*9880d681SAndroid Build Coastguard Worker;
610*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: constant_blendvps_avx:
611*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
612*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[3]
613*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm1 = xmm3[0,1,2],xmm1[3]
614*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
615*9880d681SAndroid Build Coastguard Worker;
616*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: constant_blendvps_avx:
617*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
618*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2],ymm0[3],ymm1[4,5,6],ymm0[7]
619*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
620*9880d681SAndroid Build Coastguard Workerentry:
621*9880d681SAndroid Build Coastguard Worker  %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
622*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %select
623*9880d681SAndroid Build Coastguard Worker}
624*9880d681SAndroid Build Coastguard Worker
625*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @constant_pblendvb_avx2(<32 x i8> %xyzw, <32 x i8> %abcd) {
626*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: constant_pblendvb_avx2:
627*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
628*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps {{.*#+}} xmm4 = [255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255]
629*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm4, %xmm5
630*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    andnps %xmm0, %xmm5
631*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    andps %xmm4, %xmm2
632*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    orps %xmm2, %xmm5
633*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    andps %xmm4, %xmm3
634*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    andnps %xmm1, %xmm4
635*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    orps %xmm3, %xmm4
636*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm5, %xmm0
637*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm4, %xmm1
638*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
639*9880d681SAndroid Build Coastguard Worker;
640*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: constant_pblendvb_avx2:
641*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
642*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [128,128,2,128,4,5,6,128,128,128,10,128,12,13,14,128]
643*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufb %xmm4, %xmm0
644*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [0,1,128,3,128,128,128,7,8,9,128,11,128,128,128,15]
645*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufb %xmm5, %xmm2
646*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    por %xmm2, %xmm0
647*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufb %xmm4, %xmm1
648*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufb %xmm5, %xmm3
649*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    por %xmm3, %xmm1
650*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
651*9880d681SAndroid Build Coastguard Worker;
652*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: constant_pblendvb_avx2:
653*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
654*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm4
655*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,0,255,0,255,255,255,0,0,0,255,0,255,255,255,0]
656*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm4, %xmm2
657*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm1, %xmm3
658*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm2, %xmm0
659*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm3, %xmm1
660*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
661*9880d681SAndroid Build Coastguard Worker;
662*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: constant_pblendvb_avx2:
663*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0: # %entry
664*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vmovaps {{.*#+}} 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]
665*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vandnps %ymm0, %ymm2, %ymm0
666*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
667*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
668*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
669*9880d681SAndroid Build Coastguard Worker;
670*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: constant_pblendvb_avx2:
671*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0: # %entry
672*9880d681SAndroid Build Coastguard Worker; 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]
673*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
674*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
675*9880d681SAndroid Build Coastguard Workerentry:
676*9880d681SAndroid Build Coastguard Worker  %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
677*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %select
678*9880d681SAndroid Build Coastguard Worker}
679*9880d681SAndroid Build Coastguard Worker
680*9880d681SAndroid Build Coastguard Workerdeclare <8 x float> @llvm.x86.avx.blendv.ps.256(<8 x float>, <8 x float>, <8 x float>)
681*9880d681SAndroid Build Coastguard Workerdeclare <4 x double> @llvm.x86.avx.blendv.pd.256(<4 x double>, <4 x double>, <4 x double>)
682*9880d681SAndroid Build Coastguard Worker
683*9880d681SAndroid Build Coastguard Worker;; 4 tests for shufflevectors that optimize to blend + immediate
684*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @blend_shufflevector_4xfloat(<4 x float> %a, <4 x float> %b) {
685*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: blend_shufflevector_4xfloat:
686*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
687*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
688*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
689*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
690*9880d681SAndroid Build Coastguard Worker;
691*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: blend_shufflevector_4xfloat:
692*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
693*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
694*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
695*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
696*9880d681SAndroid Build Coastguard Worker;
697*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: blend_shufflevector_4xfloat:
698*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
699*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
700*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
701*9880d681SAndroid Build Coastguard Worker;
702*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: blend_shufflevector_4xfloat:
703*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
704*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
705*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
706*9880d681SAndroid Build Coastguard Workerentry:
707*9880d681SAndroid Build Coastguard Worker  %select = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
708*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %select
709*9880d681SAndroid Build Coastguard Worker}
710*9880d681SAndroid Build Coastguard Worker
711*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @blend_shufflevector_8xfloat(<8 x float> %a, <8 x float> %b) {
712*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: blend_shufflevector_8xfloat:
713*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
714*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
715*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm3[3,0]
716*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[0,2]
717*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm2, %xmm0
718*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm3, %xmm1
719*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
720*9880d681SAndroid Build Coastguard Worker;
721*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: blend_shufflevector_8xfloat:
722*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
723*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
724*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm3[3,0]
725*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[0,2]
726*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm2, %xmm0
727*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm3, %xmm1
728*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
729*9880d681SAndroid Build Coastguard Worker;
730*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: blend_shufflevector_8xfloat:
731*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
732*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3]
733*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm1 = xmm3[0,1],xmm1[2],xmm3[3]
734*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
735*9880d681SAndroid Build Coastguard Worker;
736*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: blend_shufflevector_8xfloat:
737*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
738*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5],ymm0[6],ymm1[7]
739*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
740*9880d681SAndroid Build Coastguard Workerentry:
741*9880d681SAndroid Build Coastguard Worker  %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>
742*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %select
743*9880d681SAndroid Build Coastguard Worker}
744*9880d681SAndroid Build Coastguard Worker
745*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @blend_shufflevector_4xdouble(<4 x double> %a, <4 x double> %b) {
746*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: blend_shufflevector_4xdouble:
747*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
748*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
749*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm2, %xmm0
750*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
751*9880d681SAndroid Build Coastguard Worker;
752*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: blend_shufflevector_4xdouble:
753*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
754*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
755*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm2, %xmm0
756*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
757*9880d681SAndroid Build Coastguard Worker;
758*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: blend_shufflevector_4xdouble:
759*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
760*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm2[1]
761*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
762*9880d681SAndroid Build Coastguard Worker;
763*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: blend_shufflevector_4xdouble:
764*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
765*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2,3]
766*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
767*9880d681SAndroid Build Coastguard Workerentry:
768*9880d681SAndroid Build Coastguard Worker  %select = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 3>
769*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %select
770*9880d681SAndroid Build Coastguard Worker}
771*9880d681SAndroid Build Coastguard Worker
772*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @blend_shufflevector_4xi64(<4 x i64> %a, <4 x i64> %b) {
773*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: blend_shufflevector_4xi64:
774*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
775*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
776*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm3, %xmm1
777*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
778*9880d681SAndroid Build Coastguard Worker;
779*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: blend_shufflevector_4xi64:
780*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
781*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
782*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm3, %xmm1
783*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
784*9880d681SAndroid Build Coastguard Worker;
785*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: blend_shufflevector_4xi64:
786*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
787*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]
788*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movaps %xmm3, %xmm1
789*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
790*9880d681SAndroid Build Coastguard Worker;
791*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: blend_shufflevector_4xi64:
792*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0: # %entry
793*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2,3]
794*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
795*9880d681SAndroid Build Coastguard Worker;
796*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: blend_shufflevector_4xi64:
797*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0: # %entry
798*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3],ymm1[4,5,6,7]
799*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
800*9880d681SAndroid Build Coastguard Workerentry:
801*9880d681SAndroid Build Coastguard Worker  %select = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 7>
802*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %select
803*9880d681SAndroid Build Coastguard Worker}
804*9880d681SAndroid Build Coastguard Worker
805*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @blend_logic_v4i32(<4 x i32> %b, <4 x i32> %a, <4 x i32> %c) {
806*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: blend_logic_v4i32:
807*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
808*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrad $31, %xmm0
809*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm0, %xmm1
810*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm2, %xmm0
811*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm1, %xmm0
812*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
813*9880d681SAndroid Build Coastguard Worker;
814*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: blend_logic_v4i32:
815*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
816*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    psrad $31, %xmm0
817*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pand %xmm0, %xmm1
818*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pandn %xmm2, %xmm0
819*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    por %xmm1, %xmm0
820*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
821*9880d681SAndroid Build Coastguard Worker;
822*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: blend_logic_v4i32:
823*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
824*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrad $31, %xmm0
825*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm1, %xmm2
826*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm2, %xmm0
827*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
828*9880d681SAndroid Build Coastguard Worker;
829*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: blend_logic_v4i32:
830*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
831*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrad $31, %xmm0, %xmm0
832*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpblendvb %xmm0, %xmm1, %xmm2, %xmm0
833*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
834*9880d681SAndroid Build Coastguard Workerentry:
835*9880d681SAndroid Build Coastguard Worker  %b.lobit = ashr <4 x i32> %b, <i32 31, i32 31, i32 31, i32 31>
836*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw <4 x i32> zeroinitializer, %a
837*9880d681SAndroid Build Coastguard Worker  %0 = xor <4 x i32> %b.lobit, <i32 -1, i32 -1, i32 -1, i32 -1>
838*9880d681SAndroid Build Coastguard Worker  %1 = and <4 x i32> %c, %0
839*9880d681SAndroid Build Coastguard Worker  %2 = and <4 x i32> %a, %b.lobit
840*9880d681SAndroid Build Coastguard Worker  %cond = or <4 x i32> %1, %2
841*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %cond
842*9880d681SAndroid Build Coastguard Worker}
843*9880d681SAndroid Build Coastguard Worker
844*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @blend_logic_v8i32(<8 x i32> %b, <8 x i32> %a, <8 x i32> %c) {
845*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: blend_logic_v8i32:
846*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
847*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrad $31, %xmm0
848*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrad $31, %xmm1
849*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm1, %xmm3
850*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm5, %xmm1
851*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm0, %xmm2
852*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pandn %xmm4, %xmm0
853*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm2, %xmm0
854*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm3, %xmm1
855*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
856*9880d681SAndroid Build Coastguard Worker;
857*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: blend_logic_v8i32:
858*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
859*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    psrad $31, %xmm0
860*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    psrad $31, %xmm1
861*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pand %xmm1, %xmm3
862*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pandn %xmm5, %xmm1
863*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pand %xmm0, %xmm2
864*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pandn %xmm4, %xmm0
865*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    por %xmm2, %xmm0
866*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    por %xmm3, %xmm1
867*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
868*9880d681SAndroid Build Coastguard Worker;
869*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: blend_logic_v8i32:
870*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
871*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrad $31, %xmm1
872*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrad $31, %xmm0
873*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm2, %xmm4
874*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm0
875*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendvb %xmm3, %xmm5
876*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm4, %xmm0
877*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm5, %xmm1
878*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
879*9880d681SAndroid Build Coastguard Worker;
880*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: blend_logic_v8i32:
881*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0: # %entry
882*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm3
883*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
884*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
885*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm3, %ymm0
886*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vandnps %ymm2, %ymm0, %ymm2
887*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vandps %ymm0, %ymm1, %ymm0
888*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vorps %ymm0, %ymm2, %ymm0
889*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
890*9880d681SAndroid Build Coastguard Worker;
891*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: blend_logic_v8i32:
892*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0: # %entry
893*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
894*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendvb %ymm0, %ymm1, %ymm2, %ymm0
895*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
896*9880d681SAndroid Build Coastguard Workerentry:
897*9880d681SAndroid Build Coastguard Worker  %b.lobit = ashr <8 x i32> %b, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
898*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw <8 x i32> zeroinitializer, %a
899*9880d681SAndroid Build Coastguard Worker  %0 = xor <8 x i32> %b.lobit, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
900*9880d681SAndroid Build Coastguard Worker  %1 = and <8 x i32> %c, %0
901*9880d681SAndroid Build Coastguard Worker  %2 = and <8 x i32> %a, %b.lobit
902*9880d681SAndroid Build Coastguard Worker  %cond = or <8 x i32> %1, %2
903*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %cond
904*9880d681SAndroid Build Coastguard Worker}
905*9880d681SAndroid Build Coastguard Worker
906*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @blend_neg_logic_v4i32(<4 x i32> %a, <4 x i32> %b) {
907*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: blend_neg_logic_v4i32:
908*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
909*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrad $31, %xmm1
910*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm1, %xmm0
911*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psubd %xmm1, %xmm0
912*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
913*9880d681SAndroid Build Coastguard Worker;
914*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: blend_neg_logic_v4i32:
915*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
916*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    psrad $31, %xmm1
917*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pxor %xmm1, %xmm0
918*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    psubd %xmm1, %xmm0
919*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
920*9880d681SAndroid Build Coastguard Worker;
921*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: blend_neg_logic_v4i32:
922*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
923*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrad $31, %xmm1
924*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pxor %xmm1, %xmm0
925*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psubd %xmm1, %xmm0
926*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
927*9880d681SAndroid Build Coastguard Worker;
928*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: blend_neg_logic_v4i32:
929*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
930*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrad $31, %xmm1, %xmm1
931*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
932*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
933*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
934*9880d681SAndroid Build Coastguard Workerentry:
935*9880d681SAndroid Build Coastguard Worker  %b.lobit = ashr <4 x i32> %b, <i32 31, i32 31, i32 31, i32 31>
936*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw <4 x i32> zeroinitializer, %a
937*9880d681SAndroid Build Coastguard Worker  %0 = xor <4 x i32> %b.lobit, <i32 -1, i32 -1, i32 -1, i32 -1>
938*9880d681SAndroid Build Coastguard Worker  %1 = and <4 x i32> %a, %0
939*9880d681SAndroid Build Coastguard Worker  %2 = and <4 x i32> %b.lobit, %sub
940*9880d681SAndroid Build Coastguard Worker  %cond = or <4 x i32> %1, %2
941*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %cond
942*9880d681SAndroid Build Coastguard Worker}
943*9880d681SAndroid Build Coastguard Worker
944*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @blend_neg_logic_v8i32(<8 x i32> %a, <8 x i32> %b) {
945*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: blend_neg_logic_v8i32:
946*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
947*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrad $31, %xmm3
948*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrad $31, %xmm2
949*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm2, %xmm0
950*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psubd %xmm2, %xmm0
951*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm3, %xmm1
952*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psubd %xmm3, %xmm1
953*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
954*9880d681SAndroid Build Coastguard Worker;
955*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: blend_neg_logic_v8i32:
956*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
957*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    psrad $31, %xmm3
958*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    psrad $31, %xmm2
959*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pxor %xmm2, %xmm0
960*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    psubd %xmm2, %xmm0
961*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pxor %xmm3, %xmm1
962*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    psubd %xmm3, %xmm1
963*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
964*9880d681SAndroid Build Coastguard Worker;
965*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: blend_neg_logic_v8i32:
966*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
967*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrad $31, %xmm3
968*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrad $31, %xmm2
969*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pxor %xmm2, %xmm0
970*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psubd %xmm2, %xmm0
971*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pxor %xmm3, %xmm1
972*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psubd %xmm3, %xmm1
973*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
974*9880d681SAndroid Build Coastguard Worker;
975*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: blend_neg_logic_v8i32:
976*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0: # %entry
977*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
978*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
979*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm1
980*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
981*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
982*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
983*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsubd %xmm2, %xmm3, %xmm2
984*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpsubd %xmm0, %xmm3, %xmm3
985*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
986*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vandnps %ymm0, %ymm1, %ymm0
987*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
988*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
989*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
990*9880d681SAndroid Build Coastguard Worker;
991*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: blend_neg_logic_v8i32:
992*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0: # %entry
993*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsrad $31, %ymm1, %ymm1
994*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
995*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
996*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
997*9880d681SAndroid Build Coastguard Workerentry:
998*9880d681SAndroid Build Coastguard Worker  %b.lobit = ashr <8 x i32> %b, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
999*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw <8 x i32> zeroinitializer, %a
1000*9880d681SAndroid Build Coastguard Worker  %0 = xor <8 x i32> %b.lobit, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
1001*9880d681SAndroid Build Coastguard Worker  %1 = and <8 x i32> %a, %0
1002*9880d681SAndroid Build Coastguard Worker  %2 = and <8 x i32> %b.lobit, %sub
1003*9880d681SAndroid Build Coastguard Worker  %cond = or <8 x i32> %1, %2
1004*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %cond
1005*9880d681SAndroid Build Coastguard Worker}
1006*9880d681SAndroid Build Coastguard Worker
1007*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @blend_neg_logic_v4i32_2(<4 x i32> %v, <4 x i32> %c) {
1008*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: blend_neg_logic_v4i32_2:
1009*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
1010*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrld $31, %xmm1
1011*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pslld $31, %xmm1
1012*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psrad $31, %xmm1
1013*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm1, %xmm0
1014*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    psubd %xmm0, %xmm1
1015*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movdqa %xmm1, %xmm0
1016*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1017*9880d681SAndroid Build Coastguard Worker;
1018*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: blend_neg_logic_v4i32_2:
1019*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
1020*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    psrld $31, %xmm1
1021*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pslld $31, %xmm1
1022*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    psrad $31, %xmm1
1023*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pxor %xmm1, %xmm0
1024*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    psubd %xmm0, %xmm1
1025*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1026*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1027*9880d681SAndroid Build Coastguard Worker;
1028*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: blend_neg_logic_v4i32_2:
1029*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
1030*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm0, %xmm2
1031*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrld $31, %xmm1
1032*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pslld $31, %xmm1
1033*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pxor %xmm3, %xmm3
1034*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psubd %xmm2, %xmm3
1035*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movdqa %xmm1, %xmm0
1036*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendvps %xmm2, %xmm3
1037*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movaps %xmm3, %xmm0
1038*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1039*9880d681SAndroid Build Coastguard Worker;
1040*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: blend_neg_logic_v4i32_2:
1041*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
1042*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsrld $31, %xmm1, %xmm1
1043*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpslld $31, %xmm1, %xmm1
1044*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1045*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpsubd %xmm0, %xmm2, %xmm2
1046*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendvps %xmm1, %xmm0, %xmm2, %xmm0
1047*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1048*9880d681SAndroid Build Coastguard Workerentry:
1049*9880d681SAndroid Build Coastguard Worker  %0 = ashr <4 x i32> %c, <i32 31, i32 31, i32 31, i32 31>
1050*9880d681SAndroid Build Coastguard Worker  %1 = trunc <4 x i32> %0 to <4 x i1>
1051*9880d681SAndroid Build Coastguard Worker  %2 = sub nsw <4 x i32> zeroinitializer, %v
1052*9880d681SAndroid Build Coastguard Worker  %3 = select <4 x i1> %1, <4 x i32> %v, <4 x i32> %2
1053*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %3
1054*9880d681SAndroid Build Coastguard Worker}
1055