流水线 MIPS 延迟分支示例

Pipelined MIPS delayed branching example

我得到了这个 MIPS 伪汇编代码:

    add r7,r8,r9
    beq r1,r2,40 ---
    lw r4,O(r1)    '
    sub r5,r1,r4   '
    and r6,r4,r2   '
  <--------------- '
    or r4,r2,r3

我假设 没有结构性危害 并且使用了 延迟分支

问题是:

我正在准备考试,对延迟分支这个概念不是很理解。任何帮助将不胜感激。

MIPS 有一个五级流水线。一个效果是无论是否采用分支,都会执行分支之后的指令。简而言之,与传统的汇编语言相比,您需要将分支上移一条指令。

因此,如果采用分支,则执行的代码将是:

add r7,r8,r9
lw r4,O(r1)
or r4,r2,r3

如果分支未被采用,则执行的代码将是:

add r7,r8,r9
lw r4,O(r1)
sub r5,r1,r4
and r6,r4,r2
or r4,r2,r3

缺少结构性危险提示本质上意味着您不必考虑其他管道效应。

  1. lw r4,0(r1) 将在分支发生之前执行。这就是延迟分支。
  2. 不,如果分支被占用则不会。
  3. 不,因为 r4 无论如何都会被 or r4,r2,r3 覆盖。
  4. 所有指令按顺序执行。

延迟分支是指无论是否采用分支,都执行分支语句后面的指令。

下面是我对您问题的回答:

  • 分支情况下指令如何执行

    分支后面的指令将被执行,所以:

    add r7,r8,r9

    beq r1,r2,40

    lw r4,O(r1) # This instruction is executed even if the branch is taken

    or r4,r2,r3

  • 延迟槽中的指令是否有用

    在这种情况下,如果分支未被采用,则为是。如果采用分支 r4 将被覆盖,因此它不会有用

  • 执行延迟槽中的指令会不会产生错误的结果

    不,因为如果采用分支指令 or r4,r2,r3 将覆盖 r4

    但是请注意,延迟槽中的 lw 指令可能会发出陷阱,在这种情况下你会得到错误的行为

  • 如果没有分支,即不满足分支条件怎么办

    那就没问题了,程序继续执行