tree gfc_build_nan (tree type, const char *str) { REAL_VALUE_TYPE real; real_nan (&real, str, 1, TYPE_MODE (type)); return build_real (type, real); }
static tree fold_const_builtin_nan (tree type, tree arg, bool quiet) { REAL_VALUE_TYPE real; const char *str = c_getstr (arg); if (str && real_nan (&real, str, quiet, TYPE_MODE (type))) return build_real (type, real); return NULL_TREE; }
void real_from_mpfr (REAL_VALUE_TYPE *r, mpfr_srcptr m, tree type, mp_rnd_t rndmode) { /* We use a string as an intermediate type. */ char buf[128], *rstr; mp_exp_t exp; /* Take care of Infinity and NaN. */ if (mpfr_inf_p (m)) { real_inf (r); if (mpfr_sgn (m) < 0) *r = real_value_negate (r); return; } if (mpfr_nan_p (m)) { real_nan (r, "", 1, TYPE_MODE (type)); return; } rstr = mpfr_get_str (NULL, &exp, 16, 0, m, rndmode); /* The additional 12 chars add space for the sprintf below. This leaves 6 digits for the exponent which is supposedly enough. */ gcc_assert (rstr != NULL && strlen (rstr) < sizeof (buf) - 12); /* REAL_VALUE_ATOF expects the exponent for mantissa * 2**exp, mpfr_get_str returns the exponent for mantissa * 16**exp, adjust for that. */ exp *= 4; if (rstr[0] == '-') sprintf (buf, "-0x.%sp%d", &rstr[1], (int) exp); else sprintf (buf, "0x.%sp%d", rstr, (int) exp); mpfr_free_str (rstr); real_from_string (r, buf); }