Por que multiplicações assinadas e não assinadas são instruções diferentes no x86 (-64)?

Eu pensei que o ponto principal do complemento de 2 era que as operações poderiam ser implementadas da mesma maneira para números assinados e não assinados. A Wikipedia até lista especificamente a multiplicação como uma das operações que se beneficiam . Então, por que o x86 tem instruções separadas para cada um, mul e imul ? Isso ainda é verdade para x86-64?

A adição e a subtração são as mesmas, assim como a metade inferior de uma multiplicação. Uma multiplicação completa, no entanto, não é. Exemplo simples:

No complemento de dois bits de 32 bits, -1 tem a mesma representação que a quantidade não assinada 2 ** 32 – 1. No entanto:

 -1 * -1 = +1 (2**32 - 1) * (2**32 - 1) = (2**64 - 2**33 + 1) 

(Observe que os 32 bits baixos de ambos os resultados são os mesmos; é isso que quero dizer quando digo que a “metade baixa da multiplicação” é a mesma).

O resultado será o mesmo para as versões de operandos 2 e 3, exceto que as instruções mul e imul diferem em como elas configuram os flags CF e OF (carry e overflow).

Pense nos dois casos: -1 * -1 versus 0xFFFFFFFF * 0xFFFFFFFF em termos de estouro e você terá a idéia.

A multiplicação de dois números de 16 bits produz um resultado de 32 bits. Mesmo se um dos números for “1”, o processador irá efetivamente estender o outro para 32 bits. O processo de estender um número para um comprimento de bit maior é uma das operações que é diferente para valores assinados e não assinados (a outra operação significativa em que o sinal importa é a comparação de magnitude, que também é uma parte essencial da divisão).