36 #define OUTPUT_SIGN(sa,sb,ua,ub) \
38 negA = _cairo_int128_negative (sa); \
39 negB = _cairo_int128_negative (sb); \
40 ua = _cairo_int128_to_uint128 (sa); \
41 ub = _cairo_int128_to_uint128 (sb); \
42 ua = negA ? _cairo_uint128_negate (ua) : ua; \
43 ub = negB ? _cairo_uint128_negate (ub) : ub; \
44 (negA && !negB) || (!negA && negB); })
47 int64x64_t::Mul (int64x64_t
const &o)
49 cairo_uint128_t a, b, result;
62 int64x64_t::Umul (cairo_uint128_t a, cairo_uint128_t b)
64 cairo_uint128_t result;
65 cairo_uint128_t hiPart,loPart,midPart;
83 "High precision 128 bits multiplication error: multiplication overflow.");
88 int64x64_t::Div (int64x64_t
const &o)
90 cairo_uint128_t a, b, result;
97 int64x64_t::Udiv (cairo_uint128_t a, cairo_uint128_t b)
104 cairo_uint128_t rem, div;
121 int64x64_t::MulByInvert (
const int64x64_t &o)
125 cairo_uint128_t result = UmulByInvert (a, o._v);
130 int64x64_t::UmulByInvert (cairo_uint128_t a, cairo_uint128_t b)
132 cairo_uint128_t result;
133 cairo_uint128_t hi, mid;
143 int64x64_t::Invert (uint64_t v)
146 cairo_uint128_t a, factor;
152 result._v = Udiv (a, factor);
153 int64x64_t tmp = int64x64_t (v, 0);
154 tmp.MulByInvert (result);
155 if (tmp.GetHigh () != 1)
157 cairo_uint128_t one = { 1, 0};
cairo_uint128_t I _cairo_uint64_to_uint128(cairo_uint64_t i)
cairo_int128_t _cairo_int128_negate(cairo_int128_t a)
#define NS_ASSERT(condition)
cairo_uint128_t I _cairo_uint128_negate(cairo_uint128_t a)
int I _cairo_uint128_eq(cairo_uint128_t a, cairo_uint128_t b)
cairo_uquorem128_t I _cairo_uint128_divrem(cairo_uint128_t num, cairo_uint128_t den)
NS_LOG_COMPONENT_DEFINE("int64x64-cairo")
cairo_uint128_t I _cairo_uint128_rsl(cairo_uint128_t a, int shift)
cairo_uint128_t I _cairo_uint64x64_128_mul(cairo_uint64_t a, cairo_uint64_t b)
cairo_uint128_t I _cairo_uint128_lsl(cairo_uint128_t a, int shift)
#define OUTPUT_SIGN(sa, sb, ua, ub)
#define _cairo_int128_negative(a)
#define _cairo_uint64_add(a, b)
cairo_uint128_t I _cairo_uint128_add(cairo_uint128_t a, cairo_uint128_t b)
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if cond is true.