20 const uint64_t a_low = p_a & 0xFFFFFFFFULL;
21 const uint64_t a_high = p_a >> 32;
22 const uint64_t b_low = p_b & 0xFFFFFFFFULL;
23 const uint64_t b_high = p_b >> 32;
25 const uint64_t p0 = a_low * b_low;
26 const uint64_t p1 = a_low * b_high;
27 const uint64_t p2 = a_high * b_low;
28 const uint64_t p3 = a_high * b_high;
30 const uint64_t carry = ((p0 >> 32) + (p1 & 0xFFFFFFFFULL) + (p2 & 0xFFFFFFFFULL)) >> 32;
31 return p3 + (p1 >> 32) + (p2 >> 32) + carry;