From f1f07a96da3b9d93b6fd2923aea88944a7ad55b5 Mon Sep 17 00:00:00 2001 From: Doug Kwan Date: Fri, 16 May 2008 13:41:24 +0000 Subject: [PATCH] real.c (real_to_decimal, [...]): Distinguish QNaN & SNaN. 2008-05-16 Doug Kwan * 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 | 6 ++++++ gcc/real.c | 22 ++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 93ff3b70cf2..4f1690782db 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-05-16 Doug Kwan + + * 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 * doc/gty.texi (Source Files Containing Type Information): Note diff --git a/gcc/real.c b/gcc/real.c index ac3b7dc02ec..c4695cced91 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -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. */ -- 2.30.2