在MIPS中,为什么可以';我们是否使用FPU中存储的字作为lwc1/swc1的基址?

在MIPS中,为什么可以';我们是否使用FPU中存储的字作为lwc1/swc1的基址?,mips,mips32,Mips,Mips32,例如,这是允许的: .data try: .word 15 .text la $s0, try mtc1 $s0, $f1 lwc1 $f2, ($s0) 这不是: .data try: .word 15 .text la $s0, try mtc1 $s0, $f1 lwc1 $f2, ($f1) 即使寄存器包含相同的位模式?我已经检查了指令以澄清,但我注意到的唯一一件事是“协处理器不可用”是一个可能的例外…但是为什么?简单的回答是指令编码不

例如,这是允许的:

.data
   try: .word 15
.text
   la $s0, try
   mtc1 $s0, $f1
   lwc1 $f2, ($s0)
这不是:

.data
   try: .word 15
.text
   la $s0, try
   mtc1 $s0, $f1
   lwc1 $f2, ($f1)

即使寄存器包含相同的位模式?我已经检查了指令以澄清,但我注意到的唯一一件事是“协处理器不可用”是一个可能的例外…但是为什么

简单的回答是指令编码不允许这样做。
lwc1
指令是一个I型指令,它允许2位指定哪个协处理器,5位用于
base
寄存器,5位用于
rt
协处理器目标寄存器。与其他加载和存储一样,有一个16位立即数。16位有符号偏移量被添加到GPR base的内容中,以形成有效地址

一个较长的答案是,设计人员选择浮点寄存器的目的是存储浮点值,而不是指针。作为其中的一部分,他们选择将浮点单元仅用于浮点计算。浮点操作侧重于复杂的数值计算,还涉及舍入隐藏位-这些操作不适用于指针

它们将加载和存储操作留给主处理器,而不是向协处理器添加加载和存储单元。
lwc1
作为普通的I型指令在主处理器中执行

他们可以添加指令来取消对浮点值的引用吗?是的,我想是这样,假设他们还有足够的编码空间。(作为一个固定大小的指令集,编码空间比像x86这样的可变长度指令集更昂贵。让我们注意RISC V有一个可变长度的指令集。)(以2字节为增量)。)


如果通用整数寄存器需要寄存器中的更多指针,而不是使用浮点协处理器,则将其添加到通用整数寄存器中会更有意义。

MIPS指令的大小是固定的。指令中有5位用于编码用作基址的寄存器。这5位可以编码32个不同的values,并且已经选择了这32个值来表示32个通用寄存器。