Я использую MSVC 2010 SP1, и у меня есть следующая строка кода C++:
int32_t c = (int64_t(a)*int64_t(b))>>2;
Когда a
и b
не являются константами, MSVC правильно генерирует 32-битные инструкции imul
и shrd
. Но когда a
или b
являются константами, генерируется вызов _allmull
вместо инструкции imul
. Может ли быть какая-то причина для этого? Как я могу заставить его всегда генерировать хороший код? Меня беспокоит то, почему он генерирует худший код, когда у него больше информации о времени компиляции. Я обнаружил, что функция _allmull
выполняет 64-битное умножение, но я думаю, что в данном случае это не нужно.
Я также заметил, что для строки int32_t c = (int64_t(a)*int64_t(b))/4;
он даже генерирует _alldiv для деления на 4.
Изменить: похоже, это ошибка компилятора. Я заполнил ошибку отчет.
uint32_t
иuint64_t
? - person Alexandre C.   schedule 06.04.2011