我有以下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。有什么想法吗?
答案 0 :(得分:2)
您的代码中有4个读写后(RAW)依赖项:addi->add
,lw->srl
,srl->add
,add->sw
。这些不能像你指出的那样修复。
可以做的是移动addi
指令。我认为移动此指令的最佳位置是lw
之后,因为在MIPS架构中,所有加载指令都使用load delay slot。这意味着加载后的指令无法访问加载的内容。如果您在spim
或MARS
等模拟器中使用此代码,则可能无法模拟此代码,但假设您打算在$t0
中使用srl
的加载值说明,上面的装配实际上是不正确的。要实现此目的,nop
和lw
之间应该有srl
。
出于这个原因,最好在addi
和lw
之间移动srl
,以便利用lw
加载延迟时段。