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
为什么 addi 指令可以在 sw 指令之前移动?
他们都使用 $s1 寄存器。
在第一次迭代调度之前,我们将得到 0($s1)-> $t0, 4($s1)<- $t0+$s2。
但是调度结果可能是 0($s1)-> $t0, 0($s1)<- $t0+$s2
有明显不同。
我想管道中有一种魔力。
我不知道叫什么名字,所以我称之为“反数据危害”。
由于 addi 指令将在第 5 阶段(WB)回写,我们可以使用数据冒险使 sw 指令在第 3 阶段获取旧数据地址($s1)。
(sw指令不会触发转发)
我猜对了吗?请告诉我。
解决方案
推荐阅读
- python - '列表索引超出范围'如何?
- r - 如何将以下“poly”输出转换为可在 Excel 中使用的函数?
- ethereum - 专用网络:web3.eth.getAccounts() 总是发送空数组
- ios - 滚动时带有自定义单元格的 UITableView 滞后
- java - 从java中的控制台一次读取一个单词
- mysql - 在 CentOS 中安装 DevStack 时如何解决此错误?
- sql-server - 使用过程 SQL SERVER 在表中插入值
- swift - 使用 DateFormatter 解析时正确的时间戳日期格式
- java - 泽西岛:为 wadl 处理创建 JAXBContext 时出错
- fft - 无法在 Atollic 中使用 CMSIS 库