w00*_*00d 3 assembly kernel bit-manipulation x86-64
我正在看这段代码:
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当然是.)