我有以下 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
关于assembly - MIPS 中的延迟分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19825297/