为什么在MMX中没有pmulluw,pslad和pslaw命令?为什么没有movb和movw命令?
发布于 2015-04-13 23:33:51
完全有一个pmulluw,但它被称为pmullw。因为它只保留下半部分,所以签名和未签名之间没有区别。
出于相关原因,pslad和pslaw分别为pslld和psllw。左移是左移,符号甚至不会进入图片中,你总是会将(假设移位1)倒数第二位移到最高位,其他的都没有意义(在这种情况下,有符号溢出恰恰是无法表示“完整结果”的情况,所以试图以某种方式保留符号是无用的)。Right shift有签名版本和未签名版本。
发布于 2015-10-13 21:43:43
除了其他答案..。
我也想知道为什么没有PMULLUW。为什么它等同于PMULLW并不是一目了然的。
如果将2个16位数字相乘,结果将是一个32位数字。但是由于我们保留了下半部分,所以我们得到除以2^16的余数。
如果你取两个数字X和Y,如果它们是正的,并且它们的乘法是XY,那么结果是XY mod 2^16 (让我们称2^16为B)。
如果其中一个是负的,那么由于2的补码表示,实际的计算是:
(X - B)Y = XY - BY
(其中X和Y表示数字的无符号含义。)
由于结果是负的,我们需要形成另一个2的补码来返回结果,这就是B^2 - BY + XY。在与B形成模之后,两个第一项掉了出来,因为它们与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位,0填充上半部分。您可以将此指令与一个较小的数字一起使用,以设置较低的字或按零填充其余的字。MOVQ指令实际上是MOVD的REX.W加宽版本,允许您从64位通用寄存器填充mmx寄存器。
https://stackoverflow.com/questions/29609163
复制相似问题