我见过的大多数支持本机标量硬件 FP 支持的架构将它们推入完全独立的寄存器空间,与主寄存器集分开。
我见过的大多数支持本机标量硬件 FP 支持的架构将它们推入完全独立的寄存器空间,与主寄存器集分开。
- X86 的传统 x87 FPU 使用带有寄存器的部分独立浮点“堆栈机”(读作:基本上是固定大小的 8 项环形缓冲区)
st(0)
通过st(7)
为每个项目建立索引。这可能是最不同的流行的。它只能通过加载/存储到内存或通过将比较结果发送到 EFLAGS 来与其他寄存器交互。 (286)fnstsw ax http://felixcloutier.com/x86/FSTSW:FNSTSW.html和 i686fcomi http://felixcloutier.com/x86/FCOMI:FCOMIP:FUCOMI:FUCOMIP.html).
- 支持 FPU 的 ARM 有一个独立的 FP 寄存器空间,其工作方式与其整数空间类似。主要区别是专门用于浮点的单独指令集,但即使是习惯用法也大多一致。
- MIPS 介于两者之间浮点 https://www.doc.ic.ac.uk/lab/secondyear/spim/node20.html从技术上讲,是通过协处理器(至少明显地)完成的,并且它的使用规则略有不同(例如使用两个浮点寄存器而不是单个扩展寄存器进行双精度运算),但它们的工作方式与 ARM 非常相似。
- X86 较新的 SSE 标量指令的操作方式与其矢量指令类似,使用类似的助记符和习惯用法。它可以自由地加载和存储到标准寄存器和内存,并且您可以使用 64 位内存引用作为许多标量操作的操作数,例如addsd xmm1, m64 https://www.felixcloutier.com/x86/ADDSD.html or subsd xmm1, m64 https://www.felixcloutier.com/x86/SUBSD.html,但您只能通过以下方式从寄存器加载和存储到寄存器movq xmm1, r/m64, movq r/m64, xmm1, 和朋友 https://www.felixcloutier.com/x86/MOVD:MOVQ.html。这与 ARM64 NEON 类似,尽管它与 ARM 的标准标量指令集略有不同。
相反,许多矢量化指令甚至不关心这种区别,只是区分标量和矢量。对于 x86、ARM 和 MIPS 这三个:
- 它们将标量和向量寄存器空间分开。
- 它们重用相同的寄存器空间进行矢量化整数和浮点运算。
- 他们仍然可以访问适用的整数堆栈。
- 标量操作只是从相关的寄存器空间(或者 x86 FP 常量的情况下的内存)中提取它们的标量。
但我想知道:是否有任何 CPU 架构可以重用相同的寄存器空间进行整数和浮点运算?
如果不是(由于兼容性之外的原因),什么会阻止硬件设计人员选择走这条路?
Motorola 88100 有一个用于浮点和整数值的寄存器文件(三十一个 32 位条目加上一个硬连线零寄存器)。对于 32 位寄存器和对双精度的支持,必须使用寄存器对来提供值,这极大地限制了寄存器中可以保存的双精度值的数量。
后续的 88110 添加了 32 个 80 位扩展寄存器,用于附加(和更大)浮点值。
参与 Motorola 88k 开发的 Mitch Alsup 开发了自己的加载存储 ISA(至少部分出于教学原因),如果我没记错的话,它使用统一的寄存器文件。
还应该注意的是,Power ISA(PowerPC 的后代)定义了“嵌入式浮点设施”,它使用 GPR 来表示浮点值。这降低了核心实现成本和上下文切换开销。
单独的寄存器文件的一个好处是,这样可以提供显式存储,以减少简单的有限超标量设计中的寄存器端口数量(例如,为每个文件提供三个读取端口将允许所有对一个 FP,甚至三源操作数 FMADD,以及与使用单个寄存器文件的五个读取端口来支持 FMADD 和另外一个双源操作相比,并行启动一个基于 GPR 的操作以及许多常见的基于 GPR 的操作对。另一个因素是容量是额外的并且宽度独立;这既有优点也有缺点。此外,通过将存储与操作耦合,可以以更直接的方式实现高度独特的协处理器。考虑到芯片尺寸的限制,这对于早期微处理器来说更为重要,但 UltraSPARC T1 共享一个具有八个内核的浮点单元,而 AMD 的 Bulldozer 共享一个具有两个整数“内核”的 FP/SIMD 单元。
统一的寄存器文件具有一些调用约定的优点;无论值的类型如何,都可以在同一寄存器中传递值。统一的寄存器文件还允许所有寄存器用于所有操作,从而减少不可用的资源。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)