static bool fold_const_pow (real_value *result, const real_value *arg0, const real_value *arg1, const real_format *format) { if (do_mpfr_arg2 (result, mpfr_pow, arg0, arg1, format)) return true; /* Check for an integer exponent. */ REAL_VALUE_TYPE cint1; HOST_WIDE_INT n1 = real_to_integer (arg1); real_from_integer (&cint1, VOIDmode, n1, SIGNED); /* Attempt to evaluate pow at compile-time, unless this should raise an exception. */ if (real_identical (arg1, &cint1) && (n1 > 0 || (!flag_trapping_math && !flag_errno_math) || !real_equal (arg0, &dconst0))) { bool inexact = real_powi (result, format, arg0, n1); if (flag_unsafe_math_optimizations || !inexact) return true; } return false; }
static bool fold_const_call_sss (real_value *result, combined_fn fn, const real_value *arg0, const wide_int_ref &arg1, const real_format *format) { switch (fn) { CASE_CFN_LDEXP: return fold_const_builtin_load_exponent (result, arg0, arg1, format); CASE_CFN_SCALBN: CASE_CFN_SCALBLN: return (format->b == 2 && fold_const_builtin_load_exponent (result, arg0, arg1, format)); CASE_CFN_POWI: /* Avoid the folding if flag_signaling_nans is on and operand is a signaling NaN. */ if (!flag_unsafe_math_optimizations && flag_signaling_nans && REAL_VALUE_ISSIGNALING_NAN (*arg0)) return false; real_powi (result, format, arg0, arg1.to_shwi ()); return true; default: return false; } }
static bool fold_const_call_sss (real_value *result, built_in_function fn, const real_value *arg0, const wide_int_ref &arg1, const real_format *format) { switch (fn) { CASE_FLT_FN (BUILT_IN_LDEXP): return fold_const_builtin_load_exponent (result, arg0, arg1, format); CASE_FLT_FN (BUILT_IN_SCALBN): CASE_FLT_FN (BUILT_IN_SCALBLN): return (format->b == 2 && fold_const_builtin_load_exponent (result, arg0, arg1, format)); CASE_FLT_FN (BUILT_IN_POWI): real_powi (result, format, arg0, arg1.to_shwi ()); return true; default: return false; } }