编译以下代码时:
int f(int i1,int i2)
{
long l1=i1;
long l2=i2;
return l1*l2;
}
使用x86-64的clang 10.1和-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位除法的反例是什么?