我发现的SSE转换指令只能在所有元素上移动相同的量:
_mm_sll_epi32()_mm_slli_epi32()有没有办法对不同的元素应用不同的转换?像这样的东西:
__m128i a, __m128i b;
r0:= a0 << b0;
r1:= a1 << b1;
r2:= a2 << b2;
r3:= a3 << b3;
Run Code Online (Sandbox Code Playgroud)
存在_mm_shl_epi32()确实如此的内在.
http://msdn.microsoft.com/en-us/library/gg445138.aspx
但是,它需要XOP指令集.只有AMD Bulldozer和Interlagos处理器或更高版本才有此指令.它不适用于任何英特尔处理器.
如果你想在没有XOP指令的情况下做到这一点,你需要以艰难的方式去做:将它们拉出来并逐一进行.
如果没有XOP指令,您可以使用以下内在函数使用SSE4.1执行此操作:
_mm_insert_epi32()_mm_extract_epi32()这些将允许您将128位寄存器的部分提取到常规寄存器中以进行移位并将其放回.
如果你采用后一种方法,那将是非常低效的.这就是为什么_mm_shl_epi32()首先存在的原因.