分岐命令
From Wikipedia, the free encyclopedia
動作の仕組み
パイプライン処理への影響と対策
命令パイプラインが深い一方で、先読みが浅いプロセッサでは、ジャンプによりパイプラインにバブルが発生しペナルティとなる設計にならざるをえないことがある。そのペナルティを軽減するため、分岐命令の直後を「遅延スロット」と称し、そこにある命令は分岐処理の直前に実行されるものとする、遅延分岐という方式がある。MIPS、SH、SPARCなど、初期のいわゆるRISCに採用例が多いが、1986年にNECから発表されたμPD77230、1988年にTIから発表されたTMS320C30、デジタルシグナルプロセッサにも(その前から)多い。ディレイスロット(にある命令)の数は、μPD77230の場合で 1 、TMS320C30の場合で 3 であった。大多数の(遅延スロットを採用している場合の)RISCのディレイスロットは 1 である。
パイプライン処理では命令のフェッチが重要であり、分岐予測が用いられることがある。分岐予測は失敗時のコストが大きいので、これを減らすために投機的実行などの技術が用いられる。
アーキテクチャにおける工夫と変遷
「汎用レジスタの内1つをプログラムカウンタにする」「全ての命令を条件実行可能とする」という、分岐命令の必要性を低減したり、パイプラインストールの可能性を低くする[3]工夫がある。ARMはこの両方を採用し、IA-64は後者をプリディケートで実現している(また前者は古くはPDP-8やPDP-11などで使われDECの特許[4]でもあったため、技術的な理由でなく特許回避という観点が非採用の理由としてあった。一例としてTRONCHIP#特許)。前者は分岐命令のバリエーションを増やすことなく単純な命令セットで複雑な機能を実現できることが、DECの発明であってアーキテクトを魅了した[5]。
しかし、命令セットは単純でも複雑な機能というのはRISC原理に反することもあり、RISCではARMなど採用例はあるが下火となった。RISC-Vでは命令のデコード・実行を複雑化させ、性能を低下させるとして前者・後者共に採用されなかった。ARMでも、64ビット化の際に両者とも廃止された(AArch64を参照)。
ただし、後者のごく部分的な実装である「条件実行命令を一部に用意する」のはRISCの観点にも適っており、AArch64では分岐の他に比較・選択といった命令に条件実行が残り、RISC-VのZicond拡張や、Pentium Pro以降のx86(P6マイクロアーキテクチャ、俗に686)にて、CISCだからというよりは内部RISCアーキテクチャでのソフトウェア的な性能向上のために実装されたCMOV命令なども同様である。