mul

mul

Assembly RISC-V Riferimento

lyszt.net tratta mul e altre istruzioni RISC-V in modo più dettagliato.

Formato di codifica

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

Descrizione

mul moltiplica due registri. Legge rs1 e rs2, moltiplica quei valori e scrive il prodotto in rd. Il formato seguente significa rd = rs1 * rs2.

mul rd, rs1, rs2

RISC-V è organizzato in livelli chiamati estensioni. Moltiplicazione e divisione appartengono all'estensione chiamata M, che il più piccolo core RISC-V può omettere. Questo simulatore la include, perché il suo nome completo RV32IM termina con M, quindi mul e div sono disponibili. Un processore senza M deve svolgere il lavoro via software.

Il prodotto di due numeri a 32 bit può raggiungere i 64 bit, il che supera ciò che un registro può contenere. mul conserva i 32 bit inferiori. Per valori piccoli questa è la risposta completa. I 32 bit superiori provengono da un'istruzione separata, mulh. Input con segno e senza segno producono gli stessi 32 bit inferiori, quindi una sola istruzione copre entrambi i casi.

Quando sono necessarie entrambe le metà di un prodotto, il manuale RISC-V raccomanda una coppia fissa di istruzioni. Un'istruzione mulh (o una delle sue varianti senza segno) fornisce la metà alta, e mul con gli stessi registri sorgente nello stesso ordine fornisce la metà bassa. La destinazione della metà alta non può essere rs1 o rs2. Un processore può quindi fondere le due istruzioni in un'unica moltiplicazione.

Moltiplicare per una potenza di due (2, 4, 8, 16 e così via) può usare uno scorrimento a sinistra. Scorrere a sinistra di 3 posizioni moltiplica per 8, e uno scorrimento costa meno di una moltiplicazione (vedi slli). I compilatori effettuano questa sostituzione automaticamente. L'esempio moltiplica 6 per 7 e lascia 42 in t2.

Esempio

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