【发布时间】:2013-05-07 13:10:34
【问题描述】:
我听说 x86 比较指令:cmp x, y 进行减法并根据结果设置各种标志。
现在,如果我只想测试两个操作数是否相等怎么办?做异或而不是减法不会快得多吗?我的问题是,是否有一条指令可以与 XOR 进行比较以判断两个操作数是否相等?也许它看起来像这样:cmpeq x, y 或 cmpxor x, y。
我猜如果我只是想测试是否相等,使用cmpxor 会比使用减法的cmp 更快。有没有像cmpxor 这样的指令可以让我加快速度?
我还想说我知道xor 将设置zero flag。但是如果我做xor x, y,它会改变x。我不想要那个。我想要一个比较指令,它会留下两个操作数。
【问题讨论】:
-
你为什么认为 XOR 会“快得多”?
-
它不会“快得多”,因为
cmp已经和任何其他指令一样快(包括xor)。在某些 µarch 上,cmp指令甚至可以与前端的依赖分支指令融合到单个 µop 中,从而有效地使其更快。这一切都记录在英特尔的优化手册中,该手册可免费获得且值得一读。 -
Ira Baxter 说得很好:从技术上讲,SUB 应该比 XOR 花费更长的时间,因为进位必须“涟漪”通过所有位,而 XOR 是逐位并行的。 这是我的逻辑。
-
@Aaron 没有现代 CPU 使用像这样的波纹进位加法器,否则仅执行简单的 32 位加法/减法就需要荒谬的 32 个周期,而 64 位的数字是 64 位的两倍位系统。有许多更快的变体,例如carry-lookahead adder,它们以空间换取速度。类似的方法被用于加速更复杂的运算,如乘法、平方根......这样它们就可以在几个周期内完成
标签: performance assembly x86 comparison