遅延分岐命令の分類

 パイプライン実行が前提のRISCアーキには遅延分岐命令を持つものがある。分岐命令の直後の命令を実行してから分岐先へと制御を移す。遅延分岐命令の後にある実行される命令の場所を遅延スロットと呼ぶ。

画像



以前調べたもの:各種プロセッサ 整数演算の条件付き分岐命令について
遅延分岐の有効性については次をどうぞ:分岐命令のペナルティ

 パイプラインの深さによっては遅延スロットを複数持つこともできる。MIPS-XやSHARCは2つの遅延スロットを持つ。
MIPS-X http://i.stanford.edu/pub/cstr/reports/csl/tr/86/289/CSL-TR-86-289.pdf
SHARC -- Delayed Branches Tutorial

 すべてを調べたわけではないけれども、遅延スロットには実行順を変化させるような命令を置くのは禁止されている。つまり分岐命令を並べて書くことはできず、遅延スロット分は空けなければならない。
 遅延スロットで実行すべき命令が特にない場合はNOPで埋めておく。

 以下、MIPS/SPARC/PA-RISC/SH-4A/SH-5について整理する。

□MIPS
http://www.imgtec.com/downloads/factsheets/MD00087-2B-MIPS64BIS-AFP-05.03.pdf

 すべての分岐命令は遅延分岐命令だが、条件分岐命令のうちニーモニックにLikelyが付いているものは分岐が成立したときのみ遅延スロットも実行する。

BC1TL/BC1FL/BEQL/BNEL/BGEZL/BGTZL/BLEZL/BLTZL/BLTZALL/BGEZALL

 割り込みから戻るDRET/ERET命令は遅延分岐命令ではない。

□SPARC
 分岐命令に,aが付いているとannul bitを設定したことになる。annul bitが設定してあると以下の動作になる。
分岐成立:遅延スロットを実行して分岐する
分岐不成立:遅延スロットをバイパスして命令続行

これは if ~ then ~ else ~ を実装しやすくする。

画像



□PA-RISC
 PA-RISCはNullificationという機能で条件によって次に位置する命令の実行をスキップできる。ほとんどの演算命令に3bitのcondフィールドがあり、条件を満たすとPSWレジスタのN-bitが1になる。N-bitが1の時に実行される命令はスキップされ、N-bitはクリアされる。この機能を使うと条件分岐命令の分岐成立時に遅延スロットにある命令をスキップできる。この動作はMIPSのLikery、SPARCのannul bitと逆の動作。

 演算と分岐が一体になった命令(ADDB,BB,CMPB)は分岐する方向によって遅延スロットを実行するかどうかの動作が異なる。

 ニーモニックに,nがない時(Nullificationをしない)は遅延スロットを実行する。
 ニーモニックに,nがある時(Nullificationをする)は以下の動作になる。

 後の方向へ分岐する場合:分岐成立時は遅延スロットをスキップし、分岐不成立時は遅延スロットを実行する。

画像


 前の方向へ分岐する場合:分岐成立時は遅延スロットを実行し、分岐不成立時は遅延スロットをスキップする。

画像



□SH-4/SH-5
http://lars.nocrew.org/computers/processors/SuperH/cpush5v1.pdf

 すべての分岐命令は遅延分岐命令だが、MIPS/SPARC/PA-RISCの後で決められたアーキテクチャなのになぜ遅延分岐を入れたのか?これについて考えてみると、組み込み用途でチップの規模は大きくなくパイプラインも短い、将来このままスケールアップさせることは無視して実行効率を上げるために導入を決めたのではないだろうか。












ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック