我在看一些汇编代码,我在看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/