Maister
Maister

Reputation: 5054

How to turn off MIPS-GCC automatic instruction reordering?

Following this question: Weird MIPS assembler behavior with jump (and link) instruction I have a working GNU assembly toolchain for my single cycle MIPS project (no branch delay slot!). I would really prefer to write in C though. The code itself generated from the compiler does run, but I have to manually edit the assembly source every time since GCC for some reason likes to automatically reorder the branching instructions itself. I don't want to hack this with a script to figure out when to reorder the branches back again.

Is there a possible way to circumvent this? GCC generates code like this for some reason:

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

where I really want to feed the assembler something like this:

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

Upvotes: 7

Views: 5150

Answers (2)

sergio johann filho
sergio johann filho

Reputation: 111

pass the -mips1 and -fno-delayed-branch flags to gcc.

Upvotes: 11

Igor Skochinsky
Igor Skochinsky

Reputation: 25288

I don't think it's possible to turn it off since delay slots are present in all MIPS variants. I think it's much better if you implement delay slots in your emulator. This will also make it closer to real hardware.
Barring that, you can probably patch gcc to stop trying to fill the delay slots.

Upvotes: 3

Related Questions