有没有办法用AVX2写入_mm256_shldi_epi8(a,b,1)? (在向量之间每8位元素移动一位)

时间:2018-07-23 09:52:16

标签: c++ avx avx2

我需要将b的每个元素的最高位移到a的相应元素的底部,例如AVX512VBMI2 _mm256_shldi_epi16/32/64,计数为1

有人知道一种改变这种方式的方法吗?

示例:

__m256i x = { 11001100, 00110011, 11001100, 00110011,... x16 }
__m256i y = { 10111100, 10001011, 11000010, 01100111,... x16 }
__m256i res = _mm256_shldi_epi16(x,y);

然后res包含:

10011001011001111001100101100110,... x16

(编辑者的注:这个问题先前描述为_mm256_sllv_epi8sllv是一个可变计数移位,其中每个元素的计数都来自另一个来源中的相应元素,与两次换班。)

1 个答案:

答案 0 :(得分:4)

显然,任务是将a的字节左移1,同时将b中相应的字节的高位移入,就像固定距离为1的微小漏斗移位。左移可以通过加一个字节来完成,然后从b复制该位:

__m256i funnel_left1_epi8(__m256i a, __m256i b) {
    __m256i a2 = _mm256_add_epi8(a, a);
    __m256i bit_from_b = _mm256_and_si256(_mm256_srli_epi16(b, 7), _mm256_set1_epi8(1));
    return _mm256_or_si256(a2, bit_from_b);
}