【发布时间】:2013-04-26 17:21:13
【问题描述】:
我正在摆弄 gcc 的优化选项,发现这些行:
int bla(int moo) {
return moo * 384;
}
被翻译成这些:
0: 8d 04 7f lea (%rdi,%rdi,2),%eax
3: c1 e0 07 shl $0x7,%eax
6: c3 retq
我理解移位表示乘以 2^7。并且第一行必须是乘以 3。
所以我对“lea”行完全感到困惑。 lea 不应该加载地址吗?
【问题讨论】:
-
为了完整性:地址操作数获取的语法是:±d(A,B,C) 将被翻译成 A±d + B * C
-
顺便说一下,唯一使用 AGU 的现代 CPU 是
lea是 Intel Atom。在所有其他现代 CPU 上,它都用于 ALU。然而它仍然很有用,因为它结合了几个操作,有一个任意的输出寄存器,并且不改变标志。另外,这种形式(64位地址,32位结果)是lea在64位模式下的最短编码。
标签: gcc assembly optimization