This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Remove GMP in favor of MPFR


On Sat, Jul 03, 2004 at 08:19:31PM -0700, Steve Kargl wrote:
> 
> 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
> 

Here is an updated patch that fixes the problem with HUGE() and
I/O.  gcc/real.c and MPFR have different ideas with regard to the
number of decimal digits that correspond to 53-bit FP with 
exact rounding and round-to-nearest.  See above for a ChangeLog
entry.

-- 
Steve

Attachment: mpfr3.diff
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]