C++11 _mm256_shuffle_epi32的铿锵本质

C++11 _mm256_shuffle_epi32的铿锵本质,c++11,clang++,avx2,C++11,Clang++,Avx2,我正试图在Clang上编译一些AVX2代码。然而,AVX2的clangs实现似乎不符合Intel的内部文档 此代码 static inline __m256i maskCompress(const Vec4q& input, const uint8_t bitMask) { const int mask = maskCompressLUT4[bitMask]; #ifdef __AVX2__ __m256i retval = _mm256_shuffle_epi32(in

我正试图在Clang上编译一些AVX2代码。然而,AVX2的clangs实现似乎不符合Intel的内部文档

此代码

static inline __m256i maskCompress(const Vec4q& input, const uint8_t bitMask) {
    const int mask = maskCompressLUT4[bitMask];
#ifdef __AVX2__
    __m256i retval = _mm256_shuffle_epi32(input, mask);
    return retval;
#else ...
}
结果:

error: cannot initialize a variable of type '__m256i' with an rvalue of type 'void'
如果试着洗牌,我会得到:

error: index for __builtin_shufflevector must be a constant integer
据此:

使用只有在运行时才知道的控制掩码进行洗牌应该是完全可行的,如果不知道,洗牌就没有什么意义了?。Shuffle也应该返回一个_m256i,但clang似乎认为该方法不会返回任何结果

包括我在内


我也试过permute,似乎同样坏了。有没有办法让shuffle按照Clang中的规定工作?

shuffle值必须是立即数=在操作码中编码=仅编译时常量。该死。。。所以我将不得不使用变量shuffle?是的,您需要_mm256_permutevar8x32_epi32。但是为什么clang会抱怨返回值无效?如果您为第二个参数传递一个文本常量,它还会抱怨吗?