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

时间:2015-10-16 16:32:56

标签: 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; }

为什么会有#34; rep"在bsf指令面前?为什么__fls不是这种情况?

1 个答案:

答案 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。)

相关问题