0

大数据类型(双精度/浮点数)如何加载到算术运算的寄存器中?寄存器可以保存超过一个字大小的数据吗?如果只能添加 2 个寄存器来将结果加载到第三个寄存器,那么大于单个寄存器的数据类型会发生什么?

4

2 回答 2

0

首先,CPU 通常具有用于整数和浮点数的单独寄存器文件。

在 80 年代,一些 CPU 尝试使用统一的寄存器空间,但发现这是带宽瓶颈。因为浮点运算几乎总是多周期的,并且总是有相当数量的基于整数的流控制混合在一起,所以同时访问单独的寄存器空间会更有效。

其次,对于某些架构,浮点寄存器文件都是 80 位扩展浮点数(C 中的“long double”)。双精度和浮点数在加载时会扩展为该格式,并且扩展格式在存储时会被舍入和截断。

对于整数运算,这取决于架构。由于 64 位是 x86 的事后考虑,它在同一个物理寄存器上覆盖了 8 位(AL 和 AH)、16 位 (AX)、32 位 (EAX) 和 64 位 (RAX) ,每个都由不同的寻址模式访问。另一方面,一些 RISC 体系结构将寄存器中的数字视为 64 位用于 MOST 操作,只关心加载和存储时的字长。

于 2012-02-19T03:28:58.960 回答
0

例如,在 SPARCv8 ABI 中,64 位双精度数被加载到两个 32 位寄存器中,FP 操作同时在两个寄存器上工作。fsqrtd %f10, %f8获取 %f10:%f11 中的值并将根结果写入 %f8:%f9。在 x86_32 上,您可以在执行 32x32->64 乘法时观察到类似的情况,结果将在 edx:eax (左右)中。实际上与 286 模式下的 16x16->32 乘法相同,结果转到 dx:ax。

于 2011-12-12T00:46:21.317 回答