次の問題があります (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 に既に組み込まれていると思いました。
この問題の回避策はありますか?