SSE2指令,PMULUDQ乘法题

SSE2 Instruction, PMULUDQ Multiplication Question

在我调试的代码中,有一条汇编指令如下:

pmuludq xmm6, xmm1

xmm6 = 0x3736353433323130
xmm1 = 0x7D35343332313938

如果我用 Python 将以上 2 个数字相乘,我得到如下所示的结果:

>>> hex(0x3736353433323130 * 0x7D35343332313938)
'0x1b00f1758e3c83508a9f69982a1e7280L'

但是我调试代码的时候xmm6寄存器乘法后的值为:0x0A09A5A82A1E7280

为什么结果不一样?我如何使用 Python?

模拟这条指令

查看手册中的操作部分以获得伪代码:http://felixcloutier.com/x86/PMULUDQ.html

它执行两次 32x32 => 64 (dword x dword => qword) 乘法,每半个 16 字节寄存器一个。 (它忽略输入的奇数 dword 元素)。您只显示了 16 个十六进制数字的输入,所以我认为您只是在查看输入寄存器的低 qword。

如果只关心低64位,那么等价操作就是

result = (a & 0xFFFFFFFF) * (b & 0xFFFFFFFF)

它对高 64 位重复同样的事情。