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