46 #ifndef XT_ARITHMETIC_LONG_H
47 #define XT_ARITHMETIC_LONG_H
79 return (x >= 0) - (x < 0);
85 return x < 0 ? -x : x;
186 return (a.
hi == b.
hi) & (a.midlo == b.midlo);
208 return (sign_bit^1) - sign_bit;
224 Xt_long r = { .
hi = ((a.
hi + sign_mask) ^ sign_mask) - borrow,
225 .lo = (a.
lo + sign_mask) ^ sign_mask };
263 Xt_long r = { .
lo = al + bl, .hi = ah + bh + carry };
273 Xt_long r = { .
lo = al + bl, .hi = ah + bh + carry };
283 Xt_long r = { .
lo = al + bl, .hi = ah + carry };
292 Xt_long r = { .
lo = al + bl, .hi = ah + bh + carry };
302 Xt_long r = { .
lo = al - bl, .hi = ah - bh - carry };
311 Xt_long r = { .
lo = al - bl, .hi = ah - bh - carry };
332 Xt_long r = { .
lo = al - bl, .hi = ah - bh - carry };
403 t = a1*bh + (r.
mid & lo_mask) + k;
422 r.
hi -= a.
hi + borrow;
451 ah = a.
hi, al = a.
lo,
462 enum { int_bits =
sizeof (int) * CHAR_BIT };
472 un0 = un10 & lo_mask;
475 rhat = un32 - q1*vn1;
476 while (q1 >= base || q1*vn0 > base*rhat + un1) {
479 if (rhat >= base)
break;
482 un21 = un32*base + un1 - q1*b;
485 rhat = un21 - q0*vn1;
486 while (q0 >= base || q0*vn0 > base*rhat + un0) {
489 if (rhat >= base)
break;
493 .rem = (
Xt_int)((un21*base + un0 - q0*b) >> s)};
531 if (m < n || n <= 0 || v[n-1] == 0)
536 for (
int j = m - 1; j >= 0; j--) {
537 q[j] = (
Xt_ushort)((k*base + u[j])/v[0]);
551 for (
int i = n - 1; i > 0; i--)
557 for (
int i = m - 1; i > 0; i--)
561 for (
int j = m - n; j >= 0; j--) {
563 Xt_uint qhat = (un[j+n]*base + un[j+n-1])/vn[n-1],
565 rhat = (un[j+n]*base + un[j+n-1]) - qhat*vn[n-1];
566 while (qhat >= base || qhat*vn[n-2] > base*rhat + un[j+n-2]) {
569 if (rhat >= base)
break;
574 for (
int i = 0; i < n; i++) {
576 t = un[i+j] - k - (
Xt_int)(p & lo_mask);
587 for (
int i = 0; i < n; i++) {
588 t = un[i+j] + vn[i] + k;
598 for (
int i = 0; i < n; i++)
638 }
else if (u.
hi < v.
hi || (u.
hi == v.
hi && u.
lo < v.
lo)) {
656 if ((u.
hi >= base) == (v.
hi >= base)) {
660 while (qhat >= base || qhat*(vn.
hi & lo_mask) > base*rhat + (un.
mid >>
xt_hint_bits)) {
663 if (rhat >= base)
break;
675 p = qhat * (vn.
hi & lo_mask);
710 Xt_ushort ua[4], va[4], qa[4] = { 0U }, ra[4] = { 0U };
714 while (ua[m-1] == 0U) --m;
715 while (va[n-1] == 0U) --n;
732 Xt_ldiv r = { { 0, 0 }, { 0, 0 } };
755 int r = ah > bh || (ah == bh && al > bl);
767 int r = ah > bh || (ah == bh && al >= bl);
779 int r = ah < bh || (ah == bh && al <= bl);
791 int r = ah < bh || (ah == bh && al < bl);
798 return ((a.
hi == b.
hi) & (a.
lo == b.
lo));
static Xt_ldiv xlldivu(Xt_ulong u, Xt_ulong v)
static Xt_long xlisub(Xt_long a, Xt_int b)
static Xt_uint xtlo(Xt_tword x)
static Xt_tword xlimul(Xt_long a, Xt_int b)
static int xlicmp_gt(Xt_long a, Xt_int b)
static Xt_long xlladd(Xt_long a, Xt_long b)
static Xt_long xiisub(Xt_int a, Xt_int b)
static Xt_long xi2l(Xt_int a)
static Xt_ldiv xlldiv(Xt_long a, Xt_long b)
static Xt_uint xlhi(Xt_long x)
static Xt_long xliadd(Xt_long a, Xt_int b)
static int xttcmp_eq(Xt_tword a, Xt_tword b)
static Xt_uint xtmid(Xt_tword x)
static Xt_long xllsub(Xt_long a, Xt_long b)
static Xt_uint xthi(Xt_tword x)
static Xt_uint xllo(Xt_long x)
static void xl2a(Xt_ushort a[4], Xt_long u)
static int xllcmp_eq(Xt_long a, Xt_long b)
unsigned XT_SHORT Xt_ushort
static Xt_idiv xlidivu(Xt_ulong a, Xt_uint b)
static void xdivmnu(Xt_ushort *restrict q, Xt_ushort *restrict r, const Xt_ushort *restrict u, const Xt_ushort *restrict v, int m, int n)
static int xlicmp_lt(Xt_long a, Xt_int b)
static Xt_long xa2l(Xt_ushort a[4])
static Xt_long xiimul(Xt_int a, Xt_int b)
static bool xl_is_in_xt_int_range(Xt_long a)
static Xt_ldiv xtidiv(Xt_tword a, Xt_int b)
static Xt_long xlabs(Xt_long a)
static Xt_long xilsub(Xt_int a, Xt_long b)
static Xt_long xlinc(Xt_long a, bool b)
static Xt_long xlnegate(Xt_long a, bool negate)
static int xlsign(Xt_long x)
static int xlicmp_le(Xt_long a, Xt_int b)
static Xt_long xiiadd(Xt_int a, Xt_int b)
static int xlicmp_ge(Xt_long a, Xt_int b)
static Xt_int Xt_isign_mask(Xt_int x)
static int xinlz(Xt_uint v)
base definitions header file