summaryrefslogtreecommitdiff
path: root/gmpxx.h
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2012-01-30 11:31:45 +0100
committerMarc Glisse <marc.glisse@inria.fr>2012-01-30 11:31:45 +0100
commitb025d2b95b55c67fda78c55cb25862e654435a50 (patch)
treeff2db7c6305b14e2cf037ed0a5d71ab73e200c78 /gmpxx.h
parent9c33f2e433c9683ef1c62b4d0822a1cada6e0956 (diff)
downloadgmp-b025d2b95b55c67fda78c55cb25862e654435a50.tar.gz
Replace d=a+b+c with (d=a+b)+=c when c!=d.
TODO: * same thing for the mixed mpq/mpz operations * finish the generic code I have that generalizes all these small optimizations (may not be ready for 5.1)
Diffstat (limited to 'gmpxx.h')
-rw-r--r--gmpxx.h48
1 files changed, 40 insertions, 8 deletions
diff --git a/gmpxx.h b/gmpxx.h
index fdfa0bb54..c629e14fa 100644
--- a/gmpxx.h
+++ b/gmpxx.h
@@ -2190,8 +2190,16 @@ public:
: expr(val1, val2) { }
void eval(typename __gmp_resolve_expr<T>::ptr_type p) const
{
- __gmp_expr<T, T> temp(expr.val2);
- Op::eval(p, expr.val1.__get_mp(), temp.__get_mp());
+ if(p != expr.val1.__get_mp())
+ {
+ __gmp_set_expr(p, expr.val2);
+ Op::eval(p, expr.val1.__get_mp(), p);
+ }
+ else
+ {
+ __gmp_expr<T, T> temp(expr.val2);
+ Op::eval(p, expr.val1.__get_mp(), temp.__get_mp());
+ }
}
void eval(typename __gmp_resolve_expr<T>::ptr_type p,
mp_bitcnt_t prec) const
@@ -2223,8 +2231,16 @@ public:
: expr(val1, val2) { }
void eval(typename __gmp_resolve_expr<T>::ptr_type p) const
{
- __gmp_expr<T, T> temp(expr.val1);
- Op::eval(p, temp.__get_mp(), expr.val2.__get_mp());
+ if(p != expr.val2.__get_mp())
+ {
+ __gmp_set_expr(p, expr.val1);
+ Op::eval(p, p, expr.val2.__get_mp());
+ }
+ else
+ {
+ __gmp_expr<T, T> temp(expr.val1);
+ Op::eval(p, temp.__get_mp(), expr.val2.__get_mp());
+ }
}
void eval(typename __gmp_resolve_expr<T>::ptr_type p,
mp_bitcnt_t prec) const
@@ -2256,8 +2272,16 @@ public:
: expr(val1, val2) { }
void eval(typename __gmp_resolve_expr<T>::ptr_type p) const
{
- __gmp_expr<T, T> temp(expr.val2);
- Op::eval(p, expr.val1.__get_mp(), temp.__get_mp());
+ if(p != expr.val1.__get_mp())
+ {
+ __gmp_set_expr(p, expr.val2);
+ Op::eval(p, expr.val1.__get_mp(), p);
+ }
+ else
+ {
+ __gmp_expr<T, T> temp(expr.val2);
+ Op::eval(p, expr.val1.__get_mp(), temp.__get_mp());
+ }
}
void eval(typename __gmp_resolve_expr<T>::ptr_type p,
mp_bitcnt_t prec) const
@@ -2289,8 +2313,16 @@ public:
: expr(val1, val2) { }
void eval(typename __gmp_resolve_expr<T>::ptr_type p) const
{
- __gmp_expr<T, T> temp(expr.val1);
- Op::eval(p, temp.__get_mp(), expr.val2.__get_mp());
+ if(p != expr.val2.__get_mp())
+ {
+ __gmp_set_expr(p, expr.val1);
+ Op::eval(p, p, expr.val2.__get_mp());
+ }
+ else
+ {
+ __gmp_expr<T, T> temp(expr.val1);
+ Op::eval(p, temp.__get_mp(), expr.val2.__get_mp());
+ }
}
void eval(typename __gmp_resolve_expr<T>::ptr_type p,
mp_bitcnt_t prec) const