[LLVMdev] another mips16 puzzle
rkotler at mips.com
Thu Oct 11 17:01:17 PDT 2012
Usually we do all the accessing of stack variables via the SP register.
When the stack size is dynamic we need a frame pointer, FP.
There is a traditional FP register for MIPS, but FP is not a mips16
register so in general it has little use for mips16 because you can't
directly address it except in the move instruction when moving from/to
mips16 to mips32 register.
There are several ways to deal with this situation.
One way is to just allocate a mips16 physical register to function as FP
and use it for the whole duration of the function and copy SP into it at
the beginning of the function. This is somewhat wasteful since we don't
have so many mips 16 registers and there may be many paths through the
function where we don't need to access stack data at all.
It would seem most logical to allocate FP for the duration of the
function and have a virtual register which is an alias of FP that can
take on various physical locations.
so at the beginning of the function.
mov vr, SP
mov FP, vr ; you can't copy SP which is a mips32 register into another
mips 32 register
; directly; i.e. you have to go through a mips16
then if you run out of registers and need that physical register
allocated to vr, you can give it up and reload it from FP anytime you
need it again.
I'm not sure if there is some simple way to do all of this in llvm.
There are some complications here because you won't be able to access
stack locations without this vr so you have to be careful that it is not
given up to easily because you will end up reloading it a lot.
More information about the llvm-dev