rem
lyszt.netはremおよびその他のRISC-V命令をより詳しく扱っています。
エンコーディング形式
説明
rem は除算の余り、つまり残った数を返します。 17を5で割ると、3回割り切れて2が残ります。divは3を返し、remは2を返します。この名前は「remainder(余り)」の略です。構文は以下の通りで、rd = rs1をrs2で割った余りを意味します。
rem rd, rs1, rs2
これは div と同じ、オプションの M 数学拡張機能に属します。
この 2 つの命令は同じ数値のペアに対して動作し、組み合わせて商と余りを返します。rem は、高水準言語における %(剰余)演算子のアセンブリ形式です。
負の数の場合、余りは被除数の符号を受け継ぎます。7を2で割った余りは1、-7を2で割った余りは-1となります。2で割った余りが1であるかどうかで奇数かどうかを判定する方法は、負の数に対しては誤った答えを返します。余りが0であるかどうかを確認すれば、どの符号の場合でも偶数か奇数かを判断できます。
RISC-Vのマニュアルによると、remは対応する除算の余りを返し、結果が0でない場合はその余りの符号が被除数の符号と同じになるとしています。オーバーフローを起こさないすべての除算において、被除数 = 除数 × 商 + 余り が成り立ちます。 0で割った余りは被除数に等しく、符号付きオーバーフローの場合、つまり最も負の大きな数を-1で割った場合、余りは0になります。同じ除算の商と余りを得るには、マニュアルでは同じオペランドに対してdivを実行した後、remを実行することを推奨しており、プロセッサはこれらを1つの除算命令に融合することができます。
剰余は、カウンタをバッファの先頭に戻したり、数値から桁を切り捨てたり、項目をスロットに分散させたりするために使用されます。0による剰余演算は元の数値を返します。この例では、17の剰余5を計算し、t2に2を格納します。
例
li t0, 17 li t1, 5 rem t2, t0, t1 # t2 = 2
