summaryrefslogtreecommitdiff
path: root/gcc/fortran/simplify.c
diff options
context:
space:
mode:
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2007-08-26 18:11:42 +0000
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2007-08-26 18:11:42 +0000
commit95b6682397a1e993c33a375881aaffd998495d68 (patch)
tree733ec1028c30f2c08fd86083c385b58defdd716b /gcc/fortran/simplify.c
parent578ce6bef44f37bd2a5f32d595c80665ec60d33f (diff)
downloadgcc-95b6682397a1e993c33a375881aaffd998495d68.tar.gz
2007-08-26 Tobias Burnus <burnus@net-b.de>
PR fortran/32980 * intrinsic.h (gfc_simplify_gamma,gfc_simplify_lgamma, gfc_resolve_gamma,gfc_resolve_lgamma): New function declations. * mathbuiltins.def: Define GAMMA and LGAMMA. * intrinsic.c (add_functions): Add GAMMA, DGAMMA, LGAMMA, ALGAMA and DLGAMA. * simplify.c (gfc_simplify_gamma,gfc_simplify_lgamma): New functions. * iresolve.c (gfc_resolve_gamma,gfc_resolve_lgamma): New functions. * intrinsic.texi: Add documentation for GAMMA and LGAMMA. 2007-08-26 Tobias Burnus <burnus@net-b.de> PR fortran/32980 * gfortran.dg/gamma_1.f90: New. * gfortran.dg/gamma_2.f90: New. * gfortran.dg/gamma_3.f90: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127809 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/simplify.c')
-rw-r--r--gcc/fortran/simplify.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index a395b04a599..5e129ae18de 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -1183,6 +1183,24 @@ gfc_simplify_fraction (gfc_expr *x)
gfc_expr *
+gfc_simplify_gamma (gfc_expr *x)
+{
+ gfc_expr *result;
+
+ if (x->expr_type != EXPR_CONSTANT)
+ return NULL;
+
+ result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
+
+ gfc_set_model_kind (x->ts.kind);
+
+ mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
+
+ return range_check (result, "GAMMA");
+}
+
+
+gfc_expr *
gfc_simplify_huge (gfc_expr *e)
{
gfc_expr *result;
@@ -2212,6 +2230,27 @@ gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
return range_check (result, "LEN_TRIM");
}
+gfc_expr *
+gfc_simplify_lgamma (gfc_expr *x __attribute__((unused)))
+{
+#if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
+ gfc_expr *result;
+
+ if (x->expr_type != EXPR_CONSTANT)
+ return NULL;
+
+ result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
+
+ gfc_set_model_kind (x->ts.kind);
+
+ mpfr_lgamma (result->value.real, x->value.real, GFC_RND_MODE);
+
+ return range_check (result, "LGAMMA");
+#else
+ return NULL;
+#endif
+}
+
gfc_expr *
gfc_simplify_lge (gfc_expr *a, gfc_expr *b)