特别是对于 SPARC Assembly,取消的分支与常规分支有何不同?
我一直认为,当我需要填充分支指令的 nop 延迟槽时,需要取消分支指令。但是,我认为我在这一部分上是不正确的,因为您可以在不取消分支的情况下填充 nop。
如果不采用分支,则取消的分支指令会导致延迟槽中的指令(分支之后的指令)被忽略。
为什么这很重要?因为正常情况下,即使分支被取,分支后的指令也会被执行。这是因为有两个程序计数器,PC和NPC。 PC表示正在执行的指令,更新为NPC,即PC+4,同时NPC也更新为分支指令的目标。因此,由于这些事件的时间安排,必须加载下一条指令。如果可以的话,使用该周期会更有利可图,而不是直接扔掉该周期。然后我们只需将该指令作为循环的一部分即可。
loop: someOp
someOtherOp
branch loop ;
delayslotOp ; will actually be executed, before someOp, after branch
如果我们无法使用分支后的指令槽,那么我们会在其中插入一个 nop,并且在该周期内不执行任何操作。
那么为什么要使用不同的指令来取消和未取消分支选项呢?让我们选择退出循环时会发生什么。如果我们将延迟槽作为循环活动的一部分,我们可能不希望在离开循环时执行该操作。因此,我们要在分支指令的末尾添加“,a”。
这个页面有一些很好的例子。 http://www.cs.unm.edu/~maccabe/classes/341/labman/node3.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)