MIPS双发射调度中addi指令为何可移至sw指令之前执行
待调度的原始MIPS代码
Loop: lw $t0, 0($s1) # $t0=array element addu $t0, $t0, $s2 # add scalar in $s2 sw $t0, 4($s1) # store result addi $s1, $s1,–4 # decrement pointer bne $s1, $zero, Loop # branch $s1!=0
疑问解答
你的猜测完全正确,该双发射调度合法,不会出现逻辑错误,核心依据如下:
- 两条指令的依赖属于先读后写(WAR,反数据冒险):
sw指令需要读$s1计算访存地址,addi指令需要写$s1更新指针,这种冒险在经典5级按序流水线中天然不会触发错误,不需要额外插入阻塞周期。 - 流水线时序刚好错开读写操作:
sw读取$s1的操作发生在流水线的ID(译码/读寄存器)阶段,访存地址在EX阶段就完成计算,整个过程不需要等待后续指令的寄存器写回结果。- 即使
addi和sw同周期发射,addi对$s1的写回操作也要到WB(写回)阶段才会执行,时序上远晚于sw读取$s1的节点,且sw是存储指令,不会触发ALU运算结果的转发机制,因此sw拿到的一定是addi修改前的旧值。
- 逻辑和原代码完全一致:
sw最终写入的地址还是旧$s1 + 4,和原代码首轮迭代的写入地址完全相同,addi更新后的$s1只会提供给下一轮循环的lw指令使用,完全符合原循环的语义。
内容的提问来源于stack exchange,提问作者Sanji
相关产品推荐
相关产品推荐

