AVX2:如何将单个元素从向量移动到向量

时间:2017-10-27 11:32:46

标签: sse simd neon avx avx2

问题是:

a1[7] = b[6];
a1[15] = b[14];
a2[7] = b[0];
a2[15] = b[8];

所有三个向量都是uint8x16_t

aarch64 NEON上,这将是相当微不足道的:

mov a1.b[7], b.b[6]
mov a1.b[15], b.b[14]
mov a2.b[7], b.b[0]
mov a2.b[15], b.b[8]

如何在AVX2上执行此操作?

我已经相应地将向量加载到__m256i a, b;,其中b包含相同的128位向量两次,然后:

        const __m256i shuffle=_mm256_set_epi64x(0x0808080808080808, 0x0000000000000000, \
                                                0x0e0e0e0e0e0e0e0e, 0x0606060606060606);
        const __m256i mask=_mm256_set1_epi64x(0x8000000000000000);
        .
        .
        .
        b = _mm256_shuffle_epi8(b, shuffle);
        a = _mm256_blendv_epi8(a, b, mask);

是的,它按照我想要的方式工作,但我无法摆脱除了最佳之外的其他任何东西的感觉,为这种琐碎的操作牺牲了两个寄存器。

我错过了什么吗?是否有更有效的方法来处理这个问题?

我应该将其修改为64位移位然后混合吗?那将需要相同数量的寄存器和指令。有什么建议吗?

请注意,我无法覆盖a

中的其他通道

提前致谢。

0 个答案:

没有答案