【发布时间】:2015-01-24 01:28:29
【问题描述】:
我了解当一个分支很容易预测时,最好使用 IF 语句,因为该分支是完全免费的。我了解到,如果分支不容易预测,那么 CMOV 会更好。但是,我不太明白如何实现这一点?
问题域肯定还是一样——我们不知道下一条要执行的指令的地址?所以我不明白在执行 CMOV 时,如何在管道的整个过程中帮助指令提取器(过去 10 个 CPU 周期)选择正确的路径并防止管道停止?
有人可以帮助我了解 CMOV 如何改进分支吗?
【问题讨论】:
-
我们如何“不知道要执行的下一条指令的地址”?如果指令序列为
I1; CMOV; I3,则执行指令I1,然后是CMOV,然后是I3,始终按此顺序执行。在I1之后的是CMOV。在CMOV之后的是I3。 -
单指令长分支是一种非常特殊的情况;它适用于通用分支不承认的优化。
-
另外,您可以将 CMOV 视为根本不是一个分支,而是一个具有
Dest = (Dest AND NOT Condition) OR (Source AND Condition)效果的命令,其中 Source、Dest 和 Condition 是位。 -
Seva 的解释比任何一个答案都好得多。它是数据依赖而不是控制依赖。它有 3 个输入(dest、src 和 flags),并产生一个输出(dest)。对于 OOO 管道,可以完全像
adc一样跟踪它(具有相同的三个输入和一个输出)。
标签: assembly x86 branch cpu-architecture