将 __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 右移不同的量的主要内容,如果未能解决你的问题,请参考以下文章
使用 AVX/AVX2/SSE __m128i 将所有负数字节设置为 -128 (0x80) 并保留所有其他字节