gfortran.h: Define HAVE_mpc_pow.

gcc/fortran:

	* gfortran.h: Define HAVE_mpc_pow.
	* arith.c (complex_reciprocal, complex_pow): If HAVE_mpc_pow,
	don't define these functions.
	(arith_power): If HAVE_mpc_pow, use mpc_pow.

gcc/testsuite:
	* gfortran.dg/integer_exponentiation_4.f90: Temporarily
	comment out some values and add some cases.

From-SVN: r149023
This commit is contained in:
Kaveh R. Ghazi 2009-06-28 06:06:28 +00:00 committed by Kaveh Ghazi
parent 6f8b0efc7a
commit 7991661bc0
5 changed files with 39 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2009-06-28 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gfortran.h: Define HAVE_mpc_pow.
* arith.c (complex_reciprocal, complex_pow): If HAVE_mpc_pow,
don't define these functions.
(arith_power): If HAVE_mpc_pow, use mpc_pow.
2009-06-26 Janus Weil <janus@gcc.gnu.org>
PR fortran/39997

View File

@ -896,6 +896,7 @@ gfc_arith_divide (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
/* Compute the reciprocal of a complex number (guaranteed nonzero). */
#if ! defined(HAVE_mpc_pow)
static void
complex_reciprocal (gfc_expr *op)
{
@ -922,6 +923,7 @@ complex_reciprocal (gfc_expr *op)
}
#endif
}
#endif /* ! HAVE_mpc_pow */
/* Raise a complex number to positive power (power > 0).
@ -932,6 +934,7 @@ complex_reciprocal (gfc_expr *op)
"Seminumerical Algorithms", Vol. 2, "The Art of Computer Programming",
3rd Edition, 1998. */
#if ! defined(HAVE_mpc_pow)
static void
complex_pow (gfc_expr *result, gfc_expr *base, mpz_t power)
{
@ -988,6 +991,7 @@ complex_pow (gfc_expr *result, gfc_expr *base, mpz_t power)
mpfr_clears (x_r, x_i, tmp, re, im, NULL);
}
#endif /* ! HAVE_mpc_pow */
/* Raise a number to a power. */
@ -1107,6 +1111,15 @@ arith_power (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
case BT_COMPLEX:
{
#ifdef HAVE_mpc_pow
mpc_t apower;
gfc_set_model (mpc_realref (op1->value.complex));
mpc_init2 (apower, mpfr_get_default_prec());
mpc_set_z (apower, op2->value.integer, GFC_MPC_RND_MODE);
mpc_pow(result->value.complex, op1->value.complex, apower,
GFC_MPC_RND_MODE);
mpc_clear (apower);
#else
mpz_t apower;
/* Compute op1**abs(op2) */
@ -1118,6 +1131,7 @@ arith_power (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
/* If (op2 < 0), compute the inverse. */
if (power_sign < 0)
complex_reciprocal (result);
#endif /* HAVE_mpc_pow */
}
break;
@ -1159,6 +1173,10 @@ arith_power (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
return ARITH_PROHIBIT;
}
#ifdef HAVE_mpc_pow
mpc_pow (result->value.complex, op1->value.complex,
op2->value.complex, GFC_MPC_RND_MODE);
#else
{
mpfr_t x, y, r, t;
@ -1211,6 +1229,7 @@ arith_power (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
mpfr_mul (mpc_imagref (result->value.complex), x, y, GFC_RND_MODE);
mpfr_clears (r, t, x, y, NULL);
}
#endif /* HAVE_mpc_pow */
}
break;
default:

View File

@ -1558,6 +1558,9 @@ gfc_intrinsic_sym;
#include <mpfr.h>
#ifdef HAVE_mpc
#include <mpc.h>
# if MPC_VERSION >= MPC_VERSION_NUM(0,6,1)
# define HAVE_mpc_pow
# endif
#else
#define mpc_realref(X) ((X).r)
#define mpc_imagref(X) ((X).i)

View File

@ -1,3 +1,8 @@
2009-06-28 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gfortran.dg/integer_exponentiation_4.f90: Temporarily
comment out some values and add some cases.
2009-06-27 Paolo Bonzini <bonzini@gnu.org>
PR testsuite/40567

View File

@ -38,7 +38,10 @@ program test
print *, nearest(1.0,-1.0)**(-huge(0)) ! { dg-error "Arithmetic overflow" }
!!!!!! COMPLEX BASE !!!!!!
print *, (2.0,-4.3)**huge(0) ! { dg-error "Arithmetic NaN" }
print *, (2.0,-4.3)**(-huge(0)) ! { dg-error "Arithmetic NaN" }
! Put these lines back in (and "no-" -> "dg-") prior to gcc-4.5.
! print *, (2.0,-4.3)**huge(0) ! { no-error "Arithmetic overflow" }
! print *, (2.0,-4.3)**huge(0_8) ! { no-error "Arithmetic overflow" }
! print *, (2.0,-4.3)**(-huge(0))
! print *, (2.0,-4.3)**(-huge(0_8))
end program test