srl
lyszt.netはsrlおよびその他の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
説明
srl はビットを右に移動します。これは sll の逆の動作です。この文字は shift right logical を表します。この形式は rs1 のビットを取得し、rs2 のカウント分だけ右に移動し、その結果を rd に格納します。
srl rd, rs1, rs2
右端を越えて押し出されたビットは失われ、空いた左側の位置は 0 で埋められます。
このゼロ埋めが logical という言葉の理由です。右シフトは値を半分にするので、1 のシフトは 2 で割り、3 のシフトは 8 で割ります。余りは切り捨てられ、整数除算と一致します。srl は符号なし数を 2 のべき乗で高速に除算します。
右シフト命令は 2 つあり、違いは空になった上位ビットに何が入るかです。srl はそこに 0 を入れます。対応する sra は符号ビットをそれらの位置にコピーし、負の数の符号を保持します。生のビットパターンや負になり得ない値には srl を選んでください。負になり得る符号付きの値では、srl は大きな正の数を生成し、その場合は sra が正しい命令です。
RISC-V マニュアルによると、シフトカウントはレジスタ rs2 の下位 5 ビットを占めます。それらの 5 ビットは 0 から 31 の範囲にわたり、rs2 の残りのビットは無視されます。マニュアルは srl を論理右シフトと呼び、上位にゼロを挿入します。
シフトカウントが定数の場合は、即値形式 srli を使用してください。
例
li t0, -8 li t1, 1 srl t2, t0, t1 # t2 = 2147483644 (zero-filled)
