我有以下代码,我认为(但不是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;
}
Run Code Online (Sandbox Code Playgroud)
har*_*old 10
BSF找到最低设置位的索引(如果有).
q 是AT&T语法的操作数大小后缀,这是多余的,因为寄存器目标操作数无论如何都意味着大小.
该=中=r是一个修改器说,寄存器被覆盖.这r意味着它必须是一个登记册.rm可以是寄存器或内存操作数.请参阅gcc inline-asm文档和内联汇编标记wiki.
我建议你替换它__builtin_ffsll,因为编译器可以推断出这一点,但不是关于内联汇编(除了它可以从约束/ clobbers中得知).(https://gcc.gnu.org/wiki/DontUseInlineAsm)
| 归档时间: |
|
| 查看次数: |
446 次 |
| 最近记录: |