我有以下MIPS代码,我希望重写/重新排序代码,以便我可以减少数量 nop 在保留正确性的同时,需要进行适当的管道执行所需的说明。假定数据座既不摊位也不是向前。该问题给出了两个提示:它提醒我们分支和跳跃被延迟,需要填充它们的延迟插槽,并在必要时暗示在内存访问指令(LW,SW)中搅动偏移值。

LOOP:  lw           $1, 100 ($2)
       addi         $1, $1, 1
       sw           $1, 500 ($2)
       addiu        $2, $2, 4
       bne          $2, $10, LOOP

对我来说,很明显,此代码会将一个数组的内容递增并将其存储在另一个数组中。因此,我并不确切地看到如何重新排列此代码,因为在完成循环之前需要计算索引。

我的猜测是移动 LW 分支指令后的说明(据我所知)延迟插槽中的说明始终执行。再说一次,我不太了解这个主题,我将不胜感激。我一般都了解管道,但没有太多的延迟分支。谢谢

有帮助吗?

解决方案

填充分支延迟插槽的一种方法是:

addiu  $2, $2, 4  # We'll now iterate over [$2+4, $10] instead of [$2, $10[
LOOP:  lw           $1, 96 ($2)
       addi         $1, $1, 1
       sw           $1, 496 ($2)
       bne          $2, $10, LOOP
       addiu        $2, $2, 4  # Use the delay slot to increase $2

其他提示

根据第二个提示:

将第4个指示列为第二。它可以在第一个指令的ID(如果使用p/h术语)中进行管道(在第一个指令的ID之后),而第一个指令仍在执行时。然后在(旧的)第三指令496而不是500中偏移。我想您现在知道为什么?

至于第一个提示,我对如何确切地延迟分支执行(不在Spim上实现,所以我不在乎)。旧的最后一个指令可能会倒数第二,名称为“延迟”,但我无法告诉您如何以及为什么。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top