forked from OSchip/llvm-project
Add the ability to evaluate comparison operators with floating point numbers as operands.
llvm-svn: 59408
This commit is contained in:
parent
99a96d6ef3
commit
acc7981883
|
@ -529,8 +529,51 @@ bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!E->getLHS()->getType()->isIntegralType() ||
|
QualType LHSTy = E->getLHS()->getType();
|
||||||
!E->getRHS()->getType()->isIntegralType()) {
|
QualType RHSTy = E->getRHS()->getType();
|
||||||
|
|
||||||
|
if (LHSTy->isRealFloatingType() &&
|
||||||
|
RHSTy->isRealFloatingType()) {
|
||||||
|
APFloat RHS(0.0), LHS(0.0);
|
||||||
|
|
||||||
|
if (!EvaluateFloat(E->getRHS(), RHS, Info))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!EvaluateFloat(E->getLHS(), LHS, Info))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
APFloat::cmpResult CR = LHS.compare(RHS);
|
||||||
|
|
||||||
|
switch (E->getOpcode()) {
|
||||||
|
default:
|
||||||
|
assert(0 && "Invalid binary operator!");
|
||||||
|
case BinaryOperator::LT:
|
||||||
|
Result = CR == APFloat::cmpLessThan;
|
||||||
|
break;
|
||||||
|
case BinaryOperator::GT:
|
||||||
|
Result = CR == APFloat::cmpGreaterThan;
|
||||||
|
break;
|
||||||
|
case BinaryOperator::LE:
|
||||||
|
Result = CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual;
|
||||||
|
break;
|
||||||
|
case BinaryOperator::GE:
|
||||||
|
Result = CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual;
|
||||||
|
break;
|
||||||
|
case BinaryOperator::EQ:
|
||||||
|
Result = CR == APFloat::cmpEqual;
|
||||||
|
break;
|
||||||
|
case BinaryOperator::NE:
|
||||||
|
Result = CR == APFloat::cmpGreaterThan || CR == APFloat::cmpLessThan;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
|
||||||
|
Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!LHSTy->isIntegralType() ||
|
||||||
|
!RHSTy->isIntegralType()) {
|
||||||
// We can't continue from here for non-integral types, and they
|
// We can't continue from here for non-integral types, and they
|
||||||
// could potentially confuse the following operations.
|
// could potentially confuse the following operations.
|
||||||
// FIXME: Deal with EQ and friends.
|
// FIXME: Deal with EQ and friends.
|
||||||
|
|
Loading…
Reference in New Issue