为啥 MMX 中没有 pmulluw、pslad 和 pslaw 命令?

Posted

技术标签:

【中文标题】为啥 MMX 中没有 pmulluw、pslad 和 pslaw 命令?【英文标题】:Why there is no pmulluw, pslad and pslaw commands in MMX?为什么 MMX 中没有 pmulluw、pslad 和 pslaw 命令? 【发布时间】:2015-04-13 15:25:29 【问题描述】:

为什么 MMX 中没有 pmulluw、pslad 和 pslaw 命令?为什么没有 movb 和 movw 命令?

【问题讨论】:

【参考方案1】:

确实有一个pmulluw,但它叫做pmullw。由于它只保留低半部分,所以有符号和无符号没有区别。

出于相关原因,psladpslaw 分别是 pslldpsllw。左移是左移,符号性甚至不会进入图片,您将始终将(假设移位 1)从第二位到最高位移到最高位,没有其他真正有意义的情况(在这种情况下有符号溢出正是无论如何都无法表示“完整结果”的情况,因此试图以某种方式保留符号是无用的)。右移有有符号和无符号版本。

【讨论】:

非常感谢您的回答。 @just_user 我不知道 “因为它只保留下半部分,所以有符号和无符号之间没有区别。” 目前还不清楚为什么保留下半部分在有符号和无符号之间没有区别乘法。你能给我一个证明吗?我正在努力解决,但到目前为止还没有成功。【参考方案2】:

除了其他答案...

我也想知道为什么没有 PMULLUW。为什么它与 PMULLW 等价还不是很明显。

如果您将 2 个 16 位数字相乘,则结果将是一个 32 位数字。 但是由于我们保留了下半部分,我们形成了除以 2^16 的余数。

如果您取 2 个数字 X 和 Y,如果它们是正数并且它们的乘积是 XY,则结果是 XY mod 2^16(我们将 2^16 称为 B)。

如果其中一个是负数,那么由于 2 的补码表示,实际计算是:

(X - B)Y = XY - BY

(其中 X 和 Y 是数字的无符号含义。)

由于结果是否定的,我们需要形成另一个 2 的补码来取回结果,即 B^2 - BY + XY。与 B 形成模数后。前 2 项因可与 B 整除而失效,因此结果为 XY mod B

当它们都是负数时也会发生同样的情况:

(X - B)(Y - B) = XY - B(X+Y) + B^2

在这种情况下,结果是肯定的,您不需要另一个 2 的补码,但是在形成模数之后,包含 B 的 2 项再次掉出来,您就有了 XY mod B。这就是为什么不需要 PMULLUW。


关于 MOVB 和 MOVW 你有 MOVD 设置低 32 位和零填充上部。您可以使用此指令与一个小数字来设置较低的字或用零填充其余部分。 MOVQ 指令实际上是 MOVD 的 REX.W 扩展版本,可让您从 64 位通用寄存器填充 mmx 寄存器。

【讨论】:

我正在写一个证明,但现在你自己也有了一个——虽然是一个非常不同的证明。另外我在this answer 有一个旧的证明(嗯,证明骨架)@

以上是关于为啥 MMX 中没有 pmulluw、pslad 和 pslaw 命令?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法用 gcc 自动生成 MMX 指令(不是 SSE)

MMX操作(加16bit没做)

MMX SSE 到 C 代码转换时图像质量下降

MMX 符号扩展

MMX 内部函数和 Microsoft C++ 的堆栈使用

(a*b)/256 和 MMX