2016-11-30 139 views
1

我有下面的代码,我认为(但不是100%肯定)计算给定的64位整数的LSB。这个LSB函数做了什么?

不幸的是,我不明白的实施。什么是bsfq?什么是=r

static inline unsigned lsb(uint64_t b) 
{ 
    size_t idx; 
    __asm__("bsfq %1, %0": "=r"(idx): "rm"(b)); 
    return idx; 
} 

回答

10

BSF找到最低设定位的索引(如果有的话)。

q是AT & T语法的操作数大小后缀,由于寄存器目标操作数意味着大小,所以这是冗余的。

= in =r是一个modifier表示寄存器被覆盖。 r表示它必须是注册表。 rm可以是寄存器或内存操作数。请参阅gcc inline-asm docs标记wiki。我建议你用__builtin_ffsll来代替这个,因为编译器可以推断出这个问题,但不是关于内联汇编(除了从约束/ clobbers中可以看出的内容外)。 (https://gcc.gnu.org/wiki/DontUseInlineAsm