summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Gottesman <mgottesman@apple.com>2013-06-24 09:58:05 +0000
committerMichael Gottesman <mgottesman@apple.com>2013-06-24 09:58:05 +0000
commit575694b6a7d49004acc93294bc88d0bc337e4d27 (patch)
tree2f1d5e5008dce9ff8d9fcadd7bd39717732b747f
parentfdec0c7a7302702d08f1221609221018af8085ec (diff)
downloadllvm-575694b6a7d49004acc93294bc88d0bc337e4d27.tar.gz
llvm-575694b6a7d49004acc93294bc88d0bc337e4d27.tar.bz2
llvm-575694b6a7d49004acc93294bc88d0bc337e4d27.tar.xz
[APFloat] Added support for parsing float strings which contain {inf,-inf,NaN,-NaN}.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184713 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/ADT/APFloat.h1
-rw-r--r--lib/Support/APFloat.cpp29
2 files changed, 30 insertions, 0 deletions
diff --git a/include/llvm/ADT/APFloat.h b/include/llvm/ADT/APFloat.h
index 3d4a632e53..7e71dd3393 100644
--- a/include/llvm/ADT/APFloat.h
+++ b/include/llvm/ADT/APFloat.h
@@ -510,6 +510,7 @@ private:
/// \name Miscellany
/// @{
+ bool convertFromStringSpecials(StringRef str);
opStatus normalize(roundingMode, lostFraction);
opStatus addOrSubtract(const APFloat &, roundingMode, bool subtract);
cmpResult compareAbsoluteValue(const APFloat &) const;
diff --git a/lib/Support/APFloat.cpp b/lib/Support/APFloat.cpp
index ec50064f42..4179231f13 100644
--- a/lib/Support/APFloat.cpp
+++ b/lib/Support/APFloat.cpp
@@ -2575,11 +2575,40 @@ APFloat::convertFromDecimalString(StringRef str, roundingMode rounding_mode)
return fs;
}
+bool
+APFloat::convertFromStringSpecials(StringRef str) {
+ if (str.equals("inf") || str.equals("INFINITY")) {
+ makeInf(false);
+ return true;
+ }
+
+ if (str.equals("-inf") || str.equals("-INFINITY")) {
+ makeInf(true);
+ return true;
+ }
+
+ if (str.equals("nan") || str.equals("NaN")) {
+ makeNaN(false, false);
+ return true;
+ }
+
+ if (str.equals("-nan") || str.equals("-NaN")) {
+ makeNaN(false, true);
+ return true;
+ }
+
+ return false;
+}
+
APFloat::opStatus
APFloat::convertFromString(StringRef str, roundingMode rounding_mode)
{
assert(!str.empty() && "Invalid string length");
+ // Handle special cases.
+ if (convertFromStringSpecials(str))
+ return opOK;
+
/* Handle a leading minus sign. */
StringRef::iterator p = str.begin();
size_t slen = str.size();