【问题标题】:x86 Comparison Instruction That Uses XOR Instead of Subtraction使用 XOR 而不是减法的 x86 比较指令
【发布时间】:2013-05-07 13:10:34
【问题描述】:

我听说 x86 比较指令:cmp x, y 进行减法并根据结果设置各种标志。

现在,如果我只想测试两个操作数是否相等怎么办?做异或而不是减法不会快得多吗?我的问题是,是否有一条指令可以与 XOR 进行比较以判断两个操作数是否相等?也许它看起来像这样:cmpeq x, ycmpxor 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


【解决方案1】:

XOR、SUB、CMP、TEST 等基本机器操作都非常简单,因此它们的运行速度都非常快。它们还设置相同的条件代码位。从比较相等的角度来看,这些都以相同的方式设置 Z 位;其他位设置不同,因为这些操作计算不同的结果。

对于 x86 CPU,它们的执行时间没有差异,因为它们都使用相同的路径通过芯片。因此,您可以在计算您想要的答案时使用它们中的任何一个而不会造成性能损失。 (从技术上讲,SUB 应该比 XOR 花费更长的时间,因为进位必须“涟漪”通过所有位,而 XOR 是逐位并行的。CPU 设计人员已经找到了构建极快进位计算逻辑的方法,因此有效时间差异并不显着。他们有很大的动机这样做,因为计算机所做的大部分工作都是“添加”])。

作为一种风格约定,如果您认为您正在“比较两个(机器字大小的)值”,您可能应该使用 CMP 指令,因为它将您的想法传达给代码的读者。它的优点是它不会破坏其中一个操作数,一旦您编写了足够的代码,您最终会发现使用它而不是 XOR 是一个非常有说服力的论据。 (TEST 有这个很好的属性,对于检查位也很有用)。

还有其他类型的值比较其他 x86 指令更好:浮点比较、字符串比较、向量寄存器比较等。这些指令花费的时间与基本操作不同,因为它们必须执行更复杂的事情(例如比较多个数据字)。

【讨论】:

  • 你有一张可以查询执行时间的表格吗?我一直在找这个,但没有找到。
  • 英特尔的性能优化手册里就有这样的表格
  • 所以cmpcmpxor 之间的速度无论如何都没有差异。这回答了我的问题,谢谢。
  • Agner Fog 的优化指南agner.org/optimize - item 4 中非常有名的此类表资源。这些资源也涵盖了非 Intel x86 兼容的 CPU(AMD 和其他)。
猜你喜欢
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 2014-06-27
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多