1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin10 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -fast-isel -fast-isel-abort=1 | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -mcpu=corei7-avx | FileCheck %s --check-prefix=AVX 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -fast-isel -fast-isel-abort=1 -mcpu=corei7-avx | FileCheck %s --check-prefix=AVX 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; Test all cmp predicates that can be used with SSE. 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_oeq_f32(float %a, float %b, float %c, float %d) { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_oeq_f32 10*9880d681SAndroid Build Coastguard Worker; CHECK: cmpeqss %xmm1, %xmm0 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm0, %xmm2 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnps %xmm3, %xmm0 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm2, %xmm0 14*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_oeq_f32 15*9880d681SAndroid Build Coastguard Worker; AVX: vcmpeqss %xmm1, %xmm0, %xmm0 16*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 17*9880d681SAndroid Build Coastguard Worker %1 = fcmp oeq float %a, %b 18*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %c, float %d 19*9880d681SAndroid Build Coastguard Worker ret float %2 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine double @select_fcmp_oeq_f64(double %a, double %b, double %c, double %d) { 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_oeq_f64 24*9880d681SAndroid Build Coastguard Worker; CHECK: cmpeqsd %xmm1, %xmm0 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd %xmm0, %xmm2 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnpd %xmm3, %xmm0 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd %xmm2, %xmm0 28*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_oeq_f64 29*9880d681SAndroid Build Coastguard Worker; AVX: vcmpeqsd %xmm1, %xmm0, %xmm0 30*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0 31*9880d681SAndroid Build Coastguard Worker %1 = fcmp oeq double %a, %b 32*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, double %c, double %d 33*9880d681SAndroid Build Coastguard Worker ret double %2 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_ogt_f32(float %a, float %b, float %c, float %d) { 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ogt_f32 38*9880d681SAndroid Build Coastguard Worker; CHECK: cmpltss %xmm0, %xmm1 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm1, %xmm2 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnps %xmm3, %xmm1 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm2, %xmm1 42*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_ogt_f32 43*9880d681SAndroid Build Coastguard Worker; AVX: vcmpltss %xmm0, %xmm1, %xmm0 44*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 45*9880d681SAndroid Build Coastguard Worker %1 = fcmp ogt float %a, %b 46*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %c, float %d 47*9880d681SAndroid Build Coastguard Worker ret float %2 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine double @select_fcmp_ogt_f64(double %a, double %b, double %c, double %d) { 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ogt_f64 52*9880d681SAndroid Build Coastguard Worker; CHECK: cmpltsd %xmm0, %xmm1 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd %xmm1, %xmm2 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnpd %xmm3, %xmm1 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd %xmm2, %xmm1 56*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_ogt_f64 57*9880d681SAndroid Build Coastguard Worker; AVX: vcmpltsd %xmm0, %xmm1, %xmm0 58*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0 59*9880d681SAndroid Build Coastguard Worker %1 = fcmp ogt double %a, %b 60*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, double %c, double %d 61*9880d681SAndroid Build Coastguard Worker ret double %2 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_oge_f32(float %a, float %b, float %c, float %d) { 65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_oge_f32 66*9880d681SAndroid Build Coastguard Worker; CHECK: cmpless %xmm0, %xmm1 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm1, %xmm2 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnps %xmm3, %xmm1 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm2, %xmm1 70*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_oge_f32 71*9880d681SAndroid Build Coastguard Worker; AVX: vcmpless %xmm0, %xmm1, %xmm0 72*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 73*9880d681SAndroid Build Coastguard Worker %1 = fcmp oge float %a, %b 74*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %c, float %d 75*9880d681SAndroid Build Coastguard Worker ret float %2 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine double @select_fcmp_oge_f64(double %a, double %b, double %c, double %d) { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_oge_f64 80*9880d681SAndroid Build Coastguard Worker; CHECK: cmplesd %xmm0, %xmm1 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd %xmm1, %xmm2 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnpd %xmm3, %xmm1 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd %xmm2, %xmm1 84*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_oge_f64 85*9880d681SAndroid Build Coastguard Worker; AVX: vcmplesd %xmm0, %xmm1, %xmm0 86*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0 87*9880d681SAndroid Build Coastguard Worker %1 = fcmp oge double %a, %b 88*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, double %c, double %d 89*9880d681SAndroid Build Coastguard Worker ret double %2 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_olt_f32(float %a, float %b, float %c, float %d) { 93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_olt_f32 94*9880d681SAndroid Build Coastguard Worker; CHECK: cmpltss %xmm1, %xmm0 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm0, %xmm2 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnps %xmm3, %xmm0 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm2, %xmm0 98*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_olt_f32 99*9880d681SAndroid Build Coastguard Worker; AVX: vcmpltss %xmm1, %xmm0, %xmm0 100*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 101*9880d681SAndroid Build Coastguard Worker %1 = fcmp olt float %a, %b 102*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %c, float %d 103*9880d681SAndroid Build Coastguard Worker ret float %2 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerdefine double @select_fcmp_olt_f64(double %a, double %b, double %c, double %d) { 107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_olt_f64 108*9880d681SAndroid Build Coastguard Worker; CHECK: cmpltsd %xmm1, %xmm0 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd %xmm0, %xmm2 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnpd %xmm3, %xmm0 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd %xmm2, %xmm0 112*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_olt_f64 113*9880d681SAndroid Build Coastguard Worker; AVX: vcmpltsd %xmm1, %xmm0, %xmm0 114*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0 115*9880d681SAndroid Build Coastguard Worker %1 = fcmp olt double %a, %b 116*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, double %c, double %d 117*9880d681SAndroid Build Coastguard Worker ret double %2 118*9880d681SAndroid Build Coastguard Worker} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_ole_f32(float %a, float %b, float %c, float %d) { 121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ole_f32 122*9880d681SAndroid Build Coastguard Worker; CHECK: cmpless %xmm1, %xmm0 123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm0, %xmm2 124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnps %xmm3, %xmm0 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm2, %xmm0 126*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_ole_f32 127*9880d681SAndroid Build Coastguard Worker; AVX: vcmpless %xmm1, %xmm0, %xmm0 128*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 129*9880d681SAndroid Build Coastguard Worker %1 = fcmp ole float %a, %b 130*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %c, float %d 131*9880d681SAndroid Build Coastguard Worker ret float %2 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine double @select_fcmp_ole_f64(double %a, double %b, double %c, double %d) { 135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ole_f64 136*9880d681SAndroid Build Coastguard Worker; CHECK: cmplesd %xmm1, %xmm0 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd %xmm0, %xmm2 138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnpd %xmm3, %xmm0 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd %xmm2, %xmm0 140*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_ole_f64 141*9880d681SAndroid Build Coastguard Worker; AVX: vcmplesd %xmm1, %xmm0, %xmm0 142*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0 143*9880d681SAndroid Build Coastguard Worker %1 = fcmp ole double %a, %b 144*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, double %c, double %d 145*9880d681SAndroid Build Coastguard Worker ret double %2 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_ord_f32(float %a, float %b, float %c, float %d) { 149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ord_f32 150*9880d681SAndroid Build Coastguard Worker; CHECK: cmpordss %xmm1, %xmm0 151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm0, %xmm2 152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnps %xmm3, %xmm0 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm2, %xmm0 154*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_ord_f32 155*9880d681SAndroid Build Coastguard Worker; AVX: vcmpordss %xmm1, %xmm0, %xmm0 156*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 157*9880d681SAndroid Build Coastguard Worker %1 = fcmp ord float %a, %b 158*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %c, float %d 159*9880d681SAndroid Build Coastguard Worker ret float %2 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerdefine double @select_fcmp_ord_f64(double %a, double %b, double %c, double %d) { 163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ord_f64 164*9880d681SAndroid Build Coastguard Worker; CHECK: cmpordsd %xmm1, %xmm0 165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd %xmm0, %xmm2 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnpd %xmm3, %xmm0 167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd %xmm2, %xmm0 168*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_ord_f64 169*9880d681SAndroid Build Coastguard Worker; AVX: vcmpordsd %xmm1, %xmm0, %xmm0 170*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0 171*9880d681SAndroid Build Coastguard Worker %1 = fcmp ord double %a, %b 172*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, double %c, double %d 173*9880d681SAndroid Build Coastguard Worker ret double %2 174*9880d681SAndroid Build Coastguard Worker} 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_uno_f32(float %a, float %b, float %c, float %d) { 177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_uno_f32 178*9880d681SAndroid Build Coastguard Worker; CHECK: cmpunordss %xmm1, %xmm0 179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm0, %xmm2 180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnps %xmm3, %xmm0 181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm2, %xmm0 182*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_uno_f32 183*9880d681SAndroid Build Coastguard Worker; AVX: vcmpunordss %xmm1, %xmm0, %xmm0 184*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 185*9880d681SAndroid Build Coastguard Worker %1 = fcmp uno float %a, %b 186*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %c, float %d 187*9880d681SAndroid Build Coastguard Worker ret float %2 188*9880d681SAndroid Build Coastguard Worker} 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Workerdefine double @select_fcmp_uno_f64(double %a, double %b, double %c, double %d) { 191*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_uno_f64 192*9880d681SAndroid Build Coastguard Worker; CHECK: cmpunordsd %xmm1, %xmm0 193*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd %xmm0, %xmm2 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnpd %xmm3, %xmm0 195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd %xmm2, %xmm0 196*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_uno_f64 197*9880d681SAndroid Build Coastguard Worker; AVX: vcmpunordsd %xmm1, %xmm0, %xmm0 198*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0 199*9880d681SAndroid Build Coastguard Worker %1 = fcmp uno double %a, %b 200*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, double %c, double %d 201*9880d681SAndroid Build Coastguard Worker ret double %2 202*9880d681SAndroid Build Coastguard Worker} 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_ugt_f32(float %a, float %b, float %c, float %d) { 205*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ugt_f32 206*9880d681SAndroid Build Coastguard Worker; CHECK: cmpnless %xmm1, %xmm0 207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm0, %xmm2 208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnps %xmm3, %xmm0 209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm2, %xmm0 210*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_ugt_f32 211*9880d681SAndroid Build Coastguard Worker; AVX: vcmpnless %xmm1, %xmm0, %xmm0 212*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 213*9880d681SAndroid Build Coastguard Worker %1 = fcmp ugt float %a, %b 214*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %c, float %d 215*9880d681SAndroid Build Coastguard Worker ret float %2 216*9880d681SAndroid Build Coastguard Worker} 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Workerdefine double @select_fcmp_ugt_f64(double %a, double %b, double %c, double %d) { 219*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ugt_f64 220*9880d681SAndroid Build Coastguard Worker; CHECK: cmpnlesd %xmm1, %xmm0 221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd %xmm0, %xmm2 222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnpd %xmm3, %xmm0 223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd %xmm2, %xmm0 224*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_ugt_f64 225*9880d681SAndroid Build Coastguard Worker; AVX: vcmpnlesd %xmm1, %xmm0, %xmm0 226*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0 227*9880d681SAndroid Build Coastguard Worker %1 = fcmp ugt double %a, %b 228*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, double %c, double %d 229*9880d681SAndroid Build Coastguard Worker ret double %2 230*9880d681SAndroid Build Coastguard Worker} 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_uge_f32(float %a, float %b, float %c, float %d) { 233*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_uge_f32 234*9880d681SAndroid Build Coastguard Worker; CHECK: cmpnltss %xmm1, %xmm0 235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm0, %xmm2 236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnps %xmm3, %xmm0 237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm2, %xmm0 238*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_uge_f32 239*9880d681SAndroid Build Coastguard Worker; AVX: vcmpnltss %xmm1, %xmm0, %xmm0 240*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 241*9880d681SAndroid Build Coastguard Worker %1 = fcmp uge float %a, %b 242*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %c, float %d 243*9880d681SAndroid Build Coastguard Worker ret float %2 244*9880d681SAndroid Build Coastguard Worker} 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Workerdefine double @select_fcmp_uge_f64(double %a, double %b, double %c, double %d) { 247*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_uge_f64 248*9880d681SAndroid Build Coastguard Worker; CHECK: cmpnltsd %xmm1, %xmm0 249*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd %xmm0, %xmm2 250*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnpd %xmm3, %xmm0 251*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd %xmm2, %xmm0 252*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_uge_f64 253*9880d681SAndroid Build Coastguard Worker; AVX: vcmpnltsd %xmm1, %xmm0, %xmm0 254*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0 255*9880d681SAndroid Build Coastguard Worker %1 = fcmp uge double %a, %b 256*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, double %c, double %d 257*9880d681SAndroid Build Coastguard Worker ret double %2 258*9880d681SAndroid Build Coastguard Worker} 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_ult_f32(float %a, float %b, float %c, float %d) { 261*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ult_f32 262*9880d681SAndroid Build Coastguard Worker; CHECK: cmpnless %xmm0, %xmm1 263*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm1, %xmm2 264*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnps %xmm3, %xmm1 265*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm2, %xmm1 266*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_ult_f32 267*9880d681SAndroid Build Coastguard Worker; AVX: vcmpnless %xmm0, %xmm1, %xmm0 268*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 269*9880d681SAndroid Build Coastguard Worker %1 = fcmp ult float %a, %b 270*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %c, float %d 271*9880d681SAndroid Build Coastguard Worker ret float %2 272*9880d681SAndroid Build Coastguard Worker} 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Workerdefine double @select_fcmp_ult_f64(double %a, double %b, double %c, double %d) { 275*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ult_f64 276*9880d681SAndroid Build Coastguard Worker; CHECK: cmpnlesd %xmm0, %xmm1 277*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd %xmm1, %xmm2 278*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnpd %xmm3, %xmm1 279*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd %xmm2, %xmm1 280*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_ult_f64 281*9880d681SAndroid Build Coastguard Worker; AVX: vcmpnlesd %xmm0, %xmm1, %xmm0 282*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0 283*9880d681SAndroid Build Coastguard Worker %1 = fcmp ult double %a, %b 284*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, double %c, double %d 285*9880d681SAndroid Build Coastguard Worker ret double %2 286*9880d681SAndroid Build Coastguard Worker} 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_ule_f32(float %a, float %b, float %c, float %d) { 289*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ule_f32 290*9880d681SAndroid Build Coastguard Worker; CHECK: cmpnltss %xmm0, %xmm1 291*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm1, %xmm2 292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnps %xmm3, %xmm1 293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm2, %xmm1 294*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_ule_f32 295*9880d681SAndroid Build Coastguard Worker; AVX: vcmpnltss %xmm0, %xmm1, %xmm0 296*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 297*9880d681SAndroid Build Coastguard Worker %1 = fcmp ule float %a, %b 298*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %c, float %d 299*9880d681SAndroid Build Coastguard Worker ret float %2 300*9880d681SAndroid Build Coastguard Worker} 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Workerdefine double @select_fcmp_ule_f64(double %a, double %b, double %c, double %d) { 303*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_ule_f64 304*9880d681SAndroid Build Coastguard Worker; CHECK: cmpnltsd %xmm0, %xmm1 305*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd %xmm1, %xmm2 306*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnpd %xmm3, %xmm1 307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd %xmm2, %xmm1 308*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_ule_f64 309*9880d681SAndroid Build Coastguard Worker; AVX: vcmpnltsd %xmm0, %xmm1, %xmm0 310*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0 311*9880d681SAndroid Build Coastguard Worker %1 = fcmp ule double %a, %b 312*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, double %c, double %d 313*9880d681SAndroid Build Coastguard Worker ret double %2 314*9880d681SAndroid Build Coastguard Worker} 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Workerdefine float @select_fcmp_une_f32(float %a, float %b, float %c, float %d) { 317*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_une_f32 318*9880d681SAndroid Build Coastguard Worker; CHECK: cmpneqss %xmm1, %xmm0 319*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm0, %xmm2 320*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnps %xmm3, %xmm0 321*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm2, %xmm0 322*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_une_f32 323*9880d681SAndroid Build Coastguard Worker; AVX: vcmpneqss %xmm1, %xmm0, %xmm0 324*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 325*9880d681SAndroid Build Coastguard Worker %1 = fcmp une float %a, %b 326*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, float %c, float %d 327*9880d681SAndroid Build Coastguard Worker ret float %2 328*9880d681SAndroid Build Coastguard Worker} 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Workerdefine double @select_fcmp_une_f64(double %a, double %b, double %c, double %d) { 331*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_fcmp_une_f64 332*9880d681SAndroid Build Coastguard Worker; CHECK: cmpneqsd %xmm1, %xmm0 333*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andpd %xmm0, %xmm2 334*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnpd %xmm3, %xmm0 335*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orpd %xmm2, %xmm0 336*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: select_fcmp_une_f64 337*9880d681SAndroid Build Coastguard Worker; AVX: vcmpneqsd %xmm1, %xmm0, %xmm0 338*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0 339*9880d681SAndroid Build Coastguard Worker %1 = fcmp une double %a, %b 340*9880d681SAndroid Build Coastguard Worker %2 = select i1 %1, double %c, double %d 341*9880d681SAndroid Build Coastguard Worker ret double %2 342*9880d681SAndroid Build Coastguard Worker} 343*9880d681SAndroid Build Coastguard Worker 344