首页 > 解决方案 > 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

调度后,我们可以像下面这样打包它们: 在此处输入图像描述

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

标签: mipscpu-architecture

解决方案


推荐阅读