MIPS流水线中,后续指令覆盖前序寄存器时是否需停顿?
MIPS流水线场景下的指令冲突与指令必要性分析
先给出涉及的指令和已知条件:
LW R2, array(R1) //R2 = array[1] = 4 SUB R2, R3, R1 //R2 = R3 - R1
已知:R1=1,R2=2,R3=3,array[1]=4
1. 流水线是否需要停顿?
不需要停顿。
数据冒险导致流水线停顿的前提是当前指令需要读取前一条指令还未写回的寄存器值,但这里的SUB指令只读取R3和R1作为操作数,完全没有用到R2的值——它只是最终将计算结果写入R2。前一条LW指令修改的是R2,但SUB根本不读R2,所以不存在数据依赖,自然不需要停顿,也不需要MEM到EX阶段的转发操作。
2. LW指令是否有存在的必要?
没有必要。
这条LW指令的作用是把array[1]的4加载到R2,但紧接着的SUB指令就用R3-R1的计算结果(3-1=2)直接覆盖了R2的值,后续没有任何指令会用到LW加载的这个4。所以LW指令的执行结果完全被丢弃,属于冗余指令,去掉它对程序最终的寄存器状态没有任何影响,还能节省一个指令周期。
内容的提问来源于stack exchange,提问作者Angus Cheng
相关产品推荐
相关产品推荐

