.double 类型的变量是否存储在两个寄存器中?

问题描述 投票:0回答:2

当我声明一个整数时,我使用指令

.word
,它有 32 位,如果我正确的话,这也是 MIPS 架构中寄存器的大小。

现在,据我了解,

.double
应该是 64 位。这是否意味着当我将变量加载到寄存器(
lwc1
)时,它实际上存储在两个寄存器上,就像一个数组一样;或者协处理器上的寄存器是两倍大?

assembly floating-point mips cpu-architecture cpu-registers
2个回答
4
投票

这取决于MIPS版本和硬件实现。 MIPS I 和 II 确实只有 32 个

single
浮点寄存器,因此
double
值必须存储在 2 个寄存器中

但是 MIPS III 允许将 FPU 寄存器大小扩展到 64 位,因此每个

double
变量现在只能位于一个寄存器上

MIPS架构支持两种FPU寄存器模型:

  • 32位FPU寄存器模型:32个,32位寄存器

    • 32 位数据类型存储在任何寄存器中

    • pre-Release 6:64 位数据类型存储在偶数-奇数寄存器对中。

      在版本 6 中,32 位寄存器模型不支持 64 位数据类型(存储在寄存器的奇偶对中),并且需要 64 位操作来发出保留指令异常信号。

  • 64 位 FPU 寄存器模型:32、64 位寄存器,一个寄存器支持所有格式。

在该架构的第 1 版中,MIPS32 仅支持 32 位 FPU 寄存器模型(具有用于 64 位数据的奇偶寄存器对),而 MIPS64 仅支持 64 位 FPU 寄存器模型。

从版本 2 及更高版本开始,MIPS32 和 MIPS64 都支持 FPU 寄存器模型。如果 CP0 StatusFR 位是可写的,则允许选择寄存器模型,而如果该位是只读的,则表示支持哪种模型。在Release 2和Release 3中,需要32位FPU寄存器模型,而64位FPU寄存器模型是可选的。在 Release 5 中,需要 64 位 FPU 寄存器模型。

面向程序员的 MIPS® 架构第 I-A 卷:MIPS32® 架构简介,修订版 6.01

事实上,在 64 位 FPU 寄存器模型中,每个寄存器可以存储两个 32 位浮点值,在现代平台中充当“早期的现代 SIMD”。只是后来真正的 SIMD 扩展才被添加到 MIPS

MIPS V 添加了一种新的数据类型,即 Paired Single (PS),它由存储在现有 64 位浮点寄存器中的两个单精度(32 位)浮点数组成。添加了用于算术、比较和条件移动的现有浮点指令的变体,以便以 SIMD 方式对该数据类型进行操作。添加了用于加载、重新排列和转换 PS 数据的新指令。它是第一个利用现有资源利用浮点 SIMD 的指令集。


2
投票
这是否意味着当我将变量加载到寄存器(lwc1)中时,它实际上存储在两个寄存器上,就像一个数组一样;或者协处理器上的寄存器是两倍大?

注意指令应该是l
d

c1,lwc1用于加载32位浮点数。 但无论如何:也许吧。在 ISA 级别(您在进行汇编时遇到的级别),双精度数字存储在两个连续的寄存器中。只有偶数寄存器才能有效指定为双精度运算的目标或源,其后面的奇数寄存器也被隐式使用。从这个意义上说,双精度浮点数像数组一样存储在两个寄存器中。

另一方面,这并不一定意味着这是对硬件工作原理的良好描述。实现相同 ISA 的方法有多种。其中一种方法是使用一个由 32 个 32 位 FPU 寄存器组成的单片数组,并为每个源操作数从同一数组中读取 2 个连续的寄存器,并将结果写入 2 个连续的寄存器。但是,如果在与单精度操作相同的吞吐量下支持双精度操作,则需要将寄存器文件的读取端口和写入端口的数量加倍。

更可能的解决方案是实施两个

banks

寄存器,一个偶数bank和一个奇数bank,与“单片阵列”配置相比,将每个bank的读端口和写端口数量减半。它不会改变端口总数,但像这样将它们分开是有用的:向 SRAM 阵列添加更多端口相对昂贵,比处理两个存储体更昂贵(这也不是免费的,因为单精度操作数)需要能够从任何一家银行出来,但这并没有那么糟糕)。这样,双精度值仍然存储在两个寄存器中,但不像数组,而是像两个单独的数组中具有相同索引的两个条目。 还有更多实现方法。使用 64 位寄存器(正如您也建议的那样)并选择其中的一半作为单精度操作数也是一种选择,但在执行写入时有点烦人。

© www.soinside.com 2019 - 2024. All rights reserved.