MIPS中rem和mfhi的区别

Difference between rem and mfhi in MIPS

这有什么区别吗:

rem $s0, $t0, $t1

还有这个:

div $t0, $t1
mfhi $s0

我知道第一个有效,但不确定第二个。是一样的吗?

较旧的 MIPS 没有 rem,只有 div 将结果放入特殊寄存器,以避免从高延迟指令回写到寄存器文件的微体系结构问题一个简单的管道。

计算余数的不是 mfhi,而是 div(在 lo=quotienthi=remainder 特殊寄存器中产生结果)。 mfhi 就是 "Move from HI";它从那个特殊寄存器复制到一个通用寄存器。

这些名字来自 mult 指令(它像 divadd 或原始 MIPS I 支持的任何其他整数 ALU 指令具有更高的延迟),它产生一个双-width 导致 LO 和 HI。 (Getting result from mult in mipsIn MIPS, what is HI and LO).

如果multdiv的目的地是通用寄存器,那么在循环中结果就绪,可能还有addlw 或流水线需要在同一周期内写入寄存器文件的任何其他结果。这些指令每个都会产生 2 个单词的结果。使用特殊的 LO/HI 寄存器可以避免这两种原因造成的回写冲突。

还要记住 MIPS 代表最小互锁流水线阶段,因此早期 MIPS 的主要设计目标是不让硬件检查数据依赖性,而让软件在它之前不尝试读取结果准备好了。使 mult / mfhi / mflo 特殊也有助于此,因为没有通过普通 GP 寄存器的依赖性。


但是更现代的 MIPS CPU 具有更大的晶体管预算,并且可以支持像 mulrem 这样的指令,这些指令将它们的结果放入 GP 寄存器,即使它们比普通的 ALU 指令具有更高的延迟.

我不确定它们是什么时候添加到 ISA 的;那是不是在像r10000这样的高性能乱序执行MIPS CPU的时代。