18extern "C" int64_t
__mulodi4(int64_t a, int64_t b,
int* overflow) {
29 uint64_t a_low = a & 0xFFFFFFFFu;
30 uint64_t a_high =
static_cast<uint64_t
>(
a) >> 32;
31 uint64_t b_low = b & 0xFFFFFFFFu;
32 uint64_t b_high =
static_cast<uint64_t
>(b) >> 32;
34 uint64_t r_low = a_low * b_low;
35 uint64_t r_mid1 = a_low * b_high;
36 uint64_t r_mid2 = a_high * b_low;
37 uint64_t r_high = a_high * b_high;
39 uint64_t result1 = r_low + (r_mid1 << 32);
40 if (result1 < r_low) r_high++;
41 uint64_t result2 = result1 + (r_mid2 << 32);
42 if (result2 < result1) r_high++;
43 r_high += (r_mid1 >> 32) + (r_mid2 >> 32);
44 int64_t
result =
static_cast<int64_t
>(result2);
45 uint64_t result_sign = (
result >> 63);
46 uint64_t expected_result_sign = (a >> 63) ^ (b >> 63);
48 *overflow = (r_high > 0 || result_sign != expected_result_sign) ? 1 : 0;