L'istruzione lui
torna utile quando è necessario utilizzare operandi immediati ampi. Questa istruzione consente:
L'istruzione lui
utilizza un nuovo formato di istruzione di tipo U, dato che gli altri formati non possono ospitare una costante così ampia.
Caricamento di una costante su 32 bit
Qual è il codice RISC-V utilizzato per caricare la seguente costante a 64 bit nel registro x19
?
Costante da caricare:
|Bit da 63 a 32|Bit da 31 a 12|Bit da 11 a 0|
|--|--|--|
|00000000 00000000 00000000 00000000|00000000 00111101 0000|0101 00000000|
Per prima cosa attraverso l'istruzione lui
si caricano i bit dalla posizione 12 alla 31. Il numero 00000000 00111101 0000 non è altro che il numero decimale 976, quindi si usa lui
con il numero 976 sul registro x19:lui x19, 976
A questo punto x19
contiene:
00000000 00000000 00000000 00000000 00000000 00111101 00000000 00000000
Il passo successivo consiste nell'inserire nei 12 bit meno significativi (più a destra) della costante, ovvero i bit che vanno da 0 a 11:
|Bit da 63 a 32|Bit da 31 a 12|Bit da 11 a 0|
|--|--|--|
|00000000 00000000 00000000 00000000|00000000 00111101 0000|0101 00000000|
il cui valore decimale non è altro che 1280:addi x19, x19, 1280
Il valore finale del registro x19
è quello desiderato, ed è:
00000000 00000000 00000000 00000000 00000000 00111101 00000101 00000000
Nell'esempio proposto il bit 11 era posto a 0, ma se fosse stato a 1 ci sarebbero state ulteriori complicazioni, infatti, il campo immediato dell'istruzione addi
sarebbe interpretato come un valore negativo in complemento a 2 su 12 bit. Questo perché il bit 11 rappresenterebbe il bit di segno considerando i bit da 0 a 11, della costante da caricare, come un numero e non come parte di un numero. Per correggere questo problema, possiamo aggiungere 1 alla costante caricata con lui
.
Esempio se dovesse essere caricata la costante: 00000000 00000000 00000000 00000000 00000000 00111101 00001101 00000000 dove il bit 11 è posto a 1 e non a 0 come prima.
# Caricamento dei primi 20 bit (senza considerare il bit 11)
lui x19, 0b00000000001111010000
# Caricamento dei restanti 12 bit (incluso il bit 11)
addi x19, x19, 0b110100000000
# Correzione del bit 11 (aggiunta di 1) addi x19, x19, 1
addi x19, x19, 1