slli

slli

Assembly RISC-V Riferimento

lyszt.net tratta slli e altre istruzioni RISC-V in modo più dettagliato.

Formato di codifica

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Descrizione

slli sposta i bit a sinistra di una quantità fissa. L'operazione corrisponde a sll: i bit scorrono a sinistra, gli zeri riempiono il lato destro, i bit che superano il bordo sinistro vanno persi, e ogni posizione spostata raddoppia il valore (la pagina sll copre il meccanismo). L'istruzione contiene la distanza di scorrimento come costante, quindi nessun registro la fornisce. La i significa immediato, che è il termine per una costante scritta nell'istruzione.

La forma di slli appare di seguito, dove amount è un numero fisso da 0 a 31.

slli rd, rs1, amount

La riga successiva sposta t0 a sinistra di 3 posizioni, il che lo moltiplica per 8.

slli t1, t0, 3

Gli array rendono questa istruzione comune. Un valore a 32 bit in un array occupa 4 byte, quindi l'elemento numero i si trova a i volte 4 byte dall'inizio, e uno scorrimento a sinistra di 2 moltiplica per 4. Lo schema usuale sposta l'indice per produrre un offset in byte, aggiunge l'indirizzo iniziale dell'array, poi carica il valore. Riconoscere questa sequenza di scorrimento, addizione e caricamento aiuta quando si legge assembly scritto da altri.

Il manuale RISC-V codifica gli scorrimenti di una costante come una specializzazione del formato di tipo I, uno dei layout di istruzione standard. rs1 contiene l'operando da spostare, e i 5 bit inferiori del campo immediato contengono la quantità di scorrimento. slli esegue uno scorrimento logico a sinistra, e gli zeri entrano nei bit inferiori.

Usa slli quando la distanza di scorrimento è nota mentre scrivi il codice. Usa sll quando la quantità viene calcolata durante l'esecuzione del programma. L'esempio sposta 5 a sinistra di 3, il che dà 5 volte 8, ovvero 40.

Esempio

li t0, 5
slli t1, t0, 3   # t1 = 5 << 3 = 40  (5 * 8)