【发布时间】:2020-09-14 17:38:17
【问题描述】:
大多数架构都有不同的寄存器集来存储常规整数和浮点数。从二进制存储的角度来看,存储东西的位置不应该是对的吗?只是 1 和 0,难道它们不能将相同的通用寄存器通过管道传输到浮点 ALU 中吗?
SIMD(x64 中的xmm)寄存器能够存储浮点数和常规整数,因此
为什么相同的概念不适用于常规寄存器?
【问题讨论】:
-
纯属推测,但是:在 x86-64 和
xmm等之前,CPU 可能有一个基于堆栈的浮点单元,这是一种补充附加组件(在 FPU 之前,CPU 只是根本没有浮点支持)。我的猜测是 AMD 的人坚持浮点作为附加组件的概念,因此他们添加了xmm寄存器,而不是使用 SIMD 指令扩展整数寄存器。然后,在开发的某个阶段,他们意识到可以为xmm寄存器添加整数 SIMD 指令,但随后他们坚持使用xmm,而不是统一所有内容。 -
要记住的一点是 x86-64 是一种编程语言。它比 C 级别低,但比 x86-64 转换为的实际微操作级别高。
xmm5、rbx、ebx等只是编程语言结构,后面很可能有统一的整数+FP寄存器。 -
@hegel5000:XMM 寄存器本身甚至没有统一!英特尔处理器,或者至少其中一些处理器,具有不同的物理位置,它们将根据 XMM 寄存器是用于整数指令还是浮点指令来保存数据。这对汇编语言程序员来说是不可见的;处理器保留自己的有关数据位置的信息。除非它可以在表演效果中看到;交替整数和浮点指令可能比任何一个的齐次序列都慢。
-
只有在您的通用寄存器至少为 64 位时才真正有意义。因此,x86-32(和之前的 x86-16)确实不能对两者使用相同的寄存器,并且 x86-64 被有意设计为类似于 x86-32,因此保持寄存器架构大致相似。
-
再往前追溯,在 386 及之前的版本中,FPU 是一个物理上独立的芯片(不是每个人都选择购买),因此它确实必须有自己的寄存器。
标签: floating-point x86-64 simd cpu-registers