diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2014-02-28 20:15:35 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2014-02-28 20:15:35 +0000 |
commit | a18623946bf8b8b76fc1ca8e87846c81410d3572 (patch) | |
tree | 1d9373d98bd12214e6b703597a425282cd6c1f22 /src/gmp_op.c | |
parent | 0583e0c02d6a046bab1ebfc302543679724d6322 (diff) | |
download | mpfr-a18623946bf8b8b76fc1ca8e87846c81410d3572.tar.gz |
speedup of the mpfr_xxx_z functions when z fits in a long
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@8992 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'src/gmp_op.c')
-rw-r--r-- | src/gmp_op.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/gmp_op.c b/src/gmp_op.c index 0c2aa2f04..1ad071ced 100644 --- a/src/gmp_op.c +++ b/src/gmp_op.c @@ -83,21 +83,26 @@ foo2 (mpfr_ptr x, mpz_srcptr y, mpfr_srcptr z, mpfr_rnd_t r, int mpfr_mul_z (mpfr_ptr y, mpfr_srcptr x, mpz_srcptr z, mpfr_rnd_t r) { - return foo (y, x, z, r, mpfr_mul); + if (mpz_fits_slong_p (z)) + return mpfr_mul_si (y, x, mpz_get_si (z), r); + else + return foo (y, x, z, r, mpfr_mul); } int mpfr_div_z (mpfr_ptr y, mpfr_srcptr x, mpz_srcptr z, mpfr_rnd_t r) { - return foo (y, x, z, r, mpfr_div); + if (mpz_fits_slong_p (z)) + return mpfr_div_si (y, x, mpz_get_si (z), r); + else + return foo (y, x, z, r, mpfr_div); } int mpfr_add_z (mpfr_ptr y, mpfr_srcptr x, mpz_srcptr z, mpfr_rnd_t r) { - /* Mpz 0 is unsigned */ - if (MPFR_UNLIKELY (mpz_sgn (z) == 0)) - return mpfr_set (y, x, r); + if (mpz_fits_slong_p (z)) + return mpfr_add_si (y, x, mpz_get_si (z), r); else return foo (y, x, z, r, mpfr_add); } @@ -105,9 +110,8 @@ mpfr_add_z (mpfr_ptr y, mpfr_srcptr x, mpz_srcptr z, mpfr_rnd_t r) int mpfr_sub_z (mpfr_ptr y, mpfr_srcptr x, mpz_srcptr z, mpfr_rnd_t r) { - /* Mpz 0 is unsigned */ - if (MPFR_UNLIKELY (mpz_sgn (z) == 0)) - return mpfr_set (y, x, r); + if (mpz_fits_slong_p (z)) + return mpfr_sub_si (y, x, mpz_get_si (z), r); else return foo (y, x, z, r, mpfr_sub); } @@ -115,9 +119,8 @@ mpfr_sub_z (mpfr_ptr y, mpfr_srcptr x, mpz_srcptr z, mpfr_rnd_t r) int mpfr_z_sub (mpfr_ptr y, mpz_srcptr x, mpfr_srcptr z, mpfr_rnd_t r) { - /* Mpz 0 is unsigned */ - if (MPFR_UNLIKELY (mpz_sgn (x) == 0)) - return mpfr_neg (y, z, r); + if (mpz_fits_slong_p (x)) + return mpfr_si_sub (y, mpz_get_si (x), z, r); else return foo2 (y, x, z, r, mpfr_sub); } @@ -133,6 +136,9 @@ mpfr_cmp_z (mpfr_srcptr x, mpz_srcptr z) if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (x))) return mpfr_cmp_si (x, mpz_sgn (z)); + if (mpz_fits_slong_p (z)) + return mpfr_cmp_si (x, mpz_get_si (z)); + if (mpz_size (z) <= 1) p = GMP_NUMB_BITS; else |