FPU 以基于堆栈的方式实现其寄存器的动机是什么?



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

然而,我很好奇是否有一些更具体的动机,即技术优势。

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

  • ISA要苗条得多
    • 需要较少的寄存器编码空间
    • 堆栈处理之类的指令更少(显然)
  • 更简单的硬件设计
    • 少寄存器译码逻辑
    • 非常确定性和数学上理解良好的行为(Java虚拟机等虚拟体系结构仍然使用它的原因)

这个问题只有最初8087的设计者W.Kahan自己才能真正回答,他在一篇名为"论8087堆栈的优势"的短文中写到了这一点。

从那里:

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

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

现在我们已经将其缩小到x86,原因是显而易见的。就像计算中的许多其他事情一样,它可以归结为历史原因(有些人称之为歇斯底里的葡萄干,因为真正的原因并没有真正的意义)。

历史原因是x86体系结构没有FPU。现在,我知道你会说"但看看阁楼!"。是的,他们有FPU,但IBM选择围绕其PC构建的最初8086没有FPU——这是一台严格意义上的整数机器,就像现在许多低端微控制器一样。

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

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

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

最新更新