【发布时间】:2020-09-03 11:24:48
【问题描述】:
编译以下代码时:
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 位除法的反例?
【问题讨论】:
-
代码生成 is better in LLVM 11 具有 32 位值的特殊情况。
标签: c optimization compiler-construction clang compiler-optimization