1

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

4

2 回答 2

3

完全有一个pmulluw,但它被称为pmullw。由于它只保留下半部分,因此有符号和无符号之间没有区别。

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

于 2015-04-13T15:33:51.113 回答
3

除了其他答案...

我也想知道为什么没有 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 寄存器。

于 2015-10-13T13:43:43.387 回答