A little algebra never hurt:
#include
uint64_t top64(uint64_t x, uint64_t y) {
uint64_t a = x >> 32, b = x & 0xFFFFFFFF;
uint64_t c = y >> 32, d = y & 0xFFFFFFFF;
return a * c + ((b * d >> 32) + (a * d) + (b * c)) >> 32 +
((((a * d) & 0xFFFFFFFF) + ((b *c) & 0xFFFFFFFF) + ((b * d) >> 32)) >> 32);
}