这之间有什么区别吗:
rem $s0, $t0, $t1
Run Code Online (Sandbox Code Playgroud)
和这个:
div $t0, $t1
mfhi $s0
Run Code Online (Sandbox Code Playgroud)
我知道第一个有效,但我不确定第二个。是一样的吗?
较旧的 MIPS 没有rem,只有div将结果放入特殊寄存器中,以避免从简单管道中的高延迟指令写回寄存器文件的微架构问题。
不是mfhi计算余数,而是(在和特殊寄存器div中生成结果)。 只是“从 HI 移动”;它将从该特殊寄存器复制到通用寄存器。lo=quotienthi=remaindermfhi
这些名称来自mult指令(该指令的div延迟时间比原始 MIPS I 支持的任何其他整数 ALU 指令要高add),该指令在 LO 和 HI 中产生双宽度结果。(从 mips和
MIPS 中的 mult 中获取结果,HI 和 LO 是什么)。
mult如果和的目的地div是通用寄存器,那么在循环中结果已就绪,还可能有一个add或lw管道需要在同一周期中写入寄存器文件的这些指令每条都会产生 2 个字的结果。使用特殊的 LO/HI 寄存器可以避免这两种原因造成的写回冲突。
另请记住,MIPS 代表最小互锁流水线阶段,因此早期 MIPS 的主要设计目标是不让硬件检查数据依赖性,并让软件在结果准备好之前不要尝试读取结果。使mult//变得mfhi特殊mflo也有帮助,因为不存在通过普通 GP 寄存器的依赖性。
但更现代的 MIPS CPU 具有更大的晶体管预算,并且可以支持类似mul和rem将其结果放入 GP 寄存器的指令,尽管它们的延迟比普通 ALU 指令更高。
我不确定它们是什么时候被添加到 ISA 中的;无论那是在像 r10000 这样的高性能乱序执行 MIPS CPU 时代。