我正在看这段代码:
http://lxr.free-electrons.com/source/arch/x86/include/asm/bitops.h
static inline unsigned long __ffs(unsigned long word)
{
asm("rep; bsf %1,%0"
: "=r" (word)
: "rm" (word));
return word;
}
为什么会有#34; rep"在bsf指令面前?为什么__fls
不是这种情况?
答案 0 :(得分:5)
在支持它的处理器上将bfs
转换为tzcnt
是一种破解。但肯定会在代码中发表评论。引用指令集引用:
0F BC / r BSF r32,r / m32
F3 0F BC / r TZCNT r32,r / m32
TZCNT计算尾随最低有效位的数量 源操作数(第二个操作数)并返回目标中的结果 操作数(第一个操作数)。 TZCNT是BSF指令的扩展。 TZCNT和BSF指令之间的关键区别在于TZCNT 当源操作数为0时,提供操作数大小作为输出 BSF指令的情况,如果源操作数为零,则内容为 目标操作数未定义。在不支持的处理器上 TZCNT,指令字节编码作为BSF执行。
(REP
前缀当然是F3
。)