Многие ЦП имеют окоды с одной сборкой для возврата бит порядка высокий для 32-битного целочисленного умножения. Обычно умножение двух 32-битных целых чисел приводит к 64-битовому результату, но это сокращается до младших 32 бит, если вы храните его в 32-битном целое.
Например, в PowerPC код операции mulhw возвращает 32 бита 64-битного результата умножения 32x32 бит в одном Часы. Это именно то, что я ищу, но более переносимо. Там аналогичный код операции, umulhi(), в NVidia CUDA.
В C/С++ существует ли эффективный способ вернуть бит высокого порядка 32x32 умножения? В настоящее время я вычисляю его, отбрасывая до 64 бит, что-то вроде:
unsigned int umulhi32(unsigned int x, unsigned int y)
{
unsigned long long xx=x;
xx*=y;
return (unsigned int)(xx>>32);
}
но это более чем в 11 раз медленнее обычного 32 на 32 умножить, потому что я использую overkill 64-битную математику даже для умножения.
Есть ли более быстрый способ вычисления бит высокого порядка?
Это явно не, который лучше всего решается с помощью библиотеки BigInteger (которая слишком перегружена и будет иметь огромные накладные расходы).
У SSE есть PMULHUW, 16x16 → верхняя 16-разрядная версия этого, но не 32x32 → топ-32 версия, как я Я ищу.