当在GCC下使用-std = c ++ 11时,声明__v2di在哪里? [英] Where is __v2di declared when using -std=c++11 under GCC?
问题描述
使用 -std = c ++ 11
时,在GCC 4.9下编译一些代码时遇到问题。 GCC 4.9是在Debian 8.5(稳定版)下提供的,因此它相当受欢迎。
相关代码是:
__ inline __m128i
clmulepi64_si128(__m128i a,__m128i b,const int i)
{
asm(pclmulqdq%2,%1,%0 :+ x(a):xm(b),i(i));
return a;
}
尝试编译它会导致:
在/usr/lib/gcc/x86_64-linux-gnu/4.9/include/x86intrin.h:43:0中包含的文件中,
来自/usr/include/x86_64-linux-gnu/c++/4.9/bits/opt_random.h:33,
来自/usr/include/c++/4.9/random:50,
来自/usr/include/c++/4.9/bits/stl_algo.h:66,
来自/usr/include/c++/4.9/algorithm:62,
...
错误: expected')'before'__builtin_ia32_pclmulqdq128'
clmulepi64_si128(__m128i a,__m128i b,const int i)
^
除非我为 __ builtin_ia32_pclmulqdq128
:
class =lang-none prettyprint-override> $ 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>
超级标题不提供它。
code> __ v2di 通过greping通过源文件它可能在那里,但我没有能够找到它下面的 greps
。
-std = c ++时,
在GCC下? __ v2di
11
这里有另一个扭曲...它不需要 -std = ...
,但它失败并且 std = c ++ 11
:
$ make CXXFLAGS =-DDEBUG -g3 -O0 -fPIC -march = nativevmac.o
g ++ -DDEBUG - g3 -O0 -fPIC -march = native -c vmac.cpp
$
$ make CXXFLAGS =-DDEBUG -g3 -O0 -std = c ++ 11 - fPIC -march = native -pipevmac.o
g ++ -DDEBUG -g3 -O0 -std = c ++ 11 -fPIC -march = native -pipe -c vmac.cpp
在包含的文件中/usr/lib/gcc/x86_64-linux-gnu/4.9/include/x86intrin.h:43:0,
来自/usr/include/x86_64-linux-gnu/c++/4.9/bits/opt_random.h :33,
来自/usr/include/c++/4.9/random:50,
来自/usr/include/c++/4.9/bits/stl_algo.h:66,
来自/ 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};在我的v6版本中,
在我的v6版本中,
typedef long long __v2di __attribute__((__vector_size__ )));
I'm having trouble compiling some code under GCC 4.9 when using -std=c++11
. GCC 4.9 is provided under Debian 8.5 (Stable), so its fairly popular.
The relevant code is:
__inline __m128i
clmulepi64_si128 (__m128i a, __m128i b, const int i)
{
asm ("pclmulqdq %2, %1, %0" : "+x"(a) : "xm"(b), "i"(i));
return a;
}
Attempting to compile it results in:
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)
^
It does not make a lot of sense until I go grepping for __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),
It appears GCC performs an intermediate cast to __v2di
, but __v2di
is missing. Including GCC's <x86intrin.h>
super header does not provide it.
I can't find __v2di
by grepping through the source files. Its probably there, but I have not been able to locate it. See below for the greps
.
Where is __v2di
declared or defined when -std=c++11
under GCC?
Here's another twist... It works without -std=...
, but it fails with std=c++11
:
$ make CXXFLAGS=" -DDEBUG -g3 -O0 -fPIC -march=native" vmac.o
g++ -DDEBUG -g3 -O0 -fPIC -march=native -c vmac.cpp
$
And:
$ 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 };
In my v6 build, __v2di
is defined in emmintrin.h as:
typedef long long __v2di __attribute__ ((__vector_size__ (16)));
这篇关于当在GCC下使用-std = c ++ 11时,声明__v2di在哪里?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!