summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/APFloat.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2016-03-13 05:12:32 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2016-03-13 05:12:32 +0000
commit69fdf9b2e4669ffc69352f358b3b36828a9f4b57 (patch)
tree5b2756e022252c644342cf2c2e06d99f3f82c93b /llvm/lib/Support/APFloat.cpp
parentafa31cf4ccbb733b18df34a79bb2db710931ea82 (diff)
downloadbcm5719-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.cpp18
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;
OpenPOWER on IntegriCloud