Я играл с дизассемблером GCC на gcc.godbolt.org, и я заметил, что стартовая версия GCC 4.6 компилирует размножение по-разному. Я имею следующие две функции:
unsigned m126(unsigned i)
{
return i * 126;
}
unsigned m131(unsigned i)
{
return i * 131;
}
m126
компилируется в:
mov eax, edi
mov edx, 126
imul eax, edx
ret
И m131
скомпилируется в:
imul eax, edi, 131
ret
Почему разница? GCC 4.5 генерирует один и тот же код операции в обоих случаях.