1 概要

分岐命令は、プログラムの実行位置を現在の順序から別の箇所へ移すための命令である。機械語レベルでは、命令列を直線的に進めるだけでなく、条件に応じて処理経路を切り替える手段として働く。多くの計算機では、条件判定や反復、例外的な処理の開始、手続きの呼び出しと終了に深く関わる。

この種の命令は、ソフトウェアの記述方法だけでなく、CPUの制御回路、命令セット設計、コンパイラ最適化にも影響する。分岐の扱い方によって、実行の柔軟性、命令の配置、処理速度の特性が変化するため、基礎的でありながら体系全体に広く関係する要素といえる。

1.1 分岐命令の定義

分岐命令とは、次に実行する命令の位置を変更するための制御命令である。通常の逐次実行では、プログラムカウンタが次の命令へ順に進むが、分岐命令はその流れを別の番地へ移す。移動先は、命令内に直接示されることもあれば、レジスタや記憶内容を経由して決まることもある。

1.2 制御の流れにおける役割

制御の流れは、計算機プログラムの動作を構成する基本軸である。分岐命令は、その流れを一本化された順序から分散させ、条件に応じた処理分岐や反復を可能にする。これにより、同じ命令列でも入力や状態によって異なる動作を選べる。

1.3 関連する基本概念

分岐命令を理解するには、プログラムカウンタ、命令アドレス、条件判定、制御構造といった概念が重要である。また、呼び出しと復帰、ループ、例外処理パイプライン実行なども密接に関係する。これらは互いに独立ではなく、実際の処理系では一体として扱われる。

2 分岐命令の種類

分岐命令には、移動条件や指定方法の違いに応じて複数の型がある。代表的なのは、常に飛ぶ無条件分岐、条件成立時のみ移る条件分岐、命令位置の表し方に基づく相対分岐と絶対分岐、そして実行時に飛び先が決まる間接分岐である。これらは目的は近いが、実装や最適化の観点では性格が異なる。

2.1 無条件分岐

無条件分岐は、条件を問わず指定位置へ制御を移す命令である。処理の一部を別の場所へ移動したいときや、ループの戻り、関数内の飛び越しなどに使われる。単純な構造に見えるが、命令列の整理や配置の調整に役立つ。

2.2 条件分岐

条件分岐は、ある判定結果に従って飛び先を変える命令である。判定が真なら分岐し、偽なら次の命令へ進む形が典型である。比較や状態の変化を利用して、選択的に処理を切り替える。

2.2.1 比較結果による分岐

比較結果による分岐では、二つの値の大小や等値などを判定し、その結果に基づいて制御を移す。高水準言語の if 文や while 文の条件判定に対応することが多い。算術演算の直後に比較命令と分岐命令を組み合わせる形式がよく用いられる。

2.2.2 状態旗を用いる分岐

状態旗を用いる分岐では、演算結果に応じて設定されるフラグを参照して飛び先を決める。ゼロ、符号、桁あふれ、キャリーなどの状態が利用されることがある。比較命令を明示的に挟まなくても、直前の演算に付随する状態を活用できる点が特徴である。

2.3 相対分岐と絶対分岐

相対分岐は、現在位置からの差分で飛び先を表す方式である。命令の移動や再配置に強く、位置が変わっても修正範囲を抑えやすい。絶対分岐は、特定の番地を直接指定する方式で、明確さは高いが配置変更への柔軟性は相対的に低い。

2.4 間接分岐

間接分岐は、分岐先を命令中の即値ではなく、レジスタやメモリに格納された値から得る方式である。関数ポインタ、仮想呼び出し、ジャンプテーブルなどで用いられる。実行時に宛先が変化するため、一般の直接分岐より柔軟だが、予測や解析はやや難しくなる。

3 命令体系と実装

分岐命令の表現は、命令体系ごとの設計思想に左右される。どのようなオペコードで表すか、飛び先をどう埋め込むか、命令長を固定するか可変にするかによって、実装の複雑さや効率が変わる。命令セットアーキテクチャでは、分岐の記述形式が他の命令群との整合性を持つよう設計される。

3.1 命令形

命令形式とは、オペコード、条件指定、分岐量、参照先などをどのようなビット配置で表すかを指す。固定長命令では解析がしやすく、可変長命令では表現力が増す傾向がある。分岐命令は、短い即値で済む場合もあれば、広い範囲を扱うために複数語を必要とする場合もある。

3.2 分岐先の指定方法

分岐先の指定方法は、実装上の扱いやすさに直結する。命令内でどのように宛先を記録するかは、アドレス空間、命令密度、再配置の容易さに影響する。相対的に記すか、直接地点を示すかで、機械語の性格が分かれる。

3.2.1 オフセット指定

オフセット指定では、現在の命令位置を基準に、どれだけ進むか、あるいは戻るかを記述する。短い範囲の飛びに向いており、位置独立性を高めやすい。コンパイラやアセンブラが配置を変えても、再計算が比較的容易である。

