sra

sra

RISC-V アセンブリ 参考

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

説明

sra は 2 番目の右シフトで、srl の隣にあります。名前は shift right arithmetic の略です。以下の形式は rs1 を rs2 に保持された量だけ右にシフトします。

sra rd, rs1, rs2

他の右シフトと同様に、ビットを下位側へ移動し、はみ出したものは捨てます。空いた上位ビットの扱いが srl とは異なります。

RISC-V は最上位ビットが符号を表す符号付き方式を採用しており、そこが 1 ならその数は負です。srl は上位を 0 で埋めるため、符号マーカーが消え、負の数が大きな正の数になります。sra は上位を既存の符号ビットのコピーで埋めるため、負の数では 1、正の数では 0 で埋められます。数は符号を保ちます。

sra は符号付きの数を 2 の累乗で割ります。1 ビットのシフトは半分にし、3 ビットのシフトは 8 で割り、負の数は負のままです。結果は下方向、つまりより負の値へ丸められるため、-7 を 1 ビット右シフトすると -4 になりますが、div 命令では -3 になります。グラフィックスやオーディオのコードは通常、下方向への丸めを受け入れます。

RISC-V のマニュアルでは、シフト量はレジスタ rs2 の下位 5 ビットに保持されます。5 ビットで 0 から 31 桁をカバーするため、rs2 の他のビットは効果がありません。マニュアルは sra を算術右シフトと記述しており、元の符号ビットを空いた上位ビットにコピーします。

符号付きの数には sra を、生のビットパターンや決して負にならない数には srl を使用してください。固定量の場合は、定数形式 srai を使用してください。

例

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