3

我有以下 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指令,因为(据我所知)延迟槽中的指令总是被执行。再说一次,我不太了解这个主题,我希望能得到解释。我一般理解流水线,但没有那么多延迟分支。谢谢

4

2 回答 2

3

就第二个提示而言:

将第 4 条指令设为第 2 条。它可以在第一条指令仍然执行时被流水线化(在第一条指令的 ID 之后,如果您使用 P/H 术语)。然后在(旧的)第三条指令中将偏移量设为 496 而不是 500。我想你现在明白为什么了吗?

至于第一个提示,我不太熟悉延迟分支的执行方式(没有在 SPIM 上实现,所以我不在乎)。正如名称“延迟”所表明的那样,旧的最后一条指令可能会排在倒数第二个,但我无法告诉你如何以及为什么。

于 2013-11-07T03:47:28.310 回答
2

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

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
于 2013-11-07T06:51:48.603 回答