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
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 @@
 
 /* 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,
-                 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)