aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/arith.c
diff options
context:
space:
mode:
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>2009-06-28 06:06:28 +0000
committerKaveh Ghazi <ghazi@gcc.gnu.org>2009-06-28 06:06:28 +0000
commit7991661bc05bbe0df39745fbcc90bea0da728152 (patch)
tree20925d63681f5dfdb8f47f1109e25f886c8bdf7a /gcc/fortran/arith.c
parent6f8b0efc7a8a61e68ff25ae0e817d7b50ebdeef3 (diff)
downloadgcc-7991661bc05bbe0df39745fbcc90bea0da728152.zip
gcc-7991661bc05bbe0df39745fbcc90bea0da728152.tar.gz
gcc-7991661bc05bbe0df39745fbcc90bea0da728152.tar.bz2
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
Diffstat (limited to 'gcc/fortran/arith.c')
-rw-r--r--gcc/fortran/arith.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/gcc/fortran/arith.c b/gcc/fortran/arith.c
index 2aa3c40..dddf7e0 100644
--- a/gcc/fortran/arith.c
+++ b/gcc/fortran/arith.c
@@ -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: