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