根据此MIPS指令参考,有两个指令(bgezal
和bltzal
)执行相对跳转和链接,而不是只执行相对跳转。
这些指令可以分别用bgez
或bltz
模拟,然后是jal
,这意味着bgezal
和bltzal
都应该被归类为伪指令。然而,它们都有分配给它们的操作码,因此它们被归类为基本指令。
将它们添加到基本指令集而不使它们成为伪指令的理由是什么?另外,为什么指令集中只包括bgezal
和bltzal
,而不包括blezal
、bgzal
等?
发布于 2018-10-06 21:26:36
jal
使用半绝对目标编码(取代低28位PC),而bgezal
/ bltzal
是相对的(添加18位符号移位,imm16<<2
)。如何计算跳跃目标地址和分支目标地址?
--它们是典型的MIPS的唯一分支和链接(而不是跳转和链接),因此对于位置无关的可重定位代码非常重要。(您甚至可以使用它将当前的PC机放到寄存器中,找出执行的位置,与jal
不同)。
您可以将bal
(无条件相对函数调用)编码为bgezal $zero, target
。
您可以在不需要任何其他设置的情况下,使用未获取的$ra=PC
bltzal $zero, anywhere
来获得,而使用bgezal
进行此操作则需要一个不超过零的输入寄存器,这将需要一个输入寄存器来创建。即使不使用分支,b...al
指令也总是写入$ra
。你想要这样做的PC相对代码,直到MIPS32r6给我们addiupc
更好的PC相对地址生成。
由于它们与其他b
牧场指令一样使用i型指令格式,所以在编码中有一个寄存器的空间,因此有意义的是让它具有可选的条件,而不是仅仅有一个bal
指令。执行“和链接”的硬件逻辑已经存在,所有其他相关分支指令都是有条件的。另外,对于$zero
来说,有一个不被接受的条件对于阅读pc
是很方便的。
请记住,MIPS指令编码在早期MIPS硬件中直接用作内部控制信号,因此它们之间不同的编码中的一个位可能连接到一个异或门,该门反转(或不)对符号位的检查。(正如Konrad的回答所指出的,这些分支条件仅取决于寄存器的MSB,因为它总是针对零,因此没有等待32位加法器产生比较结果的延迟。)
来自http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html
0000 01ss sss1 0001 iiii iiii iiii iiii BGEZAL
0000 01ss sss1 0000 iiii iiii iiii iiii BLTZAL
这种指令编码缺乏灵活性(因为它直接驱动内部控制信号,而不需要在解码中进行大量转换)也许就是为什么不存在一个28位范围的单一bal
(相对位移为26位)。相关分支的硬件是为具有16位即时性的I型指令设置的。
DR:有两个有条件的分支和链接指令,因为用其中一个实现无条件的bal
是很自然的,而另一个几乎是免费的。。
MIPS b
(无条件的无链路相对分支)也是beq $zero, $zero, target
的伪指令,或由汇编程序选择的bgez $zero, target
指令。(无条件分支和无条件跳转有什么区别(MIPS中的指令)?)。MIPS R3000手册建议使用beq $zero,$zero
。(更清楚的是,无论分支如何,$ra=PC
都会发生;这一点从我最初写这个答案时看到的快速参考单中还不清楚。)
比较零编码只有一个5位寄存器字段,因此它们比beq
/ bne
占用更少的编码空间。这可能是选择bgezal
而不是beqal
作为要提供的一对条件分支之一的原因。
发布于 2013-12-19 11:38:15
bgez和bltz不是伪指令。
bgezal和bltzal是一样的,这并不奇怪。
虽然是RISC,但并不是所有的指令都应该是基本的。如果经常使用,两个指令需要更多的内存和更多的时间,而且操作码中有很大的空间,为什么不将它们组合成一个呢?
发布于 2013-12-22 04:50:59
主要原因是效率。
您最初的假设(执行bgez
后接jal
可以由beqzal
模拟或功能等效于执行beqzal
)是正确的,但这样做的效率可能较低。
为什么一开始就存在伪指令?马里兰大学关于伪指令和分枝的注释解释了这一点。答案在于MIPS的设计方式。MIPS是一个精简的指令集。如果速度有明显的提高,指令可以留在ISA中。如果它可以使用两个或更多的指令编写,而没有明显的延迟(因为它们没有经常使用),那么这些指令就没有包含在MIPS ISA中。相反,它们变成了伪指令。
让我们采取另一个伪指令,如la
,或加载地址。la
是一个伪指令,可以分解为lui
指令和ori
指令。在32位MIPS架构上,每条指令以及每个寄存器的大小都是32位.因此,为了存储32位地址,使用了两个指令。有关la
指令的更多信息可以找到这里。
bgezal
和bltzal
指令不太可能是psudo指令,因为在一条指令中执行完整操作更有效。硬件必须能够执行条件检查,跳转到分支地址,并将返回地址存储在一条指令中。如果jal
指令被分离,这不仅是对空间的不必要的使用,而且在某些硬件实现中,这个额外的指令可能会通过处理器的数据路径消耗一个执行周期,从而有效地减缓程序的执行速度。
其他来源:
https://stackoverflow.com/questions/20680218
复制相似问题