如何将lzcnt与gcc结合使用

如何将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

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

我见过这个例子:

尽管我对是否需要使用_lzcnt64或是否有32位版本感到困惑

总而言之:

  • tzcntl和lzcnt之间有什么区别
  • 如何在gcc中正确使用lzcnt(代码、包含和编译)
  • 我可以选择32位或64位版本吗
  • 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
    扩展到此指令,则需要类似的内容。在较旧的编译器版本上,英特尔内部标头。