R-type (Register type)

Fanno compiere all’ALU un’operazione aritmetico/logica, operano con 2 registri di input e uno di output, NON hanno accesso alla memoria (RAM).

campofunct7rs2rs1funct3rdopcode
n bit755357

I-type (Immediate type)

Compiono operazioni immediate, cioè tra un registro e un valore costante codificato nell’espressione stessa (imm), operano con 2 registri. (1 argomento, 1 argomento immediato e 1 risultato).

campoimmrs1funct3rdopcode
n bit125357

S-type (Store type)

Scrivono un registro nella memoria, operano con 3 registri. (2 argomenti, 1 argomento immediato e 1 risultato)

campoultimi 7 bit di immrs2rs1funct3primi 5 bit di immopcode
n bit755357

SB-type (Conditional branching type)

Gestiscono il branching condizionale, gli immediate codificano la posizione della memoria (dove sono scritte altre istruzioni del programma) a cui si deve saltare per iniziare la branch se una certa condizione in input è verificata.

La posizione a cui si deve saltare è codificata PC (Program Counter) + immediate * 2

N.B.: Hanno lo stesso formato delle S-type ma imm è interpretato in modo diverso

campoultimi 7 bit di immrs2rs1funct3primi 5 bit di immopcode
n bit755357

Esempio:

beq s1, s2, fineLoop # s1 == s2 -> salta all'etichetta fineLoop

U-type (Upper immediate instructions)

Usate nelle operazioni di load/add dove serve un campo immediate molto grande, operano con un solo registro di destinazione.

campoimmrdopcode
n bit2057
Esempio:
lui x5 0x12345     # x5 = 0x12345000 (lui è U-type)
addi x5, x5, 0x678 # x5 = 0x12345000 + 0x678 = 0x12345678 (addi è R-type)

UJ-type (Unconditional Jump instructions)

Usate per saltare a un indirizzo della memoria specificata in imm, mentre rd memorizza l’indirizzo di return.

campoimmrdopcode
n bit2057

Esempio:

jar ra, funzione
# salta a funzione (chiamandola) e salva l'indirizzo di ritorno in ra