jr
疑似lyszt.netはjrおよびその他のRISC-V命令をより詳しく扱っています。
説明
jr はレジスタに格納されたアドレスへジャンプします。名前は jump register の略です。j はコードに書かれた固定のラベルへジャンプします。jr はレジスタが保持する任意のアドレスへジャンプし、そのアドレスはプログラムが実行中に算出します。戻りアドレスは保存しません。
jr は以下の行の擬似命令であり、戻りアドレスを破棄するレジスタジャンプです(jalr を参照)。
jalr zero, rs, 0
ジャンプテーブルとは、複数のルーチンのアドレスを保持するメモリ内の配列であり、jr はこれと組み合わせて使われます。ルーチン番号 i を選ぶには、プログラムはテーブル内のそのスロットを計算し、そこに格納されたアドレスをレジスタにロードして jr でそこへジャンプします。1 回の参照と 1 回のジャンプで、長い一連の比較(case 0 か、case 1 か、case 2 か、など)を置き換えられます。ケースの数がいくつであっても変わりません。密な switch 文やインタプリタの内部ループのディスパッチはこの方式で行います。
RISC-V のマニュアルでは、単純な無条件間接ジャンプは rd を x0 に設定した jalr としてエンコードされます。jalr は条件分岐とは異なり、その即値を 2 バイトの倍数として扱わないこと、また jalr のほとんどの使用では即値がゼロであるか、lui または auipc の後に来ることに言及しています。
関数からの戻りは ra 内のアドレスへのジャンプであるため、ret は別名の jr ra です。ジャンプ命令のグループは、アドレスの出所と戻りアドレスを保存するかどうかが異なります。
展開先
jalr zero, rs, 0
アセンブラはこの疑似命令を、上記に示された実際の命令または複数の命令に置き換えます。
例
la t0, target jr t0 # jump to the address held in t0
