Assembly MIPS、流水线和分支延迟槽示例
我正在准备考试,有这样的例子。以下代码:Assembly MIPS、流水线和分支延迟槽示例,assembly,mips,pipeline,risc,Assembly,Mips,Pipeline,Risc,我正在准备考试,有这样的例子。以下代码: 1: SLL $1, $1, 2 2: LW $2, 1000($1) 3: BEQL $2, $0, END 4: ADDI $3, $2, 1 5: MULT $3, $2 6: MFLO $4 END: 7: J QUIT ... QUIT: 100: NOP 在RISC处理器(带有准MIPS指令集)上执行 五级管道 否旁路 否动态调度 分支延迟时隙 此外,我们还知道,分支不会被采用 我的任务是理解分支延迟槽在这种情况下是如何工作的,并构建正
1: SLL $1, $1, 2
2: LW $2, 1000($1)
3: BEQL $2, $0, END
4: ADDI $3, $2, 1
5: MULT $3, $2
6: MFLO $4
END:
7: J QUIT
...
QUIT:
100: NOP
在RISC处理器(带有准MIPS指令集)上执行
- 五级管道
- 否旁路
- 否动态调度
- 分支延迟时隙
- 此外,我们还知道,分支不会被采用
1: SLL $1, $1, 2 IDEMW
2: LW $2, 1000($1) I---DEMW
3: BEQL $2, $0, END I---DEMW
4: ADDI $3, $2, 1 IDx
5: MULT $3, $2 IDEMW
6: MFLO $4 I---DEMW
据我所知,ADDI在分支延迟槽中执行并停止
处理器理解后,该分支未被采用,这将导致错误的结果。我的问题是
- 我说得对吗
- 如果是,为什么ADDI在分支延迟槽中执行而不是跳转
PC
仍指向分支->后的下一条指令,即“分支延迟槽”
在经典MIPS上,下一条指令被提取、解码和执行,同时分支可能会也可能不会将PC修改为分支目标,因此每次都会执行分支延迟槽指令。仅当未发生分支时,执行后的下一条指令,即PC
在“分支延迟槽”位置后继续执行。如果分支确实修改了PC
,fetch+decode将注意并解码来自新目标的下一条指令,因此在经典MIPS上,分支延迟槽仅为1条指令“大”(我不知道更复杂的MIPS CPU是否可以有更多的阶段和更多的延迟槽可用,从技术上讲,5个阶段管道甚至5条指令延迟听起来是可能的,但实际使用起来可能会非常困难,听起来可能会产生更多的问题而不是帮助)
BEQL是一条更复杂的指令,如果分支条件失败,则在执行的中途终止延迟槽指令
有关BEQL的详细说明,请参见第45页
所以“NullifyCurrentInstruction()”可能是图中的“x”。图中的其余部分,我只是猜测,因为我没有研究您的5个阶段的细节,而是在获取和解码(?)之后的第二个LW
发现它依赖于$1
,因此它在depend阶段等待上一条指令W
阶段。等等。ADDI
不依赖任何东西,因此它几乎与BEQL
并行执行,并在接近结束时终止
但我不明白为什么每次“我”阶段被释放时都没有“我”阶段,看起来“我”在等待什么,最后你最多可以同时看到2条指令
无论如何,如果不研究你问题中使用的CPU的技术细节,这是很难理解的,我不想研究它,我甚至不知道你有什么类型的CPU,以及从哪里获得它的技术文档
编辑:我将尝试提取pdf的相关部分也在这里,使这个答案不只是“链接”,但复制pdf可能是棘手的
BEQL
MIPS IV CPU的说明文件:
说明:
如果(rs
=rt
),则分支很可能在分支延迟槽中,将18位有符号偏移量(16位偏移量字段左移2位)添加到分支后的指令地址(而不是分支本身),以形成PC相对有效的目标地址。
如果GPR
rs
和GPRrt
的内容相等,则在执行延迟槽中的指令后将分支到目标地址。如果未执行分支,则不执行延迟槽中的指令
操作:I:
tgt_偏移量← 符号延伸(偏移量| | 02)
条件← (GPR[rs]=GPR[rt])
I+1:
如果是条件,则
个人计算机← PC+tgt\U偏移量
否则
NullifyCurrentInstruction()
恩迪夫
CPU按顺序读取指令,即在执行过程中(已提取、解码,其余阶段正在处理,我不知道确切的阶段,因此这只是一般说明)对于
beql
它将让管道的另一部分自由获取下一条指令,但分支尚未完成,因此PC
仍指向分支后的下一条指令->这就是“分支延迟槽”
在经典MIPS上,下一条指令被提取、解码和执行,同时分支可能会或可能不会将PC修改为分支目标,因此每次都会执行分支延迟槽指令。只有在没有发生分支时,执行后的下一条指令,即PC
在分支结束后继续执行“分支延迟槽”按顺序定位。如果分支确实修改了PC
,fetch+decode将注意并解码来自新目标的下一条指令,因此在经典MIPS中,分支延迟槽仅为1条指令“大”(我不知道更复杂的MIPS CPU是否可以有更多的阶段和更多的延迟槽可用,从技术上讲,5个阶段管道甚至5条指令延迟听起来是可能的,但实际使用起来可能会非常困难,听起来可能会产生更多的问题而不是帮助)
BEQL是一条更复杂的指令,如果分支条件失败,则在执行的中途终止延迟槽指令