[PATCH] Remove GMP in favor of MPFR

Steve Kargl sgk@troutmask.apl.washington.edu
Sun Jul 4 03:19:00 GMT 2004


Gang,

Here is a reworking of gfortran to use MPFR in preference to
GMP.  The diff (when uncompressed) is nearly 3800 lines and
on the order of 100 kB.  The patch has been bootstrapped on
FreeBSD.  The gfortran testsuite was run with no new regression.
My private test suite also compiled and ran without a problem.

There are a few FIXME comments where I simply converted the 
GMP code to MPFR code.  The reduced number of bits in the
MPFR significand may lead to some potential overflows (see 
for example complex division in arith.c).  I clean the FIXME
comments up with a followup patch.

I need someone who understands configure to write the 
tests for libmpfr.  For my testing, I hacked configure
by replacing "-lgmp" everywhere with "-lmpfr -lgmp".

Finally, here's a mutant ChangeLog entry.  The complexity 
of patch has me somewhat stymied with submitting anything
shorter.

Steven G. Kargl  2004-07-02  <kargls@comcast.net>

arith.c: Add #define for model numbers.  Remove global GMP variables.
         (natural_logarithm,common_logarithm,exponential,sine,
          cosine,arctangent,hypercos,hypersine ): Removed functions
         (gfc_mpfr_to_mpz,gfc_set_model_kind,gfc_set_model): New functions
         (arctangent2,gfc_arith_init_1,gfc_arith_done_1
          gfc_check_real_range, gfc_constant_result, gfc_range_check,
          gfc_arith_uminus,gfc_arith_plus, gfc_arith_minus, gfc_arith_times,
          gfc_arith_divide,complex_reciprocal,complex_pow_ui,
          gfc_arith_power,gfc_compare_expr,compare_complex,gfc_convert_real,
          gfc_convert_complex,gfc_int2real,gfc_int2complex,
          gfc_real2int,gfc_real2real,gfc_real2complex,
          gfc_complex2int,gfc_complex2real,gfc_complex2complex
         ): Convert GMP to MPFR, use new functions.

 
arith.h: Remove extern global variables.
         (natural_logarithm,common_logarithm,exponential, sine, cosine,
          arctangent,hypercos,hypersine): Remove prototypes.
         (arctangent2): Update prototype from GMP to MPFR.
         (gfc_mpfr_to_mpz, gfc_set_model_kind,gfc_set_model): Prototypes
         of new functions.
 
dump-parse-tree.c: (gfc_show_expr): Convert GMP to MPFR
expr.c: (free_expr0,gfc_copy_expr): Convert GMP to MPFR

gfortran.h: (GFC_REAL_BITS): Remove; (arith): Add ARITH_NAN;
            Add mpfr.h, define GFC_RND_MODE;
            (gfc_expr): Convert GMP to MPFR
            GFC_GFC_H changed to GCC_GFORTRAN_H

module.c: Add arith.h, correct type in comment
          (mio_gmp_real): Convert GMP to MPFR
          (mio_expr):  Use gfc_set_model_kind().

primary.c:  Update copyright date with 2004
           (match_real_constant,match_const_complex_part): Convert GMP to MPFR
 
simplify.c: Remove global GMP variables
           (gfc_simplify_abs,gfc_simplify_acos,gfc_simplify_aimag,
            gfc_simplify_aint,gfc_simplify_dint,gfc_simplify_anint,
            gfc_simplify_dnint,gfc_simplify_asin,gfc_simplify_atan,
            gfc_simplify_atan2,gfc_simplify_ceiling,simplify_cmplx,
            gfc_simplify_conjg,gfc_simplify_cos,gfc_simplify_cosh,
            gfc_simplify_dim,gfc_simplify_dprod,gfc_simplify_epsilon,
            gfc_simplify_exp,gfc_simplify_exponent,gfc_simplify_floor,
            gfc_simplify_fraction,gfc_simplify_huge,gfc_simplify_int,
            gfc_simplify_ifix,gfc_simplify_idint,gfc_simplify_log,
            gfc_simplify_log10,simplify_min_max,gfc_simplify_mod,
            gfc_simplify_modulo,gfc_simplify_nearest,simplify_nint,
            gfc_simplify_rrspacing,gfc_simplify_scale,
            gfc_simplify_set_exponent,gfc_simplify_sign,gfc_simplify_sin,
            gfc_simplify_sinh,gfc_simplify_spacing,gfc_simplify_sqrt,
            gfc_simplify_tan,gfc_simplify_tanh,gfc_simplify_tiny,
            gfc_simplify_init_1,gfc_simplify_done_1
            ):  Convert GMP to MPFR, use new functions.

trans-const.c: Rename gfc_conv_mpf_to_tree() to gfc_conv_mpfr_to_tree();
               Convert it to use MPFR
               (gfc_conv_constant_to_tree): Use it.
trans-const.h: Update prototype for gfc_conv_mpfr_to_tree().

trans-intrinsic.c: Add arith.h, remove gmp.h
         (gfc_conv_intrinsic_aint,gfc_conv_intrinsic_mod): Convert GMP to MPFR.
         (gfc_conv_intrinsic_minmaxloc): Use gfc_conv_mpfr_to_tree

-- 
Steve
-------------- next part --------------
A non-text attachment was scrubbed...
Name: mpfr1.diff.gz
Type: application/x-gunzip
Size: 18506 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/fortran/attachments/20040704/bfc9efc6/attachment.bin>


More information about the Fortran mailing list