SET BASE
Le istruzioni del set base definiscono le operazioni fondamentali per il calcolo, il controllo del flusso e l’accesso alla memoria.
OPERAZIONI ARITMETICHE E LOGICHE
Operazioni sui Registri (Formato R)
ADD
Sintassi: add rd, rs1, rs2
Descrizione: Somma rs1 e rs2 → rd = rs1 + rs2
Esempio:
add x5, x1, x2 # x5 = x1 + x2SUB
Sintassi: sub rd, rs1, rs2
Descrizione: Sottrae rs2 da rs1 → rd = rs1 - rs2
Esempio:
sub x5, x1, x2 # x5 = x1 - x2SLL (Shift Left Logical)
Sintassi: sll rd, rs1, rs2
Descrizione: Shifta a sinistra rs1 di un numero di bit specificato da rs2
Esempio:
sll x5, x1, x2 # x5 = x1 << (rs2)SLT (Set Less Than, signed)
Sintassi: slt rd, rs1, rs2
Descrizione: Se rs1 < rs2 (con segno) allora rd = 1, altrimenti 0
Esempio:
slt x5, x1, x2 # x5 = (x1 < x2) ? 1 : 0SLTU (Set Less Than, unsigned)
Sintassi: sltu rd, rs1, rs2
Descrizione: Confronto senza segno
Esempio:
sltu x5, x1, x2 # x5 = (x1 < x2) in unsigned ? 1 : 0XOR
Sintassi: xor rd, rs1, rs2
Descrizione: Operazione bitwise XOR tra rs1 e rs2
Esempio:
xor x5, x1, x2 # x5 = x1 ^ x2SRL (Shift Right Logical)
Sintassi: srl rd, rs1, rs2
Descrizione: Shift logico a destra
Esempio:
srl x5, x1, x2 # x5 = x1 >> (rs2) (riempimento con 0)SRA (Shift Right Arithmetic)
Sintassi: sra rd, rs1, rs2
Descrizione: Shift aritmetico a destra (mantiene il segno)
Esempio:
sra x5, x1, x2 # x5 = x1 >> (rs2) preservando il bit del segnoOR
Sintassi: or rd, rs1, rs2
Descrizione: Operazione bitwise OR
Esempio:
or x5, x1, x2 # x5 = x1 | x2AND
Sintassi: and rd, rs1, rs2
Descrizione: Operazione bitwise AND
Esempio:
and x5, x1, x2 # x5 = x1 & x2Operazioni con Immediati (Formato I)
ADDI
Sintassi: addi rd, rs1, imm
Descrizione: Somma il registro rs1 con un valore immediato
Esempio:
addi x5, x1, 10 # x5 = x1 + 10SLTI
Sintassi: slti rd, rs1, imm
Descrizione: Imposta rd = 1 se rs1 è minore di imm (signed)
Esempio:
slti x5, x1, 20 # x5 = (x1 < 20) ? 1 : 0SLTIU
Sintassi: sltiu rd, rs1, imm
Descrizione: Confronto senza segno con immediato
Esempio:
sltiu x5, x1, 20 # confronto unsignedXORI
Sintassi: xori rd, rs1, imm
Descrizione: XOR tra rs1 e l’immediato
Esempio:
xori x5, x1, 0xFFORI
Sintassi: ori rd, rs1, imm
Descrizione: OR bitwise con immediato
Esempio:
ori x5, x1, 0xF0ANDI
Sintassi: andi rd, rs1, imm
Descrizione: AND bitwise con immediato
Esempio:
andi x5, x1, 0x0FSLLI
Sintassi: slli rd, rs1, shamt
Descrizione: Shift logico a sinistra con immediato di shift (shamt)
Esempio:
slli x5, x1, 3 # x5 = x1 << 3SRLI / SRAI
Sintassi: srli rd, rs1, shamt e srai rd, rs1, shamt
Descrizione: Shift logico o aritmetico a destra con immediato
Esempio:
srli x5, x1, 2 # x5 = x1 >> 2 (logical)
srai x5, x1, 2 # x5 = x1 >> 2 (arithmetic)Operazioni Speciali (Formato U)
LUI (Load Upper Immediate)
Sintassi: lui rd, imm20
Descrizione: Carica un immediato di 20 bit nella parte alta del registro (il resto viene posto a 0)
Esempio:
lui x5, 0x12345 # x5 = 0x12345000AUIPC (Add Upper Immediate to PC)
Sintassi: auipc rd, imm20
Descrizione: Calcola rd = PC + (imm20 << 12)
Esempio:
auipc x5, 0x1 # x5 = PC + 0x1000CONTROLLO DI FLUSSO
Branch (Salti condizionati - Formato B)
BEQ
Sintassi: beq rs1, rs2, offset
Descrizione: Salta se rs1 == rs2
Esempio:
beq x1, x2, labelBNE
Sintassi: bne rs1, rs2, offset
Descrizione: Salta se rs1 != rs2
Esempio:
bne x1, x2, labelBLT e BGE (signed)
Sintassi: blt rs1, rs2, offset / bge rs1, rs2, offset
Descrizione: Salta se rs1 < rs2 (signed) o se rs1 >= rs2
Esempio:
blt x1, x2, label # se x1 < x2
bge x1, x2, label # se x1 >= x2BLTU e BGEU (unsigned)
Sintassi: bltu rs1, rs2, offset / bgeu rs1, rs2, offset
Descrizione: Confronti senza segno
Esempio:
bltu x1, x2, label # confronto unsigned
bgeu x1, x2, labelJump (Salti Incondizionati - Formato J)
JAL (Jump and Link)
Sintassi: jal rd, label
Descrizione: Salta a label e memorizza il return address in rd
Esempio:
jal x1, func # x1 = PC + 4 *, salto a func_*(PC + 4 perché al ritorno della funzione si va ad eseguire l’istruzione successiva a quella memorizzata in x1)
JALR (Jump and Link Register)
Sintassi: jalr rd, imm(rs1)
Descrizione: Salto indiretto: calcola l’indirizzo target come (rs1 + imm), salta all’indirizzo target e memorizza il return address in rd
Esempio:
jalr x1, 0(x2) # x1 = PC + 4, salto all'indirizzo contenuto in x2 + 0ACCESSO ALLA MEMORIA
Istruzioni di Caricamento (Load – Formato I)
LB, LH, LW
Sintassi: lb rd, offset(rs1); analogamente per lh (halfword) e lw (word)
Descrizione: Carica 8, 16 o 32 bit da memoria in segno esteso
Esempio:
lw x5, 0(x1) # x5 = Mem[x1 + 0]LBU, LHU
Sintassi: lbu rd, offset(rs1); lhu per halfword senza segno
Descrizione: Carica il dato senza segno
Esempio:
lbu x5, 0(x1)Istruzioni di Memorizzazione (Store –Formato S)
SB, SH, SW
Sintassi: sb rs2, offset(rs1); analogamente per sh (halfword) e sw (word)
Descrizione: Memorizza 8, 16 o 32 bit in memoria
Esempio:
sw x5, 0(x1) # Mem[x1+0] = x5Istruzioni di Sincronizzazione e Ambiente
FENCE
Sintassi: fence [pred], [succ]
Descrizione: Garantisce l’ordine delle operazioni di memoria
Esempio:
fenceFENCE.I
Sintassi: fence.i
Descrizione: Sincronizza le istruzioni cache (utile dopo modifiche alla memoria contenente codice)
Esempio:
fence.iECALL e EBREAK
Descrizione: Chiamata al sistema (ECALL) ed interruzione per debug (EBREAK)
Esempio:
ecall ebreakTABELLA RIASSUNTIVA - SET BASE
| Istruzione | Categoria | Descrizione breve |
|---|---|---|
| ADD | Aritmetica | Somma due registri |
| SUB | Aritmetica | Sottrazione tra registri |
| SLL | Shift | Shift logico a sinistra |
| SLT / SLTU | Confronto | Setta se minore (signed/unsigned) |
| XOR | Logica | XOR bitwise |
| SRL / SRA | Shift | Shift logico / aritmetico a destra |
| OR | Logica | OR bitwise |
| AND | Logica | AND bitwise |
| ADDI | Aritmetica | Somma con immediato |
| SLTI/SLTIU | Confronto | Set less than con immediato (signed/unsigned) |
| XORI, ORI, ANDI | Logica | Operazioni logiche con immediato |
| SLLI, SRLI, SRAI | Shift | Shift con immediato |
| LUI | Speciale | Carica immediato nella parte alta |
| AUIPC | Speciale | PC-relative address calcolo |
| JAL, JALR | Salti | Salti incondizionati con link |
| BEQ, BNE, BLT, BGE, BLTU, BGEU | Branch | Salti condizionati |
| LB, LH, LW, LBU, LHU | Caricamento | Caricamento dati da memoria |
| SB, SH, SW | Memorizzazione | Scrittura in memoria |
| FENCE, FENCE.I | Sincronizzazione | Controllo ordine memoria/instr. |
| ECALL, EBREAK | Ambiente | Chiamate di sistema e debug |
ESTENSIONE M
Le istruzioni dell’estensione M aggiungono operazioni aritmetiche per la moltiplicazione e la divisione intera.
MUL
Sintassi: mul rd, rs1, rs2
Descrizione: Moltiplicazione a 32/64 bit (parte bassa del risultato)
Esempio:
mul x5, x1, x2 # x5 = (x1 * x2) lower partMULH
Sintassi: mulh rd, rs1, rs2
Descrizione: Moltiplicazione che restituisce la parte alta del prodotto (signed)
Esempio:
mulh x5, x1, x2MULHSU
Sintassi: mulhsu rd, rs1, rs2
Descrizione: Moltiplicazione tra un operando signed e uno unsigned, parte alta
Esempio:
mulhsu x5, x1, x2MULHU
Sintassi: mulhu rd, rs1, rs2
Descrizione: Moltiplicazione unsigned, parte alta
Esempio:
mulhu x5, x1, x2DIV
Sintassi: div rd, rs1, rs2
Descrizione: Divisione intera signed
Esempio:
div x5, x1, x2 # x5 = x1 / x2 (signed)DIVU
Sintassi: divu rd, rs1, rs2
Descrizione: Divisione intera unsigned
Esempio:
divu x5, x1, x2 # divisione unsignedREM
Sintassi: rem rd, rs1, rs2
Descrizione: Resto della divisione signed
Esempio:
rem x5, x1, x2 # x5 = x1 % x2 (signed)REMU
Sintassi: remu rd, rs1, rs2
Descrizione: Resto della divisione unsigned
Esempio:
remu x5, x1, x2Tabella Riassuntiva – Estensione M
| Istruzione | Descrizione breve |
|---|---|
| MUL | Moltiplicazione (parte bassa) |
| MULH | Moltiplicazione (parte alta, signed) |
| MULHSU | Moltiplicazione (mixed signed/unsigned, parte alta) |
| MULHU | Moltiplicazione (unsigned, parte alta) |
| DIV | Divisione signed |
| DIVU | Divisione unsigned |
| REM | Resto signed |
| REMU | Resto unsigned |
ESTENSIONE A
Questa estensione abilita operazioni atomiche per la sincronizzazione in ambienti multithread. Questa guida è per operazioni a 32 bit (RV32A), per sistemi a 64 bit (RV64A) esistono equivalenti con suffisso .d (per “doubleword”).
LR.W (Load-Reserved Word)
Sintassi: lr.w rd, (rs1)
Descrizione: Carica il valore da memoria marcandolo per un’operazione atomica
Esempio:
lr.w x5, (x1)SC.W (Store-Conditional Word)
Sintassi: sc.w rd, rs2, (rs1)
Descrizione: Memorizza in memoria solo se la “riserva” è valida; rd viene impostato a 0 se riuscito
Esempio:
sc.w x5, x2, (x1) # se riuscito, x5 = 0AMOSWAP.W
Sintassi: amoswap.w rd, rs2, (rs1)
Descrizione: Scambia atomicamente il contenuto di memoria con rs2
Esempio:
amoswap.w x5, x2, (x1)AMOADD.W, AMOXOR.W, AMOAND.W, AMOOR.W
Sintassi: amoadd.w rd, rs2, (rs1)
Descrizione: Eseguono rispettivamente somma, XOR, AND e OR atomico
Esempio:
amoadd.w x5, x2, (x1) # Somma atomicaAMOMIN.W, AMOMAX.W, AMOMINU.W, AMOMAXU.W
Sintassi: amomin.w rd, rs2, (rs1)
Descrizione: Operazioni atomiche per ottenere il minimo/massimo (signed/unsigned)
Esempio:
amomin.w x5, x2, (x1)Tabella Riassuntiva – Estensione A
| Istruzione | Descrizione breve |
|---|---|
| LR.W / LR.D | Carica riservato (word/double) |
| SC.W / SC.D | Store condizionale (word/double) |
| AMOSWAP.W / AMOSWAP.D | Scambio atomico |
| AMOADD, AMOXOR, AMOAND, AMOOR | Operazioni aritmetiche/logiche atomiche |
| AMOMIN, AMOMAX, AMOMINU, AMOMAXU | Operazioni min/max atomiche |
ESTENSIONE F
Questa estensione introduce operazioni in virgola mobile a 32 bit.
Operazioni di Caricamento/Salvataggio
FLW
Sintassi: flw fd, offset(rs1)
Descrizione: Carica un numero in virgola mobile a 32 bit
Esempio:
flw f5, 0(x1)FSW
Sintassi: fsw fs, offset(rs1)
Descrizione: Salva un numero in virgola mobile a 32 bit in memoria
Esempio:
fsw f5, 0(x1)Operazioni Aritmetiche
FADD.S, FSUB.S, FMUL.S, FDIV.S
Sintassi: fadd.s fd, fs1, fs2 (analoghe per le altre)
Descrizione: Somma, sottrazione, moltiplicazione e divisione in precisione singola
Esempio:
fadd.s f5, f1, f2 # f5 = f1 + f2 (single precision)FSQRT.S
Sintassi: fsqrt.s fd, fs
Descrizione: Calcola la radice quadrata
Esempio:
fsqrt.s f5, f1Operazioni di Conversione e Comparazione
FCVT.W.S, FCVT.S.W
Descrizione: Conversioni tra interi e floating-point
FEQ.S, FLT.S, FLE.S
Descrizione: Comparazioni tra valori in virgola mobile
FCLASS.S
Descrizione: Classifica il numero in virgola mobile (NaN, infinito, ecc.)
Tabella Riassuntiva – Estensione F
| Istruzione | Descrizione breve |
|---|---|
| FLW / FSW | Caricamento/Salvataggio di valori float |
| FADD.S, FSUB.S, FMUL.S, FDIV.S | Operazioni aritmetiche float (singola precisione) |
| FSQRT.S | Radice quadrata float |
| FCVT.*, FEQ.S, FLT.S, FLE.S, FCLASS.S | Conversioni e comparazioni float |
ESTENSIONE D
Simile all’estensione F, ma per operazioni in doppia precisione (64 bit).
FLD / FSD
Sintassi: fld fd, offset(rs1) / fsd fs, offset(rs1)
Descrizione: Carica/Salva un double dalla/in memoria
Esempio:
fld f5, 0(x1) fsd f5, 0(x1)FADD.D, FSUB.D, FMUL.D, FDIV.D, FSQRT.D
Descrizione: Operazioni aritmetiche per double precision
Esempio:
fadd.d f5, f1, f2 # f5 = f1 + f2 in double precisionConversioni e comparazioni:
FCVT.S.D, FCVT.D.S, FCVT.W.D, FCVT.D.W, FCVT.WU.D, FCVT.D.WU, FEQ.D, FLT.D, FLE.D, FCLASS.D
Tabella Riassuntiva – Estensione D
| Istruzione | Descrizione breve |
|---|---|
| FLD / FSD | Caricamento/Salvataggio double |
| FADD.D, FSUB.D, FMUL.D, FDIV.D, FSQRT.D | Operazioni aritmetiche double |
| Conversioni e Comparazioni | FCVT.*, FEQ.D, FLT.D, FLE.D, FCLASS.D |
ESTENSIONE C
L’estensione C riduce la dimensione del codice traducendo le istruzioni in un formato a 16 bit. Esistono molte varianti; ecco alcune tra le più comuni:
C.ADDI
Descrizione: Versione compressa di addi
Esempio:
c.addi x1, 1 # equivalente ad addiC.ADDI4SPN
Descrizione: Aggiunge un immediato al registro stack pointer (per allocare spazio nello stack)
Esempio:
c.addi4spn x2, 8 # modifica lo stack pointerC.LW, C.LD
Descrizione: Caricamento compresso di word/doubleword
C.SW, C.SD
Descrizione: Salvataggio compresso
C.J e C.JAL
Descrizione: Salti compressi (incondizionati)
C.BEQZ e C.BNEZ
Descrizione: Salti condizionati compressi (basati su zero)
C.SLLI, C.LI, C.ADDI16SP, C.LUI
Descrizione: Istruzioni compresse per immediati e operazioni speciali
L’insieme completo delle istruzioni compresse è numeroso e le loro codifiche dipendono da specifici campi all’interno dell’istruzione a 16 bit. Per ogni istruzione esiste un’equivalenza (o un’interpretazione compressa) dell’istruzione standard.
Tabella Riassuntiva – Estensione C (alcuni esempi)
| Istruzione | Descrizione breve |
|---|---|
| C.ADDI | Aggiunge un immediato (compressa) |
| C.ADDI4SPN | Aggiunge immediato allo stack pointer |
| C.LW / C.LD | Caricamento compresso da memoria |
| C.SW / C.SD | Salvataggio compresso in memoria |
| C.J / C.JAL | Salti incondizionati compressi |
| C.BEQZ / C.BNEZ | Branch compressi in base al confronto con zero |
| C.SLLI, C.LI, C.ADDI16SP, C.LUI | Operazioni immediata e speciali in formato compresso |