6

次の問題があります (g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4):

_mm256_slli_si256()次のように直接使用する場合:

__m256i x = _mm256_set1_epi8(0xff);
x = _mm256_slli_si256(x, 3);

コードは問題なくコンパイルされます ( g++ -Wall -march=native -O3 -o shifttest shifttest.C)。

ただし、関数にラップすると

__m256i doit(__m256i x, const int imm)
{
  return _mm256_slli_si256(x, imm);
}

コンパイラはそれを不平を言う

/usr/lib/gcc/x86_64-linux-gnu/4.8/include/avx2intrin.h: In function '__m256i doit(__m256i, int)':
/usr/lib/gcc/x86_64-linux-gnu/4.8/include/avx2intrin.h:651:58: error: the last argument must be an 8-bit immediate
   return (__m256i)__builtin_ia32_pslldqi256 (__A, __N * 8);

機能の使用の有無は問いません。

_mm256_slli_si32(x, imm)関数 doit() は代わりにeg を使用するとコンパイルされ、即値オペランドも必要になるため、これは即値オペランドでは問題になりません_mm256_slli_si32()

関連するバグレポートがあります

https://gcc.gnu.org/bugzilla/show_bug.cgi?format=multiple&id=54825

しかし、それはかなり古く (2012 年)、gcc 4.8.0 に関連しているため、パッチは g++ 4.8.4 に既に組み込まれていると思いました。

この問題の回避策はありますか?

4

2 に答える 2