5#ifndef V8_BIGINT_DIGIT_ARITHMETIC_H_
6#define V8_BIGINT_DIGIT_ARITHMETIC_H_
25 twodigit_t
result = twodigit_t{a} + b;
39 twodigit_t
result = twodigit_t{a} + b + c;
46 if (
result < c) *carry += 1;
54 twodigit_t
result = twodigit_t{a} - b;
68 twodigit_t subtrahend = twodigit_t{b} + borrow_in;
69 twodigit_t
result = twodigit_t{a} - subtrahend;
74 *borrow_out = (
result >
a) ? 1 : 0;
75 if (
result < borrow_in) *borrow_out += 1;
84 twodigit_t
result = twodigit_t{a} * b;
104 digit_t r_mid1 = a_low * b_high;
105 digit_t r_mid2 = a_high * b_low;
106 digit_t r_high = a_high * b_high;
125#if __x86_64__ && (__GNUC__ || __clang__)
128 __asm__(
"divq %[divisor]"
130 :
"=a"(quotient),
"=d"(rem)
133 :
"d"(high),
"a"(low), [divisor]
"rm"(divisor));
136#elif __i386__ && (__GNUC__ || __clang__)
139 __asm__(
"divl %[divisor]"
141 :
"=a"(quotient),
"=d"(rem)
144 :
"d"(high),
"a"(low), [divisor]
"rm"(divisor));
160 static_assert(
sizeof(intptr_t) ==
sizeof(
digit_t),
161 "intptr_t and digit_t must have the same size");
166 (high <<
s) | ((low >> ((
kDigitBits - s) & kShiftMask)) & s_zero_mask);
171 digit_t rhat = un32 - q1 * vn1;
181 rhat = un21 - q0 * vn1;
std::optional< TNode< JSArray > > a
ZoneVector< RpoNumber > & result
static digit_t digit_div(digit_t high, digit_t low, digit_t divisor, digit_t *remainder)
static constexpr int kHalfDigitBits
static constexpr int kDigitBits
static constexpr digit_t kHalfDigitBase
static constexpr digit_t kHalfDigitMask
digit_t digit_add3(digit_t a, digit_t b, digit_t c, digit_t *carry)
constexpr int CountLeadingZeros(T value)
digit_t digit_sub2(digit_t a, digit_t b, digit_t borrow_in, digit_t *borrow_out)
digit_t digit_sub(digit_t a, digit_t b, digit_t *borrow)
constexpr bool digit_ismax(digit_t x)
digit_t digit_mul(digit_t a, digit_t b, digit_t *high)
digit_t digit_add2(digit_t a, digit_t b, digit_t *carry)
#define DCHECK(condition)