From 45c93d8fa2d149bc561b26ec0f5ca85eba5494c7 Mon Sep 17 00:00:00 2001 From: John Maddock Date: Sat, 24 Aug 2013 17:21:28 +0000 Subject: [PATCH] Optimise squaring to use mpfr_sqr and mpfi_sqr. [SVN r85449] --- include/boost/multiprecision/mpfi.hpp | 10 ++++++++-- include/boost/multiprecision/mpfr.hpp | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/include/boost/multiprecision/mpfi.hpp b/include/boost/multiprecision/mpfi.hpp index 537eb3ee..b2b370c6 100644 --- a/include/boost/multiprecision/mpfi.hpp +++ b/include/boost/multiprecision/mpfi.hpp @@ -477,7 +477,10 @@ inline void eval_subtract(mpfi_float_backend& result, const mpfi_float_backe template inline void eval_multiply(mpfi_float_backend& result, const mpfi_float_backend& o) { - mpfi_mul(result.data(), result.data(), o.data()); + if(&result == &o) + mpfi_sqr(result.data(), o.data()); + else + mpfi_mul(result.data(), result.data(), o.data()); } template inline void eval_divide(mpfi_float_backend& result, const mpfi_float_backend& o) @@ -609,7 +612,10 @@ inline void eval_subtract(mpfi_float_backend& a, long x, const mpfi_float_ba template inline void eval_multiply(mpfi_float_backend& a, const mpfi_float_backend& x, const mpfi_float_backend& y) { - mpfi_mul(a.data(), x.data(), y.data()); + if(&x == &y) + mpfi_sqr(a.data(), x.data()); + else + mpfi_mul(a.data(), x.data(), y.data()); } template inline void eval_multiply(mpfi_float_backend& a, const mpfi_float_backend& x, unsigned long y) diff --git a/include/boost/multiprecision/mpfr.hpp b/include/boost/multiprecision/mpfr.hpp index 18e7024b..da864fb4 100644 --- a/include/boost/multiprecision/mpfr.hpp +++ b/include/boost/multiprecision/mpfr.hpp @@ -952,7 +952,10 @@ inline void eval_subtract(mpfr_float_backend& result, const mpfr_float_b template inline void eval_multiply(mpfr_float_backend& result, const mpfr_float_backend& o) { - mpfr_mul(result.data(), result.data(), o.data(), GMP_RNDN); + if(&o == &result) + mpfr_sqr(result.data(), o.data(), GMP_RNDN); + else + mpfr_mul(result.data(), result.data(), o.data(), GMP_RNDN); } template inline void eval_divide(mpfr_float_backend& result, const mpfr_float_backend& o) @@ -1084,7 +1087,10 @@ inline void eval_subtract(mpfr_float_backend& a, long x, const mpfr_floa template inline void eval_multiply(mpfr_float_backend& a, const mpfr_float_backend& x, const mpfr_float_backend& y) { - mpfr_mul(a.data(), x.data(), y.data(), GMP_RNDN); + if(&x == &y) + mpfr_sqr(a.data(), x.data(), GMP_RNDN); + else + mpfr_mul(a.data(), x.data(), y.data(), GMP_RNDN); } template inline void eval_multiply(mpfr_float_backend& a, const mpfr_float_backend& x, unsigned long y)