real.c (real_to_decimal, [...]): Distinguish QNaN & SNaN.
authorDoug Kwan <dougkwan@google.com>
Fri, 16 May 2008 13:41:24 +0000 (13:41 +0000)
committerDiego Novillo <dnovillo@gcc.gnu.org>
Fri, 16 May 2008 13:41:24 +0000 (09:41 -0400)
2008-05-16  Doug Kwan  <dougkwan@google.com>

* real.c (real_to_decimal, real_to_hexadecimal): Distinguish
QNaN & SNaN.
(real_from_string): Handle NaNs and Inf as approriate.

From-SVN: r135421

gcc/ChangeLog
gcc/real.c

index 93ff3b70cf22a3497ab984cec5b27d4f149c59b8..4f1690782db5ed3e8d9dc3779a8ba7738adc3c1a 100644 (file)
@@ -1,3 +1,9 @@
+2008-05-16  Doug Kwan  <dougkwan@google.com>
+
+       * real.c (real_to_decimal, real_to_hexadecimal): Distinguish
+       QNaN & SNaN.
+       (real_from_string): Handle NaNs and Inf as approriate.
+
 2008-05-16  Nathan Froyd  <froydnj@codesourcery.com>
 
        * doc/gty.texi (Source Files Containing Type Information): Note
index ac3b7dc02ecde8adc526ac257eb6cc5f20054008..c4695cced914b5f4fe37005c367571cf5eb9d71c 100644 (file)
@@ -1471,7 +1471,8 @@ real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size,
       return;
     case rvc_nan:
       /* ??? Print the significand as well, if not canonical?  */
-      strcpy (str, (r.sign ? "-NaN" : "+NaN"));
+      sprintf (str, "%c%cNaN", (r_orig->sign ? '-' : '+'),
+              (r_orig->signalling ? 'S' : 'Q'));
       return;
     default:
       gcc_unreachable ();
@@ -1743,7 +1744,8 @@ real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size,
       return;
     case rvc_nan:
       /* ??? Print the significand as well, if not canonical?  */
-      strcpy (str, (r->sign ? "-NaN" : "+NaN"));
+      sprintf (str, "%c%cNaN", (r->sign ? '-' : '+'),
+              (r->signalling ? 'S' : 'Q'));
       return;
     default:
       gcc_unreachable ();
@@ -1812,6 +1814,22 @@ real_from_string (REAL_VALUE_TYPE *r, const char *str)
   else if (*str == '+')
     str++;
 
+  if (!strncmp (str, "QNaN", 4))
+    {
+      get_canonical_qnan (r, sign);
+      return 0;
+    }
+  else if (!strncmp (str, "SNaN", 4))
+    {
+      get_canonical_snan (r, sign);
+      return 0;
+    }
+  else if (!strncmp (str, "Inf", 3))
+    {
+      get_inf (r, sign);
+      return 0;
+    }
+
   if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
     {
       /* Hexadecimal floating point.  */