首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc对LEA的优化

gcc对LEA的优化
EN

Stack Overflow用户
提问于 2013-05-02 13:46:20
回答 2查看 1.1K关注 0票数 2

我在摆弄gcc的优化方案,发现这些路线:

代码语言:javascript
复制
int bla(int moo) {
  return moo * 384;
}

翻译为:

代码语言:javascript
复制
0:   8d 04 7f                lea    (%rdi,%rdi,2),%eax
3:   c1 e0 07                shl    $0x7,%eax
6:   c3                      retq

我知道移位代表2^7的乘法,第一行必须是3乘。

所以我对“精益”这条线感到非常困惑。难道lea不应该装载一个地址吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-02 13:50:34

lea (%ebx, %esi, 2), %edi只会计算ebx + esi*2并将结果存储在edi中。

即使lea被设计用于计算和存储有效地址,它也可以并且经常被用作对非内存地址执行计算的优化技巧。

代码语言:javascript
复制
lea    (%rdi,%rdi,2),%eax
shl    $0x7,%eax

相当于:

代码语言:javascript
复制
eax = rdi + rdi*2;
eax = eax * 128;

由于moordi,所以它将moo*384存储在eax中。

票数 6
EN

Stack Overflow用户

发布于 2013-05-02 14:00:51

这是x86核上的一个标准优化技巧。AGU是地址生成单元,它是产生地址的处理器的一个部分,它能够实现简单的算法。它不是一个完整的ALU,但是有足够的晶体管来计算索引地址和缩放地址。加法和轮班。LEA,Load有效地址指令是一种调用AGU中的逻辑并将其用于计算简单表达式的方法。

这里的优化机会是AGU独立于ALU运行。所以你可以得到超标量的执行,两个指令同时执行。

这在代码片段中并不明显,但如果在需要ALU的显示指令之前进行计算,则可能会发生这种情况。这是一个花招,只有在更简单的cpu核心,486和奔腾葡萄酒上才能得到真正的回报。现代处理器有多个ALU,所以不再需要这个技巧了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16339699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档