srli

srli

RISC-V Assembler Referenz

lyszt.net behandelt srli 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

srli verschiebt Bits um einen festen Betrag nach rechts und setzt 0en in die freigewordenen oberen Positionen. Es ist die Form mit konstantem Betrag von srl, die die Mechanik und die Nullfüllung abdeckt. Das i bedeutet immediate, eine im Befehl kodierte Konstante.

Die Form von srli erscheint unten, wobei amount eine feste Zahl von 0 bis 31 ist.

srli rd, rs1, amount

Eine Rechtsverschiebung halbiert eine Zahl einmal für jede verschobene Stelle, und die Nullfüllung behandelt den Wert als nie negativ, sodass srli eine vorzeichenlose Zahl ohne Rest durch eine Zweierpotenz dividiert. Die nächste Zeile dividiert t0 durch vier.

srli t0, t0, 2

In Kombination mit einem maskierenden AND extrahiert srli ein Feld aus einem gepackten Wert. Verschieben Sie das Feld nach unten und wenden Sie dann andi an, um nur seine Bits zu behalten. Das Lesen des zweiten Bytes eines Worts erfordert eine Rechtsverschiebung um 8 und ein AND mit 0xff.

Das RISC-V-Handbuch kodiert konstante Verschiebungen als eine Spezialisierung des I-Typ-Formats, eines der Standard-Befehlslayouts. Der Verschiebungsbetrag belegt die unteren 5 Bits des Immediate-Felds, und Bit 30 des Befehls unterscheidet die beiden Rechtsverschiebungen. srli führt eine logische Rechtsverschiebung durch, und 0en treten in die oberen Bits ein.

srli füllt immer mit 0en. Das passt zu rohen Bitmustern und Zahlen, die nie negativ sind. Bei einem vorzeichenbehafteten Wert, der negativ sein kann, überschreiben die 0en die Vorzeichenmarkierung. Die vorzeichenbehaftete Division durch eine Zweierpotenz verwendet srai. Die Wahl zwischen den beiden spiegelt wider, wie Sie die Bits des Registers lesen.

Beispiel

li t0, -8
srli t1, t0, 1   # t1 = 2147483644 (zero-filled)