零寄存器如何提高性能?

2024-02-20

在 MIPS ISA 中,有一个零寄存器($r0) 始终给出零值。这允许处理器:

  1. 任何产生要被丢弃的结果的指令都可以将其目标定向到该寄存器
  2. 成为一个来源0

据说在这source https://web.archive.org/web/20170328171837/http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Overall/instruction.html这提高了CPU的速度。它如何提高性能?那么为什么不是所有的ISA都采用这个零寄存器呢?

$r0不是通用目的。它被硬连线到 0。无论你做什么 对此寄存器执行操作,它的值始终为 0。您可能想知道为什么 MIPS 中需要这样的寄存器。

MIPS 的设计者使用基准(用于确定 CPU 的性能),这让他们相信有一个寄存器 硬连线为 0 将提高 CPU 的性能(速度),如下所示 反对没有它。并非所有人都同意将寄存器硬连线到 0 是必不可少的,因此并非所有 ISA 都有零寄存器。


有一些潜在的方法可以提高性能;目前尚不清楚哪些适用于该特定处理器,但我已按照从最有可能到最不可能的顺序粗略地列出了它们。

  1. 它避免了虚假的管道停顿。如果没有显式的零寄存器,则需要获取一个寄存器,将其清零,然后使用它的值。这意味着归零操作取决于归零操作,并且(取决于流水线转发系统的强大程度)可能取决于归零寄存器的先前值。像 x86 这样的架构具有非常小的寄存器文件,并且基本上虚拟化其寄存器以防止其引起问题,并且具有极其强大的危险分析工具。对于 RISC 处理器来说,情况通常并非如此。
  2. 如果某些操作可以避免寄存器读取,那么它们可能会更加流水线化。如果使用显式零寄存器,则在指令解码阶段知道操作数为零的事实,而不是稍后在寄存器获取阶段知道。因此,可以跳过寄存器读取阶段。
  3. 类似地,显式丢弃结果的能力避免了对寄存器写入阶段的需要。
  4. 当已知某些操作的操作数之一为零或已知结果将被丢弃时,某些操作可能会生成更简单的微代码。
  5. 显式零寄存器减轻了编译器优化器的一些压力,因为它不需要小心地分配寄存器(不需要识别不会导致读取或写入停顿的寄存器)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

