使用LEA进行gcc优化
这个问题在这里已经有了答案:
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
这是x86内核的标准优化技巧。 AGU地址生成单元是生成地址的处理器的子部分,能够进行简单的算术运算。 它不是一个完整的ALU,但有足够的晶体管来计算索引和缩放地址。 添加和移位。 LEA,Load Load Address指令是调用AGU中的逻辑并计算简单表达式的一种方法。
这里的优化机会是AGU独立于ALU运行。 所以你可以得到超标量执行,同时执行两条指令。
这实际上并不在你的代码片段中发生,但是如果在显示的需要ALU的指令之前进行了计算,则可能发生这种情况。 这是一个诀窍,只有在更简单的cpu核心,486和奔腾年份上才真正实现。 现代处理器有多个ALU,所以不再需要这个技巧。
链接地址: http://www.djcxy.com/p/72363.html