You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 23:24:03