我在gcc.godbolt.org上尝试使用GCC反汇编器,注意到从4.6版本开始,GCC对乘法的编译方式有所不同。以下是我的两个函数:
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在两种情况下生成相同的操作码。
gcc
4.7.2 (-O3) 对于两个函数使用相同的指令序列:imull $126, 4(%esp), %eax
和imull $131, 4(%esp), %eax
。 - ouah