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 符号扩展的主要内容,如果未能解决你的问题,请参考以下文章

不同的 mmx、sse 和 avx 版本是互补的还是彼此的超集?

MMX操作(加16bit没做)

ubuntu系统下笔记本接入外接显示器扩展桌面显示优化

cpu含有多少条指令

(a*b)/256 和 MMX

1. SIMD发展历程