如何关闭MIPS-GCC自动指令重新排序?

如何关闭MIPS-GCC自动指令重新排序?,gcc,assembly,mips,Gcc,Assembly,Mips,下面这个问题:我有一个用于我的单周期MIPS项目(没有分支延迟槽!)的工作GNU组装工具链。不过我更喜欢用C写。编译器生成的代码本身确实在运行,但每次我都必须手动编辑程序集源代码,因为GCC出于某种原因喜欢自动重新排序分支指令本身。我不想用脚本来解决这个问题,以确定何时重新排列分支 有没有一种可能的方法来避免这种情况?出于某种原因,GCC会生成如下代码: .set noreorder ... jr $ra <-- GCC reordered for me! addi $v0, $v0, 1

下面这个问题:我有一个用于我的单周期MIPS项目(没有分支延迟槽!)的工作GNU组装工具链。不过我更喜欢用C写。编译器生成的代码本身确实在运行,但每次我都必须手动编辑程序集源代码,因为GCC出于某种原因喜欢自动重新排序分支指令本身。我不想用脚本来解决这个问题,以确定何时重新排列分支

有没有一种可能的方法来避免这种情况?出于某种原因,GCC会生成如下代码:

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

我认为不可能关闭它,因为所有MIPS变体中都存在延迟插槽。我认为如果在模拟器中实现延迟槽会更好。这也将使它更接近真正的硬件。

除此之外,您可能可以修补gcc以停止尝试填充延迟槽。

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

它是在硬件中实现的,所以为此重新构造大量设计会有点麻烦。我想我必须为此写一个小脚本,然后删除NOP。gcc仍然为真正的MIPS ISA编译,这只是禁用了利用。如果您想要SPIM或MARS的默认代码模拟没有分支延迟的MIPS,那么这将非常方便。
.set noreorder
addi $v0, $v0, 10
jr $ra