sra

sra

Asembler RISC-V Referencja

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

sra to drugie przesunięcie w prawo, obok srl. Nazwa oznacza przesunięcie arytmetyczne w prawo. Poniższa forma przesuwa rs1 w prawo o wartość zawartą w rs2.

sra rd, rs1, rs2

Jak każde przesunięcie w prawo, przenosi bity w stronę młodszych pozycji i odrzuca te, które wypadną. Sposób traktowania pustych górnych pozycji różni się od srl.

RISC-V używa schematu ze znakiem, w którym najstarszy bit oznacza znak, a 1 na tej pozycji oznacza liczbę ujemną. srl wypełnia górę zerami, co usuwa znacznik znaku i zamienia liczbę ujemną w dużą dodatnią. sra wypełnia górę kopiami istniejącego bitu znaku, więc wypełnienie to 1 dla liczby ujemnej i 0 dla dodatniej. Liczba zachowuje swój znak.

sra dzieli liczbę ze znakiem przez potęgę dwójki. Przesunięcie o 1 zmniejsza ją o połowę, przesunięcie o 3 dzieli ją przez 8, a liczby ujemne pozostają ujemne. Wynik zaokrągla w dół, w stronę bardziej ujemnej wartości, więc -7 przesunięte w prawo o 1 daje -4, podczas gdy instrukcja div daje -3. Kod grafiki i dźwięku zwykle akceptuje zaokrąglanie w dół.

Podręcznik RISC-V przechowuje wielkość przesunięcia w dolnych 5 bitach rejestru rs2. Pięć bitów obejmuje od 0 do 31 pozycji, więc pozostałe bity rs2 nie mają efektu. Podręcznik opisuje sra jako arytmetyczne przesunięcie w prawo, które kopiuje oryginalny bit znaku do zwolnionych górnych bitów.

Używaj sra dla liczb ze znakiem, a srl dla surowych wzorców bitowych lub liczb, które nigdy nie są ujemne. Dla stałej wartości użyj formy stałej srai.

Przykład

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