我正在查看一些汇编代码,而且我看到了tzcntl。搜索该指令会重定向到lzcnt。这些是相同的说明吗?是否可以将lzcnt与gcc一起使用?
我看过这个例子: Intrinsic __lzcnt64 returns different values with different compile options
虽然我对是否需要使用__lzcnt64或是否有32位版本感到困惑。
总结如下:
答案 0 :(得分:3)
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
。