【问题标题】:Data Types additions larger than word大于字的数据类型添加
【发布时间】:2012-01-18 00:18:14
【问题描述】:

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

【问题讨论】:

  • 您能否提供更多信息或上下文?以我有限的知识,这因一个拱门而异。您为哪种架构设计?

标签: data-structures cpu-architecture instruction-set


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 2014-09-12
      • 2014-06-24
      相关资源
      最近更新 更多