diff --git a/src/simulator/high-precision-128.cc b/src/simulator/high-precision-128.cc index 8c1bfecfb..eb6cc965b 100644 --- a/src/simulator/high-precision-128.cc +++ b/src/simulator/high-precision-128.cc @@ -18,6 +18,7 @@ * Author: Mathieu Lacage */ #include "high-precision-128.h" +#include "ns3/test.h" #include #include @@ -160,10 +161,24 @@ HighPrecision::Div (HighPrecision const &o) HP128INC (m_ndivs++); EnsureSlow (); const_cast (o).EnsureSlow (); - cairo_int128_t div = _cairo_int128_rsa (o.m_slowValue, 64); cairo_quorem128_t qr; - qr = _cairo_int128_divrem (m_slowValue, div); - m_slowValue = qr.quo; + qr = _cairo_int128_divrem (m_slowValue, o.m_slowValue); + m_slowValue = _cairo_int128_lsl (qr.quo, 64); + // Now, manage the remainder + cairo_int128_t div = o.m_slowValue; + cairo_int128_t tmp; + tmp = _cairo_int128_rsa (qr.rem, 64); + cairo_int128_t zero = _cairo_int64_to_int128 (0); + if (_cairo_int128_eq (tmp, zero)) + { + qr.rem = _cairo_int128_lsl (qr.rem, 64); + } + else + { + div = _cairo_int128_rsa (div, 64); + } + qr = _cairo_int128_divrem (qr.rem, div); + m_slowValue = _cairo_int128_add (m_slowValue, qr.quo); return false; } int @@ -207,14 +222,15 @@ HighPrecision128Tests::HighPrecision128Tests () HighPrecision128Tests::~HighPrecision128Tests () {} -#define CHECK_EXPECTED(v,expected) \ -{ \ - if (v.GetInteger () != expected) \ - { \ - Failure () << "file="<<__FILE__<<", line="<<__LINE__<<", expected: "<