Load Up Immediate

L'istruzione lui torna utile quando è necessario utilizzare operandi immediati ampi. Questa istruzione consente:

  1. il caricamento dei 20 bit più significativi di una costante nei bit da 12 a 31 di un registro
  2. poi imposta i 32 bit più a sinistra al valore del 31-esimo bit (di segno)
  3. e riempie i 12 bit più a destra del registro con zero.

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