使用LEA进行gcc优化

Ban*_*urt 2 optimization assembly gcc

我正在摆弄gcc的优化选项,发现这些行:

int bla(int moo) {
  return moo * 384;
}
Run Code Online (Sandbox Code Playgroud)

被翻译成这些:

0:   8d 04 7f                lea    (%rdi,%rdi,2),%eax
3:   c1 e0 07                shl    $0x7,%eax
6:   c3                      retq
Run Code Online (Sandbox Code Playgroud)

我理解移位代表乘以2 ^ 7.并且第一行必须乘以3.

所以我对"lea"系列完全感到困惑.是不是应该加载一个地址?

zak*_*ter 6

lea (%ebx, %esi, 2), %edi只是计算ebx + esi*2和存储结果edi.

即使lea设计用于计算和存储有效地址,它也可以并且通常用作优化技巧来对不是存储器地址的事物执行计算.

lea    (%rdi,%rdi,2),%eax
shl    $0x7,%eax
Run Code Online (Sandbox Code Playgroud)

相当于:

eax = rdi + rdi*2;
eax = eax * 128;
Run Code Online (Sandbox Code Playgroud)

自从moo进入rdi,它就存储moo*384eax