Частично связано: если вы хотите быть уверенным в использовании возможности imul
выполнения 32x32 => 64-битного умножения, вы можете использовать Int32x32To64
«поддельный API» (на самом деле макрос):
Умножает два 32-разрядных целых числа со знаком и возвращает результат 64-разрядного целого числа со знаком.Функция оптимально работает в 32-битной Windows.
Эта функция реализована на всех платформах с помощью оптимального встроенного кода: одна команда умножения, которая возвращает 64-битный результат.
Кстати, вы включили оптимизации?Я был бы весьма озадачен, если бы с включенной оптимизацией компилятор не смог сам разобраться в этом.
Редактировать :
достаточно интересно, ищите Int32x32To64
в winnt.h
, вы найдете для x86:
//
// The x86 C compiler understands inline assembler. Therefore, inline functions
// that employ inline assembler are used for shifts of 0..31. The multiplies
// rely on the compiler recognizing the cast of the multiplicand to int64 to
// generate the optimal code inline.
//
#define Int32x32To64( a, b ) (LONGLONG)((LONGLONG)(LONG)(a) * (LONG)(b))
#define UInt32x32To64( a, b ) (ULONGLONG)((ULONGLONG)(DWORD)(a) * (DWORD)(b))
Таким образом, он определенно должен выдать imul
, если даже Platform SDK доверяет компилятору делать правильные вещи.
Отредактируйте снова :
Если вам необходимо получить imul
, вы можете использовать встроенный компилятор __emul
.