【问题标题】:How to turn off MIPS-GCC automatic instruction reordering?如何关闭 MIPS-GCC 自动指令重新排序?
【发布时间】:2011-05-01 20:20:45
【问题描述】:

跟随这个问题:Weird MIPS assembler behavior with jump (and link) instruction 我有一个适用于我的单周期 MIPS 项目的 GNU 汇编工具链(没有分支延迟槽!)。不过,我真的更喜欢用 C 语言编写。从编译器生成的代码本身确实可以运行,但是我每次都必须手动编辑程序集源,因为 GCC 出于某种原因喜欢自动重新排序分支指令本身。我不想用脚本来破解这个,以确定何时重新排列分支。

有没有可能的方法来规避这种情况? GCC 出于某种原因生成这样的代码:

.set noreorder
...
jr $ra <-- GCC reordered for me!
addi $v0, $v0, 10 <--
...
.set reorder

我真的想为汇编程序提供如下内容:

.set noreorder
addi $v0, $v0, 10
jr $ra

【问题讨论】:

    标签: gcc assembly mips


    【解决方案1】:

    -mips1-fno-delayed-branch 标志传递给gcc。

    【讨论】:

    • 然后删除 NOP。 gcc 仍然为真正的 MIPS ISA 编译,这只是禁用利用。 godbolt.org/g/XmxVMu。如果您希望 SPIM 或 MARS 的代码默认模拟 MIPS 而没有分支延迟,这将非常方便。
    【解决方案2】:

    我认为关闭它是不可能的,因为所有 MIPS 变体中都存在延迟槽。我认为如果您在模拟器中实现延迟槽会更好。这也将使它更接近真实的硬件。
    除此之外,您可能可以修补 gcc 以停止尝试填充延迟槽。

    【讨论】:

    • 它是在硬件中实现的,因此为此重构大量设计会有点混乱。那我想我得为此写一个小脚本了。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2016-12-27
    • 2023-03-05
    • 1970-01-01
    • 2011-01-11
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多