当在GCC下使用-std = c ++ 11时,声明__v2di在哪里? [英] Where is __v2di declared when using -std=c++11 under GCC?

查看:353
本文介绍了当在GCC下使用-std = c ++ 11时,声明__v2di在哪里?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 -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 ++时, __ v2di 11 在GCC下?






这里有另一个扭曲...它不需要 -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版本中,


在emmintrin.h中定义为:

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