Инструкция SSE2, вопрос умножения PMULUDQ - PullRequest
0 голосов
/ 03 декабря 2018

В коде, который я отлаживаю, есть инструкция по сборке, показанная ниже:

pmuludq xmm6, xmm1

xmm6 = 0x3736353433323130
xmm1 = 0x7D35343332313938

Если я умножу вышеуказанные 2 числа с помощью Python, я получу результат, как показано ниже:

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

Однако при отладке кода значение регистра xmm6 после операции умножения составляет: 0x0A09A5A82A1E7280

Почему результат отличается?И как я могу симулировать эту инструкцию, используя Python?

1 Ответ

0 голосов
/ 03 декабря 2018

посмотрите на раздел Операция в руководстве для псевдокода: http://felixcloutier.com/x86/PMULUDQ.html.

Он выполняет два умножения 32x32 => 64 (dword x dword => qword), по одному в каждой половине 16-байтового регистра.,(Он игнорирует нечетные элементы dword входных данных).Вы только показали 16 шестнадцатеричных цифр для входов, поэтому я думаю, что вы смотрите только на младшее слово входных регистров.

Если вы заботитесь только о младших 64 битах, то эквивалентная операция просто

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

Это повторяет то же самое для старших 64 бит.

...