【发布时间】:2018-07-16 22:44:00
【问题描述】:
我正在准备考试并且有这样的例子。以下代码:
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 在 Branch Delay Slot 中执行并停止 在处理器了解之后,该分支没有被采取,导致我们得到错误结果的原因。我的问题是
- 我说的对吗?
- 如果是,为什么 ADDI 在 Branch Delay Slot 中执行而不是 Jump?
【问题讨论】:
-
如果分支不被采用,那么为什么要停止
ADDI?事实上,为什么它会被阻止?无论是否采用分支,延迟槽中的指令都会完全执行。 -
AFAIK 典型的 5 级 MIPS 流水线将寄存器访问分为两个阶段,因此即使没有显式转发,相关指令的
D阶段也可以与其相关性的W发生在同一时钟内。 -
2Jester 好吧,在我们的约定(可能不是那么真实)中,在分支可能指令的情况下,就像这里一样,BDS 中的指令会因错误的预测而停止。问题是为什么是 ADDI 而不是 J。
-
@EOF 这不完全是 MIPS。在这里,所有指令只有 IF、DE、EX、ME 和 WB 阶段。而且图是官方的解决方案,所以我认为是对的。
-
看起来像一些高级 MIPS IV 功能(math-atlas.sourceforge.net/devel/assembly/mips-iv.pdf)——事实上,
ADDI被抛弃了(第 45 页)。你是什么意思“为什么ADDI而不是跳跃”?
标签: assembly mips pipeline risc