1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -mcpu=cyclone -aarch64-neon-syntax=apple | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; rdar://10263824 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i1 @fcmp_float1(float %a) nounwind ssp { 5*9880d681SAndroid Build Coastguard Workerentry: 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_float1 7*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, #0.0 8*9880d681SAndroid Build Coastguard Worker; CHECK: cset w0, ne 9*9880d681SAndroid Build Coastguard Worker %cmp = fcmp une float %a, 0.000000e+00 10*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine i1 @fcmp_float2(float %a, float %b) nounwind ssp { 14*9880d681SAndroid Build Coastguard Workerentry: 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_float2 16*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 17*9880d681SAndroid Build Coastguard Worker; CHECK: cset w0, ne 18*9880d681SAndroid Build Coastguard Worker %cmp = fcmp une float %a, %b 19*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine i1 @fcmp_double1(double %a) nounwind ssp { 23*9880d681SAndroid Build Coastguard Workerentry: 24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_double1 25*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp d0, #0.0 26*9880d681SAndroid Build Coastguard Worker; CHECK: cset w0, ne 27*9880d681SAndroid Build Coastguard Worker %cmp = fcmp une double %a, 0.000000e+00 28*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine i1 @fcmp_double2(double %a, double %b) nounwind ssp { 32*9880d681SAndroid Build Coastguard Workerentry: 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_double2 34*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp d0, d1 35*9880d681SAndroid Build Coastguard Worker; CHECK: cset w0, ne 36*9880d681SAndroid Build Coastguard Worker %cmp = fcmp une double %a, %b 37*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; Check each fcmp condition 41*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_oeq(float %a, float %b) nounwind ssp { 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_oeq 43*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 44*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0 45*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0 46*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], eq 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oeq float %a, %b 49*9880d681SAndroid Build Coastguard Worker %conv = uitofp i1 %cmp to float 50*9880d681SAndroid Build Coastguard Worker ret float %conv 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_ogt(float %a, float %b) nounwind ssp { 54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_ogt 55*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 56*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0 57*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0 58*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], gt 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ogt float %a, %b 61*9880d681SAndroid Build Coastguard Worker %conv = uitofp i1 %cmp to float 62*9880d681SAndroid Build Coastguard Worker ret float %conv 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_oge(float %a, float %b) nounwind ssp { 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_oge 67*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 68*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0 69*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0 70*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], ge 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oge float %a, %b 73*9880d681SAndroid Build Coastguard Worker %conv = uitofp i1 %cmp to float 74*9880d681SAndroid Build Coastguard Worker ret float %conv 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_olt(float %a, float %b) nounwind ssp { 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_olt 79*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 80*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0 81*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0 82*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], mi 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker %cmp = fcmp olt float %a, %b 85*9880d681SAndroid Build Coastguard Worker %conv = uitofp i1 %cmp to float 86*9880d681SAndroid Build Coastguard Worker ret float %conv 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_ole(float %a, float %b) nounwind ssp { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_ole 91*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 92*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0 93*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0 94*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], ls 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ole float %a, %b 97*9880d681SAndroid Build Coastguard Worker %conv = uitofp i1 %cmp to float 98*9880d681SAndroid Build Coastguard Worker ret float %conv 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_ord(float %a, float %b) nounwind ssp { 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_ord 103*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 104*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0 105*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0 106*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], vc 107*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ord float %a, %b 108*9880d681SAndroid Build Coastguard Worker %conv = uitofp i1 %cmp to float 109*9880d681SAndroid Build Coastguard Worker ret float %conv 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_uno(float %a, float %b) nounwind ssp { 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_uno 114*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 115*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0 116*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0 117*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], vs 118*9880d681SAndroid Build Coastguard Worker %cmp = fcmp uno float %a, %b 119*9880d681SAndroid Build Coastguard Worker %conv = uitofp i1 %cmp to float 120*9880d681SAndroid Build Coastguard Worker ret float %conv 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_ugt(float %a, float %b) nounwind ssp { 124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_ugt 125*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 126*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0 127*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0 128*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], hi 129*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ugt float %a, %b 130*9880d681SAndroid Build Coastguard Worker %conv = uitofp i1 %cmp to float 131*9880d681SAndroid Build Coastguard Worker ret float %conv 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_uge(float %a, float %b) nounwind ssp { 135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_uge 136*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 137*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0 138*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0 139*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], pl 140*9880d681SAndroid Build Coastguard Worker %cmp = fcmp uge float %a, %b 141*9880d681SAndroid Build Coastguard Worker %conv = uitofp i1 %cmp to float 142*9880d681SAndroid Build Coastguard Worker ret float %conv 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_ult(float %a, float %b) nounwind ssp { 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_ult 147*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 148*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0 149*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0 150*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], lt 151*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ult float %a, %b 152*9880d681SAndroid Build Coastguard Worker %conv = uitofp i1 %cmp to float 153*9880d681SAndroid Build Coastguard Worker ret float %conv 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_ule(float %a, float %b) nounwind ssp { 157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_ule 158*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 159*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0 160*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0 161*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], le 162*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ule float %a, %b 163*9880d681SAndroid Build Coastguard Worker %conv = uitofp i1 %cmp to float 164*9880d681SAndroid Build Coastguard Worker ret float %conv 165*9880d681SAndroid Build Coastguard Worker} 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_une(float %a, float %b) nounwind ssp { 168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_une 169*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 170*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0 171*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0 172*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], ne 173*9880d681SAndroid Build Coastguard Worker %cmp = fcmp une float %a, %b 174*9880d681SAndroid Build Coastguard Worker %conv = uitofp i1 %cmp to float 175*9880d681SAndroid Build Coastguard Worker ret float %conv 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker; Possible opportunity for improvement. See comment in 179*9880d681SAndroid Build Coastguard Worker; ARM64TargetLowering::LowerSETCC() 180*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_one(float %a, float %b) nounwind ssp { 181*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_one 182*9880d681SAndroid Build Coastguard Worker; fcmp s0, s1 183*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0 184*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0 185*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel [[TMP:s[0-9]+]], s[[ONE]], s[[ZERO]], mi 186*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], [[TMP]], gt 187*9880d681SAndroid Build Coastguard Worker %cmp = fcmp one float %a, %b 188*9880d681SAndroid Build Coastguard Worker %conv = uitofp i1 %cmp to float 189*9880d681SAndroid Build Coastguard Worker ret float %conv 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker; Possible opportunity for improvement. See comment in 193*9880d681SAndroid Build Coastguard Worker; ARM64TargetLowering::LowerSETCC() 194*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_ueq(float %a, float %b) nounwind ssp { 195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_ueq 196*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1 197*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0 198*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0 199*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel [[TMP:s[0-9]+]], s[[ONE]], s[[ZERO]], eq 200*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], [[TMP]], vs 201*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ueq float %a, %b 202*9880d681SAndroid Build Coastguard Worker %conv = uitofp i1 %cmp to float 203*9880d681SAndroid Build Coastguard Worker ret float %conv 204*9880d681SAndroid Build Coastguard Worker} 205