零寄存器如何提高性能? 的相关文章

  • 在用 QtSpim 编译的 MIPS 中生成随机整数

    所以我看到了很多关于使用 MARS 在 MIPS 程序中生成随机整数的问题 系统调用 42没关系 问题是我需要为编译的程序生成一个随机整数QtSpim 它没有 42 或大于 17 的系统调用 我无法弄清楚从系统中获取类似随机值的东西 例如
  • MIPS:将 BEQ 计算为十六进制机器代码

    我有一个作业 必须将 MIPS 指令转换为其十六进制机器代码 我知道如何转换 add addi lw 等指令 但是当它转换为 beq 之类的指令时 我感到困惑 我如何将这个 beq 转换为十六进制 0x00400108 beq t3 t5
  • 提示用户输入汇编 ci20 seg 错误

    我目前正在 ci20 机器上开发一个小程序 提示用户输入整数值 然后将该值打印到屏幕上 我当前的代码 data prompt asciiz Please enter an integer message asciiz nValue ente
  • 为什么 EAX 中的高 16 位不能通过名称访问(如 AX、AH 和 AL)? [复制]

    这个问题在这里已经有答案了 为什么没有一个特定的寄存器来访问寄存器的其他部分 16 32 Like ah or al访问8位部分ax登记 我们的想法是将寄存器扩展到 32 位 而不是创建具有两倍数量的 16 或 8 位寄存器的机器 因为这些
  • 变址寻址方式和隐式寻址方式

    索引寻址模式通常用于访问数组 因为数组是连续存储的 我们有一个索引寄存器 它在每次迭代中都会递增 当添加到基地址时 它会给出数组元素地址 我不明白这种寻址模式的实际需要 为什么我们不能通过直接寻址来做到这一点 我们有了基地址 每次访问的时候
  • 最新的处理器不支持 SSSE3 指令? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何不支持 SSSE3 指令的仍然相关的 CPU Intel AMD Atom 没有 SSSE3 的最新 CPU 是什么 没有 SS
  • 处理 ARM 芯片的保留寄存器位

    我正在使用 ARM Cortex M3 的寄存器 在文档中 某些位可能是 保留的 我不清楚在寄存器上写入时应该如何处理这些保留位 这些保留位是否可写 我应该小心不要碰它们吗 如果我碰它们 会发生什么不好的事情吗 这是关于如何处理保留位的经典
  • 为什么 32 位寄存器上的 x86-64 指令会将整个 64 位寄存器的上部清零?

    In the x86 64 Intel 手册之旅 http x86asm net articles x86 64 tour of intel manuals I read 也许最令人惊讶的事实是诸如这样的指令MOV EAX EBX自动将高
  • 程序如何执行?操作系统在哪里发挥作用?

    程序从某种语言编译为 ASM gt 机器代码 直接可执行 当人们说这是平台相关时 意味着形成的二进制文件只能在具有相同指令集架构 如 x86 x86 64 的 CPU 上运行 正确 由于 ISA 的差异 它可能 错误地 可能 根本 不在其他
  • MIPS 左加载字 (LWL) 和右加载字 (LWR) 指令的作用是什么?

    最近我一直在研究 MIPS 指令集 当时我遇到了两个在其他指令集中没有见过的不寻常指令 我环顾四周 想找到一个关于指令到底做什么的合理解释 但我所能弄清楚的是 它们在某种程度上与未对齐的内存访问有关 例如 维基百科说 https en wi
  • 为 Mips 架构编译 C

    我已经看到了几种方法来做到这一点 到目前为止我还没有尝试过几种 但我想为了方便起见隔离这个方法 应该有一种方法可以通过 VIA gcc 来做到这一点 我更喜欢这个 我只是不断碰壁 我正在使用 debian7 并且可以使用其他任何风格 我暂时
  • 为什么 MIPS 中 bgezal 和 bltzal 是基本指令而不是伪指令?

    根据这个MIPS指令参考 http www weblearn hs bremen de risse RST docs MIPS mips isa pdf 有两条指令 bgezal and bltzal 如果分支被采用 则执行相对跳转和链接
  • 如何从程序访问控制寄存器cr0、cr2、cr3?出现分段错误

    我编写了一个程序 尝试读取和写入控制寄存器 程序编译得很好 但是当内联汇编即将执行时 它会产生分段错误 Code void instructions int val int i int value for i 0 i lt val i as
  • RISC-V 调用约定的 ABI 寄存器名称

    我对 RISC V ABI 寄存器名称感到困惑 例如 第 85 页的 RISC V 指令集手册 第一卷 用户级 ISA 版本 2 0 中的表 18 2 指定堆栈指针sp正在注册x14 然而 指令 addi sp zero 0 由 riscv
  • 如何将三地址代码转换为MIPS汇编语言?

    我正在做一个项目 其中我必须创建一个翻译器来为 C 代码生成 MIPS 汇编代码 正在使用的编程语言是 C 我已经完成了三个地址代码的生成 但我对如何进一步进行感到非常困惑 如前所述 这是直接翻译 确实没有什么需要澄清的 以下面的三地址代码
  • 在MIPS中,有符号加法、无符号加法、有符号减法和无符号减法之间有什么区别?

    add rd rs rt addu rd rs rt sub rd rs rt subu rd rs rt 在MIPS中 有符号加法 无符号加法 有符号减法和无符号减法之间有什么区别 如果它们的结果相同 那么分类为使用有符号和无符号方法有什
  • ARM Cortex A8 PMNC 读取在启用后也给出 0.. 有什么想法/建议吗?

    MODULE LICENSE GPL MODULE DESCRIPTION user mode access to performance registers int init arm init void unsigned int valu
  • CPU寄存器和CPU缓存有什么不同吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 CPU寄存器和CPU缓存有什么不同吗 是的 CPU寄存器只是少量的数据存储 方便CPU的一些操作 CPU缓存 它是一种高速易失性存储器 尺寸较大 有助
  • 如何关闭MIPS-GCC自动指令重排序?

    继这个问题之后 使用跳转 和链接 指令的奇怪 MIPS 汇编器行为 https stackoverflow com questions 3807480 weird mips assembler behavior with jump and
  • gcc 编译器开关 (-mavx -mavx2 -mavx512f) 到底有什么作用?

    我在 C C 代码中明确使用了英特尔 SIMD 内在扩展 为了编译代码 我需要在命令行上指定 mavx mavx512 或类似的内容 我对这一切都很满意 然而 从阅读 gcc 手册页来看 并不清楚这些命令行标志是否也告诉 gcc 编译器尝试

随机推荐