// 相対ジャンプ [ IF <cond> ] JUMP <ofst13> [ (DB) ]; JUMP <ofst16> [(DB)]; // ロングジャンプ(絶対アドレス) [ IF <cond> ] LJUMP <imm24>; // 間接ジャンプ [ IF <cond> ] JUMP (<ireg>) [ (DB) ];
// 相対ジャンプ IF NE JUMP jump_target; // ラベル "jump_target" へ分岐 IF EQ JUMP jump_target (DB); // 遅延分岐 JUMP jump_target; // 無条件分岐 // ロングジャンプ LJUMP jump_target; // 間接ジャンプ JUMP (I7) (DB);
ジャンプ命令です。実行すると、命令実行アドレスが変わります。
ジャンプ先アドレスをPC相対であらわすか絶対番地で表すかは命令によって変わります。ただし、プログラマはこれを意識する必要はありません。必要な形式の選択はアセンブラが自動的に行うからです。プログラマは単にジャンプ先のラベルを与えてください。
間接ジャンプを行う場合、IREGが与えるのは下位16ビットのアドレスだけです。上位8ビットはIJPGレジスタによって与えられます。
パイプライン・アーキテクチャーを採っているため、ジャンプ命令は必ずストールを起こします。ジャンプ命令の実行には5サイクルかかるため、4サイクルのストールが生じます。
(DB)オプションをつけると遅延分岐を行います。この場合、ジャンプ命令の次の2命令を無条件に実行するため、ストールが2サイクルに緩和されます。遅延分岐を行う時に注意が必要なのは即値DMストア命令と即値PMストア命令です。この二つは2ワード命令であるため、2命令分の場所を占有してしまいます。この命令を遅延スロットで実行する場合には遅延スロットの1スロット目に配置してください。なお、遅延スロットには以下の命令を置くことはできません。
ジャンプ命令実行時のオーバーヘッドや制限についての詳細はISRの8-27ページと、HRMの3-13ページ"Branches and Sequencing"を参照してください。
<ofst13> ::= 13ビット即値による、ジャンプ先への相対オフセット <imm24> ::= 24ビット即値による、ジャンプ先の絶対アドレス <ireg> ::= I0, I1, I2, I3, I4, I5, I6, I7 <cond> ::= EQ, NE, GT, LE, LT, GE, AV, NOT AV, AC, NOT AC, SWCOND, NOT SWCOND, MV, NOT MV, NOT CE, TRUE