未定义的引用`_addcarry_u64'

时间:2016-03-29 19:02:03

标签: c intel intrinsics

我有这样的代码:

uint8_t carry;

carry = 0;
for (i = 0; i < 8; i++)
    carry = _addcarry_u64 (carry, *(buf1 + i),
            *(buf2 + i), buf1 + i);

以下错误:

undefined reference to `_addcarry_u64'

我使用flags编译:

CCFLAGS = -Wall -g -msse -msse2 -msse3 -msse4 -mavx -mavx2 -fopenmp

我还包括:

#include <immintrin.h>
#include <emmintrin.h>
#include <pmmintrin.h>
#include <smmintrin.h>
#include <omp.h>

尝试使用内在函数中的bittest函数时遇到的同样问题。

我使用x86_64 ubuntu 14.04和gcc编译器。

1 个答案:

答案 0 :(得分:4)

在GCC 5.1中添加了

_addcarry_u64。您还需要内在函数包括:

 #include <x86intrin.h>

然后您的示例将编译,就像您可以看到on the Godbolt compiler explorer

对于实际编译到_addcarryx_u64 / ADOX的相关ADCX内在函数,您还需要-madx来使用ADX指令集扩展来启用代码生成。 -march=native会在支持它的主机上显示此内容(请参阅/proc/cpuinfo),并启用-mtune=native

您还需要更新版本的gcc(目前尚不存在)。 gcc curently (2016) just compiles it to correct code using the normal adc