2016-06-27 2 views
1

У меня возникли проблемы с составлением кода под GCC 4.9 при использовании -std=c++11. GCC 4.9 предоставляется под Debian 8.5 (Stable), поэтому он довольно популярен.Где __v2di объявляется при использовании -std = C++ 11 в GCC?

Соответствующий код:

__inline __m128i 
clmulepi64_si128 (__m128i a, __m128i b, const int i) 
{ 
    asm ("pclmulqdq %2, %1, %0" : "+x"(a) : "xm"(b), "i"(i)); 
    return a; 
} 

Попытка собрать это приводит:

In file included from /usr/lib/gcc/x86_64-linux-gnu/4.9/include/x86intrin.h:43:0, 
       from /usr/include/x86_64-linux-gnu/c++/4.9/bits/opt_random.h:33, 
       from /usr/include/c++/4.9/random:50, 
       from /usr/include/c++/4.9/bits/stl_algo.h:66, 
       from /usr/include/c++/4.9/algorithm:62, 
       ... 
error: expected ‘)’ before ‘__builtin_ia32_pclmulqdq128’ 
clmulepi64_si128 (__m128i a, __m128i b, const int i) 
^ 

Это не делает много смысла, пока я не иду оглавлению для __builtin_ia32_pclmulqdq128:

$ grep -IR '__builtin_ia32_pclmulqdq128' /usr/lib 2>/dev/null | grep -iv clang 
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/wmmintrin.h: return (__m128i) __builtin_ia32_pclmulqdq128 ((__v2di)__X, 
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/wmmintrin.h: ((__m128i) __builtin_ia32_pclmulqdq128 ((__v2di)(__m128i)(X), 

Похоже, что GCC выполняет промежуточное литье до __v2di, но __v2di отсутствует. В том числе суперкоманда GCC <x86intrin.h> не предоставляет его.

Я не могу найти __v2di путем grepping через исходные файлы. Вероятно, там, но я не смог его найти. См. Ниже для greps.

Где __v2di указано или определено, когда -std=c++11 под GCC?


Вот еще один поворот ... Он работает без -std=..., но он терпит неудачу с std=c++11:

$ make CXXFLAGS=" -DDEBUG -g3 -O0 -fPIC -march=native" vmac.o 
g++ -DDEBUG -g3 -O0 -fPIC -march=native -c vmac.cpp 
$ 

И:

$ make CXXFLAGS=" -DDEBUG -g3 -O0 -std=c++11 -fPIC -march=native -pipe" vmac.o 
g++ -DDEBUG -g3 -O0 -std=c++11 -fPIC -march=native -pipe -c vmac.cpp 
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.9/include/x86intrin.h:43:0, 
       from /usr/include/x86_64-linux-gnu/c++/4.9/bits/opt_random.h:33, 
       from /usr/include/c++/4.9/random:50, 
       from /usr/include/c++/4.9/bits/stl_algo.h:66, 
       from /usr/include/c++/4.9/algorithm:62, 

$ grep -IR '__v2di' /usr/lib 2>/dev/null | grep -iv clang | grep 'define' 
$ 

$ grep -IR '__v2di' /usr/lib 2>/dev/null | grep -iv clang | grep 'struct' 
$ 

$ grep -IR '__v2di' /usr/lib 2>/dev/null | grep -iv clang | grep '}'                    
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h: __v2di src = __extension__ (__v2di){ 0, 0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h: __v2di mask = __extension__ (__v2di){ ~0, ~0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h: __v2di src = __extension__ (__v2di){ 0, 0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h: __v2di mask = __extension__ (__v2di){ ~0, ~0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/emmintrin.h: return __extension__ (__m128i)(__v2di){ __q0, __q1 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h: __v2di src = __extension__ (__v2di){ 0, 0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h: __v2di mask = __extension__ (__v2di){ ~0, ~0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h: __v2di src = __extension__ (__v2di){ 0, 0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h: __v2di mask = __extension__ (__v2di){ ~0, ~0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/emmintrin.h: return __extension__ (__m128i)(__v2di){ __q0, __q1 }; 

$ grep -IR '__v2di' /usr/lib 2>/dev/null | grep -iv clang | grep '{' 
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h: __v2di src = __extension__ (__v2di){ 0, 0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h: __v2di mask = __extension__ (__v2di){ ~0, ~0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h: __v2di src = __extension__ (__v2di){ 0, 0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h: __v2di mask = __extension__ (__v2di){ ~0, ~0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/emmintrin.h: return __extension__ (__m128i)(__v2di){ __q0, __q1 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h: __v2di src = __extension__ (__v2di){ 0, 0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h: __v2di mask = __extension__ (__v2di){ ~0, ~0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h: __v2di src = __extension__ (__v2di){ 0, 0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h: __v2di mask = __extension__ (__v2di){ ~0, ~0 }; 
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/emmintrin.h: return __extension__ (__m128i)(__v2di){ __q0, __q1 }; 
+1

В моей v6 сборки, она определяется в emmintrin.h как 'ЬурейеЕ долго долго __v2di __attribute__ ((__vector_size__ (16)))'. –

ответ

2

В моей v6 сборки , __v2di определяется в emmintrin.h как:

typedef long long __v2di __attribute__ ((__vector_size__ (16))); 
+0

Это оказалось одним из таких перепутанных ошибок ... Оно появляется только тогда, когда оптимизация отключена в сборках Debug ('-DDEBUG -g3 -O0'). Он также появляется только на GCC 4.9 (возможно, 4.8) с помощью '-std = C++ 11'. – jww

Смежные вопросы