diff options
author | burnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-08-26 18:11:42 +0000 |
---|---|---|
committer | burnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-08-26 18:11:42 +0000 |
commit | 95b6682397a1e993c33a375881aaffd998495d68 (patch) | |
tree | 733ec1028c30f2c08fd86083c385b58defdd716b /gcc/fortran/simplify.c | |
parent | 578ce6bef44f37bd2a5f32d595c80665ec60d33f (diff) | |
download | gcc-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.c | 39 |
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) |