C++11 其中使用-std=c+时声明了uu v2di+;11根据GCC?

C++11 其中使用-std=c+时声明了uu v2di+;11根据GCC?,c++11,g++,inline-assembly,C++11,G++,Inline Assembly,在使用-std=c++11时,我在GCC4.9下编译一些代码时遇到问题。GCC4.9是在Debian8.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/g

在使用
-std=c++11
时,我在GCC4.9下编译一些代码时遇到问题。GCC4.9是在Debian8.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/算法:62,
...
错误:在“\uuu内置ia32\u pclmulqdq128”之前应为“')”
clmulepi64_si128(uuuM128i a,_uuuM128iB,常数int i)
^
直到我去搜索
\uuuuuu builtin\uIA32\uPCLMULQDQ128
,它才有意义:

$grep-IR'\uu内置ia32\u pclmulqdq128'/usr/lib 2>/dev/null | grep-iv clang
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/wmmintrin.h:return(uuu m128i)uuu builtin_ia32_uupclmulqdq128(uu v2di)uux,
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/wmmintrin.h:(((uuum128i)uuuuuuu内置ia32)pclmulqdq128(((uuuuv2di)uuuum128i)(X),
GCC似乎对
\uuuuv2di
执行中间转换,但缺少
\uuuv2di
。包括GCC的
超级头并没有提供它

我无法通过灰色浏览源文件找到
\uuu v2di
。它可能在那里,但我无法找到它。请参阅下面的
greps

当GCC下的
-std=c++11
时,
\uuu v2di
在哪里声明或定义


这里还有另一个扭曲…它在没有
-std=…
的情况下工作,但在
std=c++11
的情况下失败:

$make cxflags=“-DDEBUG-g3-O0-fPIC-march=native”vmac.o
g++-DDEBUG-g3-O0-fPIC-march=native-cvmac.cpp
$
以及:

$make cxflags=“-DDEBUG-g3-O0-std=c++11-fPIC-march=native-pipe”vmac.o
g++-DDEBUG-g3-O0-std=c++11-fPIC-march=native-pipe-cvmac.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/算法:62,

$grep-IR'\uuu v2di'/usr/lib 2>/dev/null | grep-iv-clang | grep'define'
$
$grep-IR'\uu v2di'/usr/lib 2>/dev/null | grep-iv clang | grep'struct'
$
$grep-IR'|u v2di'/usr/lib2>/dev/null | grep-iv clang | grep'}'
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h:uuuv2di src=uuuuu扩展(uuv2di){0,0};
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h:uuv2di-mask=uuuuuu扩展名(uuv2di){~0,~0};
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h:uuuv2di src=uuuuu扩展(uuv2di){0,0};
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h:uuv2di-mask=uuuuuu扩展名(uuv2di){~0,~0};
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/emmintrin.h:return uu扩展名uu(u m128i)(u v2di){uu q0,u q1};
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h:uuu v2di src=uuu扩展名uuu(uu v2di){0,0};
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h:uuv2di-mask=uuuu扩展名(uuv2di){~0,~0};
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h:uuu v2di src=uuu扩展名uuu(uu v2di){0,0};
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h:uuv2di-mask=uuuu扩展名(uuv2di){~0,~0};
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/emmintrin.h:return uu扩展名uu(u m128i)(u v2di){uu q0,u q1};
$grep-IR'|u v2di'/usr/lib2>/dev/null | grep-iv clang | grep'{'
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h:uuuv2di src=uuuuu扩展(uuv2di){0,0};
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h:uuv2di-mask=uuuuuu扩展名(uuv2di){~0,~0};
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h:uuuv2di src=uuuuu扩展(uuv2di){0,0};
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/avx2intrin.h:uuv2di-mask=uuuuuu扩展名(uuv2di){~0,~0};
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/emmintrin.h:return uu扩展名uu(u m128i)(u v2di){uu q0,u q1};
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h:uuu v2di src=uuu扩展名uuu(uu v2di){0,0};
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h:uuv2di-mask=uuuu扩展名(uuv2di){~0,~0};
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h:uuu v2di src=uuu扩展名uuu(uu v2di){0,0};
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/avx2intrin.h:uuv2di-mask=uuuu扩展名(uuv2di){~0,~0};
/usr/lib/gcc/x86_64-linux-gnu/4.9.2/include/emmintrin.h:return uu扩展名uu(u m128i)(u v2di){uu q0,u q1};

在我的v6版本中,
\uu v2di
在emmintrin.h中定义为:

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

在我的v6版本中,它在emmintrin.h中被定义为
typedef long\uuuu v2di\uuu attribute\uuuu((\uuu vector\u size\uuuuuuu16));
。这原来是一个混乱的bug…它只在调试版本下关闭优化时才会出现(
-DDEBUG-g3-O0
)。它似乎也只出现在GCC4.9(可能是4.8)上使用
-std=c++11