我在摆弄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不应该装载一个地址吗?
发布于 2013-05-02 13:50:34
lea (%ebx, %esi, 2), %edi只会计算ebx + esi*2并将结果存储在edi中。
即使lea被设计用于计算和存储有效地址,它也可以并且经常被用作对非内存地址执行计算的优化技巧。
lea (%rdi,%rdi,2),%eax
shl $0x7,%eax相当于:
eax = rdi + rdi*2;
eax = eax * 128;由于moo在rdi,所以它将moo*384存储在eax中。
发布于 2013-05-02 14:00:51
这是x86核上的一个标准优化技巧。AGU是地址生成单元,它是产生地址的处理器的一个部分,它能够实现简单的算法。它不是一个完整的ALU,但是有足够的晶体管来计算索引地址和缩放地址。加法和轮班。LEA,Load有效地址指令是一种调用AGU中的逻辑并将其用于计算简单表达式的方法。
这里的优化机会是AGU独立于ALU运行。所以你可以得到超标量的执行,两个指令同时执行。
这在代码片段中并不明显,但如果在需要ALU的显示指令之前进行计算,则可能会发生这种情况。这是一个花招,只有在更简单的cpu核心,486和奔腾葡萄酒上才能得到真正的回报。现代处理器有多个ALU,所以不再需要这个技巧了。
https://stackoverflow.com/questions/16339699
复制相似问题