【发布时间】:2019-12-22 18:22:04
【问题描述】:
我有这个 memchr 代码,我正在尝试使其不分支:
.globl memchr
memchr:
mov %rdx, %rcx
mov %sil, %al
cld
repne scasb
lea -1(%rdi), %rax
test %rcx, %rcx
cmove %rcx, %rax
ret
我不确定cmove 是否是分支指令。是吗?如果是这样,我该如何重新排列我的代码以使其不分支?
【问题讨论】:
-
你不需要
cld;所有标准调用约定保证/要求 DF=0 调用/ret。此外,movzbl %sil, %eax将比合并到 RAX 的低字节更有效。或者只是mov %esi, %eax很好,除非你的调用者只在 P6 系列 CPU 上编写 AL。 -
我认为由于缺乏研究努力而被否决。例如google for
is cmov a branch有几个命中率,这一切都很明显,包括 Why is a conditional move not vulnerable for Branch Prediction Failure?(可能是重复的)。我认为没有任何真正的方法可以改善这个问题。包含任何具体的错误主张或误导性来源只会导致反驳它们的更臃肿的答案。
标签: assembly x86-64 cpu-architecture micro-optimization branch-prediction