编译以下代码时:
int f(int i1,int i2)
{
long l1=i1;
long l2=i2;
return l1*l2;
}
Run Code Online (Sandbox Code Playgroud)
用clang 10.1forx86-64和 with -O3,我得到
mov eax, edi
imul eax, esi
ret
Run Code Online (Sandbox Code Playgroud)
编译器认识到不需要完整的 64 位操作。
但是,当我用除法替换乘法时:
int f(int i1,int i2)
{
long l1=i1;
long l2=i2;
return l1/l2;
}
Run Code Online (Sandbox Code Playgroud)
它编译成
movsx rax, edi
movsx rsi, esi
cqo
idiv rsi
ret
Run Code Online (Sandbox Code Playgroud)
所以它使用 64 位除法(与 gcc 相同)。
阻止在这里使用 32 位除法的反例是什么?
c compiler-construction optimization clang compiler-optimization