sll
lyszt.netはsllおよびその他の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
説明
sll は数値のビットを左に移動します。レジスタは 32 ビットを一列に保持し、シフトはその列全体を指定された位置数だけ左または右に移動します。名前は shift left logical の略です。以下の形式では、rs1 の値が rs2 で指定された桁数だけ左にシフトされ、結果が rd に格納されます。
sll rd, rs1, rs2
ビットが左に移動すると、右側の空いた位置にはゼロが入り、左端を越えて押し出されたビットは破棄されます。
1 桁の左シフトは数値を 2 倍にします。これは十進数に 0 を追加すると 10 倍になるのと同じです。1 のシフトは 2 倍、2 のシフトは 4 倍、3 のシフトは 8 倍になります。シフトは乗算よりもプロセッサへの負荷が少ないため、2 の累乗を掛ける高速な方法となります。配列アクセスはこれに依存しています。各要素のアドレスは前の要素から固定の 2 の累乗バイト数だけ離れているからです。
RISC-V マニュアルによると、シフト量はレジスタ rs2 の下位 5 ビットに保持されます。5 ビットで 0 から 31 桁をカバーするため、rs2 の残りのビットは効果がありません。マニュアルでは sll を論理左シフトと呼び、下位ビットにゼロが入ることを意味します。
この形式ではシフト量はレジスタから取得され、プログラム実行中に計算された量に適しています。固定量には slli を使用します。例では 3 を 2 桁左にシフトし、4 倍にして 12 にします。
例
li t0, 3 li t1, 2 sll t2, t0, t1 # t2 = 12
