2016-03-29 20 views
2

`_addcarry_u64' への未定義参照:私はこのようなコードを持っている

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' 

私はフラグでコンパイルします。

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コンパイラを使用します。

+0

関連するhttp://stackoverflow.com/questions/29229371/addcarry-u64-and-addcarryx-u64-with-msvc-and-icc – Samer

+0

私の質問への回答が見つかりませんでした – Artyom

+0

GCCが必要です5.1以上... – isedev

答えて

4

_addcarry_u64がGCC 5.1に追加されました。

#include <x86intrin.h> 

あなたがon the Godbolt compiler explorerを見ることができるようにその後、あなたの例では、コンパイルされます:あなたはまた、組み込み関数が含ま必要があります。実際ADCX/ADOXにコンパイルする固有の関連_addcarryx_u64については


、あなたはまた、ADXの命令セット拡張を使用してコード-GENを有効にする-madxを必要としています。 -march=nativeは、これをサポートするホスト(/proc/cpuinfoを参照)に含まれ、-mtune=nativeを有効にします。

gccの新しいバージョン(まだ存在しません)が必要です。 gcc curently (2016) just compiles it to correct code using the normal adc

+0

ありがとう、助けてくれてありがとう – Artyom

+0

@jww:あなたの編集を修正しました:_addcarryx_u64と_addcarry_u64 aren同じことはしない。 (私の推測では、将来のgccとclangのバージョンでは、ADCX/ADOXを '-madx'でコンパイルすることになりますが、コンパイラにターゲットがサポートしているとすれば、それをサポートしているのはなぜですか?効率的なコード?) –

関連する問題