部件

我没有要求一个基准。

(如果是这样的话,我会自己做。)


我的问题:

为了方便,我倾向于避免间接/索引寻址模式。

作为替代,我经常使用即时,绝对或寄存器寻址。

代码:

; %esi has the array address. Say we iterate a doubleword (4bytes) array.
; %ecx is the array elements count
(0x98767) myloop:
    ... ;do whatever with %esi
    add $4, %esi
    dec %ecx
    jnz 0x98767;

在这里,我们有一个序列化组合(dec和jnz),可以防止正确的无序执行(依赖)。

有没有办法避免/破坏dep? (我不是装配专家)。


在对Intel CPU进行优化时,应始终在条件跳转指令(如果它是下表中列出的简单跳转指令之一)之前放置标志设置指令,以便它们可以在解码器中进行宏复合。

对于不做宏观融合的较旧CPU,这样做并不会显着更坏。 提前设置标志可以通过让错误预测更早被检测到,将这种CPU的分支预测错误惩罚缩短一分之一。 我没有基准测试,但我不认为日益稀少的CPU的小缺点证明错过了融合CPU的前端吞吐量优势(解码和问题)。 总的uop吞吐量通常可能是一个瓶颈。

AMD推土机/打桩机/压路机可以将test/cmp与任何jcc进行融合,但只能test/cmp ,而不是其他任何ALU指令。 所以绝对比较分支。

从Agner Fog的微型指南,表9.2(对于Sandybridge / Ivybridge):

First       | can pair with these  |  cannot pair with
instruction | (and the inverse)    |
---------------------------------------------
cmp         |jz, jc, jb, ja, jl, jg|   js, jp, jo
add, sub    |jz, jc, jb, ja, jl, jg|   js, jp, jo
adc, sbb    |none                  |
inc, dec    |jz, jl, jg            |   jc, jb, ja, js, jp, jo
test        | all                  |
and         | all                  |
or, xor, not, neg | none           |
shift, rotate     | none           |

Table 9.2. Instruction fusion

因此,基本上,只要条件只取决于由inc/dec修改的位, inc/dec就可以与jcc进行宏观熔合。

(否则,它们不会宏观融合,并且您会插入一个额外的uop以合并标志(例如,在写入al后读取eax )或在较早的CPU上使用部分标志失速。)

Core2 / Nehalem在宏观融合能力方面受到更多限制(仅用于CMP /测试和更多有限的JCC组合),并且Core2在64位模式下根本无法进行宏观融合。

如果您还没有阅读Agner Fog的优化ASM和C指南, 他们充满了基本的知识。

链接地址: http://www.djcxy.com/p/85923.html

上一篇: Assembly

下一篇: Windows 64 ABI, correct register use if i do NOT call windows API?