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 | 9ddf7bedf9582001c33e0d9d64ff17b858c8819c (patch) | |
tree | 94b014bfa6cdf84c6217bb874c0acc0b22f9701c | |
parent | 807e8c5d637f551b9af250bf3097a64e5ced67a9 (diff) | |
download | bcm5719-llvm-9ddf7bedf9582001c33e0d9d64ff17b858c8819c.tar.gz bcm5719-llvm-9ddf7bedf9582001c33e0d9d64ff17b858c8819c.zip |
More complex float evaluator support.
llvm-svn: 59428
-rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 625a414aa9d..727678662db 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/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. //===----------------------------------------------------------------------===// |