如何在gcc中使用lzcnt

时间:2017-11-12 04:53:39

标签: c gcc

我正在查看一些汇编代码,而且我看到了tzcntl。搜索该指令会重定向到lzcnt。这些是相同的说明吗?是否可以将lzcnt与gcc一起使用?

我看过这个例子: Intrinsic __lzcnt64 returns different values with different compile options

虽然我对是否需要使用__lzcnt64或是否有32位版本感到困惑。

总结如下:

  1. tzcntl和lzcnt之间的区别是什么?
  2. 如何正确使用lzcnt和gcc(代码,包含和编译)
  3. 我可以选择32位还是64位版本?

1 个答案:

答案 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