diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2012-01-30 11:31:45 +0100 |
---|---|---|
committer | Marc Glisse <marc.glisse@inria.fr> | 2012-01-30 11:31:45 +0100 |
commit | b025d2b95b55c67fda78c55cb25862e654435a50 (patch) | |
tree | ff2db7c6305b14e2cf037ed0a5d71ab73e200c78 /gmpxx.h | |
parent | 9c33f2e433c9683ef1c62b4d0822a1cada6e0956 (diff) | |
download | gmp-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.h | 48 |
1 files changed, 40 insertions, 8 deletions
@@ -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 |