Handling Long Branches

35 pointsposted 13 days ago
by ingve

6 Comments

stevekemp

11 days ago

It was only a couple of years ago since I wrote an assembly language program of my own and got hit by branching-limits on the Z80 processor.

I did exactly the same things that were suggested in this article, either inverted conditionals, or had a thunk - essentially "jmp nextJump", where that jumped to the actual location.

I sometimes spent a few hours shuffling code around to remove the longer jumps and re-order code in groups closer together to save individual bytes.

kccqzy

11 days ago

This is really useful! I only knew about -mcmodel during compilation but I didn’t know the linker would insert thunks for faraway branches. I would’ve thought that the linker would simply complain and ask you to recompile with a larger code model. Also interesting that different linkers (or the same linker on different architectures!) chose different thunk creation algorithms.

dmitrygr

10 days ago

long relative branches are even more fun. Not all PIC has a GOT. Sometimes you just need a chunk of code that can run anywhere in memory. For MIPS this can get hard beyond +/-32KB... Here is approximately the minimum thunk to allow branching to anywhere in 32 bit address space relatively to current location, where "offset" is addr of dst minus addr of this thunk minus 8

    BGEZAL  $zero, . + 8
    ADDIU   $at, $ra, 0
    LUI     $t7, hi16(offset)
    ORI     $t7, $t7, lo16(offset)
    ADDU    $t7, $ra, $t7
    JR      $t7
    ADDIU   $ra, $at, 0