首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么编译器在从函数返回的MIPS "j“指令之后放一个指令?

为什么编译器在从函数返回的MIPS "j“指令之后放一个指令?
EN

Stack Overflow用户
提问于 2019-12-01 22:10:54
回答 1查看 553关注 0票数 3

我正在查看MIPS平台的一些编译器输出,并且很难理解函数是如何返回的以及允许的是什么。

下面是一个简单的例子:

代码语言:javascript
运行
复制
int two_x_squared(int x)
{
    return 2*x*x;
}

如果我用编译器资源管理器编译它我看到了

代码语言:javascript
运行
复制
two_x_squared(int):
        sll     $2,$4,1
        mult    $2,$4
        mflo    $2
        j       $31
        nop

好的,这里没什么大不了的,我猜j $31跳转到返回地址,而nop可能是防止管道中的投机执行所必需的东西。

但是,我用XC32在-O2下编译,我得到

代码语言:javascript
运行
复制
two_x_squared:
    mul $4,$4,$4
    j   $31
    sll $2,$4,1

所以..。跳转后执行j $31后的行?!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-01 22:18:28

这称为分支延迟槽. 是的,分支实际上执行一条指令的时间比您预期的要晚,编译器应该用一些有用的东西填充延迟槽--在分支之前逻辑地将一些操作移动到该槽中,或者将在分支之后发生的事情移动到该插槽中。

这是在最初的MIPS体系结构(以及HP PA等)中引入的,以帮助流水线处理器,因为它们必须将管道排回并重新填充到所占用的分支上,这浪费了指令周期。

这一特性在以后的MIPS处理器以及开源的RISC V硬件中都被删除了。更现代的硬件使用其他方法来减少与流水线相关的浪费周期,包括分支预测、一些无序执行、推测、在流水线中更早地执行分支。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59130450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档