为什么MMX中没有pmulluw,pslad和pslaw命令?为什么没有movb和movw命令?
答案 0 :(得分:3)
完全有一个pmulluw
,但它被称为pmullw
。由于它只保留低半部分,因此有符号和无符号之间没有区别。
出于相关原因,pslad
和pslaw
分别为pslld
和psllw
。左移是左移,签名甚至不进入图片,你总是将(假设移位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寄存器。