我在看这段代码:
http://lxr.free-electrons.com/source/arch/x86/include/asm/bitops.hstatic 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
。)