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 位重复同样的事情。
在我调试的代码中,有一条汇编指令如下:
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 位重复同样的事情。