srai

srai

RISC-V アセンブリ 参考

lyszt.netはsraiおよびその他の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

説明

srai はビットを固定量だけ右に移動し、空いた上位ビットに符号ビットをコピーするため、負の数は負のままになります。これは sra の定数量形式であり、そのためフィルが符号を保持します。i は即値(immediate)を意味し、命令にエンコードされた定数のことです。

srai の構文は以下に示すとおりで、amount は 0 から 31 の間の定数です。

srai rd, rs1, amount

1 ビットの右シフトは数を半分にし、符号は変わりません。したがって srai は符号付き数を 2 のべき乗で割ります。次の行は符号付きの値を 8 で割ります。正の入力にも負の入力にも対応します。

srai t0, t0, 3

srai はより負の値の方向へ切り下げます。-7 を 1 ビット右シフトすると -4 になりますが、除数 2 の div はゼロ方向へ丸めるため -3 になります。両者は非負の数および余りのない除算では一致します。負の数に余りが出る場合にのみ 1 だけ異なります。グラフィックス、オーディオ、信号処理のコードでは一般に切り下げ方向の丸めが必要です。

RISC-V マニュアルでは、定数シフトは標準的な命令レイアウトの一つである I タイプ形式の特殊化としてエンコードされます。シフト量は即値フィールドの下位 5 ビットを占め、命令のビット 30 が 2 つの右シフトを区別します。srai は算術右シフトを行い、元の符号ビットが空いた上位ビットを埋めます。

4 つのシフトのうち、srai は符号付き数の除算を扱い、srli は生のビットや決して負にならない数を扱います。i のない形式である sra と srl は、プログラム実行中に計算されるシフト距離を取ります。

例

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