mulh

mulh

Assembly RISC-V Riferimento

lyszt.net tratta mulh 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

mulh restituisce i 32 bit superiori di un prodotto. Due numeri a 32 bit possono essere moltiplicati per ottenere un risultato largo fino a 64 bit, mentre un registro ne contiene 32. L'istruzione mul mantiene i 32 bit inferiori e scarta il resto. mulh (multiply high) mantiene i 32 bit superiori.

Esegui entrambe le istruzioni sugli stessi input e ottieni il prodotto completo. mulh scrive la metà superiore in un registro, mul scrive la metà inferiore in un altro, e la coppia contiene il risultato completo a 64 bit.

La metà superiore indica un overflow, cioè un prodotto troppo grande per 32 bit. Un valore significativo nella metà superiore significa che il prodotto non entra in un solo registro. L'aritmetica su numeri molto grandi e la crittografia si basano su entrambe le metà.

Il manuale RISC-V definisce altre due varianti oltre a mulh. mulhu moltiplica due numeri senza segno, e mulhsu moltiplica un numero con segno in rs1 per un numero senza segno in rs2. Secondo il manuale, mulhsu compare nella moltiplicazione con segno a più parole, dove la parola più significativa di un numero, che porta il bit di segno, viene moltiplicata per le parole meno significative dell'altro, che sono senza segno.

La h sta per high. Questa versione tratta i suoi operandi come con segno, quindi possono essere negativi. La specifica RISC-V definisce anche varianti senza segno, e questo simulatore fornisce il mulh con segno. Come per tutte le istruzioni di moltiplicazione e divisione, non esiste una forma con costante, quindi entrambi gli input provengono dai registri.

Esempio

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