remu
lyszt.netはremuおよびその他の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
説明
remu は符号なし剰余、つまり符号なし除算の後に残る値を計算します。これは rem が div に対して持つ関係と同じ関係を divu に対して持ちます。u はビットが 0 からおよそ 40 億までの非負の数として扱われることを意味します。divu のページでは、同じビットの符号付きおよび符号なしの読み取りがどのように異なるかを説明しています。
remu の結果は常に 0 と除数から 1 を引いた値の間に収まるため、決して負になることはなく、符号規則もありません。このため、循環バッファ上で位置をラップさせたり、ハッシュ値を固定数のスロットに分散させたり、繰り返しシーケンスを巡回させたりするのに便利です。
ゼロによる剰余は元の数を返します。
RISC-V マニュアルによると、符号なし除算のオーバーフローは発生しないため、remu にオーバーフローのケースはありません。ゼロによる剰余は被除数と等しくなります。マニュアルでは、商と剰余の両方が必要な場合、同じオペランドに対して divu と remu を実行することを推奨しており、プロセッサがそれらを 1 つの除算に融合できるようにしています。
除数が 2 の冪である場合、ビット単位の AND(andi)が同じ結果をより低コストで得られます。以下の行は 8 で割った後の剰余を計算します。2 の冪による剰余は値の最下位ビットだからです。
andi t0, t0, 7
このショートカットは 2 の冪にのみ適用されます。
例
li t0, -1 li t1, 10 remu t2, t0, t1 # t2 = 5 (t0 read as unsigned)
