破棄されたブランチは通常のブランチとどのように異なりますか?
-
03-07-2019 - |
質問
特にSPARCアセンブリの場合、破棄されたブランチは通常のブランチとどのように異なりますか?
分岐命令のnop遅延スロットを埋める必要がある場合、分岐命令を無効にする必要があると常に考えていました。ただし、ブランチを破棄せずにnopを埋めることができるため、この部分については正しいとは思いません。
解決
破棄された分岐命令により、遅延スロット内の命令(分岐後の命令)は、分岐が行われない場合は無視されます。
これが重要なのはなぜですか?通常、分岐が行われた場合でも、分岐後の命令が実行されるためです。これは、PCとNPCの2つのプログラムカウンターがあるためです。実行中の命令を示すPCは、PC + 4であるNPCに更新されます。同時に、NPCは分岐命令のターゲットに更新されます。したがって、これらのイベントのタイミングのために、次の命令をロードする必要があります。そのサイクルを捨てるだけでなく、可能であればそのサイクルを使用する方がより有益です。その命令をループの一部にするだけです。
loop: someOp
someOtherOp
branch loop ;
delayslotOp ; will actually be executed, before someOp, after branch
分岐後に命令スロットを使用できない場合は、そこにnopを挿入し、そのサイクルでは何もしません。
では、なぜ無効化された分岐オプションと無効化されていない分岐オプションで異なる命令を使用するのですか?ループの終了時に何が起こるかを選択できるようにします。ループアクティビティの遅延スロット部分を作成した場合、ループから出るときにそのopを実行したくない場合があります。したがって、「a」を追加します。分岐命令の最後まで。
他のヒント
3.2.3コントロール転送
[...]
コントロール転送命令のほとんどは遅延しています。つまり、直後の命令 論理シーケンスの制御転送命令が前にディスパッチされます ターゲットアドレスへのコントロール転送が完了しました。
[...]
遅延制御転送命令に続く命令が呼び出されます 遅延命令。遅延制御転送命令のビット (無効ビット)により、遅延命令が無効になる可能性があります( つまり、効果がありません)分岐が行われない場合。
6.3.4コントロール転送命令(CTI)
[...]
プログラミングノート:無効ビットは、 コンパイラは、遅延スロットを埋めるのに役立つ命令を見つけることができます ブランチ、それによって実行される命令の数を減らす プログラム。たとえば、無効ビットを使用して命令を移動できます ループ内から、閉じるブランチの遅延スロットを埋める ループ。同様に、無効ビットを使用して命令を移動できます “ else”のいずれかからまたは“その後” “ ifthen- else”のブランチプログラム それらを選択するブランチの遅延スロットをブロックします。以来 条件の完全なセットが提供され、コンパイラはコードを配置できます (おそらく状態の感覚を逆転させる) “ else”のいずれかからブランチまたは“その後”ブランチをに移動できます 遅延スロット。
次のコードは2つの分岐を示しています。最初の分岐では遅延命令が常に実行され、2番目の分岐では分岐が行われない場合は遅延命令が無効になります。
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