[PATCH]: MPC cleanup in fortran frontend

Kaveh R. GHAZI ghazi@caip.rutgers.edu
Sun Nov 15 16:56:00 GMT 2009


This patch removes the HAVE_mpc* cpp conditionals from the fortran
frontend.  They were necessary only while MPC was optional.  It
depends on this patch to require MPC:
http://gcc.gnu.org/ml/gcc-patches/2009-11/msg00731.html

Tested on x86_64-unknown-linux-gnu, no regressions.

Okay for mainline once the above patch goes in?

		Thanks,
		--Kaveh


2009-11-14  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>

	* arith.c: Remove HAVE_mpc* checks throughout.
	* expr.c: Likewise.
	* gfortran.h: Likewise.
	* resolve.c: Likewise.
	* simplify.c: Likewise.
	* target-memory.c: Likewise.
	* target-memory.h: Likewise.

diff -rup orig/egcc-SVN20091114/gcc/fortran/arith.c egcc-SVN20091114/gcc/fortran/arith.c
--- orig/egcc-SVN20091114/gcc/fortran/arith.c	2009-10-08 02:00:45.000000000 +0200
+++ egcc-SVN20091114/gcc/fortran/arith.c	2009-11-14 23:07:23.000000000 +0100
@@ -429,12 +429,7 @@ gfc_constant_result (bt type, int kind,

     case BT_COMPLEX:
       gfc_set_model_kind (kind);
-#ifdef HAVE_mpc
       mpc_init2 (result->value.complex, mpfr_get_default_prec());
-#else
-      mpfr_init (result->value.complex.r);
-      mpfr_init (result->value.complex.i);
-#endif
       break;

     default:
@@ -639,12 +634,7 @@ gfc_arith_uminus (gfc_expr *op1, gfc_exp
       break;

     case BT_COMPLEX:
-#ifdef HAVE_mpc
       mpc_neg (result->value.complex, op1->value.complex, GFC_MPC_RND_MODE);
-#else
-      mpfr_neg (result->value.complex.r, op1->value.complex.r, GFC_RND_MODE);
-      mpfr_neg (result->value.complex.i, op1->value.complex.i, GFC_RND_MODE);
-#endif
       break;

     default:
@@ -677,16 +667,8 @@ gfc_arith_plus (gfc_expr *op1, gfc_expr
       break;

     case BT_COMPLEX:
-#ifdef HAVE_mpc
       mpc_add (result->value.complex, op1->value.complex, op2->value.complex,
 	       GFC_MPC_RND_MODE);
-#else
-      mpfr_add (result->value.complex.r, op1->value.complex.r,
-		op2->value.complex.r, GFC_RND_MODE);
-
-      mpfr_add (result->value.complex.i, op1->value.complex.i,
-		op2->value.complex.i, GFC_RND_MODE);
-#endif
       break;

     default:
@@ -719,16 +701,8 @@ gfc_arith_minus (gfc_expr *op1, gfc_expr
       break;

     case BT_COMPLEX:
-#ifdef HAVE_mpc
       mpc_sub (result->value.complex, op1->value.complex,
 	       op2->value.complex, GFC_MPC_RND_MODE);
-#else
-      mpfr_sub (result->value.complex.r, op1->value.complex.r,
-		op2->value.complex.r, GFC_RND_MODE);
-
-      mpfr_sub (result->value.complex.i, op1->value.complex.i,
-		op2->value.complex.i, GFC_RND_MODE);
-#endif
       break;

     default:
@@ -762,26 +736,8 @@ gfc_arith_times (gfc_expr *op1, gfc_expr

     case BT_COMPLEX:
       gfc_set_model (mpc_realref (op1->value.complex));
-#ifdef HAVE_mpc
       mpc_mul (result->value.complex, op1->value.complex, op2->value.complex,
 	       GFC_MPC_RND_MODE);
-#else
-    {
-      mpfr_t x, y;
-      mpfr_init (x);
-      mpfr_init (y);
-
-      mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
-      mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
-      mpfr_sub (result->value.complex.r, x, y, GFC_RND_MODE);
-
-      mpfr_mul (x, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
-      mpfr_mul (y, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
-      mpfr_add (result->value.complex.i, x, y, GFC_RND_MODE);
-
-      mpfr_clears (x, y, NULL);
-    }
-#endif
       break;

     default:
@@ -829,13 +785,7 @@ gfc_arith_divide (gfc_expr *op1, gfc_exp
       break;

     case BT_COMPLEX:
-      if (
-#ifdef HAVE_mpc
-	  mpc_cmp_si_si (op2->value.complex, 0, 0) == 0
-#else
-	  mpfr_sgn (op2->value.complex.r) == 0
-	  && mpfr_sgn (op2->value.complex.i) == 0
-#endif
+      if (mpc_cmp_si_si (op2->value.complex, 0, 0) == 0
 	  && gfc_option.flag_range_check == 1)
 	{
 	  rc = ARITH_DIV0;
@@ -843,8 +793,6 @@ gfc_arith_divide (gfc_expr *op1, gfc_exp
 	}

       gfc_set_model (mpc_realref (op1->value.complex));
-
-#ifdef HAVE_mpc
       if (mpc_cmp_si_si (op2->value.complex, 0, 0) == 0)
       {
 	/* In Fortran, return (NaN + NaN I) for any zero divisor.  See
@@ -855,32 +803,6 @@ gfc_arith_divide (gfc_expr *op1, gfc_exp
       else
 	mpc_div (result->value.complex, op1->value.complex, op2->value.complex,
 		 GFC_MPC_RND_MODE);
-#else
-    {
-      mpfr_t x, y, div;
-      mpfr_init (x);
-      mpfr_init (y);
-      mpfr_init (div);
-
-      mpfr_mul (x, op2->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
-      mpfr_mul (y, op2->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
-      mpfr_add (div, x, y, GFC_RND_MODE);
-
-      mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
-      mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
-      mpfr_add (result->value.complex.r, x, y, GFC_RND_MODE);
-      mpfr_div (result->value.complex.r, result->value.complex.r, div,
-		GFC_RND_MODE);
-
-      mpfr_mul (x, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
-      mpfr_mul (y, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
-      mpfr_sub (result->value.complex.i, x, y, GFC_RND_MODE);
-      mpfr_div (result->value.complex.i, result->value.complex.i, div,
-		GFC_RND_MODE);
-
-      mpfr_clears (x, y, div, NULL);
-    }
-#endif
       break;

     default:
@@ -893,107 +815,6 @@ gfc_arith_divide (gfc_expr *op1, gfc_exp
   return check_result (rc, op1, result, resultp);
 }

-
-/* Compute the reciprocal of a complex number (guaranteed nonzero).  */
-
-#if ! defined(HAVE_mpc_pow)
-static void
-complex_reciprocal (gfc_expr *op)
-{
-  gfc_set_model (mpc_realref (op->value.complex));
-#ifdef HAVE_mpc
-  mpc_ui_div (op->value.complex, 1, op->value.complex, GFC_MPC_RND_MODE);
-#else
-  {
-  mpfr_t mod, tmp;
-
-  mpfr_init (mod);
-  mpfr_init (tmp);
-
-  mpfr_mul (mod, op->value.complex.r, op->value.complex.r, GFC_RND_MODE);
-  mpfr_mul (tmp, op->value.complex.i, op->value.complex.i, GFC_RND_MODE);
-  mpfr_add (mod, mod, tmp, GFC_RND_MODE);
-
-  mpfr_div (op->value.complex.r, op->value.complex.r, mod, GFC_RND_MODE);
-
-  mpfr_neg (op->value.complex.i, op->value.complex.i, GFC_RND_MODE);
-  mpfr_div (op->value.complex.i, op->value.complex.i, mod, GFC_RND_MODE);
-
-  mpfr_clears (tmp, mod, NULL);
-  }
-#endif
-}
-#endif /* ! HAVE_mpc_pow */
-
-
-/* Raise a complex number to positive power (power > 0).
-   This function will modify the content of power.
-
-   Use Binary Method, which is not an optimal but a simple and reasonable
-   arithmetic. See section 4.6.3, "Evaluation of Powers" of Donald E. Knuth,
-   "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)
-{
-  mpfr_t x_r, x_i, tmp, re, im;
-
-  gfc_set_model (mpc_realref (base->value.complex));
-  mpfr_init (x_r);
-  mpfr_init (x_i);
-  mpfr_init (tmp);
-  mpfr_init (re);
-  mpfr_init (im);
-
-  /* res = 1 */
-#ifdef HAVE_mpc
-  mpc_set_ui (result->value.complex, 1, GFC_MPC_RND_MODE);
-#else
-  mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
-  mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
-#endif
-
-  /* x = base */
-  mpfr_set (x_r, mpc_realref (base->value.complex), GFC_RND_MODE);
-  mpfr_set (x_i, mpc_imagref (base->value.complex), GFC_RND_MODE);
-
-  /* Macro for complex multiplication. We have to take care that
-     res_r/res_i and a_r/a_i can (and will) be the same variable.  */
-#define CMULT(res_r,res_i,a_r,a_i,b_r,b_i) \
-    mpfr_mul (re, a_r, b_r, GFC_RND_MODE), \
-    mpfr_mul (tmp, a_i, b_i, GFC_RND_MODE), \
-    mpfr_sub (re, re, tmp, GFC_RND_MODE), \
-    \
-    mpfr_mul (im, a_r, b_i, GFC_RND_MODE), \
-    mpfr_mul (tmp, a_i, b_r, GFC_RND_MODE), \
-    mpfr_add (res_i, im, tmp, GFC_RND_MODE), \
-    mpfr_set (res_r, re, GFC_RND_MODE)
-
-#define res_r mpc_realref (result->value.complex)
-#define res_i mpc_imagref (result->value.complex)
-
-  /* for (; power > 0; x *= x) */
-  for (; mpz_cmp_si (power, 0) > 0; CMULT(x_r,x_i,x_r,x_i,x_r,x_i))
-    {
-      /* if (power & 1) res = res * x; */
-      if (mpz_congruent_ui_p (power, 1, 2))
-	CMULT(res_r,res_i,res_r,res_i,x_r,x_i);
-
-      /* power /= 2; */
-      mpz_fdiv_q_ui (power, power, 2);
-    }
-
-#undef res_r
-#undef res_i
-#undef CMULT
-
-  mpfr_clears (x_r, x_i, tmp, re, im, NULL);
-}
-#endif /* ! HAVE_mpc_pow */
-
-
 /* Raise a number to a power.  */

 static arith
@@ -1028,12 +849,7 @@ arith_power (gfc_expr *op1, gfc_expr *op
 	      break;

 	    case BT_COMPLEX:
-#ifdef HAVE_mpc
 	      mpc_set_ui (result->value.complex, 1, GFC_MPC_RND_MODE);
-#else
-	      mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
-	      mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
-#endif
 	      break;

 	    default:
@@ -1110,32 +926,8 @@ arith_power (gfc_expr *op1, gfc_expr *op
 	      break;

 	    case BT_COMPLEX:
-	      {
-#ifdef HAVE_mpc_pow_z
-		mpc_pow_z (result->value.complex, op1->value.complex,
-			   op2->value.integer, GFC_MPC_RND_MODE);
-#elif defined(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)  */
-		mpz_init (apower);
-		mpz_abs (apower, op2->value.integer);
-		complex_pow (result, op1, apower);
-		mpz_clear (apower);
-
-		/* If (op2 < 0), compute the inverse.  */
-		if (power_sign < 0)
-		  complex_reciprocal (result);
-#endif /* HAVE_mpc_pow */
-	      }
+	      mpc_pow_z (result->value.complex, op1->value.complex,
+			 op2->value.integer, GFC_MPC_RND_MODE);
 	      break;

 	    default:
@@ -1176,63 +968,8 @@ arith_power (gfc_expr *op1, gfc_expr *op
 	      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;
-
-	gfc_set_model (mpc_realref (op1->value.complex));
-
-	mpfr_init (r);
-
-#ifdef HAVE_mpc
-	mpc_abs (r, op1->value.complex, GFC_RND_MODE);
-#else
-	mpfr_hypot (r, op1->value.complex.r, op1->value.complex.i,
-		    GFC_RND_MODE);
-#endif
-	if (mpfr_cmp_si (r, 0) == 0)
-	  {
-#ifdef HAVE_mpc
-	    mpc_set_ui (result->value.complex, 0, GFC_MPC_RND_MODE);
-#else
-	    mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
-	    mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
-#endif
-	    mpfr_clear (r);
-	    break;
-	  }
-	mpfr_log (r, r, GFC_RND_MODE);
-
-	mpfr_init (t);
-
-#ifdef HAVE_mpc
-	mpc_arg (t, op1->value.complex, GFC_RND_MODE);
-#else
-	mpfr_atan2 (t, op1->value.complex.i, op1->value.complex.r,
-		    GFC_RND_MODE);
-#endif
-
-	mpfr_init (x);
-	mpfr_init (y);
-
-	mpfr_mul (x, mpc_realref (op2->value.complex), r, GFC_RND_MODE);
-	mpfr_mul (y, mpc_imagref (op2->value.complex), t, GFC_RND_MODE);
-	mpfr_sub (x, x, y, GFC_RND_MODE);
-	mpfr_exp (x, x, GFC_RND_MODE);
-
-	mpfr_mul (y, mpc_realref (op2->value.complex), t, GFC_RND_MODE);
-	mpfr_mul (t, mpc_imagref (op2->value.complex), r, GFC_RND_MODE);
-	mpfr_add (y, y, t, GFC_RND_MODE);
-	mpfr_cos (t, y, GFC_RND_MODE);
-	mpfr_sin (y, y, GFC_RND_MODE);
-	mpfr_mul (mpc_realref (result->value.complex), x, t, GFC_RND_MODE);
-	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:
@@ -1350,12 +1087,7 @@ gfc_compare_expr (gfc_expr *op1, gfc_exp
 static int
 compare_complex (gfc_expr *op1, gfc_expr *op2)
 {
-#ifdef HAVE_mpc
   return mpc_cmp (op1->value.complex, op2->value.complex) == 0;
-#else
-  return (mpfr_equal_p (op1->value.complex.r, op2->value.complex.r)
-	  && mpfr_equal_p (op1->value.complex.i, op2->value.complex.i));
-#endif
 }


@@ -2224,13 +1956,8 @@ gfc_convert_complex (gfc_expr *real, gfc
   gfc_expr *e;

   e = gfc_constant_result (BT_COMPLEX, kind, &real->where);
-#ifdef HAVE_mpc
   mpc_set_fr_fr (e->value.complex, real->value.real, imag->value.real,
 		 GFC_MPC_RND_MODE);
-#else
-  mpfr_set (e->value.complex.r, real->value.real, GFC_RND_MODE);
-  mpfr_set (e->value.complex.i, imag->value.real, GFC_RND_MODE);
-#endif

   return e;
 }
@@ -2350,12 +2077,7 @@ gfc_int2complex (gfc_expr *src, int kind

   result = gfc_constant_result (BT_COMPLEX, kind, &src->where);

-#ifdef HAVE_mpc
   mpc_set_z (result->value.complex, src->value.integer, GFC_MPC_RND_MODE);
-#else
-  mpfr_set_z (result->value.complex.r, src->value.integer, GFC_RND_MODE);
-  mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
-#endif

   if ((rc = gfc_check_real_range (mpc_realref (result->value.complex), kind))
       != ARITH_OK)
@@ -2433,12 +2155,7 @@ gfc_real2complex (gfc_expr *src, int kin

   result = gfc_constant_result (BT_COMPLEX, kind, &src->where);

-#ifdef HAVE_mpc
   mpc_set_fr (result->value.complex, src->value.real, GFC_MPC_RND_MODE);
-#else
-  mpfr_set (result->value.complex.r, src->value.real, GFC_RND_MODE);
-  mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
-#endif

   rc = gfc_check_real_range (mpc_realref (result->value.complex), kind);

@@ -2493,11 +2210,7 @@ gfc_complex2real (gfc_expr *src, int kin

   result = gfc_constant_result (BT_REAL, kind, &src->where);

-#ifdef HAVE_mpc
   mpc_real (result->value.real, src->value.complex, GFC_RND_MODE);
-#else
-  mpfr_set (result->value.real, src->value.complex.r, GFC_RND_MODE);
-#endif

   rc = gfc_check_real_range (result->value.real, kind);

@@ -2528,12 +2241,7 @@ gfc_complex2complex (gfc_expr *src, int

   result = gfc_constant_result (BT_COMPLEX, kind, &src->where);

-#ifdef HAVE_mpc
   mpc_set (result->value.complex, src->value.complex, GFC_MPC_RND_MODE);
-#else
-  mpfr_set (result->value.complex.r, src->value.complex.r, GFC_RND_MODE);
-  mpfr_set (result->value.complex.i, src->value.complex.i, GFC_RND_MODE);
-#endif

   rc = gfc_check_real_range (mpc_realref (result->value.complex), kind);

@@ -2704,13 +2412,7 @@ gfc_hollerith2complex (gfc_expr *src, in

   hollerith2representation (result, src);
   gfc_interpret_complex (kind, (unsigned char *) result->representation.string,
-			 result->representation.length,
-#ifdef HAVE_mpc
-			 result->value.complex
-#else
-			 result->value.complex.r, result->value.complex.i
-#endif
-			 );
+			 result->representation.length, result->value.complex);

   return result;
 }
diff -rup orig/egcc-SVN20091114/gcc/fortran/expr.c egcc-SVN20091114/gcc/fortran/expr.c
--- orig/egcc-SVN20091114/gcc/fortran/expr.c	2009-10-08 02:00:45.000000000 +0200
+++ egcc-SVN20091114/gcc/fortran/expr.c	2009-11-14 23:07:39.000000000 +0100
@@ -156,12 +156,7 @@ free_expr0 (gfc_expr *e)
 	  break;

 	case BT_COMPLEX:
-#ifdef HAVE_mpc
 	  mpc_clear (e->value.complex);
-#else
-	  mpfr_clear (e->value.complex.r);
-	  mpfr_clear (e->value.complex.i);
-#endif
 	  break;

 	default:
@@ -473,15 +468,8 @@ gfc_copy_expr (gfc_expr *p)

 	case BT_COMPLEX:
 	  gfc_set_model_kind (q->ts.kind);
-#ifdef HAVE_mpc
 	  mpc_init2 (q->value.complex, mpfr_get_default_prec());
 	  mpc_set (q->value.complex, p->value.complex, GFC_MPC_RND_MODE);
-#else
-	  mpfr_init (q->value.complex.r);
-	  mpfr_init (q->value.complex.i);
-	  mpfr_set (q->value.complex.r, p->value.complex.r, GFC_RND_MODE);
-	  mpfr_set (q->value.complex.i, p->value.complex.i, GFC_RND_MODE);
-#endif
 	  break;

 	case BT_CHARACTER:
diff -rup orig/egcc-SVN20091114/gcc/fortran/gfortran.h egcc-SVN20091114/gcc/fortran/gfortran.h
--- orig/egcc-SVN20091114/gcc/fortran/gfortran.h	2009-10-18 02:00:45.000000000 +0200
+++ egcc-SVN20091114/gcc/fortran/gfortran.h	2009-11-14 23:08:37.000000000 +0100
@@ -1623,19 +1623,7 @@ gfc_class_esym_list;

 #include <gmp.h>
 #include <mpfr.h>
-#ifdef HAVE_mpc
 #include <mpc.h>
-# if MPC_VERSION >= MPC_VERSION_NUM(0,6,1)
-#  define HAVE_mpc_pow
-# endif
-# if MPC_VERSION >= MPC_VERSION_NUM(0,7,1)
-#  define HAVE_mpc_arc
-#  define HAVE_mpc_pow_z
-# endif
-#else
-#define mpc_realref(X) ((X).r)
-#define mpc_imagref(X) ((X).i)
-#endif
 #define GFC_RND_MODE GMP_RNDN
 #define GFC_MPC_RND_MODE MPC_RNDNN

@@ -1694,15 +1682,7 @@ typedef struct gfc_expr

     mpfr_t real;

-#ifdef HAVE_mpc
-    mpc_t
-#else
-    struct
-    {
-      mpfr_t r, i;
-    }
-#endif
-    complex;
+    mpc_t complex;

     struct
     {
diff -rup orig/egcc-SVN20091114/gcc/fortran/resolve.c egcc-SVN20091114/gcc/fortran/resolve.c
--- orig/egcc-SVN20091114/gcc/fortran/resolve.c	2009-11-12 02:00:58.000000000 +0100
+++ egcc-SVN20091114/gcc/fortran/resolve.c	2009-11-14 23:08:57.000000000 +0100
@@ -8545,12 +8545,7 @@ build_default_init_expr (gfc_symbol *sym
       break;

     case BT_COMPLEX:
-#ifdef HAVE_mpc
       mpc_init2 (init_expr->value.complex, mpfr_get_default_prec());
-#else
-      mpfr_init (init_expr->value.complex.r);
-      mpfr_init (init_expr->value.complex.i);
-#endif
       switch (gfc_option.flag_init_real)
 	{
 	case GFC_INIT_REAL_SNAN:
@@ -8572,12 +8567,7 @@ build_default_init_expr (gfc_symbol *sym
 	  break;

 	case GFC_INIT_REAL_ZERO:
-#ifdef HAVE_mpc
 	  mpc_set_ui (init_expr->value.complex, 0, GFC_MPC_RND_MODE);
-#else
-	  mpfr_set_ui (init_expr->value.complex.r, 0.0, GFC_RND_MODE);
-	  mpfr_set_ui (init_expr->value.complex.i, 0.0, GFC_RND_MODE);
-#endif
 	  break;

 	default:
diff -rup orig/egcc-SVN20091114/gcc/fortran/simplify.c egcc-SVN20091114/gcc/fortran/simplify.c
--- orig/egcc-SVN20091114/gcc/fortran/simplify.c	2009-10-02 05:54:24.000000000 +0200
+++ egcc-SVN20091114/gcc/fortran/simplify.c	2009-11-14 23:15:16.000000000 +0100
@@ -283,12 +283,7 @@ init_result_expr (gfc_expr *e, int init,
 	    break;

 	  case BT_COMPLEX:
-#ifdef HAVE_mpc
 	    mpc_set_si (e->value.complex, init, GFC_MPC_RND_MODE);
-#else
-	    mpfr_set_si (e->value.complex.r, init, GFC_RND_MODE);
-	    mpfr_set_si (e->value.complex.i, 0, GFC_RND_MODE);
-#endif
 	    break;

 	  case BT_CHARACTER:
@@ -644,12 +639,7 @@ gfc_simplify_abs (gfc_expr *e)

       gfc_set_model_kind (e->ts.kind);

-#ifdef HAVE_mpc
       mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE);
-#else
-      mpfr_hypot (result->value.real, e->value.complex.r,
-		  e->value.complex.i, GFC_RND_MODE);
-#endif
       result = range_check (result, "CABS");
       break;

@@ -749,13 +739,9 @@ gfc_simplify_acos (gfc_expr *x)
 	mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
 	break;
       case BT_COMPLEX:
-#ifdef HAVE_mpc_arc
 	result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
 	mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
 	break;
-#else
-	return NULL;
-#endif
       default:
 	gfc_internal_error ("in gfc_simplify_acos(): Bad type");
     }
@@ -786,13 +772,9 @@ gfc_simplify_acosh (gfc_expr *x)
 	mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
 	break;
       case BT_COMPLEX:
-#ifdef HAVE_mpc_arc
 	result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
 	mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
 	break;
-#else
-	return NULL;
-#endif
       default:
 	gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
     }
@@ -1054,13 +1036,9 @@ gfc_simplify_asin (gfc_expr *x)
 	mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
 	break;
       case BT_COMPLEX:
-#ifdef HAVE_mpc_arc
 	result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
 	mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
 	break;
-#else
-	return NULL;
-#endif
       default:
 	gfc_internal_error ("in gfc_simplify_asin(): Bad type");
     }
@@ -1084,13 +1062,9 @@ gfc_simplify_asinh (gfc_expr *x)
 	mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
 	break;
       case BT_COMPLEX:
-#ifdef HAVE_mpc_arc
 	result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
 	mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
 	break;
-#else
-	return NULL;
-#endif
       default:
 	gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
     }
@@ -1114,13 +1088,9 @@ gfc_simplify_atan (gfc_expr *x)
 	mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
 	break;
       case BT_COMPLEX:
-#ifdef HAVE_mpc_arc
 	result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
 	mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
 	break;
-#else
-	return NULL;
-#endif
       default:
 	gfc_internal_error ("in gfc_simplify_atan(): Bad type");
     }
@@ -1152,13 +1122,9 @@ gfc_simplify_atanh (gfc_expr *x)
 	mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
 	break;
       case BT_COMPLEX:
-#ifdef HAVE_mpc_arc
 	result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
 	mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
 	break;
-#else
-	return NULL;
-#endif
       default:
 	gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
     }
@@ -1357,36 +1323,19 @@ simplify_cmplx (const char *name, gfc_ex

   result = gfc_constant_result (BT_COMPLEX, kind, &x->where);

-#ifndef HAVE_mpc
-  mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
-#endif
-
   switch (x->ts.type)
     {
     case BT_INTEGER:
       if (!x->is_boz)
-#ifdef HAVE_mpc
 	mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE);
-#else
-	mpfr_set_z (result->value.complex.r, x->value.integer, GFC_RND_MODE);
-#endif
       break;

     case BT_REAL:
-#ifdef HAVE_mpc
       mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE);
-#else
-      mpfr_set (result->value.complex.r, x->value.real, GFC_RND_MODE);
-#endif
       break;

     case BT_COMPLEX:
-#ifdef HAVE_mpc
       mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
-#else
-      mpfr_set (result->value.complex.r, x->value.complex.r, GFC_RND_MODE);
-      mpfr_set (result->value.complex.i, x->value.complex.i, GFC_RND_MODE);
-#endif
       break;

     default:
@@ -1517,12 +1466,7 @@ gfc_simplify_conjg (gfc_expr *e)
     return NULL;

   result = gfc_copy_expr (e);
-#ifdef HAVE_mpc
   mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE);
-#else
-  mpfr_neg (result->value.complex.i, result->value.complex.i, GFC_RND_MODE);
-#endif
-
   return range_check (result, "CONJG");
 }

@@ -1544,26 +1488,7 @@ gfc_simplify_cos (gfc_expr *x)
       break;
     case BT_COMPLEX:
       gfc_set_model_kind (x->ts.kind);
-#ifdef HAVE_mpc
       mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
-#else
-    {
-      mpfr_t xp, xq;
-      mpfr_init (xp);
-      mpfr_init (xq);
-
-      mpfr_cos  (xp, x->value.complex.r, GFC_RND_MODE);
-      mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
-      mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
-
-      mpfr_sin  (xp, x->value.complex.r, GFC_RND_MODE);
-      mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
-      mpfr_mul (xp, xp, xq, GFC_RND_MODE);
-      mpfr_neg (result->value.complex.i, xp, GFC_RND_MODE );
-
-      mpfr_clears (xp, xq, NULL);
-    }
-#endif
       break;
     default:
       gfc_internal_error ("in gfc_simplify_cos(): Bad type");
@@ -1587,14 +1512,7 @@ gfc_simplify_cosh (gfc_expr *x)
   if (x->ts.type == BT_REAL)
     mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
   else if (x->ts.type == BT_COMPLEX)
-    {
-#if HAVE_mpc
-      mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
-#else
-      gfc_free_expr (result);
-      return NULL;
-#endif
-    }
+    mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   else
     gcc_unreachable ();

@@ -2000,21 +1918,7 @@ gfc_simplify_exp (gfc_expr *x)

     case BT_COMPLEX:
       gfc_set_model_kind (x->ts.kind);
-#ifdef HAVE_mpc
       mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
-#else
-    {
-      mpfr_t xp, xq;
-      mpfr_init (xp);
-      mpfr_init (xq);
-      mpfr_exp (xq, x->value.complex.r, GFC_RND_MODE);
-      mpfr_cos (xp, x->value.complex.i, GFC_RND_MODE);
-      mpfr_mul (result->value.complex.r, xq, xp, GFC_RND_MODE);
-      mpfr_sin (xp, x->value.complex.i, GFC_RND_MODE);
-      mpfr_mul (result->value.complex.i, xq, xp, GFC_RND_MODE);
-      mpfr_clears (xp, xq, NULL);
-    }
-#endif
       break;

     default:
@@ -3393,26 +3297,7 @@ gfc_simplify_log (gfc_expr *x)
 	}

       gfc_set_model_kind (x->ts.kind);
-#ifdef HAVE_mpc
       mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
-#else
-    {
-      mpfr_t xr, xi;
-      mpfr_init (xr);
-      mpfr_init (xi);
-
-      mpfr_atan2 (result->value.complex.i, x->value.complex.i,
-		  x->value.complex.r, GFC_RND_MODE);
-
-      mpfr_mul (xr, x->value.complex.r, x->value.complex.r, GFC_RND_MODE);
-      mpfr_mul (xi, x->value.complex.i, x->value.complex.i, GFC_RND_MODE);
-      mpfr_add (xr, xr, xi, GFC_RND_MODE);
-      mpfr_sqrt (xr, xr, GFC_RND_MODE);
-      mpfr_log (result->value.complex.r, xr, GFC_RND_MODE);
-
-      mpfr_clears (xr, xi, NULL);
-    }
-#endif
       break;

     default:
@@ -4305,12 +4190,7 @@ gfc_simplify_realpart (gfc_expr *e)
     return NULL;

   result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
-#ifdef HAVE_mpc
   mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
-#else
-  mpfr_set (result->value.real, e->value.complex.r, GFC_RND_MODE);
-#endif
-
   return range_check (result, "REALPART");
 }

@@ -5089,25 +4969,7 @@ gfc_simplify_sin (gfc_expr *x)

     case BT_COMPLEX:
       gfc_set_model (x->value.real);
-#ifdef HAVE_mpc
       mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
-#else
-    {
-      mpfr_t xp, xq;
-      mpfr_init (xp);
-      mpfr_init (xq);
-
-      mpfr_sin  (xp, x->value.complex.r, GFC_RND_MODE);
-      mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
-      mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
-
-      mpfr_cos  (xp, x->value.complex.r, GFC_RND_MODE);
-      mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
-      mpfr_mul (result->value.complex.i, xp, xq, GFC_RND_MODE);
-
-      mpfr_clears (xp, xq, NULL);
-    }
-#endif
       break;

     default:
@@ -5131,14 +4993,7 @@ gfc_simplify_sinh (gfc_expr *x)
   if (x->ts.type == BT_REAL)
     mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
   else if (x->ts.type == BT_COMPLEX)
-    {
-#if HAVE_mpc
-      mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
-#else
-      gfc_free_expr (result);
-      return NULL;
-#endif
-    }
+    mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   else
     gcc_unreachable ();

@@ -5329,87 +5184,7 @@ gfc_simplify_sqrt (gfc_expr *e)

     case BT_COMPLEX:
       gfc_set_model (e->value.real);
-#ifdef HAVE_mpc
       mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE);
-#else
-    {
-      /* Formula taken from Numerical Recipes to avoid over- and
-	 underflow.  */
-
-      mpfr_t ac, ad, s, t, w;
-      mpfr_init (ac);
-      mpfr_init (ad);
-      mpfr_init (s);
-      mpfr_init (t);
-      mpfr_init (w);
-
-      if (mpfr_cmp_ui (e->value.complex.r, 0) == 0
-	  && mpfr_cmp_ui (e->value.complex.i, 0) == 0)
-	{
-	  mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
-	  mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
-	  break;
-	}
-
-      mpfr_abs (ac, e->value.complex.r, GFC_RND_MODE);
-      mpfr_abs (ad, e->value.complex.i, GFC_RND_MODE);
-
-      if (mpfr_cmp (ac, ad) >= 0)
-	{
-	  mpfr_div (t, e->value.complex.i, e->value.complex.r, GFC_RND_MODE);
-	  mpfr_mul (t, t, t, GFC_RND_MODE);
-	  mpfr_add_ui (t, t, 1, GFC_RND_MODE);
-	  mpfr_sqrt (t, t, GFC_RND_MODE);
-	  mpfr_add_ui (t, t, 1, GFC_RND_MODE);
-	  mpfr_div_ui (t, t, 2, GFC_RND_MODE);
-	  mpfr_sqrt (t, t, GFC_RND_MODE);
-	  mpfr_sqrt (s, ac, GFC_RND_MODE);
-	  mpfr_mul (w, s, t, GFC_RND_MODE);
-	}
-      else
-	{
-	  mpfr_div (s, e->value.complex.r, e->value.complex.i, GFC_RND_MODE);
-	  mpfr_mul (t, s, s, GFC_RND_MODE);
-	  mpfr_add_ui (t, t, 1, GFC_RND_MODE);
-	  mpfr_sqrt (t, t, GFC_RND_MODE);
-	  mpfr_abs (s, s, GFC_RND_MODE);
-	  mpfr_add (t, t, s, GFC_RND_MODE);
-	  mpfr_div_ui (t, t, 2, GFC_RND_MODE);
-	  mpfr_sqrt (t, t, GFC_RND_MODE);
-	  mpfr_sqrt (s, ad, GFC_RND_MODE);
-	  mpfr_mul (w, s, t, GFC_RND_MODE);
-	}
-
-      if (mpfr_cmp_ui (w, 0) != 0 && mpfr_cmp_ui (e->value.complex.r, 0) >= 0)
-	{
-	  mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
-	  mpfr_div (result->value.complex.i, e->value.complex.i, t, GFC_RND_MODE);
-	  mpfr_set (result->value.complex.r, w, GFC_RND_MODE);
-	}
-      else if (mpfr_cmp_ui (w, 0) != 0
-	       && mpfr_cmp_ui (e->value.complex.r, 0) < 0
-	       && mpfr_cmp_ui (e->value.complex.i, 0) >= 0)
-	{
-	  mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
-	  mpfr_div (result->value.complex.r, e->value.complex.i, t, GFC_RND_MODE);
-	  mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
-	}
-      else if (mpfr_cmp_ui (w, 0) != 0
-	       && mpfr_cmp_ui (e->value.complex.r, 0) < 0
-	       && mpfr_cmp_ui (e->value.complex.i, 0) < 0)
-	{
-	  mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
-	  mpfr_div (result->value.complex.r, ad, t, GFC_RND_MODE);
-	  mpfr_neg (w, w, GFC_RND_MODE);
-	  mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
-	}
-      else
-	gfc_internal_error ("invalid complex argument of SQRT at %L",
-			    &e->where);
-
-      mpfr_clears (s, t, ac, ad, w, NULL);
-    }
-#endif
       break;

     default:
@@ -5462,14 +5237,7 @@ gfc_simplify_tan (gfc_expr *x)
   if (x->ts.type == BT_REAL)
     mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
   else if (x->ts.type == BT_COMPLEX)
-    {
-#if HAVE_mpc
-      mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
-#else
-      gfc_free_expr (result);
-      return NULL;
-#endif
-    }
+    mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   else
     gcc_unreachable ();

@@ -5490,14 +5258,7 @@ gfc_simplify_tanh (gfc_expr *x)
   if (x->ts.type == BT_REAL)
     mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
   else if (x->ts.type == BT_COMPLEX)
-    {
-#if HAVE_mpc
-      mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
-#else
-      gfc_free_expr (result);
-      return NULL;
-#endif
-    }
+    mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   else
     gcc_unreachable ();

diff -rup orig/egcc-SVN20091114/gcc/fortran/target-memory.c egcc-SVN20091114/gcc/fortran/target-memory.c
--- orig/egcc-SVN20091114/gcc/fortran/target-memory.c	2009-08-14 02:00:36.000000000 +0200
+++ egcc-SVN20091114/gcc/fortran/target-memory.c	2009-11-14 23:11:26.000000000 +0100
@@ -164,28 +164,12 @@ encode_float (int kind, mpfr_t real, uns


 static int
-encode_complex (int kind,
-#ifdef HAVE_mpc
-		mpc_t cmplx,
-#else
-		mpfr_t real, mpfr_t imaginary,
-#endif
+encode_complex (int kind, mpc_t cmplx,
 		unsigned char *buffer, size_t buffer_size)
 {
   int size;
-  size = encode_float (kind,
-#ifdef HAVE_mpc
-		       mpc_realref (cmplx),
-#else
-		       real,
-#endif
-		       &buffer[0], buffer_size);
-  size += encode_float (kind,
-#ifdef HAVE_mpc
-			mpc_imagref (cmplx),
-#else
-			imaginary,
-#endif
+  size = encode_float (kind, mpc_realref (cmplx), &buffer[0], buffer_size);
+  size += encode_float (kind, mpc_imagref (cmplx),
 			&buffer[size], buffer_size - size);
   return size;
 }
@@ -283,13 +267,7 @@ gfc_target_encode_expr (gfc_expr *source
       return encode_float (source->ts.kind, source->value.real, buffer,
 			   buffer_size);
     case BT_COMPLEX:
-      return encode_complex (source->ts.kind,
-#ifdef HAVE_mpc
-			     source->value.complex,
-#else
-			     source->value.complex.r,
-			     source->value.complex.i,
-#endif
+      return encode_complex (source->ts.kind, source->value.complex,
 			     buffer, buffer_size);
     case BT_LOGICAL:
       return encode_logical (source->ts.kind, source->value.logical, buffer,
@@ -391,28 +369,13 @@ gfc_interpret_float (int kind, unsigned

 int
 gfc_interpret_complex (int kind, unsigned char *buffer, size_t buffer_size,
-#ifdef HAVE_mpc
-		       mpc_t complex
-#else
-		       mpfr_t real, mpfr_t imaginary
-#endif
-		       )
+		       mpc_t complex)
 {
   int size;
   size = gfc_interpret_float (kind, &buffer[0], buffer_size,
-#ifdef HAVE_mpc
-			      mpc_realref (complex)
-#else
-			      real
-#endif
-			      );
+			      mpc_realref (complex));
   size += gfc_interpret_float (kind, &buffer[size], buffer_size - size,
-#ifdef HAVE_mpc
-			       mpc_imagref (complex)
-#else
-			       imaginary
-#endif
-			       );
+			       mpc_imagref (complex));
   return size;
 }

@@ -559,13 +522,7 @@ gfc_target_interpret_expr (unsigned char
     case BT_COMPLEX:
       result->representation.length =
         gfc_interpret_complex (result->ts.kind, buffer, buffer_size,
-#ifdef HAVE_mpc
-			       result->value.complex
-#else
-			       result->value.complex.r,
-			       result->value.complex.i
-#endif
-			       );
+			       result->value.complex);
       break;

     case BT_LOGICAL:
@@ -766,19 +723,9 @@ gfc_convert_boz (gfc_expr *expr, gfc_typ
     }
   else
     {
-#ifdef HAVE_mpc
       mpc_init2 (expr->value.complex, mpfr_get_default_prec());
-#else
-      mpfr_init (expr->value.complex.r);
-      mpfr_init (expr->value.complex.i);
-#endif
       gfc_interpret_complex (ts->kind, buffer, buffer_size,
-#ifdef HAVE_mpc
-			     expr->value.complex
-#else
-			     expr->value.complex.r, expr->value.complex.i
-#endif
-			     );
+			     expr->value.complex);
     }
   expr->is_boz = 0;
   expr->ts.type = ts->type;
diff -rup orig/egcc-SVN20091114/gcc/fortran/target-memory.h egcc-SVN20091114/gcc/fortran/target-memory.h
--- orig/egcc-SVN20091114/gcc/fortran/target-memory.h	2009-06-20 02:00:48.000000000 +0200
+++ egcc-SVN20091114/gcc/fortran/target-memory.h	2009-11-14 23:11:43.000000000 +0100
@@ -39,11 +39,7 @@ int gfc_target_encode_expr (gfc_expr *,

 int gfc_interpret_integer (int, unsigned char *, size_t, mpz_t);
 int gfc_interpret_float (int, unsigned char *, size_t, mpfr_t);
-#ifdef HAVE_mpc
 int gfc_interpret_complex (int, unsigned char *, size_t, mpc_t);
-#else
-int gfc_interpret_complex (int, unsigned char *, size_t, mpfr_t, mpfr_t);
-#endif
 int gfc_interpret_logical (int, unsigned char *, size_t, int *);
 int gfc_interpret_character (unsigned char *, size_t, gfc_expr *);
 int gfc_interpret_derived (unsigned char *, size_t, gfc_expr *);



More information about the Gcc-patches mailing list