summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/ExprConstant.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2013-10-15 19:07:14 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2013-10-15 19:07:14 +0000
commitea3019d23a9633f427e249e047891b220b776181 (patch)
treea0d96f38a5033153e9caedc4105eb7c9b47c1fd8 /clang/lib/AST/ExprConstant.cpp
parent656363d5b5706326766430c2289c046874ac9576 (diff)
downloadbcm5719-llvm-ea3019d23a9633f427e249e047891b220b776181.tar.gz
bcm5719-llvm-ea3019d23a9633f427e249e047891b220b776181.zip
Add constant evaluation support for __builtin_isinf, __builtin_isfinite,
__builtin_isnan, and __builtin_isnormal. Patch by Karthik Bhat! Tests by me. llvm-svn: 192729
Diffstat (limited to 'clang/lib/AST/ExprConstant.cpp')
-rw-r--r--clang/lib/AST/ExprConstant.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index fc35f49baa2..5953355cc64 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -5985,6 +5985,30 @@ bool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
Success(Val.isInfinity() ? (Val.isNegative() ? -1 : 1) : 0, E);
}
+ case Builtin::BI__builtin_isinf: {
+ APFloat Val(0.0);
+ return EvaluateFloat(E->getArg(0), Val, Info) &&
+ Success(Val.isInfinity() ? 1 : 0, E);
+ }
+
+ case Builtin::BI__builtin_isfinite: {
+ APFloat Val(0.0);
+ return EvaluateFloat(E->getArg(0), Val, Info) &&
+ Success(Val.isFinite() ? 1 : 0, E);
+ }
+
+ case Builtin::BI__builtin_isnan: {
+ APFloat Val(0.0);
+ return EvaluateFloat(E->getArg(0), Val, Info) &&
+ Success(Val.isNaN() ? 1 : 0, E);
+ }
+
+ case Builtin::BI__builtin_isnormal: {
+ APFloat Val(0.0);
+ return EvaluateFloat(E->getArg(0), Val, Info) &&
+ Success(Val.isNormal() ? 1 : 0, E);
+ }
+
case Builtin::BI__builtin_parity:
case Builtin::BI__builtin_parityl:
case Builtin::BI__builtin_parityll: {
OpenPOWER on IntegriCloud