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=quotient
和 hi=remainder
特殊寄存器中产生结果)。 mfhi
就是 "Move from HI";它从那个特殊寄存器复制到一个通用寄存器。
这些名字来自 mult
指令(它像 div
比 add
或原始 MIPS I 支持的任何其他整数 ALU 指令具有更高的延迟),它产生一个双-width 导致 LO 和 HI。 (Getting result from mult in mips 和
In MIPS, what is HI and LO).
如果mult
和div
的目的地是通用寄存器,那么在循环中结果就绪,可能还有add
或lw
或流水线需要在同一周期内写入寄存器文件的任何其他结果。这些指令每个都会产生 2 个单词的结果。使用特殊的 LO/HI 寄存器可以避免这两种原因造成的回写冲突。
还要记住 MIPS 代表最小互锁流水线阶段,因此早期 MIPS 的主要设计目标是不让硬件检查数据依赖性,而让软件在它之前不尝试读取结果准备好了。使 mult
/ mfhi
/ mflo
特殊也有助于此,因为没有通过普通 GP 寄存器的依赖性。
但是更现代的 MIPS CPU 具有更大的晶体管预算,并且可以支持像 mul
和 rem
这样的指令,这些指令将它们的结果放入 GP 寄存器,即使它们比普通的 ALU 指令具有更高的延迟.
我不确定它们是什么时候添加到 ISA 的;那是不是在像r10000这样的高性能乱序执行MIPS CPU的时代。
这有什么区别吗:
rem $s0, $t0, $t1
还有这个:
div $t0, $t1
mfhi $s0
我知道第一个有效,但不确定第二个。是一样的吗?
较旧的 MIPS 没有 rem
,只有 div
将结果放入特殊寄存器,以避免从高延迟指令回写到寄存器文件的微体系结构问题一个简单的管道。
计算余数的不是 mfhi
,而是 div
(在 lo=quotient
和 hi=remainder
特殊寄存器中产生结果)。 mfhi
就是 "Move from HI";它从那个特殊寄存器复制到一个通用寄存器。
这些名字来自 mult
指令(它像 div
比 add
或原始 MIPS I 支持的任何其他整数 ALU 指令具有更高的延迟),它产生一个双-width 导致 LO 和 HI。 (Getting result from mult in mips 和
In MIPS, what is HI and LO).
如果mult
和div
的目的地是通用寄存器,那么在循环中结果就绪,可能还有add
或lw
或流水线需要在同一周期内写入寄存器文件的任何其他结果。这些指令每个都会产生 2 个单词的结果。使用特殊的 LO/HI 寄存器可以避免这两种原因造成的回写冲突。
还要记住 MIPS 代表最小互锁流水线阶段,因此早期 MIPS 的主要设计目标是不让硬件检查数据依赖性,而让软件在它之前不尝试读取结果准备好了。使 mult
/ mfhi
/ mflo
特殊也有助于此,因为没有通过普通 GP 寄存器的依赖性。
但是更现代的 MIPS CPU 具有更大的晶体管预算,并且可以支持像 mul
和 rem
这样的指令,这些指令将它们的结果放入 GP 寄存器,即使它们比普通的 ALU 指令具有更高的延迟.
我不确定它们是什么时候添加到 ISA 的;那是不是在像r10000这样的高性能乱序执行MIPS CPU的时代。