在我的一个应用程序中,我需要高效地对长数据流中的位进行去交错处理。理想情况下,我想在可用时使用 BMI2 pext_u32()
和/或 pext_u64()
x86_64 内部指令。我在互联网上搜索了关于 x86intrin.h
(GCC) 的文档,但找不到太多关于这个主题的内容;所以,我请求 StackOverflow 上的专家帮助我。
- 在哪里可以找到有关如何使用
x86intrin.h
中的函数的文档? - gcc 的
pext_*()
实现是否已经有代码可以回退,或者我是否需要自己编写回退代码(对于条件编译)? - 是否可以编写一个二进制文件,在目标不支持内在代码时自动回退到备用实现?如果是这样,如何做到这一点?
- 是否有一种已知的编程模式可以被 GCC 识别并在启用优化和使用
-mbmi2< 进行编译时自动转换为
?pext_*()
/
最佳答案
英特尔发布 Intrinsics Guide ,这也适用于 GCC。如果您使用这些内部函数,您将不得不编写自己的后备代码。
使用IFUNC resolvers可以实现实现的自动切换, 但对于非库代码,使用条件或函数指针可能更简单。
查看 gcc/config/i386/i386.md
和 gcc/config/i386/i386.c
文件,我在 GCC 8 中没有看到任何内容这将自动选择源代码中没有内在函数的 pext
指令。
关于c - 如何使用 x86intrin.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49602761/