寻找非立即移位值的sse 128位移位操作

Pee*_*oot 13 c c++ sse

内部函数_mm_slli_si128将在128位寄存器的左侧进行逻辑移位,但仅限于立即移位值,并且按字节而不是位移位.

我可以使用内部函数_mm_sll_epi64_mm_sll_epi32__m128i寄存器中向左移动一组值,但这些值不带"溢出"位.

对于N位移位想象我可以做类似的事情:

  • _mm_sll_epi64
  • _mm_srr_epi64 (对于我想要携带的位:将它们移动到低位)
  • 洗牌srr结果
  • 或者这些在一起.

(但可能还必须包括N相对于64的检查).

有没有更好的办法?

Jas*_*n R 5

不是您理想的解决方案,但如果您想将 SSE 寄存器旋转或移位为 8 的倍数的位数,则PSHUFB指令(和_mm_shuffle_epi8()内在的)可以提供帮助。它需要第二个 SSE 寄存器作为输入;寄存器中的每个字节保存一个值,用于索引第一个输入寄存器中的字节。

  • 我认为 OP 明确表示他想要位粒度而不限于立即数。`_mm_shuffle_epi8()` 既是字节粒度又需要立即数。 (5认同)
  • 我知道他想要位粒度,因此是我回答中的第一个子句。此外,`_mm_shuffle_epi8()` 不需要立即;第二个参数是一个 `__m128i` 值。[请参阅此处的文档](http://msdn.microsoft.com/en-us/library/bb531427.aspx)。 (5认同)
  • 我应该注意到这个函数需要 SSSE3 支持,如果你想在旧机器上运行,这可能不够。 (2认同)
  • @Mysticial:Jason 是对的,带有 16 个预计算值的 `pshufb` 可用于模拟变量的字节移位。在这种情况下,可以将它用于 qword 智能移位(是的 0 或 1 qword ;-)),其余的 64 位移位可以按照 OP 的建议进行。 (2认同)