srli

srli

RISC-V アセンブリ 参考

lyszt.netはsrliおよびその他のRISC-V命令をより詳しく扱っています。

エンコーディング形式

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

説明

srli はビットを固定量だけ右に移動し、空いた上位位置に 0 を入れます。これは srl の定数量形式であり、srl が仕組みとゼロ埋めを説明しています。i は即値(immediate)を意味し、命令にエンコードされた定数です。

srli の形式は以下に示すとおりで、amount は 0 から 31 までの固定数です。

srli rd, rs1, amount

右シフトは移動する桁ごとに数を半分にし、ゼロ埋めは値を決して負でないものとして扱うため、srli は符号なし数を 2 の冪で割り、余りを出しません。次の行は t0 を 4 で割ります。

srli t0, t0, 2

マスキング AND と組み合わせると、srli はパックされた値から 1 つのフィールドを取り出します。フィールドを最下位までシフトダウンし、次に andi を適用してそのビットだけを残します。ワードの 2 バイト目を読み取るには、8 だけ右シフトし、0xff で AND します。

RISC-V マニュアルは、定数シフトを標準的な命令レイアウトの 1 つである I タイプ形式の特殊化としてエンコードしています。シフト量は即値フィールドの下位 5 ビットを占め、命令のビット 30 が 2 つの右シフトを区別します。srli は論理右シフトを行い、0 が上位ビットに入ります。

srli は常に 0 で埋めます。これは生のビットパターンや決して負にならない数に適しています。負になる可能性がある符号付きの値では、0 が符号マーカーを上書きします。2 の冪による符号付き除算には srai を使います。この 2 つの選択は、レジスタのビットをどう読むかを反映しています。

例

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