我正在查看MIPS平台的一些编译器输出,并且很难理解函数是如何返回的以及允许的是什么。
下面是一个简单的例子:
int two_x_squared(int x)
{
return 2*x*x;
}如果我用编译器资源管理器编译它我看到了
two_x_squared(int):
sll $2,$4,1
mult $2,$4
mflo $2
j $31
nop好的,这里没什么大不了的,我猜j $31跳转到返回地址,而nop可能是防止管道中的投机执行所必需的东西。
但是,我用XC32在-O2下编译,我得到
two_x_squared:
mul $4,$4,$4
j $31
sll $2,$4,1所以..。跳转后执行j $31后的行?!
发布于 2019-12-01 22:18:28
这称为分支延迟槽. 是的,分支实际上执行一条指令的时间比您预期的要晚,编译器应该用一些有用的东西填充延迟槽--在分支之前逻辑地将一些操作移动到该槽中,或者将在分支之后发生的事情移动到该插槽中。
这是在最初的MIPS体系结构(以及HP PA等)中引入的,以帮助流水线处理器,因为它们必须将管道排回并重新填充到所占用的分支上,这浪费了指令周期。
这一特性在以后的MIPS处理器以及开源的RISC V硬件中都被删除了。更现代的硬件使用其他方法来减少与流水线相关的浪费周期,包括分支预测、一些无序执行、推测、在流水线中更早地执行分支。
https://stackoverflow.com/questions/59130450
复制相似问题