SPARCアセンブリの場合、特に、無効化されたブランチは通常のブランチとどう違うのですか?無効にされたブランチは通常のブランチとどう違うのですか?
分岐命令のためにnop遅延スロットを埋める必要があるとき、私はいつも、分岐命令を無効にする必要があると思っていました。しかし、私はブランチを廃止することなくnopを埋めることができるので、私はこの部分で正しいとは思わない。
SPARCアセンブリの場合、特に、無効化されたブランチは通常のブランチとどう違うのですか?無効にされたブランチは通常のブランチとどう違うのですか?
分岐命令のためにnop遅延スロットを埋める必要があるとき、私はいつも、分岐命令を無効にする必要があると思っていました。しかし、私はブランチを廃止することなくnopを埋めることができるので、私はこの部分で正しいとは思わない。
無効化された分岐命令は、遅延スロット内の命令(分岐後の命令)を分岐が取られない場合に無視させます。
なぜこれが重要なのでしょうか?通常は、分岐が取られたとしても、分岐後の命令が実行されるためです。これは、PCとNPCの2つのプログラムカウンタがあるためです。 NPCが分岐命令の対象に更新されるのと同時に、実行中の命令を示すPCがNPC(PC + 4)に更新される。したがって、これらのイベントのタイミングのために、次の命令をロードする必要があります。そのサイクルを離れて投げるのではなく、可能であればそのサイクルを使う方がより有益です。その命令をループの一部にするだけです。
loop: someOp
someOtherOp
branch loop ;
delayslotOp ; will actually be executed, before someOp, after branch
分岐後に命令スロットを使用できない場合は、そこにnopをスティックし、そのサイクルで何もしません。
なぜ、無効化されていない分岐オプションとは異なる命令がありますか?ループの終了時に何が起こるかの選択を私たちに与える。ループアクティビティの遅延スロット部分を作成した場合、ループから離れるとそのオペレーションを実行したくない場合があります。したがって、分岐命令の最後に "、"を追加します。 SPARC Architecture Manual (v9)によると
:
3.2.3コントロール転送
[...]
制御転送命令のほとんどが遅れています。すなわち、 論理転送の制御転送命令の直後の命令が、 の前にディスパッチされ、ターゲットアドレスへの制御転送が完了する。
[...]
遅延制御転送命令が 遅延命令呼ばれる次の命令。遅延制御転送命令 (無効ビット)のビットは、分岐が取られない場合、遅延命令を無効にすることができます(無効にすると効果がありません)。
6.3.4制御トランスファ命令(のCTI)
[...]
プログラミング・ノート:無効ビットが コンパイラはに有用命令を見つけることができる可能性を高めます ブランチの後に遅延スロットを埋めて、 プログラムによって実行される命令の数を減らします。たとえば、無効ビットを使用して、 命令をループ内から移動して、ループの を閉じる分岐の遅延スロットを埋めることができます。同様に、無効ビットは、それらの間を選択分岐の遅延スロットに「他ifthen-」プログラム ブロックの「他」または「次に」ブランチのいずれかから命令 を移動させるために使用することができます。 の条件がすべて提供されているので、コンパイラは、 (おそらく条件の意味を逆にする)コードを配置して、 "else"ブランチまたは "then"ブランチからの 命令を 遅延スロット。
を:cmp %i3, %i0 ble %icc, -0x5c ld [%l0 - 0x4], %i5 ; executed whether the branch is taken or not ... cmp %l1, 0x80 bl,a %icc, +0x40 ld [%fp + 0x7c7], %g2 ; annulled if the branch is not taken, executed otherwise
次のコードは遅延命令は、常に分岐が取られていない場合、遅延命令が無効化されている第二の一つに、実行される最初のものでは、2つの分岐を示します