如何将lzcnt与gcc结合使用
我在看一些汇编代码,我在看tzcntl。对该指令的搜索将重定向到lzcnt。这些是相同的说明吗?是否可以将lzcnt与gcc一起使用 我见过这个例子: 尽管我对是否需要使用_lzcnt64或是否有32位版本感到困惑 总而言之:如何将lzcnt与gcc结合使用,c,gcc,C,Gcc,我在看一些汇编代码,我在看tzcntl。对该指令的搜索将重定向到lzcnt。这些是相同的说明吗?是否可以将lzcnt与gcc一起使用 我见过这个例子: 尽管我对是否需要使用_lzcnt64或是否有32位版本感到困惑 总而言之: tzcntl和lzcnt之间有什么区别 如何在gcc中正确使用lzcnt(代码、包含和编译) 我可以选择32位或64位版本吗 tzcnt统计尾随零,而lzcnt统计前导零 提供对各种寄存器宽度的lzcnt指令的访问: unsigned short __builtin_i
tzcnt
统计尾随零,而lzcnt
统计前导零
提供对各种寄存器宽度的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
,则会给出错误的结果
但是您可以使用通用内置程序进行位计数。见:
内置函数:int\uuuu内置函数(无符号长-长)
类似于\uuuu builtin\u clz
,不同的是参数类型是无符号long
tzcnt
统计尾随零,而lzcnt
统计前导零
提供对各种寄存器宽度的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
,则会给出错误的结果
但是您可以使用通用内置程序进行位计数。见:
内置函数:int\uuuu内置函数(无符号长-长)
类似于\uuuu builtin\u clz
,不同的是参数类型是无符号long
我认为我们不应该过分宣传
\uuuuuuu内置ia32.*
,它们是像\uuuuuuuzcnt32
(包括x86intrin.h
)这样的内部函数的实现细节。事实上,通用内置更好,除非在调用0
@marglisse时需要特定的行为,如答案中的链接所示,我可以找到类似于uuu builtin\u ia32\u lzcnt\u u32的东西。从我上面的另一个问题中,我看到了uu lzcnt64。我可能应该试试lzcnt32看看这是否管用。一般来说,我怎么知道uuulzcnt32(和uuulzcnt64)?uuuulzcnt32
在英特尔手册中有说明,但是英特尔内部函数对于GCC并不真正有用,因为它们需要编译器标志。关于所需的编译器标志,您是什么意思?如果不想在命令行上传递,可以直接使用内部函数在函数上放置\uuuuu属性(target(“lzcnt”))
。如果您想将\uuuuuuu builtin\u clz
扩展到此指令,您将需要类似的东西。在较旧的编译器版本上,英特尔内部头。我认为我们不应该宣传太多\uuuuuuuu builtin\u ia32*
,它们是像\uuuuuuuuuuuuuuuuzcnt32
(包括x86intrin.h
)这样的内部函数的实现细节。事实上,通用内置更好,除非在调用0
@marglisse时需要特定的行为,如答案中的链接所示,我可以找到类似于uuu builtin\u ia32\u lzcnt\u u32的东西。从我上面的另一个问题中,我看到了uu lzcnt64。我可能应该试试lzcnt32看看这是否管用。一般来说,我怎么知道uuulzcnt32(和uuulzcnt64)?uuuulzcnt32
在英特尔手册中有说明,但是英特尔内部函数对于GCC并不真正有用,因为它们需要编译器标志。关于所需的编译器标志,您是什么意思?如果不想在命令行上传递,可以直接使用内部函数在函数上放置\uuuuu属性(target(“lzcnt”))
。如果要将\uuuu builtin\u clz
扩展到此指令,则需要类似的内容。在较旧的编译器版本上,英特尔内部标头。