如何使用__m128i执行元素左移?

use*_*756 4 c sse avx

我发现的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)

Mys*_*ial 7

存在_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()

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/intref_cls/common/intref_sse41_reg_ins_ext.htm

这些将允许您将128位寄存器的部分提取到常规寄存器中以进行移位并将其放回.

如果你采用后一种方法,那将是非常低效的.这就是为什么_mm_shl_epi32()首先存在的原因.