mul

mul

Assembly RISC-V Referência

lyszt.net aborda mul 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

mul multiplica dois registradores. Ele lê rs1 e rs2, multiplica esses valores e escreve o produto em rd. O formato abaixo significa rd = rs1 * rs2.

mul rd, rs1, rs2

O RISC-V é organizado em camadas chamadas extensões. Multiplicação e divisão pertencem à extensão chamada M, que o menor núcleo RISC-V pode omitir. Este simulador a inclui, porque seu nome completo RV32IM termina em M, então mul e div estão disponíveis. Um processador sem M deve fazer o trabalho em software.

O produto de dois números de 32 bits pode chegar a 64 bits, o que excede o que um registrador comporta. mul mantém os 32 bits inferiores. Para valores pequenos, essa é a resposta completa. Os 32 bits superiores vêm de uma instrução separada, mulh. Entradas com sinal e sem sinal produzem os mesmos 32 bits inferiores, então uma única instrução cobre ambos os casos.

Quando ambas as metades de um produto são necessárias, o manual do RISC-V recomenda um par fixo de instruções. Uma instrução mulh (ou uma de suas variantes sem sinal) fornece a metade superior, e mul com os mesmos registradores de origem na mesma ordem fornece a metade inferior. O destino da metade superior não pode ser rs1 ou rs2. Um processador pode então fundir as duas instruções em uma única multiplicação.

Multiplicar por uma potência de dois (2, 4, 8, 16 e assim por diante) pode usar um deslocamento à esquerda. Deslocar à esquerda em 3 posições multiplica por 8, e um deslocamento custa menos que uma multiplicação (veja slli). Os compiladores fazem essa substituição automaticamente. O exemplo multiplica 6 por 7 e deixa 42 em t2.

Exemplo

li t0, 6
li t1, 7
mul t2, t0, t1   # t2 = 42