diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-03-13 05:12:32 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-03-13 05:12:32 +0000 |
commit | 69fdf9b2e4669ffc69352f358b3b36828a9f4b57 (patch) | |
tree | 5b2756e022252c644342cf2c2e06d99f3f82c93b /llvm/lib/Support/APFloat.cpp | |
parent | afa31cf4ccbb733b18df34a79bb2db710931ea82 (diff) | |
download | bcm5719-llvm-69fdf9b2e4669ffc69352f358b3b36828a9f4b57.tar.gz bcm5719-llvm-69fdf9b2e4669ffc69352f358b3b36828a9f4b57.zip |
APFloat: Fix ilogb for denormals
llvm-svn: 263370
Diffstat (limited to 'llvm/lib/Support/APFloat.cpp')
-rw-r--r-- | llvm/lib/Support/APFloat.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp index 95953b6d071..814c72cc4d3 100644 --- a/llvm/lib/Support/APFloat.cpp +++ b/llvm/lib/Support/APFloat.cpp @@ -3945,6 +3945,24 @@ APFloat::makeZero(bool Negative) { APInt::tcSet(significandParts(), 0, partCount()); } +int llvm::ilogb(const APFloat &Arg) { + if (Arg.isNaN()) + return APFloat::IEK_NaN; + if (Arg.isZero()) + return APFloat::IEK_Zero; + if (Arg.isInfinity()) + return APFloat::IEK_Inf; + if (!Arg.isDenormal()) + return Arg.exponent; + + APFloat Normalized(Arg); + int SignificandBits = Arg.getSemantics().precision - 1; + + Normalized.exponent += SignificandBits; + Normalized.normalize(APFloat::rmNearestTiesToEven, lfExactlyZero); + return Normalized.exponent - SignificandBits; +} + APFloat llvm::scalbn(APFloat X, int Exp, APFloat::roundingMode RoundingMode) { auto MaxExp = X.getSemantics().maxExponent; auto MinExp = X.getSemantics().minExponent; |