diff options
author | Harald Anlauf <anlauf@gmx.de> | 2023-04-14 20:45:19 +0200 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2023-04-16 20:44:48 +0200 |
commit | dd2cd1e70509aaeb3db3e7b322d8357bac817632 (patch) | |
tree | 3eecb20c5e34ac3dcee340368dcb0ff0de8ead60 /gcc/fortran | |
parent | 22055748e5fc75e6dff7da991d7a28e132c093c0 (diff) | |
download | gcc-dd2cd1e70509aaeb3db3e7b322d8357bac817632.zip gcc-dd2cd1e70509aaeb3db3e7b322d8357bac817632.tar.gz gcc-dd2cd1e70509aaeb3db3e7b322d8357bac817632.tar.bz2 |
Fortran: fix compile-time simplification of SET_EXPONENT [PR109511]
gcc/fortran/ChangeLog:
PR fortran/109511
* simplify.c (gfc_simplify_set_exponent): Fix implementation of
compile-time simplification of intrinsic SET_EXPONENT for argument
X < 1 and for I < 0.
gcc/testsuite/ChangeLog:
PR fortran/109511
* gfortran.dg/set_exponent_1.f90: New test.
(cherry picked from commit fa4cb42870df60deb8888dbd51e2ddc6d6ab9e6a)
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/simplify.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 2cac5a4..cb6f240 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -7196,7 +7196,7 @@ gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i) { gfc_expr *result; mpfr_t exp, absv, log2, pow2, frac; - unsigned long exp2; + long exp2; if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT) return NULL; @@ -7228,19 +7228,19 @@ gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i) mpfr_abs (absv, x->value.real, GFC_RND_MODE); mpfr_log2 (log2, absv, GFC_RND_MODE); - mpfr_trunc (log2, log2); + mpfr_floor (log2, log2); mpfr_add_ui (exp, log2, 1, GFC_RND_MODE); /* Old exponent value, and fraction. */ mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE); - mpfr_div (frac, absv, pow2, GFC_RND_MODE); + mpfr_div (frac, x->value.real, pow2, GFC_RND_MODE); /* New exponent. */ - exp2 = (unsigned long) mpz_get_d (i->value.integer); - mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE); + exp2 = mpz_get_si (i->value.integer); + mpfr_mul_2si (result->value.real, frac, exp2, GFC_RND_MODE); - mpfr_clears (absv, log2, pow2, frac, NULL); + mpfr_clears (absv, log2, exp, pow2, frac, NULL); return range_check (result, "SET_EXPONENT"); } |