¿Por qué las instrucciones de multiplicación con signo y sin signo son diferentes en x86 (-64)?

Pensé que el objective del complemento a 2 era que las operaciones se podrían implementar de la misma manera para los números con y sin firma. Wikipedia incluso enumera específicamente multiplicar como una de las operaciones que beneficia . Entonces, ¿por qué x86 tiene instrucciones separadas para cada uno, mul e imul ? ¿Esto sigue siendo cierto para x86-64?

La sum y la resta son lo mismo, al igual que la mitad baja de una multiplicación. Una multiplicación completa, sin embargo, no lo es. Ejemplo simple:

En el complemento a dos dígitos de 32 bits, -1 tiene la misma representación que la cantidad sin signo 2 ** 32 – 1. Sin embargo:

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

(Tenga en cuenta que los 32 bits bajos de ambos resultados son los mismos, eso es lo que quiero decir cuando digo que “la mitad baja de la multiplicación” es la misma).

El resultado será el mismo para las versiones de operando 2 y 3, excepto que las instrucciones mul e imul difieren en cómo establecen las banderas CF y OF (acarreo y desbordamiento).

Piense en los dos casos: -1 * -1 versus 0xFFFFFFFF * 0xFFFFFFFF en términos de desbordamiento y obtendrá la idea.

La multiplicación de dos números de 16 bits produce un resultado de 32 bits. Incluso si uno de los números es “1”, el procesador extenderá efectivamente el otro a 32 bits. El proceso de extender un número a una longitud de bit más larga es una de las operaciones que es diferente para los valores firmados y no firmados (la otra operación importante donde el signo importa es la comparación de magnitud, que también es una parte esencial de la división).