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

Posted

技术标签:

【中文标题】将 __m128i 中的每个 DW 右移不同的量【英文标题】:Shift right every DW in a __m128i by a different amount 【发布时间】:2018-04-30 21:21:56 【问题描述】:

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

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

但是,如果我们想右移,有什么办法呢?

【问题讨论】:

他们在 AVX2 中添加了可变长度移位。但我猜你需要这个旧处理器? @Mysticial 是的。我需要一个 SSE3-4 指令。 可能的重复:Shifiting xmm integer register values using non-AVX instructions on Intel x86 architecture 和 Shifting 4 integers right by different values SIMD 和 SSE2 shift by vector。 Shifting 4 integers right by different values SIMD的可能重复 @PaulR:嘿,我很高兴地发现我已经回答了你找到的所有 3 个重复项:P 其中两个彼此非常相似,大多只是留下 4 个元素之一未使用。 【参考方案1】:

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

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

【讨论】:

以上是关于将 __m128i 中的每个 DW 右移不同的量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 gcc 中静态初始化 __m128i 数组?

使用 AVX/AVX2/SSE __m128i 将所有负数字节设置为 -128 (0x80) 并保留所有其他字节

将 __m256i 设置为两个 __m128i 值的值

将 __m256i 设置为两个 __m128i 值的值

SSE:如何将 _m128i._i32[4] 减少到 _m128i._i8

如何从 16 x 8 位 __m128i 值中提取 32 x 4 位整数