mulh

mulh

Assembly RISC-V Referência

lyszt.net aborda mulh e outras instruções RISC-V com mais detalhes.

Formato de codificação

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

Descrição

mulh retorna os 32 bits superiores de um produto. Dois números de 32 bits podem ser multiplicados para dar um resultado tão largo quanto 64 bits, enquanto um registrador comporta 32. A instrução mul mantém os 32 bits inferiores e descarta o restante. mulh (multiply high) mantém os 32 bits superiores.

Execute ambas as instruções com as mesmas entradas e você terá o produto completo. mulh escreve a metade superior em um registrador, mul escreve a metade inferior em outro, e o par contém o resultado completo de 64 bits.

A metade superior indica overflow, o que significa um produto grande demais para 32 bits. Um valor significativo na metade superior significa que o produto não cabe em um único registrador. A aritmética com números muito grandes e a criptografia dependem de ambas as metades.

O manual do RISC-V define mais duas variantes além de mulh. mulhu multiplica dois números sem sinal, e mulhsu multiplica um número com sinal em rs1 por um número sem sinal em rs2. De acordo com o manual, mulhsu aparece na multiplicação com sinal de múltiplas palavras, onde a palavra mais significativa de um número, que carrega o bit de sinal, é multiplicada pelas palavras menos significativas do outro, que são sem sinal.

O h significa high (superior). Esta versão trata seus operandos como com sinal, então eles podem ser negativos. A especificação RISC-V também define variantes sem sinal, e este simulador fornece o mulh com sinal. Como em todas as instruções de multiplicação e divisão, não existe forma com constante, então ambas as entradas vêm de registradores.

Exemplo

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