MIPS:代码调度删除停顿

时间:2014-03-18 22:42:03

标签: mips

我有以下MIPS代码:

addi $s1, $0, 10
lw   $t0, 4($s0)
srl  $t1, $t0, 1     [STALL becausee $t0 depends on lw's $t0]
add  $t2, $t1, $s1   [STALL because $t1 depends on srl's $t1]
sw   $t2, 4($s0)

如何重新排列它以避免任何失速。我看到所有2到5行的序列都无法改变。我们只能在srl之间移动第一行并添加OR lw和srl。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您的代码中有4个读写后(RAW)依赖项:addi->addlw->srlsrl->addadd->sw。这些不能像你指出的那样修复。

可以做的是移动addi指令。我认为移动此指令的最佳位置是lw之后,因为在MIPS架构中,所有加载指令都使用load delay slot。这意味着加载后的指令无法访问加载的内容。如果您在spimMARS等模拟器中使用此代码,则可能无法模拟此代码,但假设您打算在$t0中使用srl的加载值说明,上面的装配实际上是不正确的。要实现此目的,noplw之间应该有srl

出于这个原因,最好在addilw之间移动srl,以便利用lw加载延迟时段。