我有以下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 指令,因为(据我所知),总是执行延迟槽中的指令。然后,我不太明白这个主题,我会欣赏一个探索。我理解一般的流水线操作,但没有那么多延迟分支。感谢
答案 0 :(得分:3)
就第二个提示而言:
将第4条指令设为第2条。它可以流水线化(在第一条指令的ID之后,如果你使用P / H术语),而第一条仍然执行。然后在(旧)第3条指令496而不是500中进行偏移。我假设你现在看到了原因?
关于第一个提示,我不太熟悉延迟分支的执行方式(未在SPIM上实现,所以我不在乎)。旧的最后一条指令可能是倒数第二条,因为“延迟”的名称表示,但我无法告诉你如何以及为什么。
答案 1 :(得分: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