mulh

mulh

Ensamblador RISC-V Referencia

lyszt.net cubre mulh y otras instrucciones RISC-V con más detalle.

Formato de codificación

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Descripción

mulh devuelve los 32 bits superiores de un producto. Dos números de 32 bits pueden multiplicarse y dar como resultado un valor de hasta 64 bits, mientras que un registro contiene 32. La instrucción mul conserva los 32 bits inferiores y descarta el resto. mulh (multiply high) conserva los 32 bits superiores.

Ejecuta ambas instrucciones con las mismas entradas y tendrás el producto completo. mulh escribe la mitad superior en un registro, mul escribe la mitad inferior en otro, y el par contiene el resultado completo de 64 bits.

La mitad superior indica desbordamiento, lo que significa un producto demasiado grande para 32 bits. Un valor significativo en la mitad superior significa que el producto no cabe en un registro. La aritmética con números muy grandes y la criptografía dependen de ambas mitades.

El manual de RISC-V define dos variantes más además de mulh. mulhu multiplica dos números sin signo, y mulhsu multiplica un número con signo en rs1 por un número sin signo en rs2. Según el manual, mulhsu aparece en la multiplicación con signo de varias palabras, donde la palabra más significativa de un número, que contiene el bit de signo, se multiplica por las palabras menos significativas del otro, que no tienen signo.

La h significa high (alta). Esta versión trata sus operandos como con signo, por lo que pueden ser negativos. La especificación de RISC-V también define variantes sin signo, y este simulador proporciona la mulh con signo. Como con todas las instrucciones de multiplicación y división, no existe una forma con constante, por lo que ambas entradas provienen de registros.

Ejemplo

li t0, 100000
li t1, 100000
mulh t2, t0, t1   # t2 = 2 (high bits of 100000 * 100000)