开发者生态
evening
Intel 8087浮点芯片中的微代码:scale指令
2026-09-12
1 阅读
约5分钟阅读
pwg
字号:
Intel 8087 浮点芯片中的微代码:标度指令 在 20 世纪 70 年代,浮点运算一团糟。计算机制造商有十几个不兼容的算术标准。此外,浮点系统是围绕硬件简单性而不是数学严谨性设计的,导致数值稳定性问题。当英特尔于 1980 年推出 8087 浮点协处理器芯片时,这种情况发生了变化,该芯片的设计目标是尽可能准确,即使在极端情况下也是如此。 8087 之所以流行,是因为它可以安装在 IBM PC 中,使从电子表格到 CAD 等应用程序的浮点运算速度提高 100 倍。但更重要的是,8087 成为当今大多数计算机使用的浮点标准。 8087 用称为微代码的复杂低级代码来实现其指令。我是 Opcode Collective 小组的成员,该小组正在对这个微代码进行逆向工程,并且我最近取得了一些进展。在这篇文章中,我检查了 8087 指令之一 FSCALE 的微代码,并描述了该微代码的工作原理。 FSCALE(浮点缩放)指令提供了一种将数字缩放为 2 的幂的快速方法,比乘法快得多。我认为 FSCALE 是一个简单、几乎微不足道的指令,很容易理解和解释。剧透:这并不简单。 FSCALE 使用超过 140 条微指令和三级子程序调用来处理许多特殊情况。但 FSCALE 微代码展示了 8087 的许多有趣的部分,例如移位器、加法器和指数转换器,并且还揭示了 8087 的一个隐藏功能,所以希望您会发现它很有趣。为了探索微代码,我打开了 8087 芯片并用显微镜创建了高分辨率图像。大型微代码ROM位于中央,保存着控制芯片的1648条微指令。左侧的微代码引擎逐步执行微代码,处理跳转和子例程调用。芯片的下半部分是“数据路径”,即执行浮点计算的电路;它被分成一个用于数字指数的 16 位数据路径和一个用于数字尾数(也称为小数部分)的 64 位数据路径。 Intel 8087浮点单元芯片的裸片,标有主要功能块。模具尺寸为5mm×6mm。单击查看更大的图像。放大芯片底部显示数据路径电路;我在下面突出显示了相关部分。 1 指数 ROM 保存各种常数。指数转换器是一种专门的电路,用于检查指数、检测特殊值以及在指数格式之间进行转换。 2 变速杆是一个大部件;它允许 64 位 3 值左移或右移任意量。 (我在这里写了有关 8087 移位器电路的文章。)加法器是 8087 计算的核心;它是 8087 的核心。它在循环中用于乘法、除法和平方根。 B 寄存器保存加法器的一个输入,而多个源可以提供另一输入。和寄存器保存加法器的输出。八个堆栈寄存器和临时寄存器保存浮点数。 8087 数据路径的特写,显示 FSCALE 使用的功能块。 8087 的详细信息 在本节中,我将解释 8087 的一些对于 FSCALE 微代码很重要的功能。为了使用 8087,程序员将值存储在其八个内部寄存器中,并组织为堆栈。每个寄存器保存一个 80 位浮点数。为了优化性能,寄存器堆栈中的每个值都有一个关联的“标签”值,该值对程序员来说几乎是不可见的。 4 标签将值标记为有效、特殊、零或空。 “正常”浮点值被标记为 valid 。如果浮点值是无穷大、非数字 (NaN) 或非规范化值,则它会被标记为特殊 。零值被标记为 Zero 。最后,如果寄存器为空(例如,其值已从堆栈中弹出),则该寄存器被标记为空。 8087 还具有内部使用的临时寄存器: tmpA 、 tmpB 和 tmpC 。与堆栈寄存器一样,tmpA 和 tmpB 是 80 位寄存器,以及两个标记位。然而,tmpC 仅保存 64 位有效数。 8087 支持多种数据类型:各种大小的浮点数、整数和二进制编码的十进制。但在内部,所有内容都存储为 80 位浮点数,称为“临时实数”;在本文的其余部分中,我将仅考虑临时实际值。数字由三部分组成:符号位、15 位指数和 64 位有效数(小数部分)。大多数情况下,浮点数由符号 × 有效数 × 2 指数表示。有效数是 1.bbb... 形式的 64 位二进制数:前导 1,后跟二进制点(相当于小数点的二进制)和其余位。 5 浮点是什么
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