I valori immediati nei formati B, J e U vengono codificati nelle istruzioni in modi particolari:
FORMATO B (BRANCH)
Caratteristiche:
Immediato “sparso”: L’immediato è codificato su 12 bit, ma i bit non sono contigui all’interno dell’istruzione.
Shift implicito: Poiché gli indirizzi di branch sono allineati (tipicamente a 2 byte o 4 byte), il bit meno significativo (imm[0]) è sempre = 0 (numeri binari multipli di 2 o di 4) quindi non viene codificato. L’immediato viene quindi shiftato implicitamente a destra di una posizione con l’eliminazione diimm[0].
Ricostruzione: Il processore, durante la decodifica, sa che il bit meno significativo è sempre 0, quindi lo reinserisce automaticamente. Il valore immediato si ricostruisce assemblando i bit in questo ordine (l’immediato fuori dall’istruzione ha 12 + 1 bit):
{imm[12], imm[11], imm[10:5], imm[4:1], 0}
/* Da notare che l'immediato fuori dalla codifica è a 13 bit e non 12
/* Inoltre notiamo che imm[11] viene rimesso al suo postoEsempio:
Considera l’istruzione:
BEQ x5, x6, 16Offset richiesto: 16 byte. Shift implicito: 16 ÷ 2 = 8. (immediato codificato = 8) 8 in binario (12 bit):
# immediato iniziale: (13 bit)
0000000010000
# tolgo il bit meno significativo (shift implicito) (12 bit)
000000001000
# immediato codificato: (12 bit sparsi)
0 rs2 rs1 funct3 000000 1000 0 opcodeDistribuzione nella codifica:
imm[12] = 0
imm[10:5] = 000000
imm[4:1] = 1000
imm[11] = 0
Bit imm[0] implicito = 0 (non codificato)
Alla ricostruzione, il processore ricava l’offset 16 byte (lungo 12 bit + 1) ricomponendo i bit nel giusto ordine e aggiungendo il bit meno significativo (0).
FORMATO J (JUMP)
Caratteristiche:
Immediato “sparso”: L’immediato per le istruzioni di salto (come JAL) è codificato su 20 bit con una disposizione non lineare.
Shift implicito: Poiché gli indirizzi di jump sono allineati, il bit meno significativo (imm[0]) è sempre = 0 (numeri binari multipli di 2 o di 4) quindi non viene codificato. L’immediato viene quindi shiftato implicitamente a destra di una posizione con l’eliminazione diimm[0].
Ricostruzione: Il processore, durante la decodifica, sa che il bit meno significativo è sempre 0, quindi lo reinserisce automaticamente. Il valore immediato si ricostruisce assemblando i bit in questo ordine (l’immediato fuori dall’istruzione ha 20 + 1 bit):
{imm[20], imm[19:12], imm[11], imm[10:1], 0}
/* Da notare che l'immediato fuori dalla codifica è a 21 bit e non 20
/* Ogni bit viene rimesso al suo postoEsempio:
Considera l’istruzione:
JAL x1, 1024Offset richiesto: 1024 byte. Shift implicito: 1024 ÷ 2 = 512. 512 in binario (20 bit):
# immediato iniziale: (21 bit)
0000000010000000000
# tolgo il bit meno significativo (shift implicito) (20 bit)
000000001000000000
# immediato codificato: (20 bit sparsi)
0 1000000000 0 0000000 rd opcodeDistribuzione nella codifica:
imm[20] = 0
imm[10:1] = 1000000000
imm[11] = 0
imm[19:2] = 0000000
Bit imm[0] implicito = 0 (non codificato)
Alla ricostruzione, il processore ricava l’offset 1024 byte (lungo 20 bit + 1) ricomponendo i bit nel giusto ordine e aggiungendo il bit meno significativo (0).
FORMATO U (UPPER IMMEDIATE)
Caratteristiche:
Immediato a 20 bit “allineato”: In questo formato (usato in istruzioni come LUI o AUIPC) l’immediato viene memorizzato nei bit dal 31° al 12° dell’istruzione.
Shift a sinistra di 12 bit: Durante l’esecuzione, il valore memorizzato viene shiftato a sinistra di 12 bit (moltiplicato per 4096), posizionandosi così nei bit più significativi e riempiendo con zeri quelli meno significativi (20 + 12 = 32 bit).
Utilizzo: Questo consente di rappresentare numeri di grande portata (ad esempio, la parte alta di un indirizzo).
Esempio:
Considera l’istruzione:
LUI x5, 1048576Valore finale desiderato: 1048576.
Immediato codificato:
256 in binario (20 bit):
Il valore 256 in binario è 100000000₂. Espresso su 20 bit (aggiungendo zeri a sinistra):
00000000000100000000 Codifica nell’istruzione:
imm[31:12] # imm[11:0] non codificato
00000000000100000000 # + 000000000000 per fare 1048576Al momento dell’esecuzione, il processore shift a sinistra di 12 bit l’immediato, ottenendo: