summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/APFloat.cpp
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2014-10-10 04:54:30 +0000
committerChandler Carruth <chandlerc@gmail.com>2014-10-10 04:54:30 +0000
commitd9edd1e2abcb46d379bd12aca7724bfed3638dcb (patch)
tree5b2c2839acdce0c5f63e2e126cb536f3d07ccc54 /llvm/lib/Support/APFloat.cpp
parente16b92db2d7b05f67225d3e7b40bda4d201ca548 (diff)
downloadbcm5719-llvm-d9edd1e2abcb46d379bd12aca7724bfed3638dcb.tar.gz
bcm5719-llvm-d9edd1e2abcb46d379bd12aca7724bfed3638dcb.zip
[ADT] Add the scalbn function for APFloat.
llvm-svn: 219473
Diffstat (limited to 'llvm/lib/Support/APFloat.cpp')
-rw-r--r--llvm/lib/Support/APFloat.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp
index 659914a85f5..3063a07f9ff 100644
--- a/llvm/lib/Support/APFloat.cpp
+++ b/llvm/lib/Support/APFloat.cpp
@@ -3906,3 +3906,20 @@ APFloat::makeZero(bool Negative) {
exponent = semantics->minExponent-1;
APInt::tcSet(significandParts(), 0, partCount());
}
+
+APFloat llvm::scalbn(APFloat X, int Exp) {
+ if (X.isInfinity() || X.isZero() || X.isNaN())
+ return std::move(X);
+
+ auto MaxExp = X.getSemantics().maxExponent;
+ auto MinExp = X.getSemantics().minExponent;
+ if (Exp > (MaxExp - X.exponent))
+ // Overflow saturates to infinity.
+ return APFloat::getInf(X.getSemantics(), X.isNegative());
+ if (Exp < (MinExp - X.exponent))
+ // Underflow saturates to zero.
+ return APFloat::getZero(X.getSemantics(), X.isNegative());
+
+ X.exponent += Exp;
+ return std::move(X);
+}
OpenPOWER on IntegriCloud