当编译以下代码时:
int f(int i1,int i2)
{
long l1=i1;
long l2=i2;
return l1*l2;
}
使用 clang 10.1
编译 x86-64
架构,并开启 -O3
优化,得到以下结果:
mov eax, edi
imul eax, esi
ret
编译器会意识到不需要完整的64位操作。
然而,当我把乘法替换为除法时:
int f(int i1,int i2)
{
long l1=i1;
long l2=i2;
return l1/l2;
}
它编译成
movsx rax, edi
movsx rsi, esi
cqo
idiv rsi
ret
因此,它使用64位除法(gcc同样如此)。
有什么反例防止在这里使用32位除法?