[GIT] ppl/ppl(master): Avoid temporary in smod_2exp.

Module: ppl/ppl Branch: master Commit: f9182bb6ab09f42b9065bf1da5664dba1243f9b1 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=f9182bb6ab09f...
Author: Abramo Bagnara abramo.bagnara@gmail.com Date: Fri May 7 07:20:52 2010 +0200
Avoid temporary in smod_2exp.
---
src/checked_mpq.inlines.hh | 14 +++++++------- src/checked_mpz.inlines.hh | 10 ++++------ 2 files changed, 11 insertions(+), 13 deletions(-)
diff --git a/src/checked_mpq.inlines.hh b/src/checked_mpq.inlines.hh index ffd8067..2ac13e9 100644 --- a/src/checked_mpq.inlines.hh +++ b/src/checked_mpq.inlines.hh @@ -389,12 +389,13 @@ template <typename To_Policy, typename From_Policy> inline Result smod_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp, Rounding_Dir) { - to.get_num() = x.get_num(); mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp); - mpz_fdiv_r(to.get_num().get_mpz_t(), to.get_num().get_mpz_t(), to.get_den().get_mpz_t()); - to.canonicalize(); - if (to >= 0.5) - to -= 1; + mpz_fdiv_r(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), to.get_den().get_mpz_t()); + mpz_fdiv_q_2exp(to.get_den().get_mpz_t(), to.get_den().get_mpz_t(), 1); + bool neg = to.get_num() >= to.get_den(); + mpz_mul_2exp(to.get_den().get_mpz_t(), to.get_den().get_mpz_t(), 1); + if (neg) + to.get_num() -= to.get_den(); mpz_mul_2exp(to.get_num().get_mpz_t(), to.get_num().get_mpz_t(), exp); to.canonicalize(); return V_EQ; @@ -406,9 +407,8 @@ template <typename To_Policy, typename From_Policy> inline Result umod_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp, Rounding_Dir) { - to.get_num() = x.get_num(); mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp); - mpz_fdiv_r(to.get_num().get_mpz_t(), to.get_num().get_mpz_t(), to.get_den().get_mpz_t()); + mpz_fdiv_r(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), to.get_den().get_mpz_t()); mpz_mul_2exp(to.get_num().get_mpz_t(), to.get_num().get_mpz_t(), exp); to.canonicalize(); return V_EQ; diff --git a/src/checked_mpz.inlines.hh b/src/checked_mpz.inlines.hh index 6d1d41c..380e085 100644 --- a/src/checked_mpz.inlines.hh +++ b/src/checked_mpz.inlines.hh @@ -507,12 +507,10 @@ template <typename To_Policy, typename From_Policy> inline Result smod_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp, Rounding_Dir) { - mpz_fdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp); - if (mpz_tstbit(to.get_mpz_t(), exp - 1)) { - mpz_class m = 1; - mpz_mul_2exp(m.get_mpz_t(), m.get_mpz_t(), exp); - to -= m; - } + if (mpz_tstbit(x.get_mpz_t(), exp - 1)) + mpz_cdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp); + else + mpz_fdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp); return V_EQ; }
participants (1)
-
Abramo Bagnara