如何使用x86intrin.h

Mic*_*ack 6 c gcc x86-64 intrinsics bmi

在我的一个应用程序中,我需要有效地对长数据流中的位进行解交织。理想情况下,我想使用BMI2 pext_u32()和/或pext_u64()x86_64内部指令(如果可用)。我在x86intrin.hGCC)上搜索了互联网上的文档,但在该主题上找不到太多东西;因此,我要求StackOverflow上的专家帮助我。

  1. 在哪里可以找到有关如何使用函数的文档x86intrin.h
  2. gcc的实现pext_*()背后是否已经有代码可以使用,还是我需要自己编写后备代码(用于条件编译)?
  3. 如果目标不支持内在函数,是否有可能编写一个二进制文件,该二进制文件会自动退回到备用实现?如果是这样,怎么做?
  4. 是否存在一种已知的编程模式,当启用并启用优化时,GCC会识别该模式并将其自动转换为?pext_*()-mbmi2

Flo*_*mer 6

Intel 发布了Intrinsics Guide,该指南也适用于 GCC。如果使用这些内在函数,则必须编写自己的回退代码。

您可以通过使用IFUNC resolvers实现实现的自动切换,但对于非库代码,使用条件或函数指针可能更简单。

查看gcc/config/i386/i386.mdgcc/config/i386/i386.c文件,我在 GCC 8 中看不到任何会自动选择pext源代码中没有内在函数的指令的内容。

  • 抱歉,没有 IFUNC 解析器是 GNU/ELF 功能。对不起。 (2认同)