snez疑似

snez

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

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

説明

snez は、レジスタがゼロ以外の値を保持しているかどうかをテストします。これは seqz の逆です。名前は「ゼロに等しくない場合にセットする」という意味です。rs が非ゼロの場合、以下の形式は rd に 1 を書き込み、rs がゼロの場合は 0 を書き込みます。

snez rd, rs

snez は seqz と同様に疑似命令であり、アセンブラがそれを実際の命令に展開します。その命令は、ゼロがその値より小さいかどうかを問い合わせます。

sltu rd, zero, rs

これはゼロ以外の任意の値に対して成り立ちます。アセンブラは snez を書いたときにこの変換を行います。

計算では、その値の唯一の有用な性質がゼロかどうかであるような値がしばしば生成されます。たとえば、残りの項目数、2 つのものの差、またはフラグのグループなどです。snez はその値を、非ゼロのときは 1 に、ゼロのときは 0 に還元します。これは、はいかいいえの答えを返す関数の標準的な形式です。

RISC-V マニュアルでは、snez を、x0 を最初のソースとする sltu のアセンブラ疑似命令として定義しています。rs2 がゼロに等しくない場合は rd を 1 に、それ以外の場合は 0 に設定します。

snez は XOR と組み合わせて不等性をテストします。2 つの値を XOR すると、それらが異なるときにのみ非ゼロの結果が得られるので、snez を適用して、異なるときに 1 を得ます。seqz とともに、これは等しい場合と等しくない場合の真または偽の結果を生成し、ジャンプなしで and や or と組み合わせてより大きな条件にできます。

展開先

sltu rd, zero, rs

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

例

li t0, 5
snez t1, t0       # t1 = 1