微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MIPS 中的双重问题调度

如何解决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 举报,一经查实,本站将立刻删除。