我在看一些汇编代码,我在看tzcntl。对该指令的搜索将重定向到lzcnt。这些是相同的说明吗?可以将lzcnt与gcc一起使用吗?
我看过这个例子:
Intrinsic __lzcnt64 returns different values with different compile options
尽管我不知道是否需要使用lzcnt64,或者是否有32位版本。
总而言之:
如果有的话,tzcntl和lzcnt有什么区别?
如何在gcc中正确使用lzcnt(代码、包含和编译)
我可以选择32位或64位版本吗?

最佳答案

tzcnt计算尾随零,而lzcnt计算前导零。
x86 compiler built-ins提供对不同寄存器宽度的lzcnt指令的访问:

unsigned short __builtin_ia32_lzcnt_u16(unsigned short);
unsigned int __builtin_ia32_lzcnt_u32(unsigned int);
unsigned long long __builtin_ia32_lzcnt_u64 (unsigned long long);

但这些只在-mlzcnt中可用,如果CPU不支持将rep bsr作为lzcnt执行,则会产生错误的结果。
但您可以使用通用内置程序进行位计数。见the GCC documentation
内置功能:int __builtin_clzll (unsigned long long)
类似于__builtin_clz,只是参数类型是unsigned long long

关于c - 如何在gcc中使用lzcnt,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47245581/

10-08 23:53