Mips16 mode has no floating point instructions.
(Remember that mips16 is just an alternate decoder mode for the processor, mips32 or mips64
is the base processor).
Currently with gcc for mips16, when there is floating point it generates a function call to emulate each floating point instruction.
For mips 16 in llvm I want to just compile any function that has floating point, in mips32 mode.
The compression for mips32 to mips16 is less than 2x because sometimes you have to use the
extended mips16 instructions which are 4 bytes long (if immediate fields are too long for example).
So you almost could never win in real life by making those function calls for floating point instructions.
Later, when I have more time, I would like to go back and develop some metrics that allow me to make a better decision there because it is possible to change in-line to mips32/mip16 in a basic block or set of basic blocks with a lot of floating point activity, it would be possible to not have to do the whole function in mips32 if there is floating point.
So I need know if there was floating point in a function. Is there some easy way to know this already? (And if there is soft float then I would want to think that there is no floating point).
And then I need to be able to change the mode which currently is set for the duration of the compilation unit and set it for just a single function.
Maybe someone wants to add this or else maybe give me some hints as to how I would add this
Even from c/c++, gcc lets you specify mips16 and mips32 by function using attributes.
I think that Simon from our team could make the clang changes for this if we need it and there
are no other volunteers to do it.
For now I'm interested in just the llvm changes for this.
A more general change is to allow me to change mode on a per basic block level.