summaryrefslogtreecommitdiff
path: root/src/gmp_op.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2014-02-28 20:15:35 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2014-02-28 20:15:35 +0000
commita18623946bf8b8b76fc1ca8e87846c81410d3572 (patch)
tree1d9373d98bd12214e6b703597a425282cd6c1f22 /src/gmp_op.c
parent0583e0c02d6a046bab1ebfc302543679724d6322 (diff)
downloadmpfr-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.c28
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