diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2014-10-10 04:54:30 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2014-10-10 04:54:30 +0000 |
commit | d9edd1e2abcb46d379bd12aca7724bfed3638dcb (patch) | |
tree | 5b2c2839acdce0c5f63e2e126cb536f3d07ccc54 /llvm/lib/Support/APFloat.cpp | |
parent | e16b92db2d7b05f67225d3e7b40bda4d201ca548 (diff) | |
download | bcm5719-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.cpp | 17 |
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); +} |