MMX 符号扩展
Posted
技术标签:
【中文标题】MMX 符号扩展【英文标题】:MMX sign extension 【发布时间】:2011-07-27 15:54:52 【问题描述】:有谁知道如何使用 MMX 寄存器将符号从 16 位字扩展到 32 位字?我想从存储在 MMX 寄存器中的两个 16 位字中获取两个 32 位符号扩展字。不允许使用 SSE4 指令。
问候
【问题讨论】:
【参考方案1】:您可以只进行左移 (PSLLD
),然后进行算术右移 (PSRAD
),例如使用内在函数:
v = _mm_srai_pi32(_mm_slli_pi32(v, 16), 16);
(这是假设您已经在每个 32 位字的低半部分拥有 16 位值。)
【讨论】:
+1 如果它们不在正确的位置,您可能首先需要_mm_unpacklo_pi16(v, ZERO)
(PUNPCKLWD
) 之类的东西。注意 Paul R 的答案是使用 MSVC 的编译器内在函数,GCC 有 similar。
谢谢 - 我已经编辑了问题以澄清示例中内在函数的使用。请注意,MSVC、gcc、ICC 等的 MMX/SSE 内在函数几乎相同。
我正在寻找的是 shl(mult(var1,var2),1) ,其中 'mult' 将 var1 和 var2 相乘,并且 'shl' 左移算术乘法结果。结果必须饱和,即:mult(-32768,-32768)=2147483647。我虽然关于制作 mult(sing_extesion(var1), shl(sign_extension(var2))) 但我刚刚发现不存在 MMX mult() 饱和版本。你知道其他的获取方式吗?
@LooPer:也许你应该发布一个新问题来解释你真正想要做什么?以上是关于MMX 符号扩展的主要内容,如果未能解决你的问题,请参考以下文章