summaryrefslogtreecommitdiff
path: root/gcc/real.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/real.c')
-rw-r--r--gcc/real.c43
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