neg疑似

neg

疑似
RISC-V アセンブリ 参考

lyszt.netはnegおよびその他のRISC-V命令をより詳しく扱っています。

説明

neg は数値の符号を反転します。5 は -5 になり、-5 は 5 になります。この名前は negate を短縮したものです。以下の形式は、ソースレジスタ rs の否定をデスティネーションレジスタ rd に配置します。

neg rd, rs

neg は疑似命令です。アセンブラは、読みやすい名前である疑似命令を、プロセッサがそれを処理する前に 1 つ以上の実際の命令に書き換えます。neg は以下の命令になり、これは数値を、常に 0 を保持する特殊レジスタである zero から減算します。

sub rd, zero, rs

0 から x を引くと -x になるため、これで否定が生成されます。RISC-V は、このように減算とゼロレジスタを再利用することで、実際の命令のセットを小さく保っています。

負の数の範囲は正の範囲より 1 段階だけ広がっています。約 -21 億に達し、正の側は約 +21 億までしかありません。最も負の数には正の対応する値がないため、それを否定するとラップアラウンドして同じ数になります。絶対値を計算するコードはこのケースを考慮しなければなりません。

RISC-V マニュアルは sub を rs1 から rs2 を減算するものと定義し、ここでは zero と呼ばれるレジスタ x0 を、すべてのビットが 0 である値にハードワイヤードされているものとして説明しています。x0 から値を減算するとその負の値が生成され、これが neg が変換される形式です。

この例では 5 を -5 に否定します。数値がすでに正の場合に neg をスキップする分岐と組み合わせることで、通常の 2 命令の絶対値が生成されます。

展開先

sub rd, zero, rs

アセンブラはこの疑似命令を、上記に示された実際の命令または複数の命令に置き換えます。

例

li t0, 5
neg t1, t0       # t1 = -5