Then a register is spilled, i.e. replace by a location in memory. This
may be possible without new registers:
mov ireg30d,ireg29d -> mov ireg30d,[ebp-40]
... but in some cases a help register is needed:
mov ireg30d,[ebp+20] -> mov ireg99d,[ebp+20]
mov [ebp-40],ireg99d
Should a new register is needed, register allocation is completely
restarted with the new code.
Thanks for the info.
My current suspiscion is that something is missing regarding handling
of running out of VFP registers and it hasn't been noticed before
because noone has tried to do what i'm doing (implementing a calling
convention using VFP registers and then stress testing it) but i've
no idea where to look in the sourcecode to confirm/refute that idea.
It doesn't look like spilling happens in your example: I don't see
moves from/to the stack frame as temporary location.
My suspiscion was that the compiler was trying to spill but not actually
generating any code to implement the spill.
Perhaps the first thing to check is to add a breakpoint in
Tinterferencebitmap.setbitmap.
The "versions" of s20 use superregister 50 and 70, so a setbitmap
(50,70) or (70,50) should be called at some point to tell the register
allocator both registers are active at the same time and cannot be
coalesced.
I added a debug writeln to setbitmap and it does seem to be being called
with both 50,70 and 70,50. Full output is at http://pastebin.com/3jd8zNkh
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel