我认为以下代码(但不是100%肯定)计算给定64位整数的LSB。
不幸的是,我不了解实施情况。什么是bsfq
?什么是=r
?
static inline unsigned lsb(uint64_t b)
{
size_t idx;
__asm__("bsfq %1, %0": "=r"(idx): "rm"(b));
return idx;
}
答案 0 :(得分:10)
BSF找到最低设置位的索引(如果有)。
q
是AT& T语法的操作数大小后缀,这是多余的,因为寄存器目标操作数无论如何都意味着大小。
=
中的=r
是modifier,表示注册被覆盖。 r
表示它必须是注册。 rm
可以是寄存器或内存操作数。请参阅gcc inline-asm docs和inline-assembly代码wiki。
我建议您用__builtin_ffsll
替换它,因为编译器可以推断出这一点,但不是关于内联汇编(除了它可以从约束/ clobbers中得知)。 (https://gcc.gnu.org/wiki/DontUseInlineAsm)