51output_sign(
const int128_t sa,
const int128_t sb, uint128_t& ua, uint128_t& ub)
66 uint128_t result =
Umul(a, b);
67 _v = negative ? -result : result;
91 midPart = aL * bH + aH * bL;
96 "High precision 128 bits multiplication error: multiplication overflow.");
101 result = res1 + res2;
103 res1 = midPart >> 64;
119 int128_t result =
Udiv(a, b);
120 _v = negative ? -result : result;
128 uint128_t quo = rem / den;
130 uint128_t result = quo;
133 const uint64_t DIGITS = 64;
134 const uint128_t ZERO = 0;
142 while ((shift < DIGITS) && !(den & 0x1))
148 while ((digis < DIGITS) && (rem != ZERO))
151 while ((digis + shift < DIGITS) && !(rem & HP128_MASK_HI_BIT))
161 while ((digis + shift < DIGITS) && (!(den & 0x1) || (rem < den)))
181 shift = DIGITS - digis;
191 bool negResult =
_v < 0;
192 uint128_t a = negResult ? -
_v :
_v;
195 _v = negResult ? -result : result;
213 mid = ah * bl + al * bh;
NS_ABORT_x macro definitions.
NS_ASSERT() and NS_ASSERT_MSG() macro definitions.
High precision numerical type, implementing Q64.64 fixed precision.
int64_t GetHigh() const
Get the integer portion.
static const uint64_t HP_MASK_LO
Mask for fraction part.
static cairo_uint128_t Umul(const cairo_uint128_t a, const cairo_uint128_t b)
Unsigned multiplication of Q64.64 values.
static cairo_uint128_t UmulByInvert(const cairo_uint128_t a, const cairo_uint128_t b)
Unsigned multiplication of Q64.64 and Q0.128 values.
void Mul(const int64x64_t &o)
Implement *=.
void MulByInvert(const int64x64_t &o)
Multiply this value by a Q0.128 value, presumably representing an inverse, completing a division oper...
static cairo_uint128_t Udiv(const cairo_uint128_t a, const cairo_uint128_t b)
Unsigned division of Q64.64 values.
cairo_int128_t _v
The Q64.64 value.
void Div(const int64x64_t &o)
Implement /=.
static int64x64_t Invert(const uint64_t v)
Compute the inverse of an integer value.
int64x64_t()
Default constructor.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
static bool output_sign(const int128_t sa, const int128_t sb, uint128_t &ua, uint128_t &ub)
Compute the sign of the result of multiplying or dividing Q64.64 fixed precision operands.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Every class exported by the ns3 library is enclosed in the ns3 namespace.