Optimization 被撤销的分行与普通分行有何不同?

Optimization 被撤销的分行与普通分行有何不同?,optimization,assembly,sparc,Optimization,Assembly,Sparc,特别是对于SPARC组件,环形分支与常规分支有何不同 我一直认为,当我需要为分支指令填充nop延迟槽时,需要取消分支指令。但是,我认为我在这方面不正确,因为您可以在不取消分支的情况下填充nop。如果不执行分支,则取消的分支指令会导致延迟槽中的指令(分支后的指令)被忽略 为什么这很重要?因为通常情况下,执行分支后的指令,即使执行了分支。这是因为有两个程序计数器,PC和NPC。指示正在执行的指令的PC被更新为NPC,即PC+4,同时NPC被更新为分支指令的目标。因此,由于这些事件的计时,必须加载下一

特别是对于SPARC组件,环形分支与常规分支有何不同


我一直认为,当我需要为分支指令填充nop延迟槽时,需要取消分支指令。但是,我认为我在这方面不正确,因为您可以在不取消分支的情况下填充nop。

如果不执行分支,则取消的分支指令会导致延迟槽中的指令(分支后的指令)被忽略

为什么这很重要?因为通常情况下,执行分支后的指令,即使执行了分支。这是因为有两个程序计数器,PC和NPC。指示正在执行的指令的PC被更新为NPC,即PC+4,同时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)

[……]

编程注意事项:环位增加了 编译器可以找到一条有用的指令来填充延迟槽 分支,从而减少由 节目。例如,环位可用于移动指令 从循环内填充闭合分支的延迟槽 循环。同样,可以使用环位移动指令 来自“ifthen-else”程序的“else”或“then”分支 块到在它们之间进行选择的分支的延迟槽。自从 如果提供了完整的条件集,编译器可以安排代码 (可能是颠倒了条件的意义)使指令 从“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