srai

srai

Asembler RISC-V Referencja

lyszt.net obejmuje srai 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

srai przesuwa bity w prawo o stałą wartość i kopiuje bit znaku do zwolnionych górnych pozycji, co zachowuje liczby ujemne jako ujemne. Jest to forma o stałej wartości instrukcji sra, dlatego wypełnienie zachowuje znak. Litera i oznacza immediate (natychmiastowy), stałą zakodowaną w instrukcji.

Składnia srai znajduje się poniżej, gdzie amount to stała z zakresu od 0 do 31.

srai rd, rs1, amount

Przesunięcie w prawo o jedno miejsce zmniejsza liczbę o połowę i pozostawia znak bez zmian, więc srai dzieli liczbę ze znakiem przez potęgę dwójki. Następny wiersz dzieli wartość ze znakiem przez 8, zarówno dla danych dodatnich, jak i ujemnych.

srai t0, t0, 3

srai zaokrągla w dół, w stronę bardziej ujemnej wartości. Przesunięcie -7 w prawo o 1 daje -4, podczas gdy div z dzielnikiem 2 daje -3, ponieważ zaokrągla w stronę zera. Obie operacje są zgodne dla liczb nieujemnych i dla dzielenia bez reszty. Różnią się o jeden tylko wtedy, gdy liczba ujemna pozostawia resztę. Kod grafiki, dźwięku i sygnałów na ogół wymaga zaokrąglania w dół.

Podręcznik RISC-V koduje przesunięcia o stałej wartości jako specjalizację formatu typu I, jednego ze standardowych układów instrukcji. Wartość przesunięcia zajmuje dolne 5 bitów pola natychmiastowego, a bit 30 instrukcji rozróżnia dwa przesunięcia w prawo. srai wykonuje arytmetyczne przesunięcie w prawo, a pierwotny bit znaku wypełnia zwolnione górne bity.

Spośród czterech przesunięć srai obsługuje liczby ze znakiem, które są dzielone, a srli obsługuje surowe bity lub liczby, które nigdy nie stają się ujemne. Formy bez i, sra i srl, przyjmują odległość przesunięcia obliczaną w czasie działania programu.

Przykład

li t0, -8
srai t1, t0, 1   # t1 = -4 (sign-filled)