MIPS - 不能使用奇数寄存器进行双精度乘法运算?

MIPS - Cannot use odd numbered registers for multipyling with double precision?

语言具体问题, 语言是 MIPS

我知道双精度占用两个寄存器。 (所以如果我存储在 $f5 中,那么我不应该弄乱 $f6)

但是它说奇数寄存器不能用于双精度乘法。 (全部移动一个($f5 更改为 $f6)并且代码工作正常)

这有什么原因吗? 在任何地方都找不到很多相关内容

任何东西都将不胜感激,谢谢

浮点寄存器为 32 位宽,因此 64 位的双精度数(浮点数)占用 2 个寄存器。

硬件假定 even/odd 对来保存双精度数的所有 64 位,因此我们总是使用偶数寄存器编号来引用 64 位双精度数。

硬件是否可以使用像 $f5、$f6 这样的 odd/even 对——当然是假设的。对于硬件,要从偶数寄存器编号(例如 $f4)变为奇数寄存器编号($f5),我们只需将低位从 0 更改为 1(4=00100;5=00101)。从奇数 ($f5) 到下一个更高的偶数 ($f6) 需要 5 位加法,而不是简单地翻转位。我们还必须考虑 $f31 是否与 $f0 配对或什么。 (翻转奇数位(例如从 $f5 开始)甚至会得到相同的 even/odd 对($f5,$f4 vs. $f4,$f5),所以这对软件来说绝对没有优势,而且它有两种方法使用同一对会令人困惑。)

但是那 ($f5,$f6) 需要一些额外的逻辑门,所以他们不这样做。提供 odd/even 对无论如何都买不了什么,因为软件可以很好地处理 even/odd 限制,所以硬件没有理由提供它。当混合 32 位和 64 位浮点数时,软件只需选择 even/odd 对作为 64 位值——这会在编译时消耗少量逻辑,这是一个值得权衡的地方。支持 odd/even 也会干扰参数传递和保留寄存器中的调用约定,因此同样没有特别的优势。

硬件是否可以使用两个不相邻的任意寄存器——是的,这也是可能的,但现在我们必须命名这两个寄存器,所以双浮点指令将需要 6 个寄存器名称,而不再适合 32 个位,并且它们的解码方式与单精度浮点数完全不同。

另一种方法是将每个浮点寄存器扩展为 64 位,从而完全不需要寄存器 pairs/pairing。这是在某些 MIPS 设计中完成的,包括 MIPS64。在某些修订版中它也被移植到 MIPS32。