spe*_*der 11 hardware optimization x86 assembly cpu-architecture
多年来我多次读过你应该做XOR ax,ax因为它更快......或者用C编程时使用counter ++或counter + = 1因为它们会INC或ADD ......或者在Netburst Pentium中4 INC比ADD 1慢,因此必须警告编译器你的目标是一个Netburst所以它会将所有var ++翻译成ADD 1 ......
我的问题是:为什么INC和ADD有不同的表现?为什么例如INC声称在Netburst上速度较慢而在其他处理器中比ADD快?
Ira*_*ter 16
对于x86体系结构,INC更新条件代码的子集,而ADD更新整个条件代码集.(其他架构有不同的规则,因此本讨论可能适用也可能不适用).
因此,INC指令必须等待更新条件代码位的其他先前指令完成,然后才能修改该先前值以产生其最终条件代码结果.
ADD可以产生最终条件码位而不考虑条件码的先前值,因此不需要等待先前的指令来完成计算它们的条件码的值.
结果:您可以与许多其他指令并行执行ADD,并使用较少的其他指令执行INC.因此,ADD在实践中似乎更快.
(我认为在全宽度寄存器(例如,EAX)的上下文中使用8位寄存器(例如,AL)存在类似的问题,因为AL更新要求先前完成先前的EAX更新).
我不再在我的高性能汇编代码中使用INC或DEC.如果您对执行时间不敏感,那么INC或DEC就可以了,可以减小指令流的大小.