【问题标题】:assembly - x86_64 - predicates程序集 - x86_64 - 谓词
【发布时间】:2016-01-16 23:04:52
【问题描述】:

我正在为 x86_64 和 arm 编写一些程序集。

我想知道x86_64是否有一些定义分支谓词的方法。

我在英特尔文档中进行了搜索,但没有找到相关信息。

我们有cmov,但它相当慢,而cmp jmp 组合往往更快。

【问题讨论】:

  • 显示一些代码很可能会帮助人们更快地回答您的问题。
  • 唉,x86_64 没有 ARM 那样的谓词。
  • 真可惜!谢谢!
  • 现代 ARM(Thumb-2,AArch64)也没有它们。没有遗留指令集的范围。
  • 使用最近的微架构,CMOV 并不慢。过去它很慢,但根据英特尔优化手册和 Agner Fog 指令时序表,CMOV 在 Broadwell (2014) 和更新的微架构上是单周期的。在 P4 F4 上是 10 个周期。那很慢。在通过 Haswell 的 Core 2 上,这是两个周期。 (gmplib.org/~tege/x86-timing.pdf) 有一个关于 CMOV 的旧 Linus 咆哮,但那是从 2007 年开始的,英特尔从那以后改进了他们的实现。此外,他们出于各种原因推荐 CMOV。所以如果 CMOV 适合,你应该使用它。

标签: assembly optimization x86-64 predicate


【解决方案1】:

ARM 谓词是分支的替代。 IDK 你所说的“分支谓词”是什么意思。也许您的意思是“谓词条件”?

cmov 与只跳过一两条指令的分支相比,通常是值得的,如果它完全不可预测的话。 Broadwell 和 Skylake 将 cmov 作为单个 uop 运行,但之前的微架构需要 2 个 uop,因为它有 3 个输入依赖项。它还创建了数据依赖而不是控制依赖。分支预测在起作用时会更好。此外,cmov 不能接受直接操作数,这在很多情况下令人沮丧。

另一个可以使用条件作为输入的指令是setcc。使用xor reg,reg / set flags / setcc low-byte-of-reg,以避免在读取完整寄存器时出现部分寄存器停顿。

对于进位条件,sbb same,same 将产生 0 或 -1(用作 AND 掩码),或者 adc reg, 0 将产生 reg += CF

【讨论】:

  • 谢谢彼得!会试一试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 2014-05-02
  • 2017-08-02
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多