ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
パイプライン処理において、ある命令の実行に続いて実行される後続の命令のこと。高速化のための工夫である。「ディレイスロット」とも。
DSPや古いRISCプロセッサーでは、分岐命令(サブルーチンから復帰するリターン命令なども含む)の直後が遅延スロットとなっていることが多く、これを「分岐遅延スロット」という。SPARC、MIPS、PA-RISC、SuperHなどが分岐遅延スロットを持つが、対してAlpha、PowerPC、ARMなどは分岐遅延スロットを持たない。
分岐遅延スロットに配置された命令は、先行する分岐命令が結果として実行されようとされまいと、必ず先行して実行される。
また、MIPS1などごく初期のRISCには、メモリーからのロード直後の命令ではその値が使えない「ロード遅延スロット」を持つものもあった。このようなプロセッサーでは、読んだ値をすぐ使いたい場合、間にnopを挟む必要があった。
最近のプロセッサーやDSPは、スピードを達成するため、少しでも効率的に命令を処理できるよう考えられている。
パイプラインはその一つで、1クロックでも早く処理をするためには欠くことができない。
パイプライン処理では、命令フェッチ・命令デコード・実行、という手順で進み、各処理はタイミングをずらしながら平行して行なわれる。
さて、条件ジャンプ命令が実行される時には、少なくとも次の命令の命令フェッチは終わっている。せっかく1クロックかけて処理されたこれを無駄にしないため、捨てずに実行するのが遅延スロットである。
これを利用すれば、分岐に要する時間を実質短縮することができる。但しここに置ける命令は、プログラムカウンター(PC)が変化しないものに限られる。
この仕様のため、対策としては分岐直前の命令(分岐条件を決める比較命令は不可)と位置を入れ替えるか、分岐命令の直後に効果のない命令(NOP)を配置する必要がある。
例えば、加算命令の後にジャンプする場合、遅延スロットを使用しない一般的なプロセッサーでは、次のようになる。
ADD.W R0, R1
BRA TARGET
遅延スロットを用いる場合、BRA命令の次が遅延スロットとなり分岐前に実行されるため、次のように入れ換えて記述する。
BRA TARGET
ADD R0, R1
プロセッサーによっては分岐だけでなく、メモリーやコプロセッサーのアクセスなどにも遅延スロットがあるものも存在する。
また、遅延スロットを使用する命令としない命令が別々に用意されていることもある。
遅延スロット命令は、頻繁にバグを発生させる。
その多くは、遅延スロットで実行すべき命令が無いにも拘らず遅延スロット命令を用いてしまい、その直後にある意図せぬ命令が実行され想定外の動作となってしまうものである。
また、遅延スロット命令使用時、分岐命令の実行を全く行なわないわけではなく、途中までは実行される。例えばCとアセンブラーで行き来するような処理の場合、一定のレジスターの内容を保障する必要があるが、遅延スロットにそのレジスターを変更するような命令があると、意図しない結果を呼び出し元に返してしまうことになる。
遅延スロットを使用する場合、プログラムに「この部分は遅延スロットである」旨のコメントを記述しておくと、視覚的にも分かりやすくなり、無用な混乱も避けることができる。
また経験則として、遅延スロットには分岐命令やレジスター保証に関わる命令を挿入してはならない。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます