MIPS 中的双重问题调度

问题描述

这是 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

调度后,我们可以将它们打包如下:

enter image description here

为什么addi指令可以在sw指令之前移动?
他们都使用 $s1 寄存器。
在第一次迭代调度之前,我们会得到 0($s1)-> $t0,4($s1) 然而调度结果可能是 0($s1)-> $t0,0($s1) 有明显不同。
我想管道中有一种魔力。
我不知道叫什么名字,所以我称之为“反数据危害”。
由于addi指令会在第5阶段(WB)回写,我们可以利用数据风险使sw指令在第3阶段获取旧数据地址($s1)。
(sw指令不会触发转发)
我猜对了吗?请告诉我。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)