srai

srai

RISC-V Assembler Referenz

lyszt.net behandelt srai und andere RISC-V-Befehle ausführlicher.

Kodierungsformat

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

Beschreibung

srai verschiebt Bits um einen festen Betrag nach rechts und kopiert das Vorzeichenbit in die freigewordenen oberen Positionen, wodurch negative Zahlen negativ bleiben. Es ist die Form von sra mit konstantem Betrag, weshalb die Auffüllung das Vorzeichen beibehält. Das i bedeutet immediate, eine in der Anweisung kodierte Konstante.

Die Syntax von srai ist unten dargestellt, wobei amount eine Konstante zwischen 0 und 31 ist.

srai rd, rs1, amount

Eine Rechtsverschiebung um eine Stelle halbiert eine Zahl und lässt das Vorzeichen unverändert, sodass srai eine vorzeichenbehaftete Zahl durch eine Zweierpotenz dividiert. Die nächste Zeile dividiert einen vorzeichenbehafteten Wert durch 8, sowohl für positive als auch für negative Eingaben.

srai t0, t0, 3

srai rundet ab, in Richtung des negativeren Werts. Eine Verschiebung von -7 um 1 nach rechts ergibt -4, während div mit einem Divisor von 2 -3 ergibt, weil es in Richtung null rundet. Die beiden stimmen bei nicht negativen Zahlen und bei Divisionen ohne Rest überein. Sie unterscheiden sich nur um eins, wenn bei einer negativen Zahl ein Rest bleibt. Grafik-, Audio- und Signalcode benötigt im Allgemeinen die Abrundung.

Das RISC-V-Handbuch kodiert konstante Verschiebungen als eine Spezialisierung des I-Typ-Formats, eines der Standard-Anweisungslayouts. Der Verschiebungsbetrag belegt die unteren 5 Bits des Immediate-Felds, und Bit 30 der Anweisung unterscheidet die beiden Rechtsverschiebungen. srai führt eine arithmetische Rechtsverschiebung durch, und das ursprüngliche Vorzeichenbit füllt die freigewordenen oberen Bits.

Von den vier Verschiebungen behandelt srai vorzeichenbehaftete Zahlen, die dividiert werden, und srli behandelt rohe Bits oder Zahlen, die nie negativ werden. Die Formen ohne i, sra und srl, nehmen eine Verschiebungsdistanz, die zur Laufzeit des Programms berechnet wird.

Beispiel

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