diff options
author | Anders Carlsson <andersca@mac.com> | 2008-11-16 21:51:21 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2008-11-16 21:51:21 +0000 |
commit | ccc3fce5697e33f005990f9795e1c7cb8b4559ec (patch) | |
tree | 3312aef7d2575878ad49350a523c9c51cf0e5ef4 | |
parent | 7bad1995d571c082880cb69f5bb092cbabb6c4eb (diff) |
More complex float evaluator support.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59428 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/ExprConstant.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 625a414aa9..727678662d 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -1084,6 +1084,24 @@ public: return APValue(APFloat(0.0), Result); } + APValue VisitCastExpr(CastExpr *E) { + Expr* SubExpr = E->getSubExpr(); + + if (SubExpr->getType()->isRealFloatingType()) { + APFloat Result(0.0); + + if (!EvaluateFloat(SubExpr, Result, Info)) + return APValue(); + + return APValue(Result, APFloat(0.0)); + } + + // FIXME: Handle more casts. + return APValue(); + } + + APValue VisitBinaryOperator(const BinaryOperator *E); + }; } // end anonymous namespace @@ -1093,6 +1111,33 @@ static bool EvaluateComplexFloat(const Expr *E, APValue &Result, EvalInfo &Info) return Result.isComplexFloat(); } +APValue ComplexFloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) +{ + APValue Result, RHS; + + if (!EvaluateComplexFloat(E->getLHS(), Result, Info)) + return APValue(); + + if (!EvaluateComplexFloat(E->getRHS(), RHS, Info)) + return APValue(); + + switch (E->getOpcode()) { + default: return APValue(); + case BinaryOperator::Add: + Result.getComplexFloatReal().add(RHS.getComplexFloatReal(), + APFloat::rmNearestTiesToEven); + Result.getComplexFloatImag().add(RHS.getComplexFloatImag(), + APFloat::rmNearestTiesToEven); + case BinaryOperator::Sub: + Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(), + APFloat::rmNearestTiesToEven); + Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(), + APFloat::rmNearestTiesToEven); + } + + return Result; +} + //===----------------------------------------------------------------------===// // Top level Expr::Evaluate method. //===----------------------------------------------------------------------===// |