x86-64管道是否像JMP RAX那样间接跳转?

时间:2016-05-22 03:01:09

标签: assembly nasm x86-64 intel pipeline

在x86-64中,如果使用以下汇编代码:

MOV RAX, (memory address)
JMP RAX

管道在执行分支之前是否停止(等待MOV完成RAX),还是像条件分支一样刷新管道?

1 个答案:

答案 0 :(得分:5)

对于大多数现代80x86 CPU;有静态预测(没有用于做出更好预测的历史记录)和动态预测(可以使用之前执行的历史记录)。

对于静态预测,CPU预测执行将在JMP RAX之后的指令处继续执行。我不完全确定哪些CPU对JMP RAX使用动态预测(而不仅仅是Jc分支);但是那些做它的人会覆盖静态预测。

一旦CPU具有预测的目标地址,它就会推测性地执行,直到它发现它是否正确/错误。如果它预测正确,它会保留它所做的所有工作,JMP RAX几乎没有成本。

如果CPU预测错误,那么这与任何其他分支错误预测没有什么不同(丢弃所有推测性执行的工作并返回到正确RIP处获取/解码)。

请注意,如果您的JMP RAX不可预测,或者它之后的指令太不可能成为跳转的目标;英特尔建议在跳转后立即放置PAUSEUD2以防止不必要的推测性执行。在这种情况下,CPU会停止(在找到正确的跳转目标之前不做任何事情)。

另请注意,您希望移动MOV RAX, ..以便尽快执行,以便尽快知道跳转的目标,以便您最大限度地减少停滞或投机性地执行错误的时间。