如何从 __m256i AVX2 寄存器中提取一个字节到另一个 __m256i 寄存器中?

How can I extract a byte from __m256i AVX2 register into another __m256i register?

给定一个 __m256i 寄存器和一个索引 i,我想从寄存器中存储的每个值中提取一个字节并将其保存在另一个 __m256i 寄存器中。同样在对第二个寄存器执行一些计算之后,我想在不触及其他字节的情况下将字节加载回第一个寄存器。

Example:
index i = 2
__m256i a:
           3210
|AAAA|AAAA|AAAA|AAAA|AAAA|AAAA|AAAA|AAAA|

__m256i b:
|FAFF|FAFF|FAFF|FAFF|FAFF|FAFF|FAFF|FAFF|

// some calculation

__m256i a:
|A6AA|A6AA|A6AA|A6AA|A6AA|A6AA|A6AA|A6AA|

很抱歉,如果之前有人问过这个问题,但由于我是这个话题的新手,所以很难找到这个话题的答案。谢谢!

我试着概括上面的答案:

const int index = 2; // byte index
__m256i mask = _mm256_set1_epi32(0xFF << index*8); // bit mask |0F00|0F00|...|0F00|

__m256i a; // source vector |AAAA|AAAA|...|AAAA|
__m256i b = _mm256_blendv_epi8(_mm256_set1_epi8(-1), a, mask);// extract byte |FAFF|FAFF|...|FAFF|

b;  // after some manipulations |BBBB|BBBB|...|BBBB|
a = _mm256_blendv_epi8(a, b, mask); // store byte |ABAA|ABAA|...|ABAA|