我有以下问题(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);
无论是否使用该功能。
这对于直接操作数来说不是问题,因为如果我使用 eg_mm256_slli_si32(x, imm)
代替,函数 doit() 会编译,并且_mm256_slli_si32()
还需要立即操作数。
有一个相关的错误报告
https://gcc.gnu.org/bugzilla/show_bug.cgi?format=multiple&id=54825
但它已经很老了(2012 年)并且与 gcc 4.8.0 相关,所以我认为该补丁已经被合并到 g++ 4.8.4 中。
有解决此问题的方法吗?