程序集 - x86_64 - 谓词
assembly - x86_64 - predicates
我正在为 x86_64 和 arm 编写一些程序集。
我想知道x86_64是否有一些定义分支谓词的方法。
我在英特尔文档中进行了搜索,但未能找到相关信息。
我们有 cmov
,但它相当慢,cmp jmp
组合 往往 更快。
ARM 谓词是分支的替代。 IDK 你所说的 "branch predicates" 是什么意思。也许你的意思是 "predicate conditions"?
cmov
与只跳过一两条指令的分支相比通常是值得的,如果它完全不可预测的话。 Broadwell 和 Skylake 运行 cmov 作为单个 uop,但以前的微体系结构需要 2 uop,因为它具有 3 个输入依赖项。它还创建数据依赖性而不是控制依赖性。分支预测,当它起作用时,会更好。此外,cmov
不能采用立即操作数,这在很多情况下令人沮丧。
另一个可以使用条件作为输入的指令是setcc
。使用 xor reg,reg
/ set flags / setcc low-byte-of-reg
,以避免在读取完整寄存器时出现 partial-reg 停顿。
对于进位条件,sbb same,same
将产生 0 或 -1(用作 AND 掩码),或者 adc reg, 0
将产生 reg += CF
.
我正在为 x86_64 和 arm 编写一些程序集。
我想知道x86_64是否有一些定义分支谓词的方法。
我在英特尔文档中进行了搜索,但未能找到相关信息。
我们有 cmov
,但它相当慢,cmp jmp
组合 往往 更快。
ARM 谓词是分支的替代。 IDK 你所说的 "branch predicates" 是什么意思。也许你的意思是 "predicate conditions"?
cmov
与只跳过一两条指令的分支相比通常是值得的,如果它完全不可预测的话。 Broadwell 和 Skylake 运行 cmov 作为单个 uop,但以前的微体系结构需要 2 uop,因为它具有 3 个输入依赖项。它还创建数据依赖性而不是控制依赖性。分支预测,当它起作用时,会更好。此外,cmov
不能采用立即操作数,这在很多情况下令人沮丧。
另一个可以使用条件作为输入的指令是setcc
。使用 xor reg,reg
/ set flags / setcc low-byte-of-reg
,以避免在读取完整寄存器时出现 partial-reg 停顿。
对于进位条件,sbb same,same
将产生 0 或 -1(用作 AND 掩码),或者 adc reg, 0
将产生 reg += CF
.