【问题标题】:What's the motivation for a fpu to implement their registers in stack-based fashion?fpu 以基于堆栈的方式实现其寄存器的动机是什么?
【发布时间】:2012-02-14 06:22:50
【问题描述】:

fpu 以基于堆栈的方式实现其寄存器的动机是什么?据我了解,其他指令集(例如 x86/sse)使用命名寄存器。我可以想象,基于堆栈的属性通常与我们对函数的想法相对应,从而为汇编程序员带来更直观的设计。

但是我很好奇是否有一些更切实的动机,即技术优势。

【问题讨论】:

  • 我的猜测是它更容易在硬件中实现。如果所有指令都在顶部寄存器中运行,则不需要寄存器文件。
  • 除了成本/复杂性之外,算术表达式可以表示为树并使用堆栈进行评估。
  • 标准 x86 FPU 使用堆栈(通过 ST(x) 引用),它唯一的 SSE/AVX/FMA/MMX/3DNow!已命名的寄存器
  • 实际原因是逆波兰表示法可以写成x87 FPU汇编代码。 30 年前,x87 FPU 的堆栈设计简化了汇编编程。现在直接将 RPN 转换为 FPU 指令并不是最优的,因为 FPU 的延迟比反向吞吐量要长得多。看看 Peter Kankowski 的这篇文章:strchr.com/reverse_polish_notation

标签: assembly stack fpu


【解决方案1】:

如今,这些架构在该领域并不常见。不过,在过去,寄存器的硅空间和程序代码空间都是稀有资源(现在嵌入式环境中仍然如此)。这几乎总结了这种架构背后的两个动机:

  • ISA 更纤薄
    • 需要更少的寄存器编码空间
    • 堆栈处理之类的指令更少(显然)
  • 更简单的硬件设计
    • 更少的寄存器解码逻辑
    • 非常确定性和数学上易于理解的行为(Java 虚拟机等虚拟架构仍然使用它的原因)

【讨论】:

    【解决方案2】:

    这个问题只有最初的 8087 的设计者 W. Kahan 本人才能真正回答,他在一篇名为 "On the Advantages of the 8087's Stack" 的短论文中写到了这个问题。

    从那里:

    • 8087 堆栈并不是真正的“经典堆栈”,您可以访问任何寄存器,而不仅仅是顶部的两个/三个寄存器。
    • 具有两个操作数/指令的平面寄存器集是不切实际的:协处理器指令缺乏编码空间,这使得单操作数指令成为首选(堆栈擅长于此),并且它可以使用的寄存器数量有(显然 8 个是不可能的,似乎只有足够的空间容纳 4 个寄存器)被认为不足以有效计算一些常见的浮点运算。
    • 堆栈上溢/下溢应该很少发生,并在软件中处理,从而产生更大堆栈的错觉。

    【讨论】:

      【解决方案3】:

      这主要只适用于 x86,因为 ARM、PowerPC、MIPS 和 Sparc 都没有将它们的 FPU 实现为基于堆栈的机器。

      现在我们已将范围缩小到 x86,原因很明显。与计算中的许多其他事情一样,它归结为历史原因(有些人称之为歇斯底里的葡萄干,因为真正的原因并不真正有意义)。

      历史原因是x86架构没有FPU。现在,我知道你会说“但是看看 Pentiums!”。是的,他们有 FPU,但 IBM 选择围绕其构建 PC 的原始 8086 没有 FPU - 它是一个严格的整数机器,就像现在许多低端微控制器一样。

      这不是什么大问题,因为它主要用于低端终端和文本处理器。但它的廉价和流行突然让它被用于科学和工程应用。所以人们想出了带有 FPU 芯片的附加扩展卡来加快速度。这些卡中最受欢迎的碰巧使用了英特尔制造的基于堆栈的芯片。这个小事实让英特尔在以后更容易将芯片集成到下一代 CPU 中。

      此时,英特尔仍然可以设计一个不基于附加芯片的指令集。但是发生了两件事。许多应用程序,主要是游戏和电子表格,开始使用附加 FPU,这些应用程序变得非常非常流行。其他芯片供应商也看到了 PC 市场正在发生的事情,并希望采取行动。因此,迫于向后兼容性和需要快速添加此功能,英特尔做了最明智的事情(在业务管理方面,不一定在工程方面):他们只是将协处理器芯片包含在他们的下一个 x86 版本中,以便营销部门可以说他们有 FPU。

      长话短说:歇斯底里的葡萄干!

      【讨论】:

        猜你喜欢
        • 2011-07-03
        • 2012-01-31
        • 1970-01-01
        • 2012-11-20
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        • 2020-07-09
        • 1970-01-01
        相关资源
        最近更新 更多