3.2.2 アドレス指定

アドレス指定では、飛び先の絶対的な番地を命令内に含める。宛先が明示されるため理解しやすい一方、配置変更時には修正が必要になることがある。大きなコード領域や特定位置への直接移動で使われることがある。

3.3 命令長と配置の制約

分岐命令は、命令長が限られると表現できる飛び先の範囲が制約される。短い命令ではオフセットの桁数が不足し、遠距離の遷移に別の手順が必要になる場合がある。配置の密度、ページ境界、コードの再配置可能性も、この制約と関係する。

4 性能と最適化

分岐は制御を柔軟にする一方、実行性能に影響しやすい。現代の処理系では、パイプラインや命令フェッチの都合から、分岐が多いと流れが乱れやすい。そのため、予測機構やコンパイラ最適化が重要になる。分岐の扱いは、正しさだけでなく速度にも直結する。

4.1 分岐予測

分岐予測は、次にどちらへ制御が進むかをあらかじめ見積もる仕組みである。予測が当たれば実行の停滞を抑えやすく、外れた場合はやり直しが生じる。履歴や規則性を利用することで、実行の先読み精度を高める。

4.2 分岐の失敗による影響

分岐予測が外れると、すでに進めた命令の一部を破棄し、正しい経路で再開する必要がある。これにより遅延が発生し、内部の処理段階が空転することがある。高性能なCPUほどこの影響を意識した設計が求められる。

4.3 コンパイラによる最適化

コンパイラは、源プログラムを機械語へ変換する際に分岐の構造を調整できる。条件の書き換え、順序の入れ替え、同等処理への置換などにより、実行回数や予測のしやすさを改善する場合がある。最適化は、意味を保ちながら分岐コストを下げることを目的とする。

4.3.1 分岐削減

分岐削減では、条件判定や飛び先の数を減らすように変換する。不要な判定をまとめたり、単純な場合分けを別表現に置き換えたりすることで、命令流の分岐点を少なくする。これにより、予測失敗の機会を抑えやすい。

4.3.2 分岐の並べ替え

分岐の並べ替えでは、よく起こる経路を先に配置したり、落ちやすい条件を後ろへ回したりする。典型的な経路を直進しやすくすることで、実行効率の改善を狙う。ヒットしやすい経路を自然落下に置く手法もある。

4.3.3 分岐の置換

分岐の置換では、条件分岐を別の計算形態へ変える。選択演算、テーブル参照、算術的な切替などが用いられることがある。簡潔に見えるが、実際には対象CPUやデータ分布に応じて効果が変わる。

5 高水準言語との関係

高水準言語では、分岐命令は直接見えにくい形で表現される。条件文、繰り返し文、関数呼び出しなどの構文は、最終的に機械語の分岐へ変換される。したがって、プログラムの論理構造と命令レベルの制御は密接に対応している。

5.1 条件文との対応

条件文は、判定結果に応じて異なる文を実行する構文であり、分岐命令の代表的な上位表現である。if、else、switch などは、内部的に条件比較と制御移動を組み合わせて実現されることが多い。複数の分岐先を持つ場合は、選択表や連続判定に変換されることもある。

5.2 繰り返し文との対応

繰り返し文は、条件を満たす間、あるいは所定回数だけ同じ処理を反復する構文である。実装上は、ループ先頭への戻り分岐と終了判定が組み合わさる。前判定型、後判定型、カウンタ制御型などの違いはあるが、いずれも分岐命令が基礎となる。

5.3 関数呼び出しと復帰

関数呼び出しでは、実行位置を別の手続きへ移し、処理を終えた後に元の場所へ戻る。これは広い意味での分岐であり、呼び出し先と復帰先を管理する点に特徴がある。通常は戻り番地の保存と回復を伴い、スタックや特別なレジスタが利用される。

6 関連項目

分岐命令は、命令体系全体や制御構造、実行方式と結びついて理解される。単独の命令としてだけでなく、計算機の設計思想を示す要素として位置づけられる。

6.1 命令セットアーキテクチャ

命令セットアーキテクチャは、CPUが理解する命令の体系を定める枠組みである。分岐命令の種類、条件の表し方、アドレス指定の方法などは、この設計に含まれる。ソフトウェア互換性や機械語の書式にも関係する。

6.2 制御構造

制御構造は、順次、選択、反復など、プログラムの流れを整理する基本形式である。分岐命令は、その具体的な実装単位として働く。高水準の構文と低水準の命令をつなぐ概念でもある。

6.3 パイプライン処理

パイプライン処理は、命令実行を複数段階に分けて並行的に進める方式である。分岐命令は次に読む命令列を変えるため、この流れを乱しやすい。予測機構や失敗時の再開手順は、パイプライン性能を左右する重要な要素である。