diff options
Diffstat (limited to 'gcc/real.c')
-rw-r--r-- | gcc/real.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/gcc/real.c b/gcc/real.c index 38f18a8462a..ac3b7dc02ec 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -2163,6 +2163,49 @@ times_pten (REAL_VALUE_TYPE *r, int exp) do_divide (r, r, &pten); } +/* Returns the special REAL_VALUE_TYPE enumerated by E. */ + +const REAL_VALUE_TYPE * +get_real_const (enum real_value_const e) +{ + static REAL_VALUE_TYPE value[rv_max]; + + gcc_assert (e < rv_max); + + /* Initialize mathematical constants for constant folding builtins. + These constants need to be given to at least 160 bits precision. */ + if (value[e].cl == rvc_zero) + switch (e) + { + case rv_e: + { + mpfr_t m; + mpfr_init2 (m, SIGNIFICAND_BITS); + mpfr_set_ui (m, 1, GMP_RNDN); + mpfr_exp (m, m, GMP_RNDN); + real_from_mpfr (&value[e], m, NULL_TREE, GMP_RNDN); + mpfr_clear (m); + } + break; + case rv_third: + real_arithmetic (&value[e], RDIV_EXPR, &dconst1, real_digit (3)); + break; + case rv_sqrt2: + { + mpfr_t m; + mpfr_init2 (m, SIGNIFICAND_BITS); + mpfr_sqrt_ui (m, 2, GMP_RNDN); + real_from_mpfr (&value[e], m, NULL_TREE, GMP_RNDN); + mpfr_clear (m); + } + break; + default: + gcc_unreachable(); + } + + return &value[e]; +} + /* Fills R with +Inf. */ void |