我在看这段代码:

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; }

为什么bsf指令前面有一个“ rep”?为什么__fls不是这种情况?

最佳答案

在支持它的处理器上将bfs转换为tzcnt是一种黑客。不过,它肯定会在代码中添加注释。引用指令集参考:


0F BC / r BSF r32,r / m32

F3 0F BC / r TZCNT r32,r / m32

TZCNT计算末尾的最低有效零位的数量
源操作数(第二个操作数)并在目标中返回结果
操作数(第一个操作数)。 TZCNT是BSF指令的扩展。
TZCNT和BSF指令之间的关键区别在于TZCNT
当源操作数为零时,提供操作数大小作为输出
对于BSF指令,如果源操作数为零,则
目标操作数未定义。在不支持的处理器上
TZCNT,指令字节编码作为BSF执行。


REP前缀当然是F3。)

09-28 06:49