slli

slli

Asembler RISC-V Referencja

lyszt.net obejmuje slli i inne instrukcje RISC-V w większych szczegółach.

Format kodowania

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

Opis

slli przesuwa bity w lewo o stałą wartość. Operacja odpowiada sll: bity przesuwają się w lewo, zera wypełniają prawą stronę, bity wychodzące za lewą krawędź są tracone, a każde przesunięte miejsce podwaja wartość (strona sll opisuje mechanikę). Instrukcja przechowuje odległość przesunięcia jako stałą, więc żaden rejestr jej nie dostarcza. Litera i oznacza immediate (natychmiastowy), co jest terminem na stałą zapisaną w instrukcji.

Postać slli przedstawiono poniżej, gdzie amount to stała liczba od 0 do 31.

slli rd, rs1, amount

Następna linia przesuwa t0 w lewo o 3 miejsca, co mnoży go przez 8.

slli t1, t0, 3

Tablice sprawiają, że ta instrukcja jest powszechna. Wartość 32-bitowa w tablicy zajmuje 4 bajty, więc element o numerze i znajduje się i razy 4 bajty od początku, a przesunięcie w lewo o 2 mnoży przez 4. Typowy wzorzec przesuwa indeks, aby uzyskać przesunięcie w bajtach, dodaje adres początkowy tablicy, a następnie ładuje wartość. Rozpoznawanie tej sekwencji przesunięcia, dodania i załadowania pomaga przy czytaniu asemblera napisanego przez innych.

Podręcznik RISC-V koduje przesunięcia o stałą jako specjalizację formatu typu I, jednego ze standardowych układów instrukcji. rs1 przechowuje operand do przesunięcia, a dolne 5 bitów pola immediate przechowuje wartość przesunięcia. slli wykonuje logiczne przesunięcie w lewo, a zera wchodzą do dolnych bitów.

Używaj slli, gdy odległość przesunięcia jest znana podczas pisania kodu. Używaj sll, gdy wartość jest obliczana podczas działania programu. Przykład przesuwa 5 w lewo o 3, co daje 5 razy 8, czyli 40.

Przykład

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