为什么MMX中没有pmulluw,pslad和pslaw命令?

时间:2015-04-13 15:25:30

标签: simd cpu-architecture mmx

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

2 个答案:

答案 0 :(得分:3)

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

出于相关原因,psladpslaw分别为pslldpsllw。左移是左移,签名甚至不进入图片,你总是将(假设移位1)从第二高位移到最高位,没有其他真正有意义的(在签名溢出的情况恰恰是无法完全表示"完整结果"的情况,因此试图以某种方式保留符号是无用的)。右移有签名和未签名的版本。

答案 1 :(得分: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指令实际上是MOX的REX.W加宽版本,允许您从64位通用寄存器填充mmx寄存器。