assembly - MIPS 中的延迟分支

标签 assembly architecture mips pipeline pipelining

我有以下 MIPS 代码,我希望重写/重新排序代码,以便可以减少正确流水线执行所需的 nop 指令数量,同时保持正确性。假设数据路径既不停止也不转发。这个问题给出了两个提示:它提醒我们分支和跳转是延迟的,需要填充它们的延迟槽;它暗示在必要时更改内存访问指令(lw,sw)中的偏移值。

LOOP:  lw           $1, 100 ($2)
       addi         $1, $1, 1
       sw           $1, 500 ($2)
       addiu        $2, $2, 4
       bne          $2, $10, LOOP

对我来说很明显,这段代码增加了一个数组的内容并将其存储在另一个数组中。因此,我不完全了解如何重新排列此代码,因为需要在完成循环之前计算索引。

我的猜测是将lw指令移到分支指令之后,因为(据我所知)延迟槽中的指令总是被执行。话又说回来,我不太明白这个主题,希望得到解释。我总体上了解流水线,但不太了解延迟分支。谢谢

最佳答案

填充分支延迟槽的一种方法是:

addiu  $2, $2, 4  # We'll now iterate over [$2+4, $10] instead of [$2, $10[
LOOP:  lw           $1, 96 ($2)
       addi         $1, $1, 1
       sw           $1, 496 ($2)
       bne          $2, $10, LOOP
       addiu        $2, $2, 4  # Use the delay slot to increase $2

关于assembly - MIPS 中的延迟分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19825297/

相关文章:

windows - 程序集 : Dealing with user input in windows nasm

assembly - 获取 16 或 32 字节固定大小缓冲区的 C 字符串长度? (XMM 或 YMM 寄存器宽度)

assembly - 使用 EAX、EBX、ECX 等时出现 undefined symbol 异常

java - 基于管道的系统的架构/设计。如何改进这段代码?

assembly - 反转 MIPS 汇编中数字的位

c - 读入用 C 打开的 MIPS 文件

c - 如何编写从汇编代码调用的 C 函数

architecture - 如何确定 SOA 服务的功能职责?

javascript - 有哪些学习 JavaScript 和编程架构的好网站?

c - _IO_puts 和动态指令计数