aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Support
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-05-30 03:49:43 +0000
committerMike Stump <mrs@apple.com>2009-05-30 03:49:43 +0000
commitc5ca713b8073d9fe95b258d0c01328d020df3357 (patch)
tree3f470d94f3287740e9a185e43ac728d99170c500 /lib/Support
parent51b16f473759c1546acbf308a5d3f3e7bf3ea23c (diff)
downloadexternal_llvm-c5ca713b8073d9fe95b258d0c01328d020df3357.zip
external_llvm-c5ca713b8073d9fe95b258d0c01328d020df3357.tar.gz
external_llvm-c5ca713b8073d9fe95b258d0c01328d020df3357.tar.bz2
Add support for letting the client choose different flavors of NaNs. Testcase to be
added in clang. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@72606 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support')
-rw-r--r--lib/Support/APFloat.cpp18
1 files changed, 12 insertions, 6 deletions
diff --git a/lib/Support/APFloat.cpp b/lib/Support/APFloat.cpp
index 4c79ba6..3b03c54 100644
--- a/lib/Support/APFloat.cpp
+++ b/lib/Support/APFloat.cpp
@@ -598,12 +598,18 @@ APFloat::copySignificand(const APFloat &rhs)
/* Make this number a NaN, with an arbitrary but deterministic value
for the significand. If double or longer, this is a signalling NaN,
- which may not be ideal. */
+ which may not be ideal. If float, this is QNaN(0). */
void
-APFloat::makeNaN(void)
+APFloat::makeNaN(unsigned type)
{
category = fcNaN;
- APInt::tcSet(significandParts(), ~0U, partCount());
+ // FIXME: Add double and long double support for QNaN(0).
+ if (semantics->precision == 24 && semantics->maxExponent == 127) {
+ type |= 0x7fc00000U;
+ type &= ~0x80000000U;
+ } else
+ type = ~0U;
+ APInt::tcSet(significandParts(), type, partCount());
}
APFloat &
@@ -662,16 +668,16 @@ APFloat::APFloat(const fltSemantics &ourSemantics, integerPart value)
}
APFloat::APFloat(const fltSemantics &ourSemantics,
- fltCategory ourCategory, bool negative)
+ fltCategory ourCategory, bool negative, unsigned type)
{
assertArithmeticOK(ourSemantics);
initialize(&ourSemantics);
category = ourCategory;
sign = negative;
- if(category == fcNormal)
+ if (category == fcNormal)
category = fcZero;
else if (ourCategory == fcNaN)
- makeNaN();
+ makeNaN(type);
}
APFloat::APFloat(const fltSemantics &ourSemantics, const char *text)