[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