Commit e94740a0 by Jim Stichnoth

Subzero: Use setcc for most fcmp conditions, instead of control flow.

For C/C++ semantics, this applies to all the FP comparisons except == and != which require two comparisons due to ordered/unordered requirements. For == and !=, two comparisons and control flow are still used. BUG= https://code.google.com/p/nativeclient/issues/detail?id=4095 TEST= crosstest/test_fcmp R=jvoung@chromium.org Review URL: https://codereview.chromium.org/1148023003
parent 2971997a
...@@ -2702,14 +2702,15 @@ void TargetX8632::lowerFcmp(const InstFcmp *Inst) { ...@@ -2702,14 +2702,15 @@ void TargetX8632::lowerFcmp(const InstFcmp *Inst) {
// FakeUse(a) /* only if C1 != Br_None */ // FakeUse(a) /* only if C1 != Br_None */
// mov a, !<default> /* only if C1 != Br_None */ // mov a, !<default> /* only if C1 != Br_None */
// label: /* only if C1 != Br_None */ // label: /* only if C1 != Br_None */
//
// setcc lowering when C1 != Br_None && C2 == Br_None:
// ucomiss b, c /* but swap b,c order if SwapOperands==true */
// setcc a, C1
InstFcmp::FCond Condition = Inst->getCondition(); InstFcmp::FCond Condition = Inst->getCondition();
size_t Index = static_cast<size_t>(Condition); size_t Index = static_cast<size_t>(Condition);
assert(Index < TableFcmpSize); assert(Index < TableFcmpSize);
if (TableFcmp[Index].SwapScalarOperands) { if (TableFcmp[Index].SwapScalarOperands)
Operand *Tmp = Src0; std::swap(Src0, Src1);
Src0 = Src1;
Src1 = Tmp;
}
bool HasC1 = (TableFcmp[Index].C1 != CondX86::Br_None); bool HasC1 = (TableFcmp[Index].C1 != CondX86::Br_None);
bool HasC2 = (TableFcmp[Index].C2 != CondX86::Br_None); bool HasC2 = (TableFcmp[Index].C2 != CondX86::Br_None);
if (HasC1) { if (HasC1) {
...@@ -2718,6 +2719,11 @@ void TargetX8632::lowerFcmp(const InstFcmp *Inst) { ...@@ -2718,6 +2719,11 @@ void TargetX8632::lowerFcmp(const InstFcmp *Inst) {
Variable *T = nullptr; Variable *T = nullptr;
_mov(T, Src0); _mov(T, Src0);
_ucomiss(T, Src1RM); _ucomiss(T, Src1RM);
if (!HasC2) {
assert(TableFcmp[Index].Default);
_setcc(Dest, TableFcmp[Index].C1);
return;
}
} }
Constant *Default = Ctx->getConstantInt32(TableFcmp[Index].Default); Constant *Default = Ctx->getConstantInt32(TableFcmp[Index].Default);
_mov(Dest, Default); _mov(Dest, Default);
......
...@@ -690,10 +690,10 @@ if.end3: ; preds = %if.then2, %if.end ...@@ -690,10 +690,10 @@ if.end3: ; preds = %if.then2, %if.end
} }
; CHECK-LABEL: fcmpGt ; CHECK-LABEL: fcmpGt
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: ja ; CHECK: seta
; CHECK: call {{.*}} R_{{.*}} func ; CHECK: call {{.*}} R_{{.*}} func
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: ja ; CHECK: seta
; CHECK: call {{.*}} R_{{.*}} func ; CHECK: call {{.*}} R_{{.*}} func
define internal void @fcmpGe(float %a, float %b, double %c, double %d) { define internal void @fcmpGe(float %a, float %b, double %c, double %d) {
...@@ -718,10 +718,10 @@ if.end3: ; preds = %if.end, %if.then2 ...@@ -718,10 +718,10 @@ if.end3: ; preds = %if.end, %if.then2
} }
; CHECK-LABEL: fcmpGe ; CHECK-LABEL: fcmpGe
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: jb ; CHECK: setb
; CHECK: call {{.*}} R_{{.*}} func ; CHECK: call {{.*}} R_{{.*}} func
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: jb ; CHECK: setb
; CHECK: call {{.*}} R_{{.*}} func ; CHECK: call {{.*}} R_{{.*}} func
define internal void @fcmpLt(float %a, float %b, double %c, double %d) { define internal void @fcmpLt(float %a, float %b, double %c, double %d) {
...@@ -746,10 +746,10 @@ if.end3: ; preds = %if.then2, %if.end ...@@ -746,10 +746,10 @@ if.end3: ; preds = %if.then2, %if.end
} }
; CHECK-LABEL: fcmpLt ; CHECK-LABEL: fcmpLt
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: ja ; CHECK: seta
; CHECK: call {{.*}} R_{{.*}} func ; CHECK: call {{.*}} R_{{.*}} func
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: ja ; CHECK: seta
; CHECK: call {{.*}} R_{{.*}} func ; CHECK: call {{.*}} R_{{.*}} func
define internal void @fcmpLe(float %a, float %b, double %c, double %d) { define internal void @fcmpLe(float %a, float %b, double %c, double %d) {
...@@ -774,10 +774,10 @@ if.end3: ; preds = %if.end, %if.then2 ...@@ -774,10 +774,10 @@ if.end3: ; preds = %if.end, %if.then2
} }
; CHECK-LABEL: fcmpLe ; CHECK-LABEL: fcmpLe
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: jb ; CHECK: setb
; CHECK: call {{.*}} R_{{.*}} func ; CHECK: call {{.*}} R_{{.*}} func
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: jb ; CHECK: setb
; CHECK: call {{.*}} R_{{.*}} func ; CHECK: call {{.*}} R_{{.*}} func
define internal i32 @fcmpFalseFloat(float %a, float %b) { define internal i32 @fcmpFalseFloat(float %a, float %b) {
...@@ -828,7 +828,7 @@ entry: ...@@ -828,7 +828,7 @@ entry:
} }
; CHECK-LABEL: fcmpOgtFloat ; CHECK-LABEL: fcmpOgtFloat
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: ja ; CHECK: seta
define internal i32 @fcmpOgtDouble(double %a, double %b) { define internal i32 @fcmpOgtDouble(double %a, double %b) {
entry: entry:
...@@ -838,7 +838,7 @@ entry: ...@@ -838,7 +838,7 @@ entry:
} }
; CHECK-LABEL: fcmpOgtDouble ; CHECK-LABEL: fcmpOgtDouble
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: ja ; CHECK: seta
define internal i32 @fcmpOgeFloat(float %a, float %b) { define internal i32 @fcmpOgeFloat(float %a, float %b) {
entry: entry:
...@@ -848,7 +848,7 @@ entry: ...@@ -848,7 +848,7 @@ entry:
} }
; CHECK-LABEL: fcmpOgeFloat ; CHECK-LABEL: fcmpOgeFloat
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: jae ; CHECK: setae
define internal i32 @fcmpOgeDouble(double %a, double %b) { define internal i32 @fcmpOgeDouble(double %a, double %b) {
entry: entry:
...@@ -858,7 +858,7 @@ entry: ...@@ -858,7 +858,7 @@ entry:
} }
; CHECK-LABEL: fcmpOgeDouble ; CHECK-LABEL: fcmpOgeDouble
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: jae ; CHECK: setae
define internal i32 @fcmpOltFloat(float %a, float %b) { define internal i32 @fcmpOltFloat(float %a, float %b) {
entry: entry:
...@@ -868,7 +868,7 @@ entry: ...@@ -868,7 +868,7 @@ entry:
} }
; CHECK-LABEL: fcmpOltFloat ; CHECK-LABEL: fcmpOltFloat
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: ja ; CHECK: seta
define internal i32 @fcmpOltDouble(double %a, double %b) { define internal i32 @fcmpOltDouble(double %a, double %b) {
entry: entry:
...@@ -878,7 +878,7 @@ entry: ...@@ -878,7 +878,7 @@ entry:
} }
; CHECK-LABEL: fcmpOltDouble ; CHECK-LABEL: fcmpOltDouble
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: ja ; CHECK: seta
define internal i32 @fcmpOleFloat(float %a, float %b) { define internal i32 @fcmpOleFloat(float %a, float %b) {
entry: entry:
...@@ -888,7 +888,7 @@ entry: ...@@ -888,7 +888,7 @@ entry:
} }
; CHECK-LABEL: fcmpOleFloat ; CHECK-LABEL: fcmpOleFloat
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: jae ; CHECK: setae
define internal i32 @fcmpOleDouble(double %a, double %b) { define internal i32 @fcmpOleDouble(double %a, double %b) {
entry: entry:
...@@ -898,7 +898,7 @@ entry: ...@@ -898,7 +898,7 @@ entry:
} }
; CHECK-LABEL: fcmpOleDouble ; CHECK-LABEL: fcmpOleDouble
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: jae ; CHECK: setae
define internal i32 @fcmpOneFloat(float %a, float %b) { define internal i32 @fcmpOneFloat(float %a, float %b) {
entry: entry:
...@@ -908,7 +908,7 @@ entry: ...@@ -908,7 +908,7 @@ entry:
} }
; CHECK-LABEL: fcmpOneFloat ; CHECK-LABEL: fcmpOneFloat
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: jne ; CHECK: setne
define internal i32 @fcmpOneDouble(double %a, double %b) { define internal i32 @fcmpOneDouble(double %a, double %b) {
entry: entry:
...@@ -918,7 +918,7 @@ entry: ...@@ -918,7 +918,7 @@ entry:
} }
; CHECK-LABEL: fcmpOneDouble ; CHECK-LABEL: fcmpOneDouble
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: jne ; CHECK: setne
define internal i32 @fcmpOrdFloat(float %a, float %b) { define internal i32 @fcmpOrdFloat(float %a, float %b) {
entry: entry:
...@@ -928,7 +928,7 @@ entry: ...@@ -928,7 +928,7 @@ entry:
} }
; CHECK-LABEL: fcmpOrdFloat ; CHECK-LABEL: fcmpOrdFloat
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: jnp ; CHECK: setnp
define internal i32 @fcmpOrdDouble(double %a, double %b) { define internal i32 @fcmpOrdDouble(double %a, double %b) {
entry: entry:
...@@ -938,7 +938,7 @@ entry: ...@@ -938,7 +938,7 @@ entry:
} }
; CHECK-LABEL: fcmpOrdDouble ; CHECK-LABEL: fcmpOrdDouble
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: jnp ; CHECK: setnp
define internal i32 @fcmpUeqFloat(float %a, float %b) { define internal i32 @fcmpUeqFloat(float %a, float %b) {
entry: entry:
...@@ -948,7 +948,7 @@ entry: ...@@ -948,7 +948,7 @@ entry:
} }
; CHECK-LABEL: fcmpUeqFloat ; CHECK-LABEL: fcmpUeqFloat
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: je ; CHECK: sete
define internal i32 @fcmpUeqDouble(double %a, double %b) { define internal i32 @fcmpUeqDouble(double %a, double %b) {
entry: entry:
...@@ -958,7 +958,7 @@ entry: ...@@ -958,7 +958,7 @@ entry:
} }
; CHECK-LABEL: fcmpUeqDouble ; CHECK-LABEL: fcmpUeqDouble
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: je ; CHECK: sete
define internal i32 @fcmpUgtFloat(float %a, float %b) { define internal i32 @fcmpUgtFloat(float %a, float %b) {
entry: entry:
...@@ -968,7 +968,7 @@ entry: ...@@ -968,7 +968,7 @@ entry:
} }
; CHECK-LABEL: fcmpUgtFloat ; CHECK-LABEL: fcmpUgtFloat
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: jb ; CHECK: setb
define internal i32 @fcmpUgtDouble(double %a, double %b) { define internal i32 @fcmpUgtDouble(double %a, double %b) {
entry: entry:
...@@ -978,7 +978,7 @@ entry: ...@@ -978,7 +978,7 @@ entry:
} }
; CHECK-LABEL: fcmpUgtDouble ; CHECK-LABEL: fcmpUgtDouble
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: jb ; CHECK: setb
define internal i32 @fcmpUgeFloat(float %a, float %b) { define internal i32 @fcmpUgeFloat(float %a, float %b) {
entry: entry:
...@@ -988,7 +988,7 @@ entry: ...@@ -988,7 +988,7 @@ entry:
} }
; CHECK-LABEL: fcmpUgeFloat ; CHECK-LABEL: fcmpUgeFloat
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: jbe ; CHECK: setbe
define internal i32 @fcmpUgeDouble(double %a, double %b) { define internal i32 @fcmpUgeDouble(double %a, double %b) {
entry: entry:
...@@ -998,7 +998,7 @@ entry: ...@@ -998,7 +998,7 @@ entry:
} }
; CHECK-LABEL: fcmpUgeDouble ; CHECK-LABEL: fcmpUgeDouble
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: jbe ; CHECK: setbe
define internal i32 @fcmpUltFloat(float %a, float %b) { define internal i32 @fcmpUltFloat(float %a, float %b) {
entry: entry:
...@@ -1008,7 +1008,7 @@ entry: ...@@ -1008,7 +1008,7 @@ entry:
} }
; CHECK-LABEL: fcmpUltFloat ; CHECK-LABEL: fcmpUltFloat
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: jb ; CHECK: setb
define internal i32 @fcmpUltDouble(double %a, double %b) { define internal i32 @fcmpUltDouble(double %a, double %b) {
entry: entry:
...@@ -1018,7 +1018,7 @@ entry: ...@@ -1018,7 +1018,7 @@ entry:
} }
; CHECK-LABEL: fcmpUltDouble ; CHECK-LABEL: fcmpUltDouble
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: jb ; CHECK: setb
define internal i32 @fcmpUleFloat(float %a, float %b) { define internal i32 @fcmpUleFloat(float %a, float %b) {
entry: entry:
...@@ -1028,7 +1028,7 @@ entry: ...@@ -1028,7 +1028,7 @@ entry:
} }
; CHECK-LABEL: fcmpUleFloat ; CHECK-LABEL: fcmpUleFloat
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: jbe ; CHECK: setbe
define internal i32 @fcmpUleDouble(double %a, double %b) { define internal i32 @fcmpUleDouble(double %a, double %b) {
entry: entry:
...@@ -1038,7 +1038,7 @@ entry: ...@@ -1038,7 +1038,7 @@ entry:
} }
; CHECK-LABEL: fcmpUleDouble ; CHECK-LABEL: fcmpUleDouble
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: jbe ; CHECK: setbe
define internal i32 @fcmpUneFloat(float %a, float %b) { define internal i32 @fcmpUneFloat(float %a, float %b) {
entry: entry:
...@@ -1070,7 +1070,7 @@ entry: ...@@ -1070,7 +1070,7 @@ entry:
} }
; CHECK-LABEL: fcmpUnoFloat ; CHECK-LABEL: fcmpUnoFloat
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: jp ; CHECK: setp
define internal i32 @fcmpUnoDouble(double %a, double %b) { define internal i32 @fcmpUnoDouble(double %a, double %b) {
entry: entry:
...@@ -1080,7 +1080,7 @@ entry: ...@@ -1080,7 +1080,7 @@ entry:
} }
; CHECK-LABEL: fcmpUnoDouble ; CHECK-LABEL: fcmpUnoDouble
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: jp ; CHECK: setp
define internal i32 @fcmpTrueFloat(float %a, float %b) { define internal i32 @fcmpTrueFloat(float %a, float %b) {
entry: entry:
...@@ -1168,7 +1168,7 @@ entry: ...@@ -1168,7 +1168,7 @@ entry:
} }
; CHECK-LABEL: selectFloatVarVar ; CHECK-LABEL: selectFloatVarVar
; CHECK: ucomiss ; CHECK: ucomiss
; CHECK: ja ; CHECK: seta
; CHECK: fld ; CHECK: fld
define internal double @selectDoubleVarVar(double %a, double %b) { define internal double @selectDoubleVarVar(double %a, double %b) {
...@@ -1179,5 +1179,5 @@ entry: ...@@ -1179,5 +1179,5 @@ entry:
} }
; CHECK-LABEL: selectDoubleVarVar ; CHECK-LABEL: selectDoubleVarVar
; CHECK: ucomisd ; CHECK: ucomisd
; CHECK: ja ; CHECK: seta
; CHECK: fld ; CHECK: fld
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment