Commit f1f07a96 by Doug Kwan Committed by Diego Novillo

real.c (real_to_decimal, [...]): Distinguish QNaN & SNaN.

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
parent 105f48ae
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> 2008-05-16 Nathan Froyd <froydnj@codesourcery.com>
* doc/gty.texi (Source Files Containing Type Information): Note * doc/gty.texi (Source Files Containing Type Information): Note
......
...@@ -1471,7 +1471,8 @@ real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size, ...@@ -1471,7 +1471,8 @@ real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size,
return; return;
case rvc_nan: case rvc_nan:
/* ??? Print the significand as well, if not canonical? */ /* ??? 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; return;
default: default:
gcc_unreachable (); gcc_unreachable ();
...@@ -1743,7 +1744,8 @@ real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size, ...@@ -1743,7 +1744,8 @@ real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size,
return; return;
case rvc_nan: case rvc_nan:
/* ??? Print the significand as well, if not canonical? */ /* ??? 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; return;
default: default:
gcc_unreachable (); gcc_unreachable ();
...@@ -1812,6 +1814,22 @@ real_from_string (REAL_VALUE_TYPE *r, const char *str) ...@@ -1812,6 +1814,22 @@ real_from_string (REAL_VALUE_TYPE *r, const char *str)
else if (*str == '+') else if (*str == '+')
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')) if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
{ {
/* Hexadecimal floating point. */ /* Hexadecimal floating point. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment