La mayoría de los algoritmos de multiplicación y división de hardware pueden calcular las palabras altas y bajas de un producto de dos enteros, o el cociente y el resto de la división de dos enteros, al mismo tiempo. En las principales ISA RISC, existen muchos enfoques diferentes para la multiplicación y división de enteros. (En esta publicación, solo estoy considerando las matemáticas de enteros y no de punto flotante).
- La mayoría de los diseños RISC anteriores no tienen instrucciones de este tipo.
- MIPS I tiene múltiples instrucciones que devuelven el resultado de palabras dobles en un par de registros de propósito especial, $ HI: $ LO, así como instrucciones de división que devuelven el cociente en $ LO y el resto en $ HI. Mover los contenidos de $ HI o $ LO a un registro de propósito general es otra instrucción.
- SPARC V8 y superior almacenarán la palabra baja de una multiplicación o el cociente de una división en un registro específico, pero almacenarán la palabra alta de multiplicación o el resto de la división en un registro de propósito especial,% y.
- La mayoría de las arquitecturas RISC de los años 90, incluidas POWER, Alpha y PA-RISC, tienen instrucciones separadas para poner cualquiera la palabra alta o la palabra baja de una multiplicación en cualquier registro de propósito general , y para poner un cociente en cualquier registro de propósito general, pero no para calcular un resto en absoluto; para obtener el resto, debe calcular c = a / b , y luego encontrar d = a - b × c .
- El ARM A32 ISA tiene dos de las instrucciones que me interesan,
SMULL
yUMULL
, que se introdujeron en v3M. Estos almacenan la palabra alta y baja del producto de dos enteros de 32 bits en diferentes registros de 32 bits. Tiene muchas otras instrucciones de multiplicación de variantes también. Sin embargo, no calcula el resto de una división. - ARM A64 redefine
SMULL
yUMULL
para almacenar el producto de 64 bits de dos enteros de 32 bits en un registro de 64 bits. No tiene instrucciones de multiplicación de 64 bits, per se . Para multiplicar, haces una suma multiplicada que agrega el registro cero. Existe una división de enteros, pero no hay un módulo de enteros. - La ISA RISC-V con la extensión M tiene varias variantes de
MULH
,MUL
,DIV
yREM
, pero el Manual de conjunto de instrucciones RISC-V recomienda que cuando aMULH
le sigue unMUL
con los mismos operandos de origen, o unDIV
por unREM
con los mismos operandos de origen, las microarquitecturas pueden fusionar estas operaciones en una sola operación en lugar de realizar dos separadas. / li>
Definitivamente es posible calcular el resultado completo de una multiplicación, o división y resto, al mismo tiempo. ¡Varias ISA de RISC tienen una instrucción para hacerlo! En teoría, si solo desea un resultado, puede establecer el destino del otro en el registro cero. ¿Por qué, entonces, ninguna ISA RISC que miré tiene una instrucción para almacenar tanto el cociente como el resto en registros separados de propósito general, y por qué la única ISA que encontré hace esto por las palabras altas y bajas de un producto, ARM A32, ¿soltarlo en la próxima revisión importante?
Estoy particularmente interesado en saber por qué los primeros chips RISC de mediados de los 80 tomaron esta decisión de diseño. SPARC V8 no tenía un formato de instrucciones con dos registros de origen y dos de destino y posiblemente no quería complicar su decodificador con otro formato. MIPS I: ¿recortar esquinas para encajar instrucciones más complejas en una tubería RISC clásica?
Pero también me pregunto por qué las arquitecturas modernas de RISC se han alejado de él. Supongo que ARM A64 lo hace de esta manera porque la adición múltiple de precisión fija es útil para la decodificación multimedia, ya que la sobrecarga relativa es mayor cuanto más bits se multiplican y, una vez que se tiene eso, tiene sentido reutilizar los circuitos para la multiplicación ( sólo tiene que añadir 0). Pero la documentación de RISC-V sugiere que el núcleo debe tener una sola operación que calcule ambos resultados, entonces, ¿por qué no, en un diseño RISC, exponer eso en la ISA?
¿Se han publicado artículos sobre este tema? ¿O los diseñadores de estas arquitecturas han explicado alguna vez su razón para ello?