52 inline void umul128 (uint64_t a, uint64_t b, uint64_t& high, uint64_t& low)
noexcept
54#if defined(__SIZEOF_INT128__)
55 __uint128_t p =
static_cast<__uint128_t
> (a) * b;
57 high =
static_cast<uint64_t
> (p >> 64);
58 low =
static_cast<uint64_t
> (p);
60 uint64_t b_lo =
static_cast<uint32_t
> (b);
61 uint64_t b_hi = b >> 32;
62 uint64_t p0 = (a & 0xFFFFFFFF) * b_lo;
63 uint64_t p1 = (a >> 32) * b_lo;
64 uint64_t p2 = (a & 0xFFFFFFFF) * b_hi;
65 uint64_t p3 = (a >> 32) * b_hi;
66 uint64_t carry = (p0 >> 32) + (p1 & 0xFFFFFFFF) + (p2 & 0xFFFFFFFF);
68 low = (carry << 32) | (p0 & 0xFFFFFFFF);
69 high = (carry >> 32) + (p1 >> 32) + (p2 >> 32) + p3;
void umul128(uint64_t a, uint64_t b, uint64_t &high, uint64_t &low) noexcept
multiply two 64 bits unsigned integers.
Definition power.hpp:52