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

Abramo Bagnara abramo.bagnara at gmail.com
Fri May 7 07:49:26 CEST 2010


Module: ppl/ppl
Branch: master
Commit: f9182bb6ab09f42b9065bf1da5664dba1243f9b1
URL:    http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=f9182bb6ab09f42b9065bf1da5664dba1243f9b1

Author: Abramo Bagnara <abramo.bagnara at 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;
 }
 




More information about the PPL-devel mailing list