在x86-64中,如果使用以下汇编代码:
MOV RAX, (memory address)
JMP RAX
管道是在执行分支之前暂停(等待MOV用RAX完成),还是像条件分支一样刷新管道?
适用于大多数现代80x86 CPU;有静态预测(没有历史可以用来进行更好的预测)和动态预测(有以前执行的历史可以使用)。
对于静态预测,CPU预测在紧接着CCD_ 1之后的指令处继续执行。我不完全确定哪些CPU对JMP RAX
使用动态预测(而不仅仅是对Jc
分支);但对于那些这样做的人来说,它会覆盖静态预测。
一旦CPU有了预测的目标地址,它就会推测性地执行,直到它发现它预测的是对是错。如果预测正确,它会保留它所做的所有工作,JMP RAX
将几乎没有成本。
如果CPU预测错误,那么这与任何其他分支预测错误都没有什么不同(放弃所有推测执行的工作,然后返回到正确的RIP获取/解码)。
请注意,如果您的JMP RAX
是不可预测的,或者它之后的指令不太可能成为跳转的目标;英特尔建议在跳转后立即放入PAUSE
或UD2
,以防止不必要的推测性执行。在这种情况下,CPU将暂停(在找到正确的跳转目标之前什么都不做)。
还要注意的是,您希望移动MOV RAX, ..
,以便尽快执行它,以便尽快知道跳跃的目标,从而最大限度地减少停滞或推测性执行错误的时间。