Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to turn off MIPS-GCC automatic instruction reordering?

Tags:

gcc

assembly

mips

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
like image 790
Maister Avatar asked Oct 28 '10 11:10

Maister


2 Answers

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

like image 171
sergio johann filho Avatar answered Nov 08 '22 04:11

sergio johann filho


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.

like image 39
Igor Skochinsky Avatar answered Nov 08 '22 06:11

Igor Skochinsky