将 __m128i 中的每个 DW 右移不同的量

Shift right every DW in a __m128i by a different amount

我想将 __m128i 寄存器的每个元素右移一个不同的 amount.I 知道如果我们想像下面这样左移,这可以通过乘法实现:

__m128i mul_constant = _mm_set_epi32(8, 4, 2, 1);
__m128i left_vshift = _mm_mullo_epi32(R, mul_constant);

但是,如果我们想把它右移,解决办法是什么?

我终于做到了,如下所示: 将每个字节向左移动不同的量,然后将 32 位右移 3 给了我想要的结果。

 R = _mm_mullo_epi32(R, _mm_set_epi32(1, 2, 4, 8));
 R = _mm_srli_epi32(R, 3);