int Port::isNan(long double r) { return real_isnan(&r); }
static bool fold_const_call_ss (wide_int *result, built_in_function fn, const real_value *arg, unsigned int precision, const real_format *format) { switch (fn) { CASE_FLT_FN (BUILT_IN_SIGNBIT): if (real_isneg (arg)) *result = wi::one (precision); else *result = wi::zero (precision); return true; CASE_FLT_FN (BUILT_IN_ILOGB): /* For ilogb we don't know FP_ILOGB0, so only handle normal values. Proceed iff radix == 2. In GCC, normalized significands are in the range [0.5, 1.0). We want the exponent as if they were [1.0, 2.0) so get the exponent and subtract 1. */ if (arg->cl == rvc_normal && format->b == 2) { *result = wi::shwi (REAL_EXP (arg) - 1, precision); return true; } return false; CASE_FLT_FN (BUILT_IN_ICEIL): CASE_FLT_FN (BUILT_IN_LCEIL): CASE_FLT_FN (BUILT_IN_LLCEIL): return fold_const_conversion (result, real_ceil, arg, precision, format); CASE_FLT_FN (BUILT_IN_LFLOOR): CASE_FLT_FN (BUILT_IN_IFLOOR): CASE_FLT_FN (BUILT_IN_LLFLOOR): return fold_const_conversion (result, real_floor, arg, precision, format); CASE_FLT_FN (BUILT_IN_IROUND): CASE_FLT_FN (BUILT_IN_LROUND): CASE_FLT_FN (BUILT_IN_LLROUND): return fold_const_conversion (result, real_round, arg, precision, format); CASE_FLT_FN (BUILT_IN_IRINT): CASE_FLT_FN (BUILT_IN_LRINT): CASE_FLT_FN (BUILT_IN_LLRINT): /* Not yet folded to a constant. */ return false; CASE_FLT_FN (BUILT_IN_FINITE): case BUILT_IN_FINITED32: case BUILT_IN_FINITED64: case BUILT_IN_FINITED128: case BUILT_IN_ISFINITE: *result = wi::shwi (real_isfinite (arg) ? 1 : 0, precision); return true; CASE_FLT_FN (BUILT_IN_ISINF): case BUILT_IN_ISINFD32: case BUILT_IN_ISINFD64: case BUILT_IN_ISINFD128: if (real_isinf (arg)) *result = wi::shwi (arg->sign ? -1 : 1, precision); else *result = wi::shwi (0, precision); return true; CASE_FLT_FN (BUILT_IN_ISNAN): case BUILT_IN_ISNAND32: case BUILT_IN_ISNAND64: case BUILT_IN_ISNAND128: *result = wi::shwi (real_isnan (arg) ? 1 : 0, precision); return true; default: return false; } }