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 rs2rd = rs1 + rs2
Esempio:

add x5, x1, x2  # x5 = x1 + x2

SUB
Sintassi: sub rd, rs1, rs2
Descrizione: Sottrae rs2 da rs1rd = rs1 - rs2
Esempio:

sub x5, x1, x2  # x5 = x1 - x2

SLL (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 : 0

SLTU (Set Less Than, unsigned)

Sintassi: sltu rd, rs1, rs2
Descrizione: Confronto senza segno
Esempio:

sltu x5, x1, x2  # x5 = (x1 < x2) in unsigned ? 1 : 0

XOR

Sintassi: xor rd, rs1, rs2
Descrizione: Operazione bitwise XOR tra rs1 e rs2
Esempio:

xor x5, x1, x2  # x5 = x1 ^ x2

SRL (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 segno

OR

Sintassi: or rd, rs1, rs2
Descrizione: Operazione bitwise OR
Esempio:

or x5, x1, x2  # x5 = x1 | x2

AND

Sintassi: and rd, rs1, rs2
Descrizione: Operazione bitwise AND
Esempio:

and x5, x1, x2  # x5 = x1 & x2

Operazioni 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 + 10

SLTI

Sintassi: slti rd, rs1, imm
Descrizione: Imposta rd = 1 se rs1 è minore di imm (signed)
Esempio:

slti x5, x1, 20  # x5 = (x1 < 20) ? 1 : 0

SLTIU

Sintassi: sltiu rd, rs1, imm
Descrizione: Confronto senza segno con immediato
Esempio:

sltiu x5, x1, 20  # confronto unsigned

XORI

Sintassi: xori rd, rs1, imm
Descrizione: XOR tra rs1 e l’immediato
Esempio:

xori x5, x1, 0xFF

ORI

Sintassi: ori rd, rs1, imm
Descrizione: OR bitwise con immediato
Esempio:

ori x5, x1, 0xF0

ANDI

Sintassi: andi rd, rs1, imm
Descrizione: AND bitwise con immediato
Esempio:

andi x5, x1, 0x0F

SLLI

Sintassi: slli rd, rs1, shamt
Descrizione: Shift logico a sinistra con immediato di shift (shamt) Esempio:

slli x5, x1, 3  # x5 = x1 << 3

SRLI / 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 = 0x12345000

AUIPC (Add Upper Immediate to PC)

Sintassi: auipc rd, imm20
Descrizione: Calcola rd = PC + (imm20 << 12)
Esempio:

auipc x5, 0x1  # x5 = PC + 0x1000

CONTROLLO DI FLUSSO

Branch (Salti condizionati - Formato B)

BEQ

Sintassi: beq rs1, rs2, offset
Descrizione: Salta se rs1 == rs2
Esempio:

beq x1, x2, label

BNE

Sintassi: bne rs1, rs2, offset
Descrizione: Salta se rs1 != rs2
Esempio:

bne x1, x2, label

BLT 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 >= x2

BLTU 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, label

Jump (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 + 0

ACCESSO 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] = x5

Istruzioni di Sincronizzazione e Ambiente

FENCE

Sintassi: fence [pred], [succ]
Descrizione: Garantisce l’ordine delle operazioni di memoria
Esempio:

fence

FENCE.I

Sintassi: fence.i
Descrizione: Sincronizza le istruzioni cache (utile dopo modifiche alla memoria contenente codice)
Esempio:

fence.i

ECALL e EBREAK

Descrizione: Chiamata al sistema (ECALL) ed interruzione per debug (EBREAK)
Esempio:

ecall ebreak

TABELLA RIASSUNTIVA - SET BASE

IstruzioneCategoriaDescrizione breve
ADDAritmeticaSomma due registri
SUBAritmeticaSottrazione tra registri
SLLShiftShift logico a sinistra
SLT / SLTUConfrontoSetta se minore (signed/unsigned)
XORLogicaXOR bitwise
SRL / SRAShiftShift logico / aritmetico a destra
ORLogicaOR bitwise
ANDLogicaAND bitwise
ADDIAritmeticaSomma con immediato
SLTI/SLTIUConfrontoSet less than con immediato (signed/unsigned)
XORI, ORI, ANDILogicaOperazioni logiche con immediato
SLLI, SRLI, SRAIShiftShift con immediato
LUISpecialeCarica immediato nella parte alta
AUIPCSpecialePC-relative address calcolo
JAL, JALRSaltiSalti incondizionati con link
BEQ, BNE, BLT, BGE, BLTU, BGEUBranchSalti condizionati
LB, LH, LW, LBU, LHUCaricamentoCaricamento dati da memoria
SB, SH, SWMemorizzazioneScrittura in memoria
FENCE, FENCE.ISincronizzazioneControllo ordine memoria/instr.
ECALL, EBREAKAmbienteChiamate 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 part

MULH

Sintassi: mulh rd, rs1, rs2
Descrizione: Moltiplicazione che restituisce la parte alta del prodotto (signed)
Esempio:

mulh x5, x1, x2

MULHSU

Sintassi: mulhsu rd, rs1, rs2
Descrizione: Moltiplicazione tra un operando signed e uno unsigned, parte alta
Esempio:

mulhsu x5, x1, x2

MULHU

Sintassi: mulhu rd, rs1, rs2
Descrizione: Moltiplicazione unsigned, parte alta
Esempio:

mulhu x5, x1, x2

DIV

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 unsigned

REM

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, x2

Tabella Riassuntiva – Estensione M

IstruzioneDescrizione breve
MULMoltiplicazione (parte bassa)
MULHMoltiplicazione (parte alta, signed)
MULHSUMoltiplicazione (mixed signed/unsigned, parte alta)
MULHUMoltiplicazione (unsigned, parte alta)
DIVDivisione signed
DIVUDivisione unsigned
REMResto signed
REMUResto 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 = 0

AMOSWAP.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 atomica

AMOMIN.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

IstruzioneDescrizione breve
LR.W / LR.DCarica riservato (word/double)
SC.W / SC.DStore condizionale (word/double)
AMOSWAP.W / AMOSWAP.DScambio atomico
AMOADD, AMOXOR, AMOAND, AMOOROperazioni aritmetiche/logiche atomiche
AMOMIN, AMOMAX, AMOMINU, AMOMAXUOperazioni 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, f1

Operazioni 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

IstruzioneDescrizione breve
FLW / FSWCaricamento/Salvataggio di valori float
FADD.S, FSUB.S, FMUL.S, FDIV.SOperazioni aritmetiche float (singola precisione)
FSQRT.SRadice quadrata float
FCVT.*, FEQ.S, FLT.S, FLE.S, FCLASS.SConversioni 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 precision

Conversioni 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

IstruzioneDescrizione breve
FLD / FSDCaricamento/Salvataggio double
FADD.D, FSUB.D, FMUL.D, FDIV.D, FSQRT.DOperazioni aritmetiche double
Conversioni e ComparazioniFCVT.*, 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 addi

C.ADDI4SPN

Descrizione: Aggiunge un immediato al registro stack pointer (per allocare spazio nello stack)
Esempio:

c.addi4spn x2, 8  # modifica lo stack pointer

C.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)

IstruzioneDescrizione breve
C.ADDIAggiunge un immediato (compressa)
C.ADDI4SPNAggiunge immediato allo stack pointer
C.LW / C.LDCaricamento compresso da memoria
C.SW / C.SDSalvataggio compresso in memoria
C.J / C.JALSalti incondizionati compressi
C.BEQZ / C.BNEZBranch compressi in base al confronto con zero
C.SLLI, C.LI, C.ADDI16SP, C.LUIOperazioni immediata e speciali in formato compresso