问题是:
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
提前致谢。