找到第一位,使用bsf,blf查找最后一位汇编

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呢?

Jes*_*ter 5

这是打开一个黑客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当然是.)

  • 是的,对于某些cpus,可能会有性能优势.根据Agner Fog的文档,大多数AMD cpus需要3或4个时钟用于`BSF`,但只有2个用于`TZCNT`.在英特尔Haswell,他们需要同时. (3认同)