2011-07-27 77 views
2

有谁知道如何使用MMX寄存器从16位字扩展到32位字?我想从存储在MMX寄存器中的两个16位字中获得两个32位符号扩展字。没有SSE4指令允许。MMX符号扩展

问候

回答

5

你可以做一个左移(PSLLD),然后被算术右移(PSRAD),例如使用内部函数:

v = _mm_srai_pi32(_mm_slli_pi32(v, 16), 16); 

(这是假设你已经在每个32位字的低半的16位值。)

+0

+1如果他们不是在正确的位置,你可能首先需要'_mm_unpacklo_pi16(v,ZERO)'('PUNPCKLWD')。注意Paul R的答案是使用MSVC的编译器内在函数,GCC有类似的东西(http://gcc.gnu.org/onlinedocs/gcc/X86-Built_002din-Functions.html)。 – user786653

+0

谢谢 - 我已经编辑了这个问题,以澄清示例中内部函数的使用。请注意,MMX/SSE内在函数与MSVC,gcc,ICC等几乎完全相同。 –

+0

我在寻找的是做shl(mult(var1,var2),1)其中'mult'乘以var1和var2和'shl '转移左乘法结果。结果必须饱和,即:mult(-32768,-32768)= 2147483647。我虽然关于制作mult(sing_extesion(var1),shl(sign_extension(var2))),但我刚刚发现不存在MMX mult()饱和版本。你知道任何其他方式来得到它吗? – LooPer